You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Follow-ups from the Codex (gpt-6-astra) adversarial review of PR #198 (Studio v0.76, fw #50 campaign) on 2026-09-12. Reconciliation: docs/development/codex-review-2026-09-12-mode3-wedge.md (on the PR branch). Everything else from that review was fixed on the branch; these three were deliberately deferred.
A timed-out write does not cancel the write (js/arena-link.js_sendOne, the Promise.race against the response timer). The apply queue is released while the WritableStream may still deliver the bytes, so a late STOP (or a late 0x70) can cross the recovery boundary and confuse opcode-only reply matching. Fix: a transport generation that a write timeout invalidates — ordinary sends are refused until reconnect()/teardown; the post-mortem's quiet period + flushRx() stay as the second line. Did not affect night-1 evidence (the wedged controller ACKed writes and answered nothing).
Lifecycle integration test runner → run-log adapter → export: assert that the serialized terminal event carries stopAcked (the runner now emits it from finally, after the best-effort STOP) and that a CONTROLLER_FAULT run's commit is deferred until Studio.handleControllerFault finishes. Today the adapter test hand-supplies stopAcked and the deferral is exercised only in the browser.
Session-owned run lifecyclerunning → stopping → diagnosing → finalizing → idle inside ArenaSession, instead of HTML orchestration through Studio._pendingCommit / _activePostmortem globals. This is the right shape for the self-healing runner (Self-healing runner: detect controller wedge, reset, reconnect, resume with a trial gap #197, LAB-212): background pollers (telemetry ring, analog-in), UI actions and recovery all compete for one link and should take a lease from the session, not check flags.
Follow-ups from the Codex (gpt-6-astra) adversarial review of PR #198 (Studio v0.76, fw #50 campaign) on 2026-09-12. Reconciliation:
docs/development/codex-review-2026-09-12-mode3-wedge.md(on the PR branch). Everything else from that review was fixed on the branch; these three were deliberately deferred.js/arena-link.js_sendOne, thePromise.raceagainst the response timer). The apply queue is released while theWritableStreammay still deliver the bytes, so a late STOP (or a late 0x70) can cross the recovery boundary and confuse opcode-only reply matching. Fix: a transport generation that a write timeout invalidates — ordinary sends are refused untilreconnect()/teardown; the post-mortem's quiet period +flushRx()stay as the second line. Did not affect night-1 evidence (the wedged controller ACKed writes and answered nothing).stopAcked(the runner now emits it fromfinally, after the best-effort STOP) and that aCONTROLLER_FAULTrun's commit is deferred untilStudio.handleControllerFaultfinishes. Today the adapter test hand-suppliesstopAckedand the deferral is exercised only in the browser.running → stopping → diagnosing → finalizing → idleinsideArenaSession, instead of HTML orchestration throughStudio._pendingCommit/_activePostmortemglobals. This is the right shape for the self-healing runner (Self-healing runner: detect controller wedge, reset, reconnect, resume with a trial gap #197, LAB-212): background pollers (telemetry ring, analog-in), UI actions and recovery all compete for one link and should take a lease from the session, not check flags.Related: #197, #198, #199, reiserlab/LED-Display_G6_Firmware_Arena#50, LAB-212, LAB-149.