# Proof audit pass 1 — issue24549

Scope: /home/ubuntu/wt/issue-24549, branch fix/issue-24549. Reviewed head 9c52670b395884bbef37a6a255cee771404a9c28 against base 3afb9b366f. Read-only source audit; no edits, tests, capture, server, push, or merge performed. No prior findings supplied.

## Applicability decision

Server-only proof exception applies. Actual diff contains only packages/provider-opencode/src/server/v2/adapter.ts and apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.test.ts. No component, render function, client contract, styling, or new client interaction path changes. Existing fork/rollback outcomes change through the adapter; this does not introduce a changed render path. The changed-render interaction matrix is empty (0 rows), so there is no per-row recording obligation. Do not invent screenshot or video rows. Required proof is red regression test plus matched before/after runtime transcript, with focused green tests. This decision does not waive runtime proof.

## Changed-render interaction matrix

| Changed render path | Fixture | Recording |
| --- | --- | --- |

Empty by inspection of the complete two-file diff.

## Backend fixture matrix derived from diff

| ID | Fixture / condition | Required observation | Current evidence / gap |
| --- | --- | --- | --- |
| B1 | Start OpenCode turn; Stop acknowledged interrupted:true; suppress session.execution.interrupted; session.active excludes source; fork | Adapter queries session.active, finalizes stranded source as interrupted, forks correct source and returns distinct native fork; no still-working rejection | New replay test covers successful fork/native ID. Execution results and terminal-event assertions not supplied. |
| B2 | Same missing-event Stop, but session.active includes source | Refuse with ProviderAdapterProtocolError; no session.fork and no premature interrupted finalization | New negative replay test asserts error tag. Execution results not supplied. |
| B3 | Same stopped/missing-event condition, rollback instead of fork | Idle source permits rollback with correct retained history; active source refuses; background work still blocks rollback | Shared ensureQuiet changes both verbs; no new rollback fixture in diff. Focused proof requested for this affected branch. |
| B4 | Normal event delivery for same Stop/fork flow | Existing normal Stop lifecycle and fork still succeed, terminal event once | Lead reports normal-delivery success; transcript not independently inspected. Control only, not failure-condition after-proof. |
| B5 | Turn active without Stop; local busy/background guards | No new bypass for a non-interrupted active turn; rollback retains background guard | Existing follow-up refusal test visible; run relevant existing adapter tests. Source condition preserves these guards. |
| B6 | Delayed interrupted event or replacement active turn while session.active resolves | No duplicate terminal event; do not finalize a replacement turn; successful follow-up remains usable | Identity check state.active === stopped is present under lock; no new race fixture in diff. Useful focused regression coverage. |
| B7 | session.active query fails/times out after missing-event Stop | Operation fails without fork/rollback or clearing active turn; retry can succeed once query recovers | Timeout remains in call; no new error-path fixture in diff. Useful boundary coverage. |

B1/B2 are primary regression proof. B3 is an affected-branch proof gap. B6/B7 are boundary suggestions, not claims of a demonstrated bug or blanket test mandates.

## Required runtime transcript observations

1. Identify tested commit, OpenCode version, isolated environment, and forwarding-proxy rule. Redact tokens, pairing URLs, credentials, personal prompt content, and unrelated data before publication.
2. Before and after must use the SAME fault: proxy drops session.execution.interrupted SSE frames for the source session, preserving interrupt response and other traffic. Log a dropped-frame counter/session correlation; ordinary event delivery is only the control.
3. Establish source execution started, Stop sent, session.interrupt returned interrupted:true, suppressed event did not reach T3, and provider became idle (session.active excludes source).
4. Before: subsequent fork fails with the still-working error, correlated to the stopped source. Lead reports this real-app reproduction; supplied statement is not independently reviewed transcript evidence.
5. After at reviewed head: repeat that exact sequence; observe active-list query, fork request/response, distinct target session, correct source/boundary/history and successful subsequent target prompt. Confirm no stuck source turn, duplicate terminal event, or lingering pending tool/request.
6. Safety/control: source still active must refuse fork; normal event delivery must still succeed. For shared rollback branch, demonstrate the analogous missing-event idle recovery and continued refusal while active/background work remains.
7. Attach focused regression output: new positive case red on base implementation (with identical fixture), green on head; negative case green on head; relevant existing OpenCode adapter suite green. Report commands, commit and result. This audit did not run tests or mutate checkouts to manufacture red proof.

## Findings and verdict

No demonstrated implementation defect from this proof-only pass. Server-only/empty render matrix claim is accepted. Proof readiness is PENDING: no red-test output or matched after runtime transcript was provided for inspection. A normal-delivery success cannot replace the after run with dropped SSE. New tests prove returned fork identity and refusal tag, but do not themselves assert synthetic interrupted terminal emission or rollback recovery.

FRICTION: matched fault-injected after evidence remains required; replay red/green output remains uninspected; shared rollback path expands backend verification beyond the two added fork tests. No browser/capture needed for this audit. No repository scratch created.
