Repository navigation
feat(pr-pipeline): turn path-based merge holds off behind one switch (owner Q15) - #11058
Conversation
…(owner Q15) merge.diff-check.path-holds, default false: no changed path holds a pull request for its path alone in the pr-merge lane (babysit risk scorer's high-path:/review-path: holds, enable-auto-merge's hold paths, ci-status's merge-holds step). True restores them. Cost, unsafe-path, manifest, trusted-actor, body, veto and do-not-merge holds stay. Skipped holds are named in the gate report and the lane logs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g with path holds off With merge.diff-check.path-holds off, enable-auto-merge also lifts a standing risk refusal whose every code is a path hold. The live-config risk tests and the ci-status step test now read the switch; docs qualify the path floor. 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-security-review reviewed Incremental security review of ecb0f1b against a1f05af. I reviewed only the two changed changelog fragments, The change is prose only. Both fragments move
critical-findings: 0 |
|
claude-review reviewed Incremental review of the two change files edited since a1f05af. I found nothing to report. The edit changes I did not check how the release tooling handles a This change only edits release-note text, so it has no cost or security impact. I did not re-review the rest of the PR, which is unchanged since the last review. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e0f35b2187
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
The pr-unblock lane stopped
When a retry on this head can change the outcome, the lane runs one on its own, up to its per-head cap, and edits this comment if it stops again; a run that does not stop clears the status. When no retry can (a review thread the lane does not take or settle, or a failing check after the retries are spent), a person resolves the threads or gets the checks green, then dispatches the workflow below: that run finds the cause gone and clears the status. On a pull request the lanes App opened, the dispatchers start that run once per stop; on any other, a person does. A new commit to the branch starts clean. To run it again on this head now, dispatch the gh workflow run pr-unblock.yml -R melodic-software/claude-code-plugins -f pr-number=11058 -f activity=resolve-conflicts |
…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>
|
claude-security-review holds this pull request for a person (critical-security) at The change weakens the pr-merge lane's path-based merge holds: claude-lane: claude-security-review |
The new default turns off holds an existing denied-paths config relied on, so both fragments move to bump: major under Changed with a migration note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No related issue: owner decision Q15 (owner-decisions.md:11)
Owner, verbatim (Q15, 2026-10-29): "We shouldn't really have any path restrictions at all... like that is just bullshit friction", then "We can go in and harden later".
Owner, verbatim (scope confirmation): "I want no paths to start so things just go through... we can harden once we get our issues to 0 and PRs to 0"
Owner, verbatim (Q16, no globs kept): "No fucking path restrictions"
Hardening trigger: once open issues = 0 and open PRs = 0, turn path holds back on by setting
merge.diff-check.path-holds: trueindocs/conventions/pr-pipeline.yaml. The default stays off.Summary
This PR adds one switch,
merge.diff-check.path-holds(boolean, defaultfalse). It sits besidedenied-pathsandhigh-path-floor, the other path switches of the pr-merge lane undermerge.diff-check. While it is off, a changed path no longer holds a lanes PR just because of the path. Setting it totruebrings back every hold exactly as it was. The hold code and the floor tables (FLOOR_CLASSES,HOLD_PATH_CLASSES,hold_patterns) are unchanged. The switch is read only at the points where the holds are decided. The babysit gate reads it at both the base commit and the default-branch head, and holds when either saystrue. ci-status reads it from the base commit. So a PR cannot turn off its own hold.merge.person-helddoes not exist on main. It existed only on the superseded #10966 (lane-arm attestation) branch, so there was nothing to remove.Fix
Sites the switch disables (file:line at the head):
babysit_risk.py:2194-2221:_scoremoves everyis_path_holdreason intoRiskResult.skipped. That covershigh-path:<floor or configured glob>andreview-path:<glob>.RiskInput.path_holdsis at:207.babysit_merge_policy.py:640, 885, 934, 1049, 1125, 1196: thePipelineConfig.path_holdsfield, how it is read, the stricter-of-base-and-main rule, and validation.babysit_merge.py:3567: passes the switch to the pr-merge lane only. The local babysit lane keeps every path hold.babysit_verify_evidence.py:2472passes it to enable-auto-merge's reader.merge-holds.mjs:389-418(pathHold,pathHoldsOf,readPathHolds,pathHoldKind, i.e. theHOLD_PATH_FLOORmatch) and:1313-1318(holds). The CLI at:1605-1618readsPATH_HOLDS.enable-auto-merge.mjs:1219(decide) and:1519(no lifter read for a path that no longer holds).:648-680lifts a standing refusal that names only hold paths, for example "it changes .github/scripts/pr-merge/clear-escalations.mjs, a hold path". It also lifts a risk refusal whose every code is a path hold, and needs no approval for either. The lift goes through the existingliftBlockerchecks.pr-require-checks.yml:5585-5591: ci-status's merge-holds step reads the switch frompr-pipeline.yamlatBASE_SHAand passes it asPATH_HOLDS. This step is separate fromhold_patterns.report-outcome.mjsheldPaths(Q16): after feat(pr-pipeline): hold lanes App human-merge pull requests with a label only a listed person lifts #11036 (human-merge-hold label), report-outcome's denied-path match becomes a label that ci-status enforces. So with the switch off it denies no path. An unreadable config still holds.pr-pipeline.yaml:1093-1101setspath-holds: false. The schema adds the key, and the README documents it.Measurability (§9, Q15's skipped-hold count): the gate report lists each skipped hold under
risk.pathHoldsSkipped. enable-auto-merge and merge-holds.mjs each log onepath holds are off (merge.diff-check.path-holds), so nothing holds it for this: <reason>line per PR.Kept holds (not path restrictions):
do-not-merge, body holds and member vetoesCOST_PATHS/cost-review-required)trust-gate:), a content checkhigh-path:**, the unsafe or aliasing path check. It covers symlinks and segments such as..,:or non-ASCII characters that could alias a cost or other path.Not changed:
hold_patterns),.github/trust-path-hold.jsonand the ci-workflows trust-paths. Another lane owns them, and they still apply.head-movedon the next push.Verification
.github/scripts/pr-merge/clear-escalations.mjs, and one changing a floor workflow, gets no path hold in the risk scorer, the gate, enable-auto-merge, the merge-holds CLI or the ci-status step testdo-not-merge, body holds andhigh-path:**still holdpath_holds=True/path-holds: true. The live-config tests assert that this repository's config has the switch off.pytest plugins/source-control/skills/babysit-prs/scripts/tests: 3561 passed.node --test .github/scripts/pr-merge: 653 passed..github/actions/resolve-config: 750 passed (the schema validates the live config).scripts/ci-lanes-pr-hold.test.sh: 246 passed. The other ci-status hold tests (early-queue, human-gated, merge-group, cost-decision, review-lanes, pr-unblock-status) all pass.ci-lanes-pr-hold.test.sh246 passed,ci-hold-human-merge.test.sh23 passed.enable-auto-merge.mjsat the twodecide()calls. I kept main'swholeReview(fix(pr-merge): request a whole review for a lanes PR's review-path hold #10999) and this PR'spathHolds. fix(pr-merge): request a whole review for a lanes PR's review-path hold #10999 clearsreview-path:holds and adds no hold of its own. feat(pr-pipeline): hold lanes App human-merge pull requests with a label only a listed person lifts #11036's label hold is not path-based, except for the denied-path match covered above.scripts/sync-hold-floor.py --check: exit 0. test_merge_holds_sync.py is green.Related
🤖 Generated with Claude Code