feat(board): stall highlight + Sort: stall + Stalled filter chip (B8) #424
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!424
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "dev/416"
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?
Adds stall-awareness to the planner board so operators spot rotting cards before they're missed.
stalled_for_msadded toBoardCard(type + server). Card borders turnborder-warningat per-stage threshold andborder-error+ clock icon at 2×;transition-colorsprevents flicker. Per-columnSort: age | stalltoggle (localStorage-persisted). ToolbarStalled (N)chip filters to only stalled cards, combines AND with existing chips, persists as?stalled=true; dimmed + inert when N = 0.Test plan
board-card.test.tsx— no ring below threshold;border-warningat threshold;border-error+ clock icon at 2× threshold (idle_assigned, running, in_review).board-column.test.tsx— Sort: stall reorders within each status bucket bystalled_for_msdesc; Sort: age restores server order.board.test.tsx—Stalled (N)chip shows count; disabled/no-op at 0; click togglesonly_stalled; filter hides non-stalled cards; count respects repo filter.filter-logic.test.ts—isCardStalled,countStalledCards,only_stalledAND-combine with repo filter.Closes #416
All AC from #416 verified. CI green.
stallBorderClass()correctly gatesborder-warningat threshold andborder-errorat 2×;ClockIconrenders whenisDoubleStalled;transition-colorsprevents flicker ✓board.sort.<type>localStorage key; stall sort appliesb.stalled_for_ms - a.stalled_for_mswithin each status bucket, not across buckets ✓{ ...filters, only_stalled: false }so it reflects the current repo/milestone/label scope (not the already-filtered view);disabled+opacity-40at N=0;?stalled=trueURL persistence wired correctly inhandleFilterChange✓stalled_for_msadded to shared type with JSDoc and all four card construction sites on the server ✓filter-logic.test.ts✓Nit:
STALL_THRESHOLD_BY_STATUS.queued(30 min) is dead — the server hardcodesstalled_for_ms: 0for queued cards (no queue-entry timestamp available). Fine to leave as self-documenting intent for a future follow-up.