Repository navigation
ci: judge ci-status's hold labels and kill switch by merge-holds.mjs - #10876
Conversation
ci-status's queued-pull-request label step now runs the base checkout's merge-holds.mjs labelHolds (and humanGatedLabel), the lanes App step's kill switch runs its switchHold, and the human-gated step resolves its label with humanGatedLabel, so each rule is stated once. The error texts are unchanged; a base module that is missing or cannot judge fails closed. Closes #10835 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. |
…le did The bash label resolution ran jq on any non-empty tracker file, so one holding only blanks failed closed; the node snippets trimmed it to no config and fell back to needs-human. Only an empty file now means none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
claude-security-review reviewed I read the whole diff and checked it against critical-findings: 0 Trust controls read. The change touches the
Spend. The change adds no paid-plan, billing or lane-run spend. Manifests. The diff touches no plugin manifest. |
|
claude-review reviewed No findings. I read the full diff and checked it against
|
|
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=10876 -f activity=resolve-conflicts |
Closes #10835
Hold paths. This changes
.github/workflows/pr-require-checks.yml, which is on the hold-path floor. No hold is loosened: every state that failed ci-status before still fails it, and a base module that cannot judge fails closed.Summary
Fail a queued pull request carrying a hold labelstep now judgesdo-not-merge, the human-gated label andpr-verify-failedwith the base checkout'smerge-holds.mjslabelHolds, and names the human-gated label with itshumanGatedLabel. Before this, the step had its own bash copy of those rules.Fail a lanes App pull request its body or a member holdsnow runs the base module'sswitchHold.Fail a pull request carrying the human-gated label(pull_request) resolves its label withhumanGatedLabeltoo. That is the third copy of the label-name rule, and with it switched the label and kill-switch rules are stated once, inmerge-holds.mjs. select-tests'queueHoldsalready uses them.Fix
base_configsparse checkout of the base commit (.github/scripts/pr-merge/merge-holds.mjswas already in that checkout). It is never loaded from pull request code.::error::, before any further read:argv[1]of the inlinenode -e.merge-holds.mjsruns itsmainwhenargv[1]is its own URL, and its usage error would then set exit code 2.reconcile.test.mjskeys on the kill-switch text, so its pin now checks that the step printsswitchHold's reason and thatswitchHold's reason still carries theKILL_SWITCH_NOTEthe reconciler matches.gh_read(issues/N/labels), and the pull is still read throughpr_read. Thepr_readscope set in perf(ci): fail held merge-queue pull requests before the lanes run #10838 (pull, labels, events) is untouched, and comments, reviews and runs are still read live.Verification
gh_read,pr_read,read3,read_apiorgh apicall site (git diff -U0 | grep -cE 'gh_read|pr_read|read3|read_api|gh api'on the changed lines prints 0). The stubbed step bodies log the same calls as before:ci-hold-merge-group76/0,ci-hold-human-gated55/0,ci-lanes-pr-hold240/0,ci-hold-lifted-by,ci-hold-pr-unblock-status,ci-early-queue-holds,ci-hold-cost-decision,ci-gh-read,ci-review-lanes,workflow-self-paths,check-lane-coverage.test.sh,check-lane-coverage.sh --check,merge-holds.test.mjsandreconcile.test.mjsall pass.actionlintpasses on the workflow, with shellcheck on PATH, andshellcheckpasses on the three test scripts.merge-holds.mjswere killed:labelHolds;humanGatedLabelignoring the tracker;switchHoldnever holding;switchHoldignoringCLAUDE_LANES_REPO_DISABLED.ci-review-plugin-source.test.sh,resolve-config/callers.test.mjs) touch these steps. CI runs the full selected corpus.Related
labelHolds,switchHoldandqueueHolds. This switches ci-status to them, now that the base carries them.🤖 Generated with Claude Code