Repository navigation
fix(source-control): keep a queued lanes App entry whose verdict the sweep cannot read - #12472
Conversation
…ot read The merge job's queued-entry sweep read verify:unreadable as a hold and dequeued the entry. When the job's whole artifact listing failed, it removed lanes App PRs that enable-auto-merge had just armed on a pass verdict, and they cycled in and out of the queue (#12432, #12435 in run 41496022715). The merge queue's own reader refuses an unreadable verdict fail-closed, so the sweep now leaves the entry and does not count it as kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The merge queue's ci-status reads the verdict only for lanes App pull requests and exits before any read for every other author, so keeping every unreadable entry let an adopted pull request merge unread. queued_hold now answers verify:queue-reads only for an unreadable verdict on a lanes App entry (id and Bot type, as ci-status matches it), and the sweep keeps only that one; every other unreadable entry and a crash still dequeue. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
claude-review reviewed Code review: no findings. I read every hunk of all 5 changed files: the changelog fragment, What I checked:
Other checks:
|
|
claude-security-review reviewed Security review: no security issues foundScope. I read every hunk of all 5 changed files: the changelog fragment, What changes. pr-merge's queued-entry sweep normally dequeues a queued entry whose pr-verify verdict it cannot read (
This loosens a merge hold, so I judged it as a possible weakening of a merge hold. Does anything still stop that path? Checked, and yes. The narrowed hold is backed by the merge queue's own check, which fails closed:
So a lanes App entry with an unreadable verdict can no longer be dequeued early, but it still cannot merge without a verdict the queue's reader accepts (or the same trusted head approval that lifted the hold before). The only effect is that the queue may build a merge group that ci-status then fails. That costs CI time, not security. Embedded text: the PR context contains no instructions aimed at the review lane. Spend: none. The PR says the sweep makes the same reads and dequeues fewer entries, which may save merge-group CI runs. critical-findings: 0 |
No related issue: a merge-queue loop the hub found on #12432 and #12435; no new issue is filed while open issues are driven to zero.
Summary
pr-merge's merge job dequeued lanes App PRs that enable-auto-merge had just armed on a pass verdict, so #12432 and #12435 cycled in and out of the merge queue about every 10 minutes:
The cause was in the merge job's queued-entry sweep:
repository artifacts: 1 whole listing never held GitHub's live artifact count.verify:unreadableand dequeued them:"dequeued": {"12432": "verify:unreadable", "12435": "verify:unreadable"}.verify-cache shadow: ... fresh=allow) and armed them again.Fix
babysit_verify_evidence.pyReader.queued_hold: when the verdict read isverify:unreadableand the pull request is the lanes App's, it now answersverify:queue-reads. The App is matched by id andtype == "Bot", the same way ci-status matches it. A lanes App id that cannot be read keepsverify:unreadable.babysit_merge.pyunattended_writes: averify:queue-readsentry stays in the queue and is not recorded as kept, so the next sweep judges it again.entry_hold), the run's own refusal, and its risk score.verify:unreadable(pr-require-checks.yml, the "AND NO FAIL PR-MERGE'S READER COUNTS" step;merge-holds.mjsevidenceHold).Per-run call delta: none. The sweep makes the same reads and dequeues fewer entries. Each avoided cycle saves a merge-group CI run and an arm.
Verification
AnUnreadableQueuedLanesEntryIsLeftToTheQueue(test_babysit_verify_evidence.py): only a lanes App author getsverify:queue-reads. An owner, a non-Bot with the same id, another App, a missing App id and an unreadable App id all keepverify:unreadable. Answering yes for every author fails 5 of its 6 cases.AnUnreadableVerdictKeepsAQueuedEntry(test_babysit_merge_unattended.py): FAIL and unreadable entries dequeue, averify:queue-readsentry stays, and only the passing entry is stored as kept. It fails with the sweep change reverted.test_babysit_verify_evidence.py429 passed,test_babysit_merge_unattended.py298,test_babysit_merge.py143,test_babysit_merge_skip.py22. Pinned ruffcheckis clean.Related
🤖 Generated with Claude Code