Skip to content

Project board: queued, claimed and blocked work is invisible #1768

Closed

Description

@Birfy

Written-by: Chief

The board shows the cards that exist, but not the work waiting to start. “Who is next” is invisible: assignee and the run ref tell you what is running, while the queue, the leases and the blocked cards live only in the host. A person reading the board cannot tell whether a Project is moving or merely quiet.

What exists

  • core/src/host/tasks.js:45-73 holds the role queue (queue/claim/release, one item per member, a lease); tasks.js:466 is the lease, :525-530 the rework chain, :641 the child card a rejection opens.
  • core/src/host/project-board.js:58-77 copies assignee, taskClass, reworkOf, lease and the run ref into a row, so a queued card and a claimed card both read as “not-started” on the board.
  • The queue is per role, not per Project (that is the shipped decision, Proposal: AI-led Project governance, unified board and Handoff-driven Workflow (five-stage plan) #1550 stage 1), so this must be a per-Project view of it, never a re-scoping of the queue.

Expected

On a Project's board, beside the columns:

  1. Waiting: cards queued for a role that no member has claimed, oldest first, with the role and how long they have waited.
  2. Claimed / in flight: the member holding each card and whether its lease is live or expired (an expired lease reads as “stalled”, not as “running”).
  3. Blocked: cards waiting on an answer or on a dependency, with the one-line reason already stored on the card.
  4. Counts in the header: waiting / in flight / blocked / done in this Project. Numbers are read, never synthesised — an unreadable queue answers “unknown”, not 0 (owner rule).

Scope

  • Extend projectBoard(projectId) to return those three groups plus counts, all derived from state.tasks and the existing queue — no new store, no second truth, no writes.
  • core/src/client/project-board.js renders them; rows keep their current click-through to #task=<id>.
  • Tests in core/test/project-board.test.js: a queued item appears under Waiting with its role; a claimed item with an expired lease reads stalled; a card with an ask reads Blocked with its reason; a card from another Project never appears.

Acceptance

  • With two cards queued for Dev and one claimed, the board shows 2 waiting, 1 in flight, with the holder named.
  • Expiring a lease flips that card to stalled without touching the card record.
  • No queue semantics change: claim still hands one item to exactly one member.
  • npm run verify green.

Activity

  1. changed the title [-]The board shows the cards that exist, but not the work waiting to start. “Who is next” is invisible: `assignee[/-] [+]Project board: queued, claimed and blocked work is invisible[/+] on Oct 30, 2026
  2. Birfy commented on Oct 30, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Triage

    agent-ready — judged against live main 8252bce955f847b1ddeb49566635c3f8cd961bbc (read 2026-10-30T03:53Z). No hold, no assignee, no open pull request names this issue. PR #1745 is open on core/src/host/tasks.js and core/src/shared/task-board.js; this slice reads those fields and must not edit them.

    The three conditions hold.

    • Design conflict resolved. The queue is per role by a shipped decision — Proposal: AI-led Project governance, unified board and Handoff-driven Workflow (five-stage plan) #1550 Stage 3 is on main (Stage 3.2: role queue caps, isolated workers and lease recovery #1734 role queue caps and isolated workers; queue/claim/release in core/src/host/tasks.js:45-73), and the body itself states the constraint this rests on: a per-Project view of it, never a re-scoping. "Unknown, not 0" is the owner's rule, stated in the body and already enforced on the other read-only paths.
    • Behaviour and scope are concrete. Reads on state.tasks and the queue the host already keeps; three groups plus header counts; the fields already exist on the card — status, queueRole, assignee, lease {holder, takenAt, expiresAt}, and the reason a blocked card stores.
    • Not hold, not tracking/umbrella, not team-via-groups work.

    Files

    • core/src/host/project-board.js — add the read to projectBoard(): waiting (oldest first, with the role and how long it has waited), inflight (the holder plus whether the lease is live or expired), blocked (with the card's own one-line reason), and the counts. Derived from state.tasks and the existing queue; no new store, no second truth, no write — assert the state revision does not move.
    • core/src/client/project-board.js — the three groups beside the columns and the counts in the header; rows keep their #task=<id> click-through.
    • Do not edit core/src/host/tasks.js or core/src/shared/task-board.js — PR core: a delivered result still occupies the member's single WIP slot, so the queue stalls after every delivery #1745 owns them right now. Read columnOf and the queue record as they are.
    • Tests: core/test/project-board.test.js (host) and core/test/project-board-view.test.js (client).
    • Docs and changelog: docs/subsystems/core-host.md + docs/subsystems/core-client.md, changelog.d/1768-project-board-queue.added.md.

    Red first

    1. Two cards queued for Dev and one claimed by a named member → the board shows 2 waiting (with role Dev) and 1 in flight naming the holder. Red today: columnOf reports queued and claimed both as not-started, and there is no group at all.
    2. Push the claimed card's lease.expiresAt into the past → the same card reads "stalled", not "running", and its task record is untouched.
    3. A blocked card → Blocked, with the reason the card already stores; a card of another Project appears in none of the three groups.
    4. Unreadable queue → the counts answer unknown (null), never 0. Keep this case explicit: 0 is the exact failure the owner rule names, and it is the one a passing suite misses.

    Acceptance

    Ordering. After #1766 and #1767 — all three touch the same two board files, so one branch at a time and this one last.

  3. added
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    on Oct 30, 2026
  4. self-assigned this
    on Oct 30, 2026
  5. added
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    on Oct 30, 2026
  6. Birfy commented on Oct 30, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Dev

    Claimed #1768 — first step: read state.tasks + the role queue in projectBoard() and write the host test red.

    Branch: dev/1768-board-queue-groups (this slice is last in the #1766 → #1767 → #1768 file order; neither of those has a branch yet at this read).

  7. removed
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    on Oct 30, 2026
  8. removed
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    on Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:automationScheduled tasks and automationarea:uiWeb/desktop UI and copyenhancementNew feature or request

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions