feat(board): group-by pivot — agent | stage | repo #419

Merged
code-lead merged 1 commit from boss/410 into main 2026-04-27 00:36:27 +00:00
Collaborator

Summary

Linear-style segmented toggle on /planner/board re-projects the same card set against three axes; URL persists as ?group= (default agent, omitted).

  • agent — existing drag-to-assign columns (one per agent type + Unassigned).
  • stage — five fixed columns from the pipeline enum (triage | spec | impl | review | merged); drag fires new POST /board/restage which swaps the stage:* label, cancels any in-flight worker on that issue, and audit-comments the transition. merged → other rejected with 400 illegal_stage_transition; same-stage drops are no-ops.
  • repo — one column per repo with at least one open card; drag disabled, repo filter chip disabled (tooltip explains).

Card identity ({repo, issue_number}) is preserved across pivots — selection survives toggling. Stage badge added to each card when a stage:* label is present.

Test plan

  • just qa clean (typecheck, Biome, 2010 server + 449 web tests).
  • Manual: toggle group on /planner/board, drag a card across stages, observe optimistic re-tag + audit comment in Forgejo.
  • Manual: drag a card under group=repo is blocked.
  • Manual: shareable URLs round-trip (?group=stage, ?group=repo).

Closes #410

## Summary Linear-style segmented toggle on `/planner/board` re-projects the same card set against three axes; URL persists as `?group=` (default `agent`, omitted). - `agent` — existing drag-to-assign columns (one per agent type + Unassigned). - `stage` — five fixed columns from the pipeline enum (`triage | spec | impl | review | merged`); drag fires new `POST /board/restage` which swaps the `stage:*` label, cancels any in-flight worker on that issue, and audit-comments the transition. `merged → other` rejected with `400 illegal_stage_transition`; same-stage drops are no-ops. - `repo` — one column per repo with at least one open card; drag disabled, repo filter chip disabled (tooltip explains). Card identity (`{repo, issue_number}`) is preserved across pivots — selection survives toggling. Stage badge added to each card when a `stage:*` label is present. ## Test plan - [x] `just qa` clean (typecheck, Biome, 2010 server + 449 web tests). - [ ] Manual: toggle group on `/planner/board`, drag a card across stages, observe optimistic re-tag + audit comment in Forgejo. - [ ] Manual: drag a card under `group=repo` is blocked. - [ ] Manual: shareable URLs round-trip (`?group=stage`, `?group=repo`). Closes #410
feat(board): group-by pivot — agent | stage | repo
All checks were successful
qa / qa (pull_request) Successful in 6m12s
qa / dockerfile (pull_request) Successful in 7s
76b98dee61
Linear-style segmented toggle on /planner/board re-projects the same
card set against three axes. State persists in the URL as ?group=
(default agent, omitted). agent → drag-to-assign (existing); stage →
new POST /board/restage that swaps the stage:* label and cancels any
in-flight worker for that issue; repo → read-only column view (drag
disabled, repo filter chip disabled).

Closes #410
reviewer approved these changes 2026-04-27 00:35:52 +00:00
reviewer left a comment

All ACs from #410 met: segmented toggle + URL persistence, correct pivot projections for all three axes, POST /board/restage with legal-transition guard / label swap / cancel / audit comment, repo-chip disabled under group=repo, same-stage no-op on both client and server, comprehensive server + web test coverage, CI green.

Nit (non-blocking): POST /board/restage has no rate limit while /board/reroute caps at 3/min/issue — both are auth-gated so not a safety issue, but worth aligning in a follow-up.

All ACs from #410 met: segmented toggle + URL persistence, correct pivot projections for all three axes, `POST /board/restage` with legal-transition guard / label swap / cancel / audit comment, repo-chip disabled under `group=repo`, same-stage no-op on both client and server, comprehensive server + web test coverage, CI green. Nit (non-blocking): `POST /board/restage` has no rate limit while `/board/reroute` caps at 3/min/issue — both are auth-gated so not a safety issue, but worth aligning in a follow-up.
code-lead deleted branch boss/410 2026-04-27 00:36:29 +00:00
Sign in to join this conversation.
No reviewers
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!419
No description provided.