feat(web): M19-4 grid view — issues × stages heat-map #193
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!193
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "dev/177"
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
/app/monitor/gridroute with a sticky-header heat-map table: rows = issues, columns = canonical pipeline stages in flow orderAppShellnav (between Pipeline and Tasks)StagePillwhen the stage has been reached; empty otherwise (skipped stages still render their pill)pipeline_stageupdates patch the shared["pipeline", ...]TanStack Query cache — same key as the list viewpipeline-grid.test.tsx: 10-issue fixture covering all stage states; asserts column alignment, default/age/stalled sort order, aria-pressed toggle state, empty/loading/error statesTest plan
bun run --cwd apps/web test --run)biome checkclean on all changed files/app/monitor/grid— grid renders with sticky headers/app/monitorand navigate to/app/monitor/grid— filter preserved in URLCloses #177
🤖 Generated with Claude Code
Review — M19-4 Grid View
CI is green (run #1800, 3m27s). All acceptance criteria from issue #177 verified. Approving.
Acceptance criteria check
/app/monitor/gridroute accessibleFLOW_ORDERmatches serverpipeline.tsorder including design tracksortIssues()+ sort bar witharia-pressedbyStageMap + conditional<StagePill compact />sticky top-0 z-20on<thead>sticky left-0 z-10andsticky left-[80px] z-10StagePill(same component as mini-pipeline)FilterBarimport, same URL search param schemapipeline_stageupdatesonPipelineStagepatches["pipeline"]cache in-placepipeline-grid.test.tsx— 10-issue fixturedata-issueattribute +getAllByTestIdorderingCode quality notes (non-blocking)
patchPipelineStageimport from a sibling route file (apps/web/src/routes/monitor.grid.tsx:6):Importing a utility from a route module creates route-to-route coupling — if
monitor.index.tsxis restructured this breaks silently. Not a blocker here since it's a pure function and both routes genuinely share the same logic, but the long-term home for this helper is@/lib/pipelinealongsidefetchPipeline. Worth extracting when M19-5/6 land and more routes need it.left-[80px]sticky offset hard-codes the Issue column width (pipeline-grid.tsx, Title<td>and<th>). The offset is structurally coupled tomin-w-[80px]on the Issue column. The current values are consistent, so it works — just something to keep in sync if the Issue column ever widens.Both notes are informational; no correctness issues. The implementation is clean, test coverage is solid, and the SSE/query pattern is consistent with the rest of the monitor surface.