Skip to content

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

Open

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).

Activity

  1. self-assigned this
    on May 21, 2026
  2. added
    area/vscodeArea: VS Code extension
    projectNew project or feature
    and removed on May 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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