Repository navigation
ci(lanes): repin the Claude lane callers to ci-workflows v0.65.11 - #10147
Conversation
Moves the review, intake, pr-run-activity, pr-unblock and pr-verify callers to e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 (ci-workflows#889), and passes run-claude-cli's log-file to report-lane-outcome where the caller wires the two actions itself, so the lane-outcome record carries token usage and rate-limit windows. 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 No findings. This is a pin bump of the Claude lane callers to ci-workflows v0.65.11 ( What I checked in the diff:
|
|
claude-security-review reviewed No security findings. critical-findings: 0 This PR repins the Claude lane callers to ci-workflows v0.65.11 (
|
…ed (#884) Refs: melodic-software/claude-code-plugins#10151 ## Summary Owner decision (2026-10-25): a ci-workflows repin moves only the pinned paths a release actually changed, not every pin, and the existing repin tool (`components/claude-lanes/repin-callers.sh`) stays the single source of truth for repins. Evidence: - The `v0.65.12...v0.65.13` compare changed only `.github/workflows/pr-review-cli.yml` and `.github/scripts/pr-review-cli.test.cjs`. - Even so, the consumer repin melodic-software/claude-code-plugins#10151 rewrote 21 `uses:` lines: intake-triage, the `run-claude-cli`, `apply-claude-managed-settings` and `report-lane-outcome` composites, and pr-review-cli. - Each needless move forces runner-policy contract PRs for job-level reusable workflows. - Each needless move also fails lane runs already in flight with a workflow-modified 403 (4 intake runs on melodic-software/claude-code-plugins#10147). ## Fix `repin-callers.sh apply` now decides each `melodic-software/ci-workflows/<path>@<sha>` ref separately: - **One compare per distinct pinned SHA**, `compare/<pinned>...<release>`, cached for the run. The same response feeds the downgrade fence and the file list. The fence is unchanged in meaning: a fallback-form pin the release does not contain (`behind` or `diverged` in this direction) is left as is. - **Moved**: the release changed the reusable workflow file, anything under the composite directory (tests included), or a path the pin reaches through a commit-relative `uses:`. Those are a step-level `$/<dir>` action or a job-level `./.github/workflows/<file>` nested workflow, the two forms runner-policy diffs. Each is read once from the release, transitively. intake-triage, for example, runs `$/.github/actions/run-claude-cli` and `report-lane-outcome`, so a change to those moves intake-triage too. - **Fail closed**, moving every pin at that SHA, in two cases: the compare lists 300 or more files (the documented cap), or it changed a file that is not a test (`*.test.*`), not a `README.md`, not under `docs/`, and not reached by any pin (for example a shared `.github/scripts/*.cjs` or `schemas/`). That is today's behavior. - **Unchanged pins stay byte-identical.** Moved pins get the release SHA with the `# vX.Y.Z` comment. The version note lists what moved and what stayed. - **`--root <dir>`** runs the same tool against any repository. It discovers every git-tracked `.github/` YAML file that pins ci-workflows, so a consumer checkout such as claude-code-plugins repins with this tool instead of hand edits. The rename map is read from beside the script. The standards lane's invocation (no `--root`, enumerated callers) is unchanged. The apply step now gets `GH_TOKEN`, because it calls `gh` on any day a new release resolves. `repin-policy-lockstep.mjs` plans only the pins apply moved, so an unchanged reusable pin keeps its existing contract and needs no contract copy. Its own caller rewrite (`rewriteCallerFiles`) is removed: it rewrote every pin in its target files to the new SHA, which would have undone the selective repin, and apply already rewrites those files. Its two unit tests go with it. Out of scope and unchanged: no runner-policy contract rule is loosened, nothing auto-admits a secret-bearing runner-input contract, and `components/runner-policy/policy.json` semantics are untouched. ## Verification Run from the worktree root: - `bash harness/shell/run-tests.sh components/claude-lanes/repin-callers.test.sh`: pass, 161 assertions (the existing 129 plus 32 new). New cases: - only `pr-review-cli.yml` changed moves only that ref, with one compare call; - a shared-script change moves all refs; - a composite-directory change moves only that composite; - a composite reached through a nested workflow moves the reusable; - an inert-only change moves nothing, while the same files at the 300-file cap move everything; - two distinct SHAs cost two compares; - the standards lane's own invocation moves only the changed lane caller. - Mutation check: forcing every decision to `move`, dropping fail-closed, dropping reach, dropping the cap, dropping the compare cache, counting tests, or dropping the directory prefix rule each turns new cases red. Inverting the fence statuses turns 20 assertions red. - `node --test components/claude-lanes/repin-policy-lockstep.test.mjs`: 23 pass. The two new tests (only moved pins are planned; `settleLockstep` leaves an unmoved caller pin alone) fail against the previous script. - `bash harness/shell/run-tests.sh components/claude-lanes/claude-lanes.test.sh` and `node --test components/runner-policy/runner-policy.test.mjs` (355): pass. - `shellcheck --rcfile .shellcheckrc`, biome, actionlint and zizmor on the changed files: clean. - End to end against the live v0.65.13 compare on a copy of claude-code-plugins' `.github/` from before #10151 (442 files, 47 pins): - Real snapshot: 46 of 47 pins move, because none of the pinned SHAs is v0.65.12. The lane pins were at v0.65.11, and `v0.65.11...v0.65.13` also changed `schemas/lane-outcome.v1.schema.json`, so they fail closed exactly as #10151 moved them. The v0.55, v0.58 and v0.59 pins fail closed on `.github/scripts/*.cjs` and `.claude/rules/*.md`. - Synthetic variant with every pin set to v0.65.12: only the two `pr-review-cli.yml` lines move, and the other 45 stay byte-identical. Consumer command, from any directory with an authenticated `gh`, `jq`, GNU sed and bash 4.4 or newer: ```bash GITHUB_OUTPUT=/tmp/repin.out bash <standards-checkout>/components/claude-lanes/repin-callers.sh resolve melodic-software/ci-workflows GITHUB_OUTPUT=/tmp/repin.out bash <standards-checkout>/components/claude-lanes/repin-callers.sh apply <tag> <sha> <date> --root <consumer-checkout> ``` `resolve` writes `tag`, `sha` and `date` to the output file. `apply` leaves the moved pins in the consumer's working tree and writes `changed`, `old-sha`, `old-tags` and `version-note`. ## Related - Refs melodic-software/claude-code-plugins#10147 (in-flight intake runs failed with a workflow-modified 403 by the full repin). - The inert set stays tests, `README.md` and `docs/` by owner decision: lanes may load other `.md` files as instructions, so a change to one can change what a pin runs. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01DpzEJAE4EMndcWQXiKSZYn --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Refs: melodic-software/ci-workflows#889
Summary
Repins every Claude lane caller to ci-workflows
v0.65.11
(
e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8), so the lane-outcome recordcarries each leg's token usage and subscription rate-limit windows
(ci-workflows#889).
Fix
pr-review-hosted.ymlandpr-review-security-hosted.yml(pr-review-cli.yml, from v0.65.9) andintake-triage.yml(from v0.65.10). In v0.65.11 those reusables passlog-filetoreport-lane-outcomethemselves. No input, secret orpermission changes.
pr-run-activity-read.yml,pr-run-activity-write.yml,pr-unblock.ymlandpr-verify.ymlmoverun-claude-cli,report-lane-outcomeandapply-claude-managed-settingsfrom v0.65.0 (
d02b8697). Between those SHAs the three actions change onlyby claude-config: audit-instructions — add step-list-culling eval case (absorb candidate from audit-model-fit) #889: the new optional
log-fileinput and a usage warning.pr-run-activity-read.ymlandpr-verify.ymlwirerun-claude-clitoreport-lane-outcomethemselves, so their report steps now pass the leg'slog-file.pr-run-activity-write.ymlreports on aclaude-code-actionleg, whichwrites no run-claude-cli log. It gets the pin only, so its record gains no
usage or windows.
pr-unblock.ymlhas no report-lane-outcome step. It gets the pin and theusage warning only.
callers.test.mjsadds e5167fc2 to the launchers checked to pass--permission-prompts none(lane.cjs:357-358at that SHA). Thereplay.mjspin,ci-review-lanes.test.shandci-review-plugin-source.test.shmove with it.Verification
node --test .github/actions/resolve-config/callers.test.mjs: 182 pass, 0 fail.node --test .github/scripts/pr-verify/probe/parity.test.mjs .github/scripts/pr-verify/probe/replay.test.mjs: 24 pass, 0 fail.bash scripts/ci-review-lanes.test.sh: 88 pass, 0 fail.bash scripts/ci-review-plugin-source.test.sh: 10 pass, 0 fail.bash scripts/check-changelog-fragments.sh --check-required origin/main: no fragment-mode plugin changed, so none is required.Related
🤖 Generated with Claude Code