Repository navigation
feat(pr-pipeline): hold lanes App human-merge pull requests with a label only a listed person lifts - #11036
Conversation
…bel only a listed person lifts report-outcome labels a pull request it holds for a person human-merge-hold right after it opens or reuses it, and closes and retries one it cannot label (hold-label-failed). A new ci-status step fails while the label is on and, once it is off, unless the first removal at or after its newest add was a trusted-actor human acting directly. enable-auto-merge, the merge queue's labelHolds and the babysit merge lane hold the label too, so deleting the body's hold line or rewriting Refs to Closes no longer lets a held pull request merge. Closes #9437 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…comments 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 I found nothing to block or flag in this change. I read the whole diff (14 files) and the PR context, and I ran no tests myself. The author's test counts are theirs and unverified. Closing issue #9437 (checked against its acceptance criteria):
Spot checks
Cost: there is no billing change. Reports of the unverified label creation are the author's own note: the first labels POST is expected to create Minor, not counted as a finding: if the label write fails, report-outcome closes the PR even when it only reused an existing open one. A retry is a safe fallback, so I did not flag it. |
|
claude-security-review reviewed Security review of #11036 at a221573. I found no security issues. No critical-findings: 0 This change adds a hold; it widens nothing. I read the whole change to each trust-control file on the trusted-path list:
Cost: none. The only added spend is one extra labels API write per held PR. |
…th-holds switch (owner Q16) #11036 turns report-outcome's hold into a human-merge-hold label that ci-status enforces, so its denied-path match is a path hold too: with merge.diff-check.path-holds absent or false it denies no path; an unreadable config still holds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes #9437
Summary
A lanes App pull request that holds for a person said so only in its body (
Hold: a human merges this), which the App can edit. report-outcome now also labels ithuman-merge-hold, and ci-status fails while that label is on and unless a person on the trusted-actor list removed it. The coordinator chose a dedicated label (option a) over reusingneeds-humanunder the owner's standing direction, because the lanes App adds and clearsneeds-humanitself (report-escalation, clear-escalations), so counting itsneeds-humanas a hold would turn ci-status red after every automatic clear.Fix
report-outcome.mjs: plans carryhold; a held PR getshuman-merge-holdright after it opens, or when the run reuses its open PR. A PR the label cannot reach (after the resend) is closed and the issue retried under the newhold-label-failedstop route.pr-require-checks.ymlci-status: new stepFail a human-merge hold a listed person has not lifted. It fails while the label is on. Once the label is off, it fails unless the first removal at or after the newest add (by any account) came from ahumanon the base trusted-actor list, matched by numeric id and not made through an App. It reads no other step's outcome, so neither the human-gated step nor a cost decision lifts it, and it fails closed on unreadable labels, events or actor list.enable-auto-merge.mjsHOLD_LABELS,merge-holds.mjslabelHolds(the merge queue) andbabysit_merge_policy.MERGE_HOLD_LABELShold the label.gate-source.mjsis unchanged: option (a) leaves theneeds-humanhold-bot list alone, so there is nothing to mirror there.Verification
scripts/ci-hold-human-merge.test.shagainst main's workflow fails with no such step.node --testover.github/scripts/pr-mergeand.github/scripts/work-resolve-issue: all pass. Thescripts/ci-hold-*.test.shsuites: 384 pass, 0 fail (23 new). The babysittest_merge_holds_sync.py,test_babysit_merge_policy.pyandtest_babysit_merge_prefilter.pysuites pass.actionlintis clean, andscripts/check-affected.shpassed 15 checks.Each refined criterion (intake refinement, 2026-10-26), and what meets it under option (a):
human-merge-hold; report-outcome.test.mjs "main labels a held PR human-merge-hold right after it opens" and "... it reuses"labeledevent as a holdhuman-merge-holdas a holdholdReasonreturnsit carries human-merge-holdLeft out: the issue's refined criteria still name
needs-human; amending them is the owner's call. The label is not created in the repository by this PR. The first labels POST is expected to create it (UNVERIFIED).Related
🤖 Generated with Claude Code