fix(web): keep manual panel choices during a turn - #10113
Conversation
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR changes production right-panel behavior across ChatView and the shared panel store, adding session-scoped revision tracking to coordinate manual choices with turn and pull-request auto-opening. The focused tests reduce risk, but the cross-component state and asynchronous ordering logic is substantial enough to warrant human review. You can add or adjust custom eligibility rules. Learn more. |
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. |
4e8e0a7 to
a980db9
Compare
Turn completion and new PR links could replace a panel the user selected while the turn was running, and could reopen a panel the user hid. The right panel store now counts user panel choices per thread. Proactive opens go through openProactive, which refuses when the count moved after the choice was observed. A linked PR stays above a completed-turn diff. ChatView uses one observation for turn completion, linked PRs, and replacement PRs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
231ec07 to
962cc34
Compare
## What's Changed * feat(usage): pool subscription limits per provider across accounts and environments by @juliusmarminge in pingdotgg/t3code#10300 * chore(web): remove usage limits demo fixtures by @juliusmarminge in pingdotgg/t3code#10330 * fix(web): expose error disclosure state by @saphid in pingdotgg/t3code#10125 * fix(web): name the editor picker accurately by @saphid in pingdotgg/t3code#10124 * fix(web): make task row states readable by @saphid in pingdotgg/t3code#10128 * fix(web): explain hosted connection prerequisites by @saphid in pingdotgg/t3code#10129 * fix(web): name combobox chip removal targets by @saphid in pingdotgg/t3code#10127 * fix(marketing): present the Git workflow as an illustration by @saphid in pingdotgg/t3code#10130 * feat(mobile): pool usage limits across selected environments by @juliusmarminge in pingdotgg/t3code#10334 * fix(release): space automatic nightlies at least six hours apart by @t3dotgg in pingdotgg/t3code#10272 * refactor(web): share bulk thread deletion between sidebars by @t3dotgg in pingdotgg/t3code#10106 * refactor(client): share tool outcome rules by @t3dotgg in pingdotgg/t3code#10122 * refactor(server): share Claude result status and error mapping by @t3dotgg in pingdotgg/t3code#10296 * fix(server): settle inactive threads without a PR lookup by @t3dotgg in pingdotgg/t3code#10103 * fix(ssh): report remote stop failures without losing ownership by @t3dotgg in pingdotgg/t3code#10105 * perf(server): stop scanning old OpenCode parts by @t3dotgg in pingdotgg/t3code#10116 * perf(server): avoid full thread reads on turn start by @t3dotgg in pingdotgg/t3code#10108 * perf(web): skip checkpoint map rebuilds while streaming by @t3dotgg in pingdotgg/t3code#10118 * perf(server): skip plan bodies in thread summaries by @t3dotgg in pingdotgg/t3code#10341 * fix(server): skip disabled provider instances for text generation fallback by @t3dotgg in pingdotgg/t3code#10346 * fix(server): capture checkpoints before refreshing PR status by @t3dotgg in pingdotgg/t3code#10347 * fix(web): keep manual panel choices during a turn by @t3dotgg in pingdotgg/t3code#10113 * fix(threads): keep completed requests closed across clients by @t3dotgg in pingdotgg/t3code#10123 * perf(server): finish runtime messages without full thread reads by @t3dotgg in pingdotgg/t3code#10120 * refactor(server): let adapters declare context compaction by @t3dotgg in pingdotgg/t3code#10112 * fix(server): link thread PRs without an open client by @t3dotgg in pingdotgg/t3code#10101 **Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260906.1293...v0.0.39-nightly.20260906.1303 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260906.1303
Turn completion and new PR links could replace a panel the user selected while the turn was running, and could reopen a panel the user hid.
resolveProactiveTurnDiffActiononly stepped aside for an open pull request, thenChatViewcalledopen(activeThreadRef, "diff"), which activates the diff over the Files selection and setsisOpen.The right panel store now keeps a per-thread count of user panel choices. Every existing action is a user choice by construction. Only
openProactiveand the two reconcile actions are automatic, so a new action cannot forget to declare itself.ChatViewreads the count when it observes a turn or link, andopenProactiverefuses when the count moved after that. A linked PR still stays above a completed-turn diff. The linked-PR effect and the diff effect are one effect that shares one observation. The count is session-only and is not persisted.Removed from the original version to reduce risk: the
removeSurfacesrewrite ofcloseSurface,closeAllSurfaces, andcloseSurfacesToRight(main's implementations and fallback-tab rule stay), thecloseSurfacesbatch action, thesourceargument on terminal close, and the DiffPanel scope change that activated the diff surface. None of these were needed for the fix.Reworked by Claude Fable 5.1 in Claude Code.
Note
Keep manual right-panel choices during a turn by adding per-thread user-action revisions to
rightPanelStorerightPanelStore.openProactive, which accepts an expected revision and rejects stale automatic diff or pull-request openings; automatic diffs are also rejected while a pull-request surface is activeChatView.tsxinto one effect usingobserveProactivePanelUserChoice, which records revisions even during loading and routes both automatic pull-request and diff requests through the revision-checked store methodresolveProactiveTurnDiffAction; the resolver now decides based only on checkpoint and repository statepullRequestSurfaceconstructor soChatViewcan build replacement surfaces through the store's canonical pathopenProactiverejects any automatic request whoseexpectedRevisiondoes not match the current per-thread revision inrightPanelStore.ts; callers inChatView.tsxmust capture the revision at observation time and pass it through, or proactive panels silently fail to openMacroscope summarized 962cc34.