- Python dicts returned by `Store` are `store::Json` objects (insertion ordered); settings rows are `SettingRow`.
-`ShellSession` is named `ShellContext` because `detz::shell::ShellSession` is the command runner.
- A bare `/` at the prompt prints "unknown command, try /help" (tai.py raises IndexError).
- Without readline there is no line editing, arrow-key history or tab completion; `LineInput` is a plain line reader.
-`PlexerController::ask` takes the timeout as `Json` so an int stays an int on the wire like in python; a `double` overload exists.
- Unbounded python bigints in JSON become doubles.
## Gaps (stated, not hidden)
| Gap | Effect |
|---|---|
| No `Seal` implementation here (`SealPort` only) | `Boot::open` uses `NullSeal` when `TAI_PASSPHRASE` is unset (vault stored in plain text, which python seals on its next start); an explicit `TAI_PASSPHRASE` without a `seal_factory` is refused with a `SealError`; a vault sealed by python is refused ("memory is sealed"). `rotate_seal` and the default-key upgrade are not ported |
| readline (history recall, `complete_input`) | typed input is still recorded in `input_history` |
Run from `taicpp/`: `make -f tests/foundation.mk test` (needs only g++, sqlite3, python3, tmux for the tmux cases).
| Test | What it proves |
|---|---|
| `tests/foundation_parity.py` + `foundation_probe` | one scenario replayed through tai.py and the C++ store: results, every table, the FTS index, the schema DDL and every profile file identical (timestamps and random ids masked). Pure functions (JSON, tags, settings rules, prompts, chunking, shell context against a fake /proc, flow validator and driver, Glow pieces), DebugLog sinks, REPL slash commands, native plexer against a scripted backend, tmux against a private server, and vault portability (each implementation reads the vault the other wrote) |
| `tests/repl_persist.py` + `repl_probe` | the history bug: the REPL started repeatedly under a long-lived shell per pane resumes the same session file, another pane stays separate (also in real tmux panes), Ctrl-C mid-turn, an uncaught exception reaching the debug log, a pinned `TAI_SESSION` is shared, an interrupted turn is resumed by `--continue`; every assertion reads the vault |
| `tests/tmux_ask.py` | tmux `ask` (menu, text popup, message, cancel, timeout) with a real client attached through a pty, both implementations, same replies |
| `tests/foundation_test.cpp` | hash vectors, UTF-8 helpers, seal-enabled store paths with a stand-in seal, boot settings, dir defaults, turn files, plexer detection, line input |
`repl_probe` runs the real `Repl`, `Conversation` and `Store` with a scripted
host in place of the model loop; no model is called.