What happened
Issue #680 (Late switching) met every tier-1 criterion for the backlog loop's autonomous Stage 2 spend — labelled bug, opened by a non-maintainer (ridax67), debug bundle attached, no prior @claude-bot analyze comment — yet Stage 2 never fired. It sat unanalysed until the maintainer asked why.
Evidence
On #680 at open:
- Labels:
bug, bot-analyzed, ready-for-analysis — triage correctly confirmed the debug bundle was received
- Debug bundle attached in the body
- 0 comments — no analyze trigger, and triage never posted its required confirmation comment either
But the project card carried Awaiting: reporter. The rhythm pass suppresses every item whose Awaiting means "someone else owes us" (reporter, upstream, discussion), so #680 never appeared in the rhythm actions — and the autonomous-spend carve-out is only evaluated against items the rhythm surfaces. A stale field therefore silently disables the one path that fires Stage 2 without a human trigger.
Expected vs actual
- Expected: a bug that is labelled
bug, opened by a non-maintainer, with a debug log attached and no prior analyze is fired through Stage 2 automatically, regardless of what the Awaiting field says.
- Actual: the
Awaiting: reporter field (set against the evidence) suppressed the item entirely, so the qualifying bug was never analysed.
Root cause
The Awaiting field is treated as authoritative by the rhythm pass, but it is a board value set by grooming and can go stale relative to the issue's actual state (labels + debug log + comments). The autonomous-spend rule's conditions are checked against the item only if the rhythm surfaces it, so a stale wait value defeats the rule.
Proposed fix (options)
- In
backlog-rhythm.sh, compute the tier-1 carve-out condition from the issue evidence itself (labels, author, debug log, prior analyze) and emit a dedicated action that is NOT suppressible by Awaiting, rather than relying on the item appearing in the normal action list.
- When the rhythm digests an item, reconcile a stale
Awaiting against awaiting_suggested and the label state before applying suppression — a ready-for-analysis bug with a debug bundle and 0 comments is waiting on analysis, not the reporter.
- At minimum, surface a triage action when
Awaiting disagrees with the labels (awaiting_source: board but awaiting_suggested differs), so a human/PO sees the conflict.
Related
What happened
Issue #680 (
Late switching) met every tier-1 criterion for the backlog loop's autonomous Stage 2 spend — labelledbug, opened by a non-maintainer (ridax67), debug bundle attached, no prior@claude-bot analyzecomment — yet Stage 2 never fired. It sat unanalysed until the maintainer asked why.Evidence
On #680 at open:
bug,bot-analyzed,ready-for-analysis— triage correctly confirmed the debug bundle was receivedBut the project card carried
Awaiting: reporter. The rhythm pass suppresses every item whoseAwaitingmeans "someone else owes us" (reporter,upstream,discussion), so #680 never appeared in the rhythm actions — and the autonomous-spend carve-out is only evaluated against items the rhythm surfaces. A stale field therefore silently disables the one path that fires Stage 2 without a human trigger.Expected vs actual
bug, opened by a non-maintainer, with a debug log attached and no prior analyze is fired through Stage 2 automatically, regardless of what theAwaitingfield says.Awaiting: reporterfield (set against the evidence) suppressed the item entirely, so the qualifying bug was never analysed.Root cause
The
Awaitingfield is treated as authoritative by the rhythm pass, but it is a board value set by grooming and can go stale relative to the issue's actual state (labels + debug log + comments). The autonomous-spend rule's conditions are checked against the item only if the rhythm surfaces it, so a stale wait value defeats the rule.Proposed fix (options)
backlog-rhythm.sh, compute the tier-1 carve-out condition from the issue evidence itself (labels, author, debug log, prior analyze) and emit a dedicated action that is NOT suppressible byAwaiting, rather than relying on the item appearing in the normal action list.Awaitingagainstawaiting_suggestedand the label state before applying suppression — aready-for-analysisbug with a debug bundle and 0 comments is waiting on analysis, not the reporter.Awaitingdisagrees with the labels (awaiting_source: boardbutawaiting_suggesteddiffers), so a human/PO sees the conflict.Related