Repository navigation
vscode: builder row → expandable phase children, each phase reveals its artifact (spec / plan / diff / review) #792
Description
Problem
The Builders tree shows each builder's current phase in the row label (#773 ... [fix]) but the full phase progression and the artifacts each phase produces are invisible. To see the spec, the user has to know which command opens it; to see the plan, run a different command; to see the current diff, click "View Diff" elsewhere. There's no single tree-driven path that mirrors how a builder actually progresses through a protocol.
Current state
- Server-side already parses the full phase list —
parseStatusYaml()populatesParsedStatus.planPhases: PlanPhase[](packages/codev/src/agent-farm/servers/overview.ts:139) wherePlanPhase = { id, title, status }(line 29). - But
BuilderOverview(overview.ts:35) only exposes the currentphasestring — the parsed phase list is truncated server-side before reaching the client. - Tree row builder (
views/builders.ts:94–98) labels rows with[<current-phase>]only; no expandable phase children. - Tooltip on the row says
Protocol: <p> | Mode: <m> | Progress: <%>(line 108). - SSE already pushes overview changes; no polling needed.
codev.viewPlanFileexists for PIR-only plan files (extension.ts:539); the equivalentviewSpecFile/viewReviewFiledo not exist yet — see dependency below.
Proposed behavior
1. Flow the parsed phase list to the client
Extend BuilderOverview with planPhases: PlanPhase[]. No new fetch / parser / poll — just stop truncating data that's already parsed.
2. Render each phase as a child row of the builder
Under each builder row, render every phase as a child item with a status marker:
▾ #773 Flaky Dashboard E2E [fix]
▸ ✓ investigate
▸ ▶ fix
▸ ○ verify
▸ ○ pr
Icons: ✓ done, ▶ current, ○ pending (use ThemeIcon equivalents).
3. Each phase row is itself expandable to its artifact
Per protocol-specific mapping, expanding a phase row reveals the artifact produced/operated on in that phase:
| Phase concept | Reveals |
|---|---|
| Specify (SPIR/ASPIR) | The spec file (codev/specs/<id>-<slug>.md on the builder's branch) |
| Plan (SPIR/ASPIR/PIR) | The plan file (codev/plans/<id>-<slug>.md) |
| Implement / Fix / Code (any) | The builder's current diff — same content as codev.viewDiff (all changed files, expandable like the existing "Changed files" child) |
| Review (SPIR/ASPIR/PIR/AIR) | The review file (codev/reviews/<id>-<slug>.md) |
| Other phases (investigate, verify, pr, etc.) | No artifact child — phase row stays a leaf with just its status marker |
When a phase has no produced artifact yet (e.g. plan phase pending), expanding shows a placeholder leaf: (no plan file yet).
4. Reactive on phase advance
Tree refreshes via the existing OverviewCache SSE subscription — when porch advances phase or a gate flips, the tree re-renders without polling.
5. The existing "Changed files (3)" child stays
Folds into the Implement / Fix phase row's children (it's the same data), removing duplication.
Dependency
This issue requires P2 (generalize codev.viewPlanFile beyond PIR-only, add sibling codev.viewSpecFile / codev.viewReviewFile). The phase children invoke those commands when clicked. File P2 first or land it as part of this issue's PR.
Acceptance criteria
-
BuilderOverview.planPhases: PlanPhase[]ships from Tower (no new fetch — surface the already-parsed data). - Each builder row in the tree has one child per phase, status icon indicating done/current/pending.
- Phases mapped to a known artifact (Spec/Plan/Implement/Review variants) are themselves expandable to that artifact.
- Implement-phase expansion shows the same per-file list as
codev.viewDiff; clicking a file row opens itsvscode.diffeditor (using existingopenBuilderFileDiff). - Phases without an artifact (investigate, verify, pr, etc.) render as leaves with status markers only.
- Tree updates reactively on SSE overview changes; no polling added.
- Works for all protocols that have parsed phases: SPIR, ASPIR, PIR, AIR, BUGFIX, TICK, MAINTAIN. Protocols without artifact-producing phases render leaf-only.
- The standalone "Changed files (N)" builder child is absorbed into the Implement/Fix phase child to avoid duplication.
Out of scope
- Polling-based phase updates (intentionally — SSE is sufficient).
- Re-architecting how artifacts are stored or named.
- Editing artifacts from the tree (read-only reveal only).
- A separate gates child row (intentionally — gates remain in the current
blocked on <gate>row label).
Activity