Repository navigation
fix(clients): a thread comes back when its subagent needs approval - #19630
Conversation
A delegated subagent waiting on an approval left its parent in the Working section with no alert, because subagent rows are hidden and only the subagent's own shell carried the request. Threads above a live subagent now carry what it waits on: the Working section returns the thread, the sidebar and mobile list show the approval or question, web alerts fire on the parent, a snoozed parent wakes, and the parent's banner covers approvals as well as questions.
Snoozing it would wake it again at once, because a subagent's request raises the parent's hand. Co-Authored-By: lovelycodemonkey <ghassemimahyad@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This change propagates hidden subagent approval/input state into shared client runtime behavior, affecting inbox placement, statuses, notifications, banners, and snooze behavior across web and mobile. The intent is clear and tested, but the breadth of existing-path changes and nontrivial shared-state logic 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. |
## What's Changed * fix(server): only Claude progress updates before a tool call show as text by @maria-rcks in pingdotgg/t3code#18923 * fix(pr): keep known state in sync across controls by @maria-rcks in pingdotgg/t3code#18408 * fix(web): review summary only says optional when it is by @flamboh in pingdotgg/t3code#18451 * fix(web): subagent lists in the composer banner no longer start lines with a comma by @flamboh in pingdotgg/t3code#19170 * fix(web,mobile): pull request filters no longer offer the Scratch folder by @flamboh in pingdotgg/t3code#19179 * fix(web,mobile): pull request project filter follows the sidebar order by @flamboh in pingdotgg/t3code#19180 * feat(settings): inactivity auto-settle can keep threads with a PR by @tris203 in pingdotgg/t3code#14642 * fix(server): Claude works next to an enterprise managed-mcp.json by @SunkenInTime in pingdotgg/t3code#18706 * fix(web,mobile): muse code uses meta's official blue logo by @maria-rcks in pingdotgg/t3code#19562 * fix(desktop): import CA trust variables from the login shell by @maria-rcks in pingdotgg/t3code#19604 * fix(server): preview copy only forwards text from the viewer's copy keys by @maria-rcks in pingdotgg/t3code#19561 * fix(muse): Supervised threads ask before commands again by @maria-rcks in pingdotgg/t3code#19558 * fix(server): restarts no longer stall on old subagent result deliveries by @t3dotgg in pingdotgg/t3code#19631 * fix(clients): a thread comes back when its subagent needs approval by @t3dotgg in pingdotgg/t3code#19630 * fix(usage): cold usage scans no longer stall the server by @t3dotgg in pingdotgg/t3code#19446 * fix(server): "Always allow this session" stops Codex asking for every command by @t3dotgg in pingdotgg/t3code#19635 * fix(web): keep vertical cursor stops outside styled markers by @Yash-Singh1 in pingdotgg/t3code#19651 * fix(web): mermaid code toggle stays in place when switching views by @maria-rcks in pingdotgg/t3code#19601 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261014.3118...v0.0.46-nightly.20261014.3132 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261014.3132
## What's Changed * fix(server): only Claude progress updates before a tool call show as text by @maria-rcks in pingdotgg/t3code#18923 * fix(pr): keep known state in sync across controls by @maria-rcks in pingdotgg/t3code#18408 * fix(web): review summary only says optional when it is by @flamboh in pingdotgg/t3code#18451 * fix(web): subagent lists in the composer banner no longer start lines with a comma by @flamboh in pingdotgg/t3code#19170 * fix(web,mobile): pull request filters no longer offer the Scratch folder by @flamboh in pingdotgg/t3code#19179 * fix(web,mobile): pull request project filter follows the sidebar order by @flamboh in pingdotgg/t3code#19180 * feat(settings): inactivity auto-settle can keep threads with a PR by @tris203 in pingdotgg/t3code#14642 * fix(server): Claude works next to an enterprise managed-mcp.json by @SunkenInTime in pingdotgg/t3code#18706 * fix(web,mobile): muse code uses meta's official blue logo by @maria-rcks in pingdotgg/t3code#19562 * fix(desktop): import CA trust variables from the login shell by @maria-rcks in pingdotgg/t3code#19604 * fix(server): preview copy only forwards text from the viewer's copy keys by @maria-rcks in pingdotgg/t3code#19561 * fix(muse): Supervised threads ask before commands again by @maria-rcks in pingdotgg/t3code#19558 * fix(server): restarts no longer stall on old subagent result deliveries by @t3dotgg in pingdotgg/t3code#19631 * fix(clients): a thread comes back when its subagent needs approval by @t3dotgg in pingdotgg/t3code#19630 * fix(usage): cold usage scans no longer stall the server by @t3dotgg in pingdotgg/t3code#19446 * fix(server): "Always allow this session" stops Codex asking for every command by @t3dotgg in pingdotgg/t3code#19635 * fix(web): keep vertical cursor stops outside styled markers by @Yash-Singh1 in pingdotgg/t3code#19651 * fix(web): mermaid code toggle stays in place when switching views by @maria-rcks in pingdotgg/t3code#19601 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261014.3118...v0.0.46-nightly.20261014.3132 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261014.3132
Subagent rows are hidden from the threads list, and only a subagent's own shell summary carried its pending approval or question. A parent whose delegated subagent was blocked on the user stayed in Working, kept its snooze or explicit settle, and gave no sign that anything waited. client-runtime now derives, per environment, what a live subagent below each thread waits on (`pendingSubagentRequest`: approval or user_input) from the shell summaries clients already hold, so no child transcript is subscribed and nothing new crosses the wire. Nested subagents pass the request up the same-environment parent chain; an approval outranks a question; non-blocking questions and requests left on a finished subagent run don't count. The derived map keeps its identity while unchanged, presentations are cached per source and request, and the roster key includes the field, so unrelated rows keep their identity. The field drives the web/desktop sidebar status and pill, the Working shelf, Needs attention sorting, the workspace overview, snooze wake and the snooze guard, and the settled blockers. iOS derives the same state in its lifecycle partition for the status badge, snooze/settle sections, the Needs attention filter, and the snooze menu. Alerts already fire on the subagent's own thread from the server's attention events. Ported from pingdotgg/t3code#19630. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sync 1014d: 15 upstream commits, including pingdotgg#19630 (a thread comes back when its subagent needs approval), pingdotgg#19656 (Reveal in File Explorer works on Windows again) and pingdotgg#19675 (busy-thread command perf). The fork's completion alert rules (Wait hold, quiet crew completions, PR watch re-arm) keep working beside the subagent approval alert. A fork browser test casts the screencast listener upstream retyped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(server): only Claude progress updates before a tool call show as text (pingdotgg#18923) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(pr): keep known state in sync across controls (pingdotgg#18408) * fix(web): review summary only says optional when it is (pingdotgg#18451) * fix(web): subagent lists in the composer banner no longer start lines with a comma (pingdotgg#19170) * fix(web,mobile): pull request filters no longer offer the Scratch folder (pingdotgg#19179) * fix(web,mobile): pull request project filter follows the sidebar order (pingdotgg#19180) * feat(settings): inactivity auto-settle can keep threads with a PR (pingdotgg#14642) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): Claude works next to an enterprise managed-mcp.json (pingdotgg#18706) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web,mobile): muse code uses meta's official blue logo (pingdotgg#19562) * fix(desktop): import CA trust variables from the login shell (pingdotgg#19604) * fix(server): preview copy only forwards text from the viewer's copy keys (pingdotgg#19561) * fix(muse): Supervised threads ask before commands again (pingdotgg#19558) * fix(server): restarts no longer stall on old subagent result deliveries (pingdotgg#19631) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(clients): a thread comes back when its subagent needs approval (pingdotgg#19630) A delegated subagent waiting on an approval or question now shows on its parent thread: Working section, status badge, notifications, snooze, and the composer banner on web and mobile. Takes over pingdotgg#19614. Co-authored-by: lovelycodemonkey <ghassemimahyad@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(usage): cold usage scans no longer stall the server (pingdotgg#19446) Co-authored-by: Victor Vogel <263261067+only21mil@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): "Always allow this session" stops Codex asking for every command (pingdotgg#19635) After "Always allow this session", the Codex adapter answers later command (or file change) approvals in that thread for the rest of the session. A turn in another runtime mode, or the thread unloading, ends it. Takes over pingdotgg#19598. Co-authored-by: lovelycodemonkey <ghassemimahyad@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): keep vertical cursor stops outside styled markers (pingdotgg#19651) * fix(web): mermaid code toggle stays in place when switching views (pingdotgg#19601) * fix(server): Reveal in File Explorer and browser launches work on Windows again (pingdotgg#19656) Windows PowerShell started with detached: true exits 0 without running its command. Native Windows PowerShell launches (reveal and browser) now start attached, unref'd, with ignored stdio. Takes over pingdotgg#10387. Fixes pingdotgg#11780. Co-authored-by: doubletwisted <118005273+doubletwisted@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): GitHub App tokens can merge and use other write actions (pingdotgg#19103) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): commands on busy threads stop decoding thousands of finished tool nodes (pingdotgg#19675) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): use workspace-scoped Bitbucket permissions API (pingdotgg#10984) Co-authored-by: RealDoc06 <73218979+RealDoc06@users.noreply.github.com> Co-authored-by: Theo Browne <me@t3.gg> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(composer): read dropped threads across environments (pingdotgg#15210) * test(web): remove duplicate change request parser tests (pingdotgg#13591) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> * fix(server): a delegated task's question ends the parent's blocking wait (pingdotgg#19538) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): a delegated task's question now wakes its parent agent (pingdotgg#19521) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): a cancelled delegated task no longer shows its child's question (pingdotgg#18459) Co-authored-by: maria-rcks <maria@kuuro.net> * feat(storage): clean up settled thread worktrees (pingdotgg#15208) Co-authored-by: maria-rcks <maria@kuuro.net> * feat(web,mobile): waiting status shows a dot-dashed icon and a timer (pingdotgg#19617) * feat(pr): delete branches after merge or close (pingdotgg#19257) --------- Co-authored-by: maria <maria@kuuro.net> Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com> Co-authored-by: Tristan Knight <admin@snappeh.com> Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: lovelycodemonkey <ghassemimahyad@gmail.com> Co-authored-by: Victor Vogel <263261067+only21mil@users.noreply.github.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: doubletwisted <118005273+doubletwisted@users.noreply.github.com> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Sebastian Pugliese <73218979+RealDoc06@users.noreply.github.com> Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Problem
When a delegated subagent waits on an approval, its parent thread stays in Working. You get no alert and no badge. You can't tell anything is waiting unless you open the subagent.
Subagent rows are hidden in the sidebar, and only the subagent's own thread summary carries its pending request. So the parent's status, the Working section, notifications, and the mobile list all say "working". #16634 already put a subagent's question in the parent's composer banner, but only questions, and only inside the open parent.
Fix
Each thread above a live subagent now carries what that subagent waits on (
pendingSubagentRequest:approvaloruser_input).client-runtimeworks this out from the shell summaries clients already have, so nothing new goes over the wire.Nested subagents pass the request up to the visible thread. An approval outranks a question. Provider-native subagents are skipped, because they already ask on their parent. Each environment computes this once per shell change, and unchanged summaries keep their identity, so lists don't re-render.
Not included: mobile push and Live Activity alerts. They come from the server's agent-awareness relay, which also skips subagent threads. That is a separate server change.
Verification
threadShell.test.ts: a parent leaves Working when a nested subagent asks for a command approval, and goes back when the request clears. Fails without the fix.ThreadNotificationCoordinator.test.tsx: the parent alerts "Approval needed" while its own summary object does not change. Fails without the fix.threadSnoozed.test.ts:canSnoozerefuses a parent whose subagent waits.client-runtime,web, andmobile.runtimeMode: "approval-required", and the child asked for a command approval. Only the client files were swapped betweenmainand this change.main)Credit
Takes over #19614 by @LovelyCodeMonkey. Their commit is kept as is. I added the snooze guard on top.
Reviewed with sol-loop: 1 round with GPT-6.1-Sol.
Written by Claude Opus 5.5 in Claude Code, run from T3 Code.
🤖 Generated with Claude Code