feat(web): expanded per-issue pipeline graph (M19-3) #194
No reviewers
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/claude-hooks!194
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "boss/176"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Closes #176 — the per-issue drill-down for M19 lands.
/app/monitor/issue/$owner/$repo/$issueNumberrenders aGitLab-style horizontal DAG: one card per canonical stage, a design
branch when the issue went the design track, and a dashed self-loop
arrow labelled
↺ Nwhen the review round counter is > 0.turns, stalled-since, plus the force-merge
★and round↺ Nbadges when applicable. A "View events" button deep-links to the
task-event view (or the external PR / CI / review URL for derived
stages).
activates the card's primary link. Live updates flow through the
existing SSE stream — a
pipeline_stageevent patches the matchingcard in the query cache without collapsing the row.
<Link>instead of theM19-2
preventDefaultstub, so the row → graph jump works acrossthe fleet.
/issues/pipelineis reused (no new endpoint) — scoped with?repo=…&state=allso closed-but-recently-touched issues keeptheir drill-down. The 5 s server cache means this is a cache hit
whenever the list is already open.
Test plan
bun x biome check .— cleanbun x turbo run typecheck— clean (server + shared + web)bun x vitest runin apps/web — 56 tests, all green. The newpipeline-graph.test.tsxcovers the six-stage fixture, eachcard's rendered fields, derived-stage external links, the
design-track branch, round-2 self-loop, force-merge badge, and
the keyboard arrow-nav + Enter contract.
apps/web/e2e/pipeline-graph.spec.ts) stubs/issues/pipelineand/history, clicks the list row title,arrow-navigates to the Implement card, and clicks its "View
events" button to land on
/app/monitor/task/<id>.🤖 Generated with Claude Code
Review: M19-3 expanded pipeline graph ✅
CI is green (run #1801, 3m26s). All acceptance criteria from issue #176 are met.
Acceptance criteria check
★badge on Merge↺ Nbadge on Review carddesign → design_reviewrow↺ Nabove main row/monitor/task/:idor external PR/CI/review URL/app/monitor/issue/$owner/$repo/$issueNumberpipeline_stagepatches matching card without collapsing row<Link>to drill-down (M19-2 stub wired up)pipeline-graph.test.tsx— 6-stage fixture, all card fieldsCode quality notes
placeholderEntryJSDoc inaccuracy (apps/web/src/components/pipeline-graph.tsx, the function near the top): the comment says "the caller tags itskippedfor the dimmed visual" but no call site ever passes"skipped"toplaceholderEntryfor design entries — the design row is simply not rendered for non-design issues (designTrackActivegate). The docstring describes a case that doesn't exist. Not a functional bug, but worth correcting to avoid misleading future maintainers.stalled_sincein live SSE updates:PipelineStageEvent(inpackages/shared/src/pipeline.ts) doesn't carry astalled_sincefield, so theonPipelineStagehandler in the route correctly can't propagate it. When a stage flips tostalledvia SSE the state badge updates immediately; the stalled-since timestamp only appears after the 60 s backstop refetch. This is a pre-existing gap in the event type, not introduced by this PR — just documenting it here so the next milestone can add the field toPipelineStageEventif the operator experience warrants it.Both are non-blocking. The implementation is clean, well-structured, and thoroughly tested. LGTM.
47ce0bdfaab4284b80a7