Repository navigation
fix(web): PR panel no longer shows "All fibers interrupted" on open - #54
Conversation
) Opening a pull request starts its detail read twice within a few ms. The server lets the second read join the first read's shared lookup while the first read's cancellation is tearing it down, and answers it with an interrupt. The client query atom stored that as a failure, so the panel showed "All fibers interrupted without error" until Retry. An atom never observes its own cancellation, so an interrupt-only failure in an environment query is the server's. The query now reads once more instead of surfacing it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
Independent review at
|
Closes #52.
Opening a pull request from a link sometimes showed "Could not load pull requests: All fibers interrupted without error" in the right-panel PR tab until Retry.
Cause (from the desktop and server traces of the 19:35 occurrence): when the panel opens, the client starts the
detailandactivityreads, and its query atoms restart them about 6ms later, cancelling the first ones. On the server, the seconddetailrequest joins the first one's in-flightCachelookup while that lookup is still being torn down by the cancellation (theghsubprocess kill takes a few ms). It gets back the interrupt: its server span is interrupted after 1ms with no GitHub work of its own. The client query atom stored that interrupt-only exit as aFailure, and the panel rendered it as an error. This path is upstream code the fork had not changed; the Issues work does not touch it.Fix: an atom never observes its own cancellation (it detaches before interrupting), so an interrupt-only failure in an environment query is always the server's.
createEnvironmentQueryAtomFamilynow reads once more on an interrupt-only failure instead of surfacing it. This covers every environment query and every server version, including servers that are not upgraded. The server-sideCachejoin race stays as it is (a separate, upstream-shaped change).The upstream edit is allowlisted and owned in the feature map (
query-interrupt-retry).Proof
reads again when the server interrupts a query this client did not cancelfails without the fix withAll fibers interrupted without error, and passes with it.vp test run packages/client-runtime/src/state/runtime.test.ts packages/client-runtime/src/state/pullRequests.test.ts: 75 passed.client-runtimetypecheck,vp lintandvp fmt --checkon the changed files: clean.knip: output identical toorigin/main(existing findings only).scripts/fork-check.sh: OK.Done by Claude Opus 5.5 in T3 Code (Claude Code harness).
🤖 Generated with Claude Code