Repository navigation
feat(claude-lanes): repin only the ci-workflows paths a release changed - #884
Conversation
repin-callers.sh apply now moves a ci-workflows pin only when the target release changed what it runs: the reusable workflow file, anything under the composite action directory, or a path either reaches through a commit-relative `$/` action or `./.github/workflows/` nested workflow. It decides from one cached compare per distinct pinned SHA. It fails closed and moves every pin at that SHA when the file list is at the 300-file cap, or when a non-test, non-README, non-docs/ file that no pinned path reaches changed. apply --root <dir> runs the same tool against any repository's tracked .github/ callers, so consumer repins stop being hand edits. The standards lane's invocation is unchanged. The lockstep plans only pins apply moved and no longer rewrites callers itself, so an unchanged reusable pin needs no contract copy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DpzEJAE4EMndcWQXiKSZYn
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 No security findings in the incremental change ( I reviewed the three changed files. I read
No trusted-path globs or plugin manifests are in the diff, and no standing instruction is deleted, narrowed or softened. I did not consult the instruction-exception register, because the diff doesn't touch an instruction surface. critical-findings: 0 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b7f175541e
ℹ️ 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".
|
claude-review reviewed No findings in the incremental change (e13ee5b..ca1b758). I could not run the tests: the sandbox required approval for
|
…ins on the release The runner-policy convergence test now requires every caller of one upstream path to share a revision, since a selective repin can leave the code-review and security-review callers on different ones. apply gives a fallback-form pin already on the release SHA the tag form, as the full rewrite did, and hands lockstep the release SHA when a run only relabels. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DpzEJAE4EMndcWQXiKSZYn
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 forrepins.
Evidence:
v0.65.12...v0.65.13compare changed only.github/workflows/pr-review-cli.ymland
.github/scripts/pr-review-cli.test.cjs.uses:lines: intake-triage, the
run-claude-cli,apply-claude-managed-settingsandreport-lane-outcomecomposites, and pr-review-cli.(4 intake runs on ci(lanes): repin the Claude lane callers to ci-workflows v0.65.11 claude-code-plugins#10147).
Fix
repin-callers.sh applynow decides eachmelodic-software/ci-workflows/<path>@<sha>refseparately:
compare/<pinned>...<release>, cached for therun. 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 (
behindordivergedin this direction) is left as is.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 isread once from the release, transitively. intake-triage, for example, runs
$/.github/actions/run-claude-cliandreport-lane-outcome, so a change to those movesintake-triage too.
more files (the documented cap), or it changed a file that is not a test (
*.test.*),not a
README.md, not underdocs/, and not reached by any pin (for example a shared.github/scripts/*.cjsorschemas/). That is today's behavior.# vX.Y.Zcomment. The version note lists what moved and what stayed.--root <dir>runs the same tool against any repository. It discovers everygit-tracked
.github/YAML file that pins ci-workflows, so a consumer checkout such asclaude-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, enumeratedcallers) is unchanged. The apply step now gets
GH_TOKEN, because it callsghon anyday a new release resolves.
repin-policy-lockstep.mjsplans only the pins apply moved, so an unchanged reusable pinkeeps 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 newSHA, 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.jsonsemantics 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:
pr-review-cli.ymlchanged moves only that ref, with one compare call;everything;
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 twonew tests (only moved pins are planned;
settleLockstepleaves an unmoved caller pinalone) fail against the previous script.
bash harness/shell/run-tests.sh components/claude-lanes/claude-lanes.test.shandnode --test components/runner-policy/runner-policy.test.mjs(355): pass.shellcheck --rcfile .shellcheckrc, biome, actionlint and zizmor on the changed files:clean.
.github/from before #10151 (442 files, 47 pins):lane pins were at v0.65.11, and
v0.65.11...v0.65.13also changedschemas/lane-outcome.v1.schema.json, so they fail closed exactly as #10151 movedthem. The v0.55, v0.58 and v0.59 pins fail closed on
.github/scripts/*.cjsand.claude/rules/*.md.pr-review-cli.ymllines move, and the other 45 stay byte-identical.
Consumer command, from any directory with an authenticated
gh,jq, GNU sed and bash4.4 or newer:
resolvewritestag,shaanddateto the output file.applyleaves the moved pinsin the consumer's working tree and writes
changed,old-sha,old-tagsandversion-note.Related
workflow-modified 403 by the full repin).
README.mdanddocs/by owner decision: lanes may load other.mdfiles as instructions, so a change to one can change what a pin runs.🤖 Generated with Claude Code
https://claude.ai/code/session_01DpzEJAE4EMndcWQXiKSZYn