You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The heading button queues the shown set instead of starting agents
"Add all X tickets shown below to the AI queue": every unclaimed shown
ticket joins the AI queue exactly as the detail page's Queue action
queues one (#1164), in the shown order, skipping tickets an open entry
already links to. No agent starts — the queue is what the routine drain
fans out over (#1204) and what the queue card's play buttons work one
entry at a time (#855). After a click the button reads "Queued" and
rests until the shown set changes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019vS2EK2vVFJc3oDCtrgShR
Copy file name to clipboardExpand all lines: packages/framework/dashboard/components/TicketsPage.SPEC.md
+8-8Lines changed: 8 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@ The dashboard's Tickets page: every registered project's `tickets/` backlog on o
2
2
3
3
## User story
4
4
5
-
The user wants to see the whole backlog — not one project's slice of it — decide what to work next, and act on a ticket right there: read it, read its plan, have an agent plan it, or have an agent work it. And when the filters have carved out a coherent slice, they want to hand that whole slice to agents at once — one agent per ticket.
5
+
The user wants to see the whole backlog — not one project's slice of it — decide what to work next, and act on a ticket right there: read it, read its plan, have an agent plan it, or have an agent work it. And when the filters have carved out a coherent slice, they want to queue that whole slice for the AI in one click.
6
6
7
7
## Business logic — TL;DR
8
8
@@ -11,7 +11,7 @@ The user wants to see the whole backlog — not one project's slice of it — de
11
11
-**Grouped or flat** - grouped shows one section per project, each with that project's own ticket panel; flat pools every project's tickets into one order, each row naming its project — the only view that can answer which ticket is the highest-priority one anywhere.
12
12
-**Click-to-filter** - clicking a row's topic adds that topic to the filter, clicking its claim marker narrows to claimed tickets; both add to what is already filtered rather than replacing it.
13
13
-**Plan it or work it from the row** - a ticket can be handed to a planning agent or to an unattended work agent without leaving the page.
14
-
-**Spin up the whole shown set** - a button beside the page's heading spins up one unattended agent per shown ticket, via the AI queue: each unclaimed shown ticket is queued (unless it already is) and gets its own agent working that one entry, and the button's label counts the agents one click costs.
14
+
-**Queue the whole shown set** - a button beside the page's heading adds every unclaimed shown ticket to the AI queue (a ticket already queued stays as it is), counting on its label what one click adds; no agent starts — the queue's own consumers do that.
15
15
-**Filtered-away tickets are accounted for** - the page says how many tickets the filters hide and offers to clear them; a project the user deselected disappears silently instead.
16
16
17
17
## Business logic
@@ -74,23 +74,23 @@ The user has decided a ticket is next and wants an agent on it now.
74
74
75
75
Every ticket row offers to start a planning agent for that ticket, and to start an agent that works it. The work agent runs unattended with the ticket named on it, so the agent knows which ticket it is working. Both start in the project the ticket belongs to — in the flat list that is the row's own project, not a page-wide selection — and the dashboard shell is told an agent started so it can show it. A start that fails leaves a message on the page saying the planning agent or the work agent could not be started.
76
76
77
-
### Spin up the whole shown set
77
+
### Queue the whole shown set
78
78
79
79
#### User story
80
80
81
-
The user narrows the backlog to a coherent slice — a topic, a priority band, one project — and wants agents on everything left showing, one agent per ticket, rather than starting the rows one by one.
81
+
The user narrows the backlog to a coherent slice — a topic, a priority band, one project — and wants everything left showing on the AI queue, rather than queueing the rows one by one.
82
82
83
83
#### Business logic
84
84
85
-
Whenever the filters leave at least one unclaimed ticket showing, the page's heading row offers a button that spins up one agent per shown ticket, via the AI queue. For each such ticket, in the shown order: the ticket is queued exactly as the ticket detail page's Queue action queues it — unless an open queue entry already links to it, in which case that entry stands and nothing is written twice — and an unattended agent is started on that one entry, exactly as the AI Queue card's per-entry play button starts one, with the ticket named on the agent. Each agent starts in the project its ticket belongs to, so a shown set spanning projects needs no special case.
85
+
Whenever the filters leave at least one unclaimed ticket showing, the page's heading row offers a button that adds the shown tickets to the AI queue — "Add all X tickets shown below to the AI queue". Each ticket is queued exactly as the ticket detail page's Queue action queues it (the entry links back to the ticket and lands in its priority's section), walked in the shown order so entries within a priority section keep the order the reader saw, and each on its own project's queue, so a shown set spanning projects needs no special case. A ticket an open queue entry already links to is left as it stands — "add" means the set ends up queued, never queued twice. No agent starts: the queue is what the framework's own routine drain fans out over and what the AI Queue card's play buttons start one entry at a time.
86
86
87
-
Claimed tickets — those an agent already holds — are skipped: they are left to the agents holding them, the same rule the daemon's own fan-out follows. The button's label is the spend readout: one agent per ticket, so it counts what one click costs — "Spin up agents working on all X tickets shown below" — and switches to counting unclaimed tickets the moment the shown set contains claimed ones, so it never promises a ticket it will skip; hovering explains the mechanics and says how many claimed tickets are being left alone. With nothing to start — nothing shown, or everything shown claimed — the button is not offered.
87
+
Claimed tickets — those an agent already holds — are skipped: they are being worked, and the label then counts only the unclaimed tickets so it never promises a ticket it will skip; hovering explains the mechanics and says how many claimed tickets are being left alone. With nothing to add — nothing shown, or everything shown claimed — the button is not offered.
88
88
89
-
The dashboard shell is told about one started agent — the first — rather than being bounced through every one. The work stops at the first failure, whose reason lands under the heading in grouped and flat mode alike; everything already queued or started stays.
89
+
Once a click has queued the shown set, the button reads "Queued" and rests; any change to the shown set — a filter, newly arrived tickets — arms it again for the new set. The work stops at the first failure, whose reason lands under the heading in grouped and flat mode alike; everything already queued stays.
90
90
91
91
#### Rationale
92
92
93
-
Routing through the AI queue rather than starting bare agents makes each start durable: a queue entry outlives a failed or interrupted agent, so the routine drain picks up whatever the click could not finish. Reusing an existing open entry matters for the same reason in reverse — a duplicate entry would outlive its agent's check-off as an open entry naming a closed ticket, and the sweep would spend an agent on it. And the label carries the count precisely because the set is a side effect of the filters — the click's cost must be readable before it is paid.
93
+
Queueing rather than starting agents keeps the one click cheap and durable: entries are what the framework already picks up on its own, survive anything that interrupts the work, and spend nothing until an agent actually starts. Skipping already-queued tickets matters because a duplicate entry would outlive its agent's check-off as an open entry naming a closed ticket, costing the sweep an agent.
Copy file name to clipboardExpand all lines: packages/framework/dashboard/components/TicketsPage.test.SPEC.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,7 +6,7 @@ Filtering: searching narrows the rows, updates the shown/total tally beside the
6
6
7
7
Grouping: the flat mode renders one cross-project list ordered across projects, with each row naming its project and no per-project update controls; opening a flat row still identifies its own project and file; and a flat row's start button runs the work agent in that row's own project, unattended, with the ticket named on it.
8
8
9
-
The page-wide spin-up button: each shown ticket is queued the way the ticket detail page queues one (title as the entry, ticket linked, priority picking the section) and gets its own unattended agent started on that one entry with the ticket named on the agent, the shell pointed at the first started agent only; a ticket an open queue entry already links to is not queued twice — its agent is pointed at the existing entry verbatim, and a checked-off entry does not count as queued; claimed tickets are skipped, with the button's label counting only the unclaimed tickets it will start; and the button is absent when nothing is shown or every shown ticket is claimed.
9
+
The page-wide queue-add button: every shown ticket is queued the way the ticket detail page queues one (title as the entry, ticket linked, priority picking the section) and no agent is started; after the click the button reads "Queued" and stays disabled until the shown set changes, when it arms again counting the new set; a ticket an open queue entry already links to is not queued twice, and a checked-off entry does not count as queued; claimed tickets are skipped, with the button's label counting only the unclaimed tickets it will add; and the button is absent when nothing is shown or every shown ticket is claimed.
0 commit comments