Repository navigation
feat(runner-policy): register ci-workflows v0.56.0 intake contracts - #829
Conversation
Copies the intake-triage (v0.55.0) and intake-label-needs-triage (v0.42.0) entries forward verbatim to 1bb8953644d16f21d10718962c6702f01ea3308a. Both files' git blobs at v0.56.0 equal those at the SHAs the copied entries reviewed; the release changes only pr-require-checks actions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
… contracts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
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. I reviewed all three changed files against
Not verified. I could not run the test suite or the lint because the sandbox required approval for those commands. The PR's reported results (323 passing, the policy lint) are the author's claims, and I did not confirm them. I also did not confirm the git-blob byte-identity table in the PR body, since that needs access to PR body. The body still says "Owner sign-off pending" and describes the README line as "sign-off pending". The README in the diff already says "signed off by hand on 2026-10-21". This is a stale description, not a code problem. The |
|
claude-security-review reviewed Security review: PR #829 (head 65208d6)No security findings. The PR changes three files:
Not verified: I could not fetch the ci-workflows blobs (the API calls needed approval I didn't have). I did not confirm the claim that the two workflow files are byte-identical at v0.56.0 and at the SHAs the copied entries reviewed. The PR's integrity rests on that claim and on the recorded owner sign-off. The policy diff itself adds nothing beyond what was already approved. Because the PR is an allowlist addition for a pinned tag, I did not run the instruction-exception register check: no guardrail is removed or narrowed. |
…832) Refs: melodic-software/ci-workflows#840 Refs: melodic-software/ci-workflows#841 ## Summary Registers ci-workflows [v0.58.0](https://github.com/melodic-software/ci-workflows/releases/tag/v0.58.0) (`5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c`) contracts for `intake-triage.yml` and `intake-label-needs-triage.yml`, so [claude-code-plugins#8800](melodic-software/claude-code-plugins#8800) can repin both intake callers from v0.56.0 (`1bb8953`) to v0.58.0 and intake gets the 401/402 subscription handoff. **Owner review needed.** Unlike #829, `intake-triage` is not byte-identical to the SHA its copied entry reviewed. Its contract surface is unchanged, but its steps changed, so the gate cannot auto-approve it and the copy rests on the review below. The README rollout line says "sign-off pending"; replace it with "signed off by hand on <date>" when you sign off. ## Fix - `components/runner-policy/policy.json`: verbatim copies of the v0.56.0 (`1bb8953`) entries at `5e18f3d6`, for `intake-triage` and `intake-label-needs-triage`. No input, secret mapping, caller permission or routing is added or widened. - `components/runner-policy/README.md`: the v0.58.0 rollout line, sign-off pending. - `components/runner-policy/runner-policy.test.mjs`: a test that both v0.58.0 entries equal their v0.56.0 entries and are the only two keys at that SHA. ### Review basis Git blob SHAs (`git rev-parse <sha>:.github/workflows/<file>`): | File | `1bb8953` (v0.56.0) | `5e18f3d6` (v0.58.0) | |---|---|---| | `intake-label-needs-triage.yml` | `8d274a66` | `8d274a66` | | `intake-triage.yml` | `d79b7e9e` | `8ff8eac3` | `intake-label-needs-triage.yml` is byte-identical, so its copy has the same basis as #829. For `intake-triage.yml`, parsing both versions and comparing them structurally: `on.workflow_call` inputs (except the `cli-version` description), secrets and outputs are identical, as are the top-level permissions and every job's `permissions` and `runs-on`. The two jobs that hold `issues: write`, `apply` and `skipped`, are identical in full. The `claude`, `subscription` and `status` jobs changed (ci-workflows#840, #841). Please review these changes: 1. **CLI default goes from the pinned `2.1.304` to `latest`.** When the caller passes no `cli-version` and sets no `CLAUDE_LANE_CLI_VERSION` variable, run-claude-cli now installs whatever npm resolves as latest at run time, with a Claude credential in its environment ([L200](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L200), [L527](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L527), [L1053](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L1053)). The contract does not model this. It is a supply-chain change. 2. **The subscription token is used in more cases.** The secret mapping is unchanged, but the `subscription` job, which holds `CLAUDE_CODE_OAUTH_TOKEN`, now runs when `handoff == 'true'`: after a credit stop as before, and also when the API refuses the key with status 401 or 402. A 403 stops the run ([L855](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L855)). 3. A new `handoff` job output on `claude` and `subscription` ([L340](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L340), [L866](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L866)). These are job outputs, not `workflow_call` outputs. 4. `fallback-reason: auth` in the subscription job's lane record ([L1295](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L1295)), and a status-job warning and `class=auth` when the key was refused ([L1671](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L1671)). The contract has no allowlist entry for the `skipped-label` input. That was already true at v0.56.0, and this PR leaves it unchanged. ## Verification - `npm run test:runner-policy`: 324 pass, 0 fail, including `✔ both intake contracts at the v0.58.0 tag copy their v0.56.0 entries forward verbatim`. - `npm run lint:runner-policy`: `Runner policy passed.` - End to end, against a temp copy of the claude-code-plugins#8800 worktree's `.github` with both intake callers repinned to `5e18f3d6` (`--repository-visibility public`): - with #8800's vendored `runner-policy.mjs` and policy: two `runner-target-contract` failures, `intake-label-needs-triage` ("carries a reviewed allowedCallerPermissions grant; its steps cannot be proven unchanged by this surface diff, so auto-approval is declined") and `intake-triage` ("inputs changed since the previously reviewed ...intake-triage.yml@182aca3..."), and no others; - with the vendored `runner-policy.mjs` and `--policy` set to this branch's `policy.json`: `Runner policy passed.`; - with this branch's `runner-policy.mjs` and `policy.json`: `Runner policy passed.` - lefthook pre-commit (typos, editorconfig, markdownlint, gitleaks, biome): clean. ## Related - [claude-code-plugins#8800](melodic-software/claude-code-plugins#8800) can repin to v0.58.0 once this merges and syncs. - v0.58.0 also changes `pr-review.yml` and `pr-review-security.yml` (4 lines each). This PR adds no contracts for them. #8800 calls both at v0.55.0 (`3a2c748`), which already has contracts. - Precedent: #829 (v0.56.0 verbatim copies), #828. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…838) Refs: melodic-software/claude-code-plugins#8938 ## Summary Registers ci-workflows [v0.59.1](https://github.com/melodic-software/ci-workflows/releases/tag/v0.59.1) (`8bd4d7f963a06627dd2d551ffcd8d9db5e6b881b`) contracts for `pr-review.yml` and `pr-review-security.yml`, so [claude-code-plugins#8938](melodic-software/claude-code-plugins#8938) can repin both review lanes from v0.55.0 (`3a2c748`) to v0.59.1. **Review: the GitHub Security & Cost session reviews this PR.** The gate cannot auto-approve these entries, so the copies rest on the review below. The README rollout line says "sign-off pending"; replace it with "signed off by hand on <date>" at sign-off. ## Fix - `components/runner-policy/policy.json`: verbatim copies of the v0.55.0 (`3a2c748`) entries at `8bd4d7f9`, for `pr-review` and `pr-review-security`. No input, secret mapping, caller permission or routing is added or widened. The policy entries do not record a credential-reference shape; the gate computes `credentialReferences` from the workflow, so no field changes there. - `components/runner-policy/README.md`: the v0.59.1 rollout line, sign-off pending. - `components/runner-policy/runner-policy.test.mjs`: a test that both v0.59.1 entries equal their v0.55.0 entries and are the only two keys at that SHA. ### Review basis Git blob SHAs (`git rev-parse <sha>:.github/workflows/<file>`): | File | `3a2c748` (v0.55.0) | `8bd4d7f9` (v0.59.1) | |---|---|---| | `pr-review.yml` | `c67ec82b` | `4f3d4e44` | | `pr-review-security.yml` | `1737f82d` | `30b595b9` | `git log 3a2c748f..8bd4d7f9` on the two files lists two commits. The full diff of each file has three hunks and none touches `on.workflow_call`, permissions or `runs-on`: 1. **Credential-bearing steps:** the review step and its fallback step, which receive `CLAUDE_CODE_OAUTH_TOKEN`, move `anthropics/claude-code-action` from `f27be6b65a4652f08a2ba3cff79114829b588967` (v1.0.252) to `5eb090f3c3afd701a0672cd32981197ca27688f6` (v1.0.253) ([ci-workflows#838](melodic-software/ci-workflows#838)). This is the `credentialReferences` diff the gate declines to auto-approve. 2. **Findings count:** the result step raises the review's findings count to the number of `manifest <field>: flag` lines in its summary when the count is lower ([ci-workflows#848](melodic-software/ci-workflows#848)). Model-free script logic, no credential. ## Verification - `npm run test:runner-policy`: 326 pass, 0 fail, including `✔ both review contracts at the v0.59.1 tag copy their v0.55.0 entries forward verbatim`. - `npm run lint:runner-policy`: `Runner policy passed.` - In the claude-code-plugins#8938 worktree (head `5fd71552`), `node .github/standards/runner-policy/runner-policy.mjs --root .`: - with its vendored policy (identical to standards `main`): two `runner-target-contract` failures, "auto-approval declined: credentialReferences changed since the previously reviewed melodic-software/ci-workflows@3a2c748f..." and the same for `pr-review-security.yml`; - with this branch's `policy.json` copied in: `Runner policy passed.` (file restored afterwards). - lefthook pre-commit (typos, editorconfig, markdownlint, gitleaks, biome): clean. ## Related - [claude-code-plugins#8938](melodic-software/claude-code-plugins#8938) passes its runner-policy gate once this merges and syncs. - [ci-workflows#838](melodic-software/ci-workflows#838): the claude-code-action bump. - [ci-workflows#848](melodic-software/ci-workflows#848): the findings-count fix (the v0.59.1 release commit). - Precedent: #832, #829, #828. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Refs: melodic-software/ci-workflows#818
Refs: melodic-software/ci-workflows#819
Summary
Registers ci-workflows v0.56.0 (
1bb8953644d16f21d10718962c6702f01ea3308a) contracts forintake-triage.ymlandintake-label-needs-triage.yml. claude-code-plugins#8800 repins both intake callers to that SHA, and its runner-policy gate fails withrunner-target-contract: the reusable workflow path@SHA has no reviewed runner-input contract (auto-approval declined: ... carries a reviewed allowedCallerPermissions grant; its steps cannot be proven unchanged by this surface diff, so auto-approval is declined)for both.Owner sign-off pending. The README rollout line says "sign-off pending"; replace it with "signed off by hand on " when you sign off.
Fix
components/runner-policy/policy.json:intake-triage.yml@1bb8953: a verbatim copy of the v0.55.0 entry (3a2c748).intake-label-needs-triage.yml@1bb8953: a verbatim copy of the v0.42.0 entry (182aca3), the newest reviewed SHA for that file.components/runner-policy/README.md: the v0.56.0 rollout line, sign-off pending.components/runner-policy/runner-policy.test.mjs: a test that both v0.56.0 entries equal their source entries and that they are the only two keys at that SHA.Byte-identity evidence
Git blob SHA of each file, from
gh api repos/melodic-software/ci-workflows/contents/.github/workflows/<file>?ref=<sha> --jq .sha:182aca33a2c748(v0.55.0)1bb8953(v0.56.0)intake-triage.ymlfa4e86f8d79b7e9ed79b7e9eintake-label-needs-triage.yml8d274a668d274a668d274a66gh api repos/melodic-software/ci-workflows/compare/3a2c748...1bb8953is one commit (ci-workflows#836) touching nine files, all under.github/actions/pr-require-checks/plusREADME.md; neither intake file is among them. Against182aca3, the compare listsintake-triage.ymlas modified (that file's reviewed SHA is3a2c748, not182aca3) and notintake-label-needs-triage.yml.No input, secret, caller permission, or
runs-onrouting changes.Verification
npm run test:runner-policy: 323 pass, 0 fail, including✔ both intake contracts at the v0.56.0 tag copy their reviewed entries forward verbatim. Adding an input to the newintake-label-needs-triageentry makes that test fail.npm run lint:runner-policy:Runner policy passed.--repository-visibility public, worktree not modified):runner-target-contractfailures above, and no others;--policyset to this branch'spolicy.json:Runner policy passed.;runner-policy.mjsandpolicy.json:Runner policy passed.pr-reviewandpr-review-securityat v0.48.0,maintenance-check-links-onlineat v0.55.0). The other v0.56.0 pins are composite actions, which need no contract.Related
🤖 Generated with Claude Code
https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw