Skip to content

vscode: builder row → expandable phase children, each phase reveals its artifact (spec / plan / diff / review) #792

Description

@amrmelsayed

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() populates ParsedStatus.planPhases: PlanPhase[] (packages/codev/src/agent-farm/servers/overview.ts:139) where PlanPhase = { id, title, status } (line 29).
  • But BuilderOverview (overview.ts:35) only exposes the current phase string — 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.viewPlanFile exists for PIR-only plan files (extension.ts:539); the equivalent viewSpecFile / viewReviewFile do 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 its vscode.diff editor (using existing openBuilderFileDiff).
  • 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).

Metadata

Metadata

Assignees

Labels

area/vscodeArea: VS Code extensionprojectNew project or feature

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions