Ruling
"188 would be really easy to solve, the producer can just put the 'vet' tag on it and take off 'needs work'" — thedavidmeister, 2026-08-17. This is the spec, not a proposal.
The case
rainlanguage/rain.erc4626.words#188 is green, CLEAN, MERGEABLE, and its rework has already landed. The producer verified that itself, in run 20260817T000148Z, and said so in the run summary:
Green + CLEAN + MERGEABLE. The rework had already landed at head; verified independently rather than relayed — branch 0 behind main, pointers genuinely regenerated (both hashes moved, 2-line net diff), copy-artifacts green, soldeer import violation fixed. No push needed.
It is still labelled ai:needs-work. That is a false claim about the PR: it does not need work, it needs vetting.
Why the state does not self-correct
NeedsWorkState::WorkOrder is derived from the LABEL plus a trusted send-back instruction. It never asks whether the work has already been done — a question vettedAtHead (verdict's pinned sha vs current head) already answers, and which unvetted computes for the vetter.
So the producer re-dispatches the PR every run, spends an item reaching the same conclusion, and leaves the state exactly as it found it. #188 cost $0.28 that run to establish a fact nothing recorded.
The label is only retired by the vetter's record_verdict. That is deliberate — a send-back pins its verdict AT the head so vetted_at_head is true and the vetter does not immediately strip the label it just wrote. The intended sequence is: label persists → producer pushes → head moves → vetter re-vets → label clears.
#188 breaks that sequence because the rework landed in an earlier run, so there is no push left to make. The producer has verified the exit condition and has no transition that expresses it.
Scale
Run 20260817T000148Z reported the fleet as 215 open PRs, 78 rework-needs-work, and called that "the largest actionable class". An unknown fraction of those 78 are #188s — already done, needing only a vetter pass. The count as reported overstates the actionable class by that fraction, and every one of them generates a producer item per run until the vetter's own 5-item budget reaches it. At 76 to vet and 5 per run, that window is days, not minutes.
What to build
A producer transition for "verified already done": take ai:needs-work off and put the vet tag on.
Mechanically the removal is what makes the PR vettable — the vetter's state-load has no needs-work skip bucket (skipHumanDecided, skipVettedAtHead, skipOpenThreads, skipBlockedOn, skipArchivedRepo, and no needs-work equivalent), so #188 enters the vet queue as soon as the label is gone. The vet tag is carrying LEGIBILITY: today "is this vettable" requires comparing two shas, so a human reading the queue cannot see why the producer keeps picking a PR up.
Constraints this must satisfy:
pr-review-report is the only transition function (CLAUDE.md). This is a subcommand, not a prompt instruction to run gh --add-label, which binds to nothing.
- The claim must be checked by the tool, not asserted by the model. "Already done" means the head has moved past the trusted verdict's pinned sha AND the PR is green and mergeable. A producer that could assert it in prose could retire a send-back it had not satisfied.
- The vetter stays the authority. It re-vets the moved head and re-applies
ai:needs-work if the work is in fact incomplete. This transition asserts "not the producer's move right now", never "this PR is good".
- Do not mint a second source of truth for vettability. Un-vetted-at-head is derived and cannot drift; if the new tag ever contradicts it, the derived fact wins and the divergence is the bug (QA-GUIDE §7).
Acceptance
- A producer run that verifies a needs-work PR's rework has already landed retires
ai:needs-work through a typed transition, and the PR appears in the next vetter state-load.
- The same run does NOT retire the label where the head has not moved past the verdict, or where the PR is red or conflicting.
#188 specifically: labels move, and the next vetter run records a verdict on it.
Ruling
"188 would be really easy to solve, the producer can just put the 'vet' tag on it and take off 'needs work'" — thedavidmeister, 2026-08-17. This is the spec, not a proposal.
The case
rainlanguage/rain.erc4626.words#188is green, CLEAN, MERGEABLE, and its rework has already landed. The producer verified that itself, in run20260817T000148Z, and said so in the run summary:It is still labelled
ai:needs-work. That is a false claim about the PR: it does not need work, it needs vetting.Why the state does not self-correct
NeedsWorkState::WorkOrderis derived from the LABEL plus a trusted send-back instruction. It never asks whether the work has already been done — a questionvettedAtHead(verdict's pinned sha vs current head) already answers, and whichunvettedcomputes for the vetter.So the producer re-dispatches the PR every run, spends an item reaching the same conclusion, and leaves the state exactly as it found it.
#188cost $0.28 that run to establish a fact nothing recorded.The label is only retired by the vetter's
record_verdict. That is deliberate — a send-back pins its verdict AT the head sovetted_at_headis true and the vetter does not immediately strip the label it just wrote. The intended sequence is: label persists → producer pushes → head moves → vetter re-vets → label clears.#188breaks that sequence because the rework landed in an earlier run, so there is no push left to make. The producer has verified the exit condition and has no transition that expresses it.Scale
Run
20260817T000148Zreported the fleet as 215 open PRs, 78 rework-needs-work, and called that "the largest actionable class". An unknown fraction of those 78 are#188s — already done, needing only a vetter pass. The count as reported overstates the actionable class by that fraction, and every one of them generates a producer item per run until the vetter's own 5-item budget reaches it. At 76 to vet and 5 per run, that window is days, not minutes.What to build
A producer transition for "verified already done": take
ai:needs-workoff and put the vet tag on.Mechanically the removal is what makes the PR vettable — the vetter's state-load has no needs-work skip bucket (
skipHumanDecided,skipVettedAtHead,skipOpenThreads,skipBlockedOn,skipArchivedRepo, and no needs-work equivalent), so#188enters the vet queue as soon as the label is gone. The vet tag is carrying LEGIBILITY: today "is this vettable" requires comparing two shas, so a human reading the queue cannot see why the producer keeps picking a PR up.Constraints this must satisfy:
pr-review-reportis the only transition function (CLAUDE.md). This is a subcommand, not a prompt instruction to rungh --add-label, which binds to nothing.ai:needs-workif the work is in fact incomplete. This transition asserts "not the producer's move right now", never "this PR is good".Acceptance
ai:needs-workthrough a typed transition, and the PR appears in the next vetter state-load.#188specifically: labels move, and the next vetter run records a verdict on it.