Skip to content

Commit efd21d1

Browse files
committed
Record what conversation fidelity supports and what its gate still needs
docs/conversation-fidelity.md: supported behaviour per CLI, fallbacks, privacy limits (Streamer Mode is visual only), migration and rollback. The acceptance receipt lists every #273 requirement with its evidence and leaves the gate open: CF-2, CF-3, live provider runs, VoiceOver, reference captures and measurements. Refs #281 Coven-Harness: Claude Code / claude-opus-5-5
1 parent f256d69 commit efd21d1

2 files changed

Lines changed: 129 additions & 0 deletions

File tree

‎docs/conversation-fidelity.md‎

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# Conversation fidelity
2+
3+
What Modex shows about a coding turn, where each fact comes from, and what it does not claim. It is
4+
the user-facing summary of tracker [#273](https://github.com/TypeSafeAI/modex/issues/273). The
5+
contracts behind it are [conversation events](conversation-events.md),
6+
[evidence](conversation-evidence.md), [task plans and records](task-context.md) and the
7+
[event journal](event-journal.md). The acceptance matrix and its open gates are in
8+
[the acceptance receipt](reviews/2026-10-18-conversation-fidelity-acceptance.md).
9+
10+
Coding still runs only through `codex app-server` and `claude -p`. Nothing described here executes,
11+
replays or re-sends anything by being shown, reloaded or reconnected.
12+
13+
## Supported
14+
15+
| Feature | Codex (app-server, codex-cli 0.163.0) | Claude (`claude -p`, Claude Code 2.1.302) |
16+
| --- | --- | --- |
17+
| Message identity and phase | Native item ids; `commentary` and `final_answer` phases | Message id and block index; no phase (unspecified) |
18+
| Final answer | The latest attempt's `final` message | The latest attempt's last reply |
19+
| Reasoning | Summary parts; reasoning text kept apart; empty reasoning is "not shared" | Thinking text when `thinking_display` is `summarized` (summary) or other (provider text); signature-only or redacted is "not shared" |
20+
| Tool outcome | From native status: succeeded, failed, denied (declined), unknown | Succeeded, failed, or denied when Modex refused it |
21+
| Exit code | Reported | Not reported |
22+
| Citations | Memory citations | None; links in the reply are labelled as the model's |
23+
| Plan | `turn/plan/updated` | `TodoWrite` |
24+
| Save to Notes | Yes | Yes |
25+
| Stop | Native interrupt | Process stop (CF-2, [#275](https://github.com/TypeSafeAI/modex/issues/275), refines this) |
26+
27+
## Fallbacks
28+
29+
- **History from before these changes** reads unchanged. It keeps the old last-reply heuristic and
30+
gains no invented provenance.
31+
- **A value a CLI does not report** stays unspecified, unknown or not shared. Modex never guesses
32+
one.
33+
- **Work a dead process left running** becomes unknown everywhere it is shown, not running and not
34+
failed, and is not run again.
35+
- **A phone that predates these fields** shows a tool's outcome in its title, and a plan as a line of
36+
text.
37+
- **Journal off,** the default, keeps the earlier reload behaviour. Journal on replays the same items
38+
as the transcript.
39+
40+
## Privacy limits
41+
42+
- **Opaque reasoning** (signatures, redacted thinking) is never read, stored or shown.
43+
- **Task records** leave out reasoning, command output and paths outside the project.
44+
- **Streamer Mode** masks what the window shows. It does not sanitize the clipboard, accessibility
45+
text, images or arbitrary secrets in transcripts. Copy and Save to Notes write what the transcript
46+
holds.
47+
48+
## Migration and rollback
49+
50+
Every new item field is optional and additive. An older build reading a newer transcript ignores the
51+
fields it does not know and shows the item as before. A plan item shows as text on older phones; an
52+
older desktop ignores it. Nothing migrates state files in place. The journal stores events
53+
unchanged, so rolling back to an older build leaves its replay working.
54+
55+
## Reference captures
56+
57+
The CF-4 typed-turn spec captures a typed turn at 900×600 in Graphite, Jev and OpenCoven
58+
(`MODEX_SCREENSHOTS=<dir>` keeps them). They are test captures from the mock engine and injected
59+
items, not provider screenshots. No reference images are committed yet; the receipt lists that as
60+
open.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Conversation fidelity acceptance, 2026-10-18 (preparation)
2+
3+
The acceptance receipt for tracker [#273](https://github.com/TypeSafeAI/modex/issues/273) and its
4+
gate [#281](https://github.com/TypeSafeAI/modex/issues/281) (CF-8). **The gate is not passed.** This
5+
receipt records what is verified, how, and every gate still open. A green mock or fixture test is not
6+
recorded as live-provider or human acceptance.
7+
8+
## Candidate
9+
10+
No integrated candidate is pinned yet: CF-2 (#275, PR #286) and CF-3 (#276) have not landed, and
11+
several children have parts still open. Each row names the build it was checked on.
12+
13+
## Children
14+
15+
| Child | Landed | State |
16+
| --- | --- | --- |
17+
| CF-1 #274: identity, phases, outcomes | #282 → `7780093` | Done; closed |
18+
| CF-2 #275: Claude Stop and cleanup | PR #286, green, waiting to update over CF-4 | Owned by another session |
19+
| CF-3 #276: human requests | — | Not started by its owner |
20+
| CF-4 #277: typed turns, Markdown | #284 → `8e26534` (typed turns); Markdown slice is PR #283 | Partial |
21+
| CF-5 #278: evidence | #287 → `d3711c6` (first part) | Partial |
22+
| CF-6 #279: journal and clients | #285 → `fb76aac` (CF-1 half) | Partial; request half waits for CF-3 |
23+
| CF-7 #280: plans and Notes | PR #289 (first part) | Partial; question cards wait for CF-3 |
24+
25+
## Integration matrix
26+
27+
| Requirement | Evidence | State |
28+
| --- | --- | --- |
29+
| Golden path: request → plan → approval → real edit → check → answer → Save to Notes → Open → restart restores, nothing re-runs | `e2e/conversation-fidelity.spec.ts` "golden path", against the real app, main process and `claude -p` adapter with a fake Claude CLI. Asserts file bytes, execution counts `{edits: 1, checksStarted: 1, checksFinished: 1}` before and after restart, plan statuses, outcomes, note revision 1 → 2 on the same page, and identical `thread:items` after restart | Verified with a fixture CLI, not a live provider |
30+
| A plan or clarifying question answered during the path | — | Open: needs CF-3 |
31+
| Paired-client reconnect in the path | CF-6 unit tests (journal replay, the phone's full and delta snapshots); `journal-resume.test.ts` | Verified in unit tests; not yet inside the golden fixture |
32+
| Denial: file unchanged, nothing runs | "a denial leaves the file as it was and runs nothing": bytes unchanged, counts `{}` | Verified (fixture) |
33+
| Command failure | "a failing check is a failed command": the tool is failed, and the plan step stays in progress | Verified (fixture) |
34+
| Unknown outcome | CF-1 and CF-6 unit tests: a dropped stream; work left running at a restart | Verified (unit) |
35+
| Stop while executing | "Stop while a check runs": stopped, the check never reports, nothing retried | Verified (fixture); CF-2 refines Stop |
36+
| Request withdrawal; simultaneous desktop and phone answers; reconnect after a decision send | — | Open: needs CF-3 |
37+
| Old snapshot migration | `test/conversation-migration.test.ts` | Verified (unit) |
38+
| Journal off | The golden fixture runs with the journal off, the default | Verified (fixture) |
39+
| Expired cursor | Existing `event-journal.test.ts` resume and reload cases | Verified (unit, existing) |
40+
| Stale Note revision | `task-context.test.ts`: a note edited since is kept and the new record becomes a new note | Verified (unit) |
41+
| Missing artifact | — | Open: CF-5's owned-artifact actions |
42+
| Outcomes, reasoning and provenance match recorded events | CF-1 fixture tests on Claude Code 2.1.302 and codex-cli 0.163.0 captures; CF-5 evidence tests | Verified on captures, not live |
43+
| Themes at 900×600 | `e2e/typed-turns.spec.ts`: Graphite, Jev and OpenCoven, no sideways scroll | Partial: no wider reference viewport, no committed references |
44+
| Keyboard and reduced motion | Existing `app.spec.ts` accessibility test; the new elements add no animation | Partial; human VoiceOver open |
45+
| Long transcript and streaming measurement | CF-5: a 3 MiB Codex stream from 584 ms to 76 ms in a unit test | Open: no named-environment measurement |
46+
| Live Codex and Claude acceptance | Captures only (2026-10-18, Haiku 5.5 and gpt-6-astra, benign tasks) | Open: needs authorized live runs through the app |
47+
| Human VoiceOver | — | Open: human |
48+
| Fresh `pnpm build`, `typecheck`, `test`, `test:e2e` on a pinned candidate | Per-PR results in #282, #284, #285, #287, #289 | Open until a candidate is pinned |
49+
50+
## Commands and results for this preparation
51+
52+
On `cf8-fidelity`, stacked on CF-7, macOS (Apple Silicon), Node v24.18.1, pnpm 10.34.5:
53+
54+
- `pnpm run build`: passed.
55+
- `npx playwright test e2e/conversation-fidelity.spec.ts`: 4 of 4 passed (45 s).
56+
57+
These are acceptance tests of behaviour CF-1 through CF-7 already built, so they had no red phase.
58+
59+
## Next
60+
61+
1. Land CF-2 (#286) and CF-3. Then add the question, withdrawal, simultaneous-answer and
62+
reconnect-after-decision variants to the golden fixture.
63+
2. Pin a candidate SHA and run fresh full checks on it.
64+
3. Run authorized live Codex and Claude smoke tasks through the app, and record versions, models and
65+
limits.
66+
4. Get human keyboard and VoiceOver acceptance, commit reference captures, and measure a long
67+
transcript on a named machine.
68+
EOF
69+
cd /Users/buns/Documents/GitHub/TypeSafeAI/modex/.worktrees/cf8-fidelity && git status --short

0 commit comments

Comments
 (0)