M19-2: Pipeline list view (main monitor, mini-pipeline per issue) #175

Closed
opened 2026-04-20 18:44:10 +00:00 by code-lead · 1 comment
Collaborator

As an operator, I want the primary /app/monitor to become a list of open issues with a horizontal mini-pipeline badge per row, so that "where is issue N in its lifecycle" is answerable at a glance. Current task-event view moves to /app/monitor/task/:id — preserved, not deleted.

Acceptance criteria

Layout

  • Header unchanged — title, SSE pill (three-state from #M18-3), tabs: Pipeline (new default), Tasks (legacy monitor), Agents, Stats, Usage (if landed)
  • Main table rows: <repo>#<n> | title | milestone | assignee | mini-pipeline | latest activity
  • Mini-pipeline = horizontal sequence of stage pills. Colour palette:
    • green ✓ success
    • blue pulsing ● running
    • gray ○ pending
    • red ✗ failure
    • amber ⚠ stalled
    • purple ↺ review round (↺ 2)
    • gold ★ force-merge
  • Hover tooltip on a stage pill: agent instance, started/finished, duration, cost, turns. Deep-link to PR / CI run / review where applicable
  • Filter bar: repo, milestone, label(s), assignee agent, state (open / closed / all). Filters sync to URL query params — views are shareable
  • Empty state: "No open issues" with a link to the Forgejo repo

Routing

  • /app/monitor → pipeline list (default)
  • Click a row → expanded pipeline (#M19-3) inline under the row (accordion) OR navigates to /app/monitor/issue/<repo>/<n>. Pick one pattern, document in PR body
  • Click a stage pill → /app/monitor/task/<task_id> (the legacy task-event view, verbatim from #M18-3)
  • Deep-link /app/monitor/task/<task_id> works standalone (bookmarkable, same layout as #M18-3's view)

Live updates

  • Subscribes to the existing SSE stream. pipeline_stage events from #M19-1 update mini-pipeline badges in place without a full re-fetch
  • Stage transitions animate (200-300ms colour swap). No layout shift
  • Polls /issues/pipeline every 60s as refresh backstop. Poll pauses when tab is hidden (Page Visibility API)

Design tokens

  • Stage pill palette maps to design/tokens.json via existing CSS vars. No raw hex
  • Pulsing animation = shared @keyframes stage-pulse so Grid / Gantt views reuse it

Tests

  • pipeline-list.test.tsx — render a fixture with 5 issues spanning all stage states; assert each badge's classname / aria-label matches
  • pipeline-list.test.tsx — SSE pipeline_stage updates only the affected row in-place
  • Playwright: navigate to /app/monitor, click a stage pill, land on task-event view, back-button returns to the pipeline

Migration notes

  • Old Tasks-tab view (#M18-3's monitor) stays behind the Tasks tab. No feature loss
  • README adds a "Pipeline monitor" subsection with a screenshot or ASCII mock

Out of scope

  • Grid view (#M19-4), Gantt view (#M19-5), stuck-detection UI polish (#M19-6)
  • Cross-repo unified pipeline
  • Editing / assigning from the pipeline view (see #M18-7 assignment board)

Dependencies

  • Blocks on #M19-1 + #M18-3 (endpoint + legacy monitor view preserved)
  • Unblocks #M19-3, #M19-4, #M19-5, #M19-6

References

As an operator, I want the primary `/app/monitor` to become a **list of open issues** with a horizontal mini-pipeline badge per row, so that "where is issue N in its lifecycle" is answerable at a glance. Current task-event view moves to `/app/monitor/task/:id` — preserved, not deleted. ## Acceptance criteria ### Layout - [ ] Header unchanged — title, SSE pill (three-state from #M18-3), tabs: **Pipeline** (new default), **Tasks** (legacy monitor), **Agents**, **Stats**, **Usage** (if landed) - [ ] Main table rows: `<repo>#<n>` | title | milestone | assignee | **mini-pipeline** | latest activity - [ ] Mini-pipeline = horizontal sequence of stage pills. Colour palette: - green ✓ success - blue pulsing ● running - gray ○ pending - red ✗ failure - amber ⚠ stalled - purple ↺ review round (`↺ 2`) - gold ★ force-merge - [ ] Hover tooltip on a stage pill: agent instance, started/finished, duration, cost, turns. Deep-link to PR / CI run / review where applicable - [ ] Filter bar: repo, milestone, label(s), assignee agent, state (open / closed / all). Filters sync to URL query params — views are shareable - [ ] Empty state: "No open issues" with a link to the Forgejo repo ### Routing - [ ] `/app/monitor` → pipeline list (default) - [ ] Click a row → expanded pipeline (#M19-3) inline under the row (accordion) OR navigates to `/app/monitor/issue/<repo>/<n>`. Pick one pattern, document in PR body - [ ] Click a stage pill → `/app/monitor/task/<task_id>` (the legacy task-event view, verbatim from #M18-3) - [ ] Deep-link `/app/monitor/task/<task_id>` works standalone (bookmarkable, same layout as #M18-3's view) ### Live updates - [ ] Subscribes to the existing SSE stream. `pipeline_stage` events from #M19-1 update mini-pipeline badges in place without a full re-fetch - [ ] Stage transitions animate (200-300ms colour swap). No layout shift - [ ] Polls `/issues/pipeline` every 60s as refresh backstop. Poll pauses when tab is hidden (Page Visibility API) ### Design tokens - [ ] Stage pill palette maps to `design/tokens.json` via existing CSS vars. No raw hex - [ ] Pulsing animation = shared `@keyframes stage-pulse` so Grid / Gantt views reuse it ### Tests - [ ] `pipeline-list.test.tsx` — render a fixture with 5 issues spanning all stage states; assert each badge's classname / aria-label matches - [ ] `pipeline-list.test.tsx` — SSE `pipeline_stage` updates only the affected row in-place - [ ] Playwright: navigate to `/app/monitor`, click a stage pill, land on task-event view, back-button returns to the pipeline ### Migration notes - [ ] Old Tasks-tab view (#M18-3's monitor) stays behind the Tasks tab. No feature loss - [ ] README adds a "Pipeline monitor" subsection with a screenshot or ASCII mock ## Out of scope - Grid view (#M19-4), Gantt view (#M19-5), stuck-detection UI polish (#M19-6) - Cross-repo unified pipeline - Editing / assigning from the pipeline view (see #M18-7 assignment board) ## Dependencies - **Blocks on #M19-1 + #M18-3** (endpoint + legacy monitor view preserved) - **Unblocks #M19-3, #M19-4, #M19-5, #M19-6** ## References - Spec: `specs/m19-pipeline-monitor.md` §Story M19-2 - GitLab mini pipeline graph: https://design.gitlab.com/data-visualization/mini-pipeline-graph/
Collaborator

Mockup reference: this story blocks on the Penpot frames produced by #181 (M19-0). Do not start CSS/layout work until the designer hands off and the design-reviewer verdict is APPROVED. Implementation must match the locked visual language — no improvised palettes, no raw hex.

**Mockup reference**: this story blocks on the Penpot frames produced by **#181 (M19-0)**. Do not start CSS/layout work until the designer hands off and the `design-reviewer` verdict is APPROVED. Implementation must match the locked visual language — no improvised palettes, no raw hex.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks#175
No description provided.