feat(web): Prism spawns, collapsed child tree and parent breadcrumb (#17) - #18
Merged
Merged
Conversation
) The Agents panel now separates threads Model Router (Prism) started for this thread from the thread's own spawns, grouped by job with status and route. Router threads are recognized from the [model-router job ...] tag in their first message, read once per thread and cached. Rows with child threads show a collapsed chevron with the child count that reveals compact nested rows. A child thread's header shows the parent title as a link plus a menu to switch between siblings. 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. |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This was referenced Sep 25, 2026
lukemaj
added a commit
that referenced
this pull request
Sep 27, 2026
) (#18) * feat(web): Prism spawns, collapsed child tree and parent breadcrumb (#17) The Agents panel now separates threads Model Router (Prism) started for this thread from the thread's own spawns, grouped by job with status and route. Router threads are recognized from the [model-router job ...] tag in their first message, read once per thread and cached. Rows with child threads show a collapsed chevron with the child count that reveals compact nested rows. A child thread's header shows the parent title as a link plus a menu to switch between siblings. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(web): keep Agents tree internals unexported for knip (#17) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lukemaj
added a commit
that referenced
this pull request
Sep 27, 2026
) (#18) * feat(web): Prism spawns, collapsed child tree and parent breadcrumb (#17) The Agents panel now separates threads Model Router (Prism) started for this thread from the thread's own spawns, grouped by job with status and route. Router threads are recognized from the [model-router job ...] tag in their first message, read once per thread and cached. Rows with child threads show a collapsed chevron with the child count that reveals compact nested rows. A child thread's header shows the parent title as a link plus a menu to switch between siblings. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(web): keep Agents tree internals unexported for knip (#17) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lukemaj
added a commit
that referenced
this pull request
Sep 27, 2026
) (#18) * feat(web): Prism spawns, collapsed child tree and parent breadcrumb (#17) The Agents panel now separates threads Model Router (Prism) started for this thread from the thread's own spawns, grouped by job with status and route. Router threads are recognized from the [model-router job ...] tag in their first message, read once per thread and cached. Rows with child threads show a collapsed chevron with the child count that reveals compact nested rows. A child thread's header shows the parent title as a link plus a menu to switch between siblings. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(web): keep Agents tree internals unexported for knip (#17) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #17.
The Agents panel listed every child thread as a direct spawn, so threads Model Router (Prism) started for a planner looked like the planner's own spawns. It also had no way to see a child's own children, and a child thread's header gave no route back to its parent.
What changed
[model-router job <id> <kind> on route <route>; planner thread <id>]tag in their first user message. A thread's shell carries no such metadata, and router titles are regenerated after the first turn, so the tag is the only stable marker. The panel reads each child thread once through the normal thread-detail atom, caches the parsed tag (or "not a router thread") in memory, then drops the subscription. Router threads are grouped by job; the job label shows request id, aggregate status and route (the dispatcher's route). Everything else stays under "Direct spawns". A thread whose tag is not read yet shows under Direct spawns until the read completes.parentThreadIdif a shell ever carries it, else thesub.<parent>.<suffix>id) shows a▸ Nchevron, collapsed by default. Clicking it reveals compact one-line rows (status dot, title, model), each with its own chevron for deeper levels. Nothing expands on its own. Rows still open their thread.project / parent title / child title. The parent title links to the parent, and a small menu next to it switches to sibling child threads. Threads the user started are unchanged.Logic lives in fork-owned files:
AgentThreadTree.logic.ts(pure functions plus tests),AgentThreadTree.tsxandchat/ThreadParentCrumbs.tsx. Upstream edits:AgentsPanel.tsx(already allowlisted) and one import plus one JSX line inchat/ChatHeader.tsx(added toscripts/fork-upstream-edits.txtanddocs/fork.md).Not in scope: opening harness-internal subagents read-only (deferred per the Issue), and the mobile client, which has no Agents panel for child threads yet.
Proof
Local, in the worktree (Node 26, pnpm 11.10.0,
ELECTRON_RUN_AS_NODEunset):pnpm install --frozen-lockfile: passpnpm exec vp run -r typecheck: passpnpm exec vp lint: pass (no warnings in touched lines)pnpm exec vp fmt --check: passvp test run AgentThreadTree.logic.test.ts subagentThreads.test.ts chat/ChatHeader.test.ts: 20 tests pass (tag parsing, section assignment, tree nesting and toggle state, shell status, breadcrumb links)scripts/fork-check.sh: OKLive, on an isolated dev instance (server
127.0.0.1:3791,T3CODE_HOME=/tmp/agents-panel-t3homeseeded with aVACUUM INTOsnapshot of real data, headless Chrome with a fresh profile). Two grandchild threads were created under the router dispatcher thread with a normalthread.createcommand to exercise nesting.router-80-release-t3: the panel shows Prism spawns withrouter-80-release-t3 · Failed · luna/maxand the dispatcher plus two worker rows; no Direct spawns section, since the planner spawned nothing itself.▸ 2chevron (aria-expanded=false, 0 child rows). Clicking it showsDispatcher helper: run proofandDispatcher helper: review diff(bothgpt-5.6-luna · max); clicking again hides them (0 rows).model-router / Continue Chromeria Handoff Plan / Fix Release Verification False Failures. The sibling menu lists the two worker threads; choosing one openedsub.…f40b7340, and clicking the parent crumb returned to the planner thread.Screenshots were kept local because they contain private job prompts and paths from real data:
/tmp/agents-panel-shots/01-prism-spawns-collapsed.png,02-child-tree-expanded.png,03-child-breadcrumb.png,04-sibling-menu.png.Built with Claude Code (Claude Opus 5.5).
🤖 Generated with Claude Code