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
{{ message }}
Repository navigation
repo-queue: claim can hand out a payload-null task, and list views cannot recover a live claim by lane #5444
On 2026-11-04 ~12:49Z, lane code-u's shift claimed a task from queue repo-health-code-pilot whose payload is null — no kind, no issue, no repo-task/v1 fields. A worker cannot route or work such a packet (the lane's claim loop crashed on payload.get("kind") with AttributeError: 'NoneType' object has no attribute 'get'), and the claim's task id is not recoverable afterwards from the helper's own views:
repo-queue list --status claimed returns only one row (task 8625) despite queue health reporting ~245 claimed.
repo-queue list returns only ~22 rows total.
So a payload-less claim is a dead claim until its lease expires: the worker cannot identify it to park/block/complete it, and no list view surfaces it by lane or recency.
Acceptance
The claim path never hands out a task whose payload fails the repo-task/v1 schema (validate at enqueue and/or claim; quarantine existing payload-less rows so they are not claimable).
repo-queue list can surface a worker's/lane's live claims (filter by lane/worker and status, with a usable limit), so a claim interrupted by a worker crash is recoverable by id before its lease expires.
Evidence
Lane code-u shift starting 2026-11-04T12:24Z; two normal handoffs (task 9347, task 9325) immediately preceded the payload-null claim in the same claim loop.
The two list outputs above were captured in the same shift, minutes after the claim.
Filed by lane code-u per the file-the-issue rule; the unidentified claim itself will fall back to queued when its 2700s lease expires.
Correction from the filing lane (code-u), same shift: the payload-null claim that prompted this issue was not a defective task. After the queue drained for this lane, re-running repo-queue claim returned the identical shape — an all-null row (id: null, payload: null, every field null) — which is the helper's "no task available" sentinel. No claim was lost; there was no task id to recover, and the list-view concern in the original report was chased on that false premise (the list outputs were real, but they were never going to show a claim that did not exist).
What survives of this issue, narrowed:
The no-task sentinel is an all-null task-shaped row, indistinguishable from a malformed task record; it crashed a worker claim loop that parsed payload before checking id. An explicit signal (nonzero exit, empty stdout, or a dedicated status/empty marker) would make "nothing to claim" unambiguous for every consumer.
Worker claim loops must treat the all-null row as "no task" — lane code-u's loop now does (checks id first).
The list-filter/limit behaviour may still be worth documenting, but it is not evidence of an unrecoverable claim. Sorry for the noise in the original framing.
Triage findings (verified fresh 2026-11-05, lane code-t shift):
Original premise already disproven — by the filer. The correction comment on issue repo-queue: claim can hand out a payload-null task, and list views cannot recover a live claim by lane #5444 (dezren39) establishes the "payload-null claim" was the helper's no-task sentinel, not a defective task: no claim was lost and there was no task id to recover. The original acceptance items (payload validation at claim; list views to recover the claim) were chased on that false premise and are NOT the fix path.
The narrowed surviving scope still reproduces. This shift, lane code-t received the all-null sentinel row 5 times (exit 0, every field null, no status/empty marker), interleaved with successful claims of task 9381, task 9896 and task 10041, while fleet queue health showed queued_count 135. "Nothing claimable right now" and "malformed task record" remain indistinguishable in shape — exactly the narrowed complaint.
List recovery works — with a trap.fleet queue list --queue repo-health-code-pilot --status claimed does surface live claims (it listed task 10041 minutes after claim). But fleet queue list --status claimed WITHOUT --queue prints (no tasks), which reads as "no claims exist" rather than "no queue selected" — a related ambiguity folded into the follow-up.
Disposition: follow-up small_fix task 10385 enqueued (queue repo-health-code-pilot): make the claim no-task signal unambiguous (dedicated marker / empty stdout / nonzero exit), keep id-first consumers working, and fix or explicitly document the list no-queue default, with regression coverage for the sentinel shape. Issue #5444 stays open for task 10385.
Expectation: the bound worker session works task 10385 to a terminal queue state and must not claim another task. It revalidates the issue/PR before acting.
Expectation: the bound worker session works task 10385 to a terminal queue state and must not claim another task. It revalidates the issue/PR before acting.
Activity
developing-today commentedon Nov 4, 2026
CODE-1322
dezren39 commentedon Nov 4, 2026
Correction from the filing lane (code-u), same shift: the payload-null claim that prompted this issue was not a defective task. After the queue drained for this lane, re-running
repo-queue claimreturned the identical shape — an all-null row (id: null,payload: null, every field null) — which is the helper's "no task available" sentinel. No claim was lost; there was no task id to recover, and the list-view concern in the original report was chased on that false premise (the list outputs were real, but they were never going to show a claim that did not exist).What survives of this issue, narrowed:
payloadbefore checkingid. An explicit signal (nonzero exit, empty stdout, or a dedicatedstatus/emptymarker) would make "nothing to claim" unambiguous for every consumer.idfirst).The list-filter/limit behaviour may still be worth documenting, but it is not evidence of an unrecoverable claim. Sorry for the noise in the original framing.
dezren39 commentedon Nov 5, 2026
🤖 Agent note · done (triage)
Triage findings (verified fresh 2026-11-05, lane code-t shift):
status/emptymarker), interleaved with successful claims of task 9381, task 9896 and task 10041, whilefleet queue healthshowed queued_count 135. "Nothing claimable right now" and "malformed task record" remain indistinguishable in shape — exactly the narrowed complaint.fleet queue list --queue repo-health-code-pilot --status claimeddoes surface live claims (it listed task 10041 minutes after claim). Butfleet queue list --status claimedWITHOUT--queueprints(no tasks), which reads as "no claims exist" rather than "no queue selected" — a related ambiguity folded into the follow-up.Disposition: follow-up small_fix task 10385 enqueued (queue repo-health-code-pilot): make the claim no-task signal unambiguous (dedicated marker / empty stdout / nonzero exit), keep id-first consumers working, and fix or explicitly document the list no-queue default, with regression coverage for the sentinel shape. Issue #5444 stays open for task 10385.
4 remaining items
developing-today commentedon Nov 5, 2026
🤖 Agent note · handed off
developing-today commentedon Nov 5, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 5, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 5, 2026
🤖 Agent note · handed off
fleet queue claim;fleet queue listno-queue default) — execution-lane assignment returnedopencode, so this task is handed off; the laptop claimant launches the bound opencode session which drives it to its terminal state.dezren39 commentedon Nov 5, 2026
🤖 Agent note · handed off
opencode(repeat handoff, attempt 1/4)dezren39 commentedon Nov 5, 2026
🤖 Agent note · handed off
opencode; handed off to the opencode claimant, which launches the bound session.dezren39 commentedon Nov 5, 2026
Agent note - handed off
ses_e5e5361ad78ffem1o1SGn707qgdezren39 commentedon Nov 5, 2026
Agent note - handed off
ses_e5e5345cfe5ffeYPGrpLbszaGo