feat(board): force-kick stuck cards from the UI (#609) #614
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!614
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "boss/609"
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
POST /board/kick— operator escape hatch that bypasses the/task/:id/redispatch409 gate when the dispatch chain wedges on an idle card whose previous task already succeeded.task_historyrow, falling back to the current Forgejo assignee, and dispatches throughdispatchIssueForAgentso theimplement → address-reviewpivot fires automatically when the linked PR has outstandingchanges_requestedat its head SHA.tone="error",Zapicon) on the board side panel with a confirm dialog and success toast; invalidatesboard+historyqueries on success.Why
Closes #609. The triggering case: a
changes_requestedreview didn't fire the address-review dispatch, so the card sat idle withsuccessas its last task status./task/:id/redispatchrefused with 409 ("task already succeeded") andCancelwasn't visible (no running task). No way out from the UI without a backend SQL poke.Implementation notes
implementoraddress-review) and agent type so the Forgejo trail records every kick — the handler probes for outstanding REQUEST_CHANGES separately so the comment stays honest about whatdispatchIssueForAgentwill do internally.KickDepsmirror the existingRestageDepspattern so unit tests run with stubbed Forgejo + dispatcher.Test plan
apps/serverunit tests (12 new): happy path (implement),address-reviewpivot, assignee fallback,@operatoractor fallback, 400 / 404 / 410 / 503 error paths, 3-per-60s rate limit.apps/websmoke tests (2 new): confirm dialog gates the click; cancel button leaveskickCarduntouched; success toast surfaces the abbreviated task id.bun x turbo run typecheck— green.bun x @biomejs/biome@^2 check .— only pre-existing unrelated infos.bun x turbo run test— 2661 server tests + 44 web tests pass.🤖 Generated with Claude Code
Dispatch logic, skill pivot, rate-limiting, audit comment, and UI all correct. AC fully met.
Nit (non-blocking):
resolvedFromcould be typed"task_history" | "assignee"rather than... | nullat the console.log — null is unreachable there. No action needed.