Repository navigation
fix(work-resolve-issue): stop holding a reuse PR only because its runner checks did not report - #10701
Conversation
…ner checks did not report A reuse PR whose runner checks or leak scan did not report got `Hold: a human merges this`. That line fails ci-status, so pr-verify never ran and the hold could only be lifted by a person. mustHold now writes it only for a failed runner check, a leak scan that found something, and the trust reasons; enable-auto-merge's pr-verify and security-review gates and ci-status check the head as for every lanes App PR. Refs: #10610 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…is not clean The leak-scan hold on a reused branch is the owner's security decision, so this change must not loosen it. mustHold holds a reuse PR on any scan word but "clean" (found, failed, missing or unread), and the unreported scan line again says a person merges it. Only runner checks that did not report stop holding a PR on their own. The docs and changelog fragment say so, and the tests pin both sides. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…k-gap-hold-clears-on-pass
… that found something This reverts 0a118a1. A lane leak scan that did not report is already covered by a required, deterministic control: the merge needs ci-status, which needs lint-repo and its gitleaks scan, and both fail closed on any non-success. The mustHold comment, the docs and the changelog fragment now give that reason in place of the auto-merge arming gate. A new test pins the cases: a missing scan does not hold, while a found scan and a failed check do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…k-gap-hold-clears-on-pass
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-security-review reviewed Security review: #10701 (
|
|
claude-review reviewed No findings. I read the whole diff, the PR context, and
The change only narrows when the hold line is written. It does not touch the There is no closing issue (the PR says |
lint-repo's gitleaks scan does not cover what the lane's reuse scan (scanLeak) flags: it honors a gitleaks:allow comment or .gitleaksignore the branch itself can add, its generic-api-key rule needs 10+ word-class characters at entropy 3.5 where scanLeak flags 8+ of any non-quote character, and it reads only the commits' patches, not every changed file's bytes. So a reuse PR holds again on any scan word but clean. Runner checks that did not report still hold nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…k-gap-hold-clears-on-pass
|
The pr-verify verifier failed head This pull request leaves the merge queue, and ci-status holds it out while it carries |
…k-gap-hold-clears-on-pass
Post-merge mutation testingKilled 0, survived 0, timeout 0, no coverage 0, invalid 0, not run 5.
The run's summary has the full report. |
Refs: #10610
Summary
A
work-resolve-issuePR gotHold: a human merges thiswhen the runner's checks did not report. #10610 is an example. That line failsci-statusitself: the merge-holds step reports "its body holds it" on run 40732056082. pr-verify then never runs, becausepr-verify.ymlruns only on apr-require-checksrun that concludedsuccess(pr-verify.yml:73-74). So nothing a lane does could ever lift the hold, and the PR waited on a person for checks CI runs anyway.Runner checks that did not report are covered:
ci-statusreruns them on the head. The reuse leak scan is not covered that way, so it keeps holding on any word butclean.lint-repo's gitleaks honors agitleaks:allowcomment or.gitleaksignorethe branch itself can add. Its generic-api-key rule needs 10+ word-class characters at entropy 3.5, wherescanLeakflags 8+ of any non-quote character. It also reads only the commits' patches, not every changed file's bytes (464a7e6).Fix
mustHoldinreport-outcome.mjs, reason by reason:humanMerge(trustedmerge: human)clean(found,failed, unknown, missing, or no checks record)cleanscan: no runner check reportedBoolean(checks?.results.some(({ exit }) => exit !== 0)) || (reused && checks?.scan !== "clean"), in place of!checks || checkFailures(checks).length > 0 || (reused && checks.scan !== "clean").Left out: ...; ci-status, pr-verify and the security review lane check the head before it merges.(report-outcome.mjs:825).HOLD_LINEtext is unchanged, so every reader (ci-status,enable-auto-merge, check-wip-cap, fix-ci-dispatch, apply-patch) treats the remaining holds as it did.docs/conventions/pr-pipeline/README.md(trust hold section) andpr-run-activity.md(reuse hold conditions). Changelog fragment.changes/pr-pipeline/.Verification
report-outcome.test.mjs: 285 pass, 0 fail. ThemustHoldtest (report-outcome.test.mjs:3294) pins: a clean reuse does not hold; on a reuse, scan missing, checks and scan missing, scanfailedand scanfoundeach hold; a failed check holds; a reuse with a clean scan and no runner check reported does not hold; no reuse with runner checks missing does not hold.test_merge_holds_sync.py: 14 passed.python3 -I scripts/sync-hold-floor.py --checkexits 0.check-changelog-fragments.sh --check: valid.Left out:
needs-humanlabel. This change affects PRs opened after it merges.Related
mustHold)🤖 Generated with Claude Code