Skip to content

Prove the conversation path end to end and record what fidelity still needs (CF-8, first part) - #294

Merged
BunsDev merged 3 commits into
mainfrom
cf8-fidelity
Oct 18, 2026
Merged

BunsDev merged 3 commits into
mainfrom
cf8-fidelity

Conversation

@BunsDev

@BunsDev BunsDev commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

Part of #281 (CF-8 of tracker #273).

What changes

e2e/conversation-fidelity.spec.ts drives the real app, main process and claude -p adapter with a fixture Claude CLI. The fixture edits greeting.txt for real and counts what it executes. Four cases:

  • Golden path: request → plan (TodoWrite) → approval → real edit → check → final answer → Save to Notes → Open the note → restart.
    • It asserts the file bytes, and execution counts { edits: 1, checksStarted: 1, checksFinished: 1 } both before and after the restart.
    • It also asserts the plan statuses, the outcomes, the note going from revision 1 to 2 on the same page, and identical thread:items after the restart. Nothing re-runs.
  • Denial: the file is unchanged and nothing runs.
  • Failing check: a failed command, and the plan step stays in progress.
  • Stop while a check runs: stopped, the check never reports, and nothing is retried.

docs/conversation-fidelity.md says what the conversation path supports today, child by child, and what its gate still needs.

docs/reviews/2026-10-18-conversation-fidelity-acceptance.md is the integration matrix. Each requirement is listed with its evidence and its state (verified by fixture, verified by unit test, partial, or open), plus what is left:

  • CF-3 variants: a question, a withdrawal, simultaneous answers, reconnect after a decision;
  • a pinned candidate with fresh full checks;
  • authorized live runs;
  • human VoiceOver;
  • reference captures;
  • a named-machine long-transcript measurement.

docs/status.md adds the acceptance line under the conversation-fidelity entry.

These are acceptance tests of behaviour CF-1 through CF-7 already built, so they had no red phase.

Checks run locally

On main at f6976df (CF-7 landed), macOS on Apple Silicon, Node v24.18.1, pnpm 10.34.5:

  • Root pnpm build: passed.
  • npx playwright test e2e/conversation-fidelity.spec.ts e2e/task-to-notes.spec.ts: 6 of 6 passed (44 s).

There are no source changes, so the unit suite is unchanged from main.

Not in this PR

The fidelity gate is not complete. The review lists every open row. The fixture runs Claude only, and no live provider was used.

Coven-Harness: Claude Code / claude-opus-5-5

@vercel

vercel Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
modex Ready Ready Preview Oct 18, 2026 12:34pm UTC

Request Review

…for real

e2e/conversation-fidelity.spec.ts runs through the real app, main
process and claude -p adapter against a fake Claude CLI shaped like
2.1.302 that edits a disposable repository and counts what it runs.
Golden path: a reported plan, an approval, a real edit and check, the
final answer, Save to Notes twice (same note, next revision), Open, and
a restart that restores identical items with no re-run. Variants: a
denial (bytes unchanged, nothing run), a failing check, and Stop while
a check runs. Assertions are on bytes, counts, outcomes and revisions.
These cover behaviour CF-1 to CF-7 built, so there was no red phase.

Refs #281

Coven-Harness: Claude Code / claude-opus-5-5
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
CF-7 landed as f6976df, so the review's child table and run note now name it, and the
fidelity run is repeated on main. CF-3 is in progress, stacked on #286.

Part of #281.

Coven-Harness: Claude Code / claude-opus-5-5
@github-code-quality

Copy link
Copy Markdown

Code coverage overview

Languages: TypeScript

TypeScript / code-coverage-agent

main f6976df cf8-fidelity df82ab3 +/-
63% 63% 0%

ℹ️ Calculations represent line coverage. Results may change as calculations are updated.

@BunsDev
BunsDev merged commit d3dfe76 into main Oct 18, 2026
13 checks passed
@BunsDev
BunsDev deleted the cf8-fidelity branch October 18, 2026 13:02
BunsDev added a commit that referenced this pull request Oct 18, 2026
Brings in #294 (CF-8, first part).

Coven-Harness: Claude Code / claude-opus-5-5
BunsDev added a commit that referenced this pull request Oct 18, 2026
Coven-Harness: Claude Code / claude-opus-5-5
BunsDev added a commit that referenced this pull request Oct 18, 2026
Coven-Harness: Claude Code / claude-opus-5-5
BunsDev added a commit that referenced this pull request Oct 18, 2026
The merge is clean. CF-8's conversation-fidelity spec drives Stop through
the claude -p adapter, and now runs against CF-2's interrupt-then-grace
Stop.

Refs #275

Coven-Harness: Claude Code / claude-opus-5-5
BunsDev added a commit that referenced this pull request Oct 18, 2026
Opening a tab (⌘⇧B) focuses its address bar twice: once when the tab becomes active, and again
in an animation frame that newTab queues for when the panel was not yet visible. Chromium can
hold frames back for an inactive or busy window. The late focus then landed after the person,
or a test, had already moved on, and took the caret out of the composer mid-typing.

That failed CI on #293: store-desktop.spec.ts's browser-tools recovery case filled the composer
just as the late frame ran. The text went into the address bar and the composer stayed empty
(job 117782462586). The same case failed on #294's first run.

The late focus now applies only if focus has not moved since the tab opened. The new
workspace.spec.ts case holds animation frames, moves to the composer, releases the frames and
types. It failed first: the composer lost focus when the frame ran.

Coven-Harness: Claude Code / claude-opus-5-5
BunsDev added a commit that referenced this pull request Oct 18, 2026
Opening a tab (⌘⇧B) focuses its address bar twice: once when the tab becomes active, and again
in an animation frame that newTab queues for when the panel was not yet visible. Chromium can
hold frames back for an inactive or busy window. The late focus then landed after the person,
or a test, had already moved on, and took the caret out of the composer mid-typing.

That failed CI on #293: store-desktop.spec.ts's browser-tools recovery case filled the composer
just as the late frame ran. The text went into the address bar and the composer stayed empty
(job 117782462586). The same case failed on #294's first run.

The late focus now applies only if focus has not moved since the tab opened. The new
workspace.spec.ts case holds animation frames, moves to the composer, releases the frames and
types. It failed first: the composer lost focus when the frame ran.

Coven-Harness: Claude Code / claude-opus-5-5
BunsDev added a commit that referenced this pull request Oct 18, 2026
…ards (CF-3) (#293)

* Define the human-request contract and a pure broker with one resolution

shared/human-requests.ts: approvals and native questions as one
versioned contract. A request is bound to thread, turn, attempt,
account, runtime and native request id plus a digest of the exact
action; it accepts one local answer, and an unknown id, a wrong
identity, a changed action, a withdrawn request or a second answer
authorises nothing. Stop withdraws pending requests; one whose answer
was being sent becomes uncertain, never resolved. Codex's experimental
item/tool/requestUserInput (codex-cli 0.163.0) maps to typed questions,
answers are validated against them, and secret answers are hidden from
anything shown, saved or exported. Not wired in yet: that consumes
#275's interfaces once #286 lands.

Refs #276

Coven-Harness: Claude Code / claude-opus-5-5

* Answer each request once, route Codex questions to a card, and close stale cards

The runner keeps the turn's approvals and questions in the human-request broker. The first
answer is taken; every other one is refused with a reason (already resolved, withdrawn,
unknown, invalid) that thread:answer now returns and the phone receives as a 409.

Codex item/tool/requestUserInput (codex-cli 0.163.0, experimental) becomes a question card,
answered through thread:answer-question. Answers are checked against the questions before
anything reaches Codex. A secret answer goes to the CLI only and is saved as "(hidden)".
Stop sends an error reply, never an empty answer. When serverRequest/resolved arrives for a
request still open, Codex settled it, so the card closes as withdrawn and no answer is sent.
Approvals now carry the CLI's own request id (Codex JSON-RPC id, Claude request_id).

Cards a dead process left open close as ended when their thread loads, saved and emitted.
Phones see a question as a notice to answer on the Mac.

Part of #276.

Coven-Harness: Claude Code / claude-opus-5-5

* Show question cards with a control for each question

Options are radio buttons, with Other when the question takes free text. A free-text question
gets a text field, and a secret one a password field. A refused answer says why on the card.
An answered card lists the answers, with a secret shown as (hidden). A closed card says why,
in the approval card's words.

The turn header reads "Waiting for your answer" while a question waits. An answered or
closed question folds into the turn's work; an open one never does.

The e2e drives a fixture codex-cli 0.163.0 app-server through the real UI. It covers an
incomplete answer refused in place, one reply carrying the answers, a refused second answer,
Stop giving an error reply, and no secret anywhere under MODEX_HOME/app.

Part of #276.

Coven-Harness: Claude Code / claude-opus-5-5

* Document the human-request contract and record CF-3 in status

docs/human-requests.md covers the broker's exported signatures, its states and refusals, the
runner's binding and withdrawal rules, the Codex 0.163.0 and Claude 2.1.302 mappings, the
clients, how secrets are kept, the tests, and what is left for CF-6 and CF-7.

Part of #276.

Coven-Harness: Claude Code / claude-opus-5-5

* Keep a new tab's late focus from taking the caret away

Opening a tab (⌘⇧B) focuses its address bar twice: once when the tab becomes active, and again
in an animation frame that newTab queues for when the panel was not yet visible. Chromium can
hold frames back for an inactive or busy window. The late focus then landed after the person,
or a test, had already moved on, and took the caret out of the composer mid-typing.

That failed CI on #293: store-desktop.spec.ts's browser-tools recovery case filled the composer
just as the late frame ran. The text went into the address bar and the composer stayed empty
(job 117782462586). The same case failed on #294's first run.

The late focus now applies only if focus has not moved since the tab opened. The new
workspace.spec.ts case holds animation frames, moves to the composer, releases the frames and
types. It failed first: the composer lost focus when the frame ran.

Coven-Harness: Claude Code / claude-opus-5-5

This branch was successfully deployed

1 active deployment
Preview — df82ab3c Deployed Oct 18, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant