Skip to content

feat(tasks): first-level TASKS board (workspace-wide Kanban)#209

Merged
Fullstop000 merged 8 commits into
mainfrom
feat/tasks-board
May 24, 2026
Merged

feat(tasks): first-level TASKS board (workspace-wide Kanban)#209
Fullstop000 merged 8 commits into
mainfrom
feat/tasks-board

Conversation

@Fullstop000
Copy link
Copy Markdown
Owner

First-level TASKS sidebar destination: a live, workspace-wide Kanban of all agent tasks by status, with a "Needs me" filter that cross-links into the Decision Inbox. Closes #208.

Design (spec: docs/superpowers/specs/2026-05-23-tasks-sidebar-board-design.md)

  • Observational — agents drive status (claimer-gate untouched); the human acts via existing open/assign affordances. No drag, no human status-override endpoint.
  • Membership-scopedlist_workspace_tasks(workspace_id, viewer_id) only returns tasks in channels the viewer is a member of (IDOR-safe; a workspace-only filter would leak DMs/private channels — caught in design review).
  • Poll, not push — board + sidebar share a react-query key and poll GET /api/w/{id}/tasks every ~10s (per-channel events can't drive a workspace-wide board without a new topic).
  • No schema change — reuses tasks + a correlated decisions subquery for the cross-link.
  • "Needs me" = blocked · open decision · in_review without a reviewer. Same predicate on server (item_needs_me) and client (isNeedsMe).

What's here

  • Backend: Store::list_workspace_tasks + GET /api/w/{id}/tasks{ tasks, needsMeCount }.
  • Frontend: /tasks route, TasksBoard page (5 columns, Needs-me toggle), first-level sidebar entry + badge.

Review + verification

  • Design reviewed by Gemini pre-plan (IDOR + poll-not-WS + drop-stale folded in).
  • End-of-branch review (opus): no blockers; trimmed dead payload fields + guarded bucketByStatus against a non-canonical status (follow-up commit).
  • Gates green: cargo test (incl. 3 new tests: membership-scope, board+needsMeCount, membership-IDOR) · cargo clippy -D warnings · cargo fmt --check · tsc --noEmit · vitest 141 · vite build.
  • Live dogfood (agent-driven card move) in progress.

🤖 Generated with Claude Code

Fullstop000 and others added 8 commits May 24, 2026 00:20
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Review follow-up: drop attempts/assigneeName/subChannel*/lastProgressAt from the
board payload (nothing renders them; last_progress_at stays in the query's WHERE/
ORDER only); guard bucketByStatus against a non-canonical status.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Gemini review nit: NULL last_progress_at (brand-new todo tasks) sorted to the
bottom of their column under DESC; coalesce to created_at so untouched tasks
float to the top.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- CHANGELOG: first-level TASKS board (#209)
- VERSION: 0.18.1 -> 0.19.0

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@Fullstop000 Fullstop000 merged commit 4e4727f into main May 24, 2026
3 checks passed
@Fullstop000 Fullstop000 deleted the feat/tasks-board branch May 24, 2026 05:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

First-level TASKS sidebar destination (agent-work triage surface)

1 participant