B8 — Planner board: stall highlight + card aging #416

Closed
opened 2026-04-27 00:03:49 +00:00 by claude-desktop · 0 comments
Collaborator

As an operator,
I want stalled cards to visually fade and flag,
so that I notice them before they rot another day.

docs/label-routing.md defines per-stage stall thresholds; the server already computes whether a card is past threshold. The board does not surface this today. This story adds the visual + a sort/filter.

Acceptance criteria

Visual

  • Cards stalled past their per-stage threshold render with a border-warning ring.
  • Past 2× the threshold: border-error ring + a clock icon to the left of the stall-age text (B5 already shows the text in text-error).
  • No flicker on threshold crossings — class change is debounced/animated via existing transition tokens.

Sort

  • Per-column header Sort: [age | stall] toggle; default age.
  • stall sorts by stalled_for_ms desc (most stalled first).
  • age keeps current sort (status group, then created_at).
  • Sort choice persists in localStorage per column.

Board-level filter chip

  • Toolbar adds a Stalled (N) chip that pivots to only stalled cards across all columns.
  • N is the live count of stalled cards in the current projection.
  • Chip is dimmed when N === 0; click is a no-op.
  • Filter combines AND with existing chips (repo, milestone, label, unassigned).
  • State persists in URL as ?stalled=true.

Tests

  • board-card.test.tsx: warning ring at threshold; error ring + clock icon at 2× threshold.
  • board-column.test.tsx: Sort: stall reorders cards by stalled_for_ms desc.
  • board.test.tsx: Stalled (N) chip filters projection; URL updates; combines with other filters.

Out of scope

  • Stall reasons (LLM-generated explanations of why a card is stalled). Separate spec.
  • Auto-pinging the assigned agent when a card crosses 2× threshold. Separate spec.

References

  • Spec: docs/specs/board-rework.md §5 B8.
  • Per-stage thresholds: docs/label-routing.md.
  • B5 already adds stalled_for_ms to the /board response — no further server work needed.

Dependencies

  • Lands after B5. Independent of B1/B2/B3/B4/B6/B7.

Suggested first commit

feat(board): stall highlight (warning/error) + Sort: stall + Stalled filter chip

**As an** operator, **I want** stalled cards to visually fade and flag, **so that** I notice them before they rot another day. `docs/label-routing.md` defines per-stage stall thresholds; the server already computes whether a card is past threshold. The board does not surface this today. This story adds the visual + a sort/filter. ## Acceptance criteria ### Visual - [ ] Cards stalled past their per-stage threshold render with a `border-warning` ring. - [ ] Past 2× the threshold: `border-error` ring + a clock icon to the left of the stall-age text (B5 already shows the text in `text-error`). - [ ] No flicker on threshold crossings — class change is debounced/animated via existing transition tokens. ### Sort - [ ] Per-column header `Sort: [age | stall]` toggle; default `age`. - [ ] `stall` sorts by `stalled_for_ms` desc (most stalled first). - [ ] `age` keeps current sort (status group, then `created_at`). - [ ] Sort choice persists in `localStorage` per column. ### Board-level filter chip - [ ] Toolbar adds a `Stalled (N)` chip that pivots to **only stalled cards** across all columns. - [ ] `N` is the live count of stalled cards in the current projection. - [ ] Chip is dimmed when `N === 0`; click is a no-op. - [ ] Filter combines AND with existing chips (`repo`, `milestone`, `label`, `unassigned`). - [ ] State persists in URL as `?stalled=true`. ### Tests - [ ] `board-card.test.tsx`: warning ring at threshold; error ring + clock icon at 2× threshold. - [ ] `board-column.test.tsx`: `Sort: stall` reorders cards by `stalled_for_ms` desc. - [ ] `board.test.tsx`: `Stalled (N)` chip filters projection; URL updates; combines with other filters. ## Out of scope - Stall reasons (LLM-generated explanations of why a card is stalled). Separate spec. - Auto-pinging the assigned agent when a card crosses 2× threshold. Separate spec. ## References - Spec: `docs/specs/board-rework.md` §5 B8. - Per-stage thresholds: `docs/label-routing.md`. - B5 already adds `stalled_for_ms` to the `/board` response — no further server work needed. ## Dependencies - Lands after **B5**. Independent of B1/B2/B3/B4/B6/B7. ## Suggested first commit `feat(board): stall highlight (warning/error) + Sort: stall + Stalled filter chip`
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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#416
No description provided.