2.8 KiB
2.8 KiB
| title | state | created_at | updated_at | assignee | readiness | risk_flags | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Panel Queue action should allow ready Tickets whose blockers are already queued or in progress | closed | 2026-06-20T05:18:00Z | 2026-06-20T12:27:08Z | null | implementation_ready |
|
Background
Panel ViewModel already treats a ready Ticket as queueable when all blocking relations point at Tickets that are already queued or inprogress. That matches the intended workflow: once prerequisite work is queued/accepted by Orchestrator, dependent ready Tickets should also be queueable so the human does not need to return after every prerequisite completes.
However, pressing Enter in Panel still calls the backend queue_ready gate, and that backend rejected any unresolved relation blocker regardless of blocker state. This caused a ticket conflict even though the UI correctly showed Queue as available.
Concrete example:
00001KVHKWNQSdepends on00001KVHKWNQA.00001KVHKWNQAis alreadyinprogress.- Panel shows
00001KVHKWNQSas queueable. - Enter/Queue fails with backend ticket conflict.
Requirements
- Backend
queue_readymust match the Panel gating rule. - A ready Ticket may transition
ready -> queuedwhen every relation blocker is alreadyqueuedorinprogress. - A ready Ticket must still be blocked when any relation blocker is
planningorready. - This change applies to queueing only.
queued -> inprogressacceptance remains blocked while unresolved dependency/blocker relations exist; Orchestrator must preserve execution order after queueing.
- Existing Panel display behavior should remain aligned with backend behavior.
Implementation summary
- Added backend helper
relation_blocker_allows_queue. - Updated
LocalTicketBackend::queue_readyto filter relation blockers by that helper before rejecting. - Kept
queued -> inprogressrelation blocker validation unchanged. - Added backend test coverage for ready Tickets with queued/inprogress blockers.
- Re-ran existing Panel ViewModel test that already asserted ready+queued dependency appears queueable.
Acceptance criteria
readyTicket withdepends_ontarget inqueuedstate can be queued.readyTicket with incomingblocksblocker ininprogressstate can be queued.readyTicket with dependency/blocker still inplanningremains rejected.- Panel and backend queue behavior are consistent.
- Orchestrator acceptance ordering remains guarded by existing
queued -> inprogressrelation check.
Validation
cargo test -p ticket queue_gate --libcargo test -p tui workspace_panel_allows_ready_ticket_when_relation_prerequisite_is_queued --libcargo check -p ticket -p tuicargo fmtgit diff --check