Repository navigation
feat(runner-policy): register ci-workflows v0.49.0 intake contract - #802
Conversation
intake-triage at ff8cd36 copies its v0.45.0 entry and adds issue-number, allowed-author-ids and allowed-bot-sender-ids. skipped-label stays unregistered because no caller passes it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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. I reviewed all three changed files in this PR. I did not run the test suite or the runner-policy command; the PR body's pass counts are author-claimed and unverified.
|
|
claude-security-review reviewed No security findings. The PR registers the ci-workflows v0.49.0
I read the diff and the v0.45.0 entry only. I did not check the upstream workflow at the pinned SHA, so I can't confirm the README's description of the new gate. |
…829) Refs: melodic-software/ci-workflows#818 Refs: melodic-software/ci-workflows#819 ## Summary Registers ci-workflows [v0.56.0](https://github.com/melodic-software/ci-workflows/releases/tag/v0.56.0) (`1bb8953644d16f21d10718962c6702f01ea3308a`) contracts for `intake-triage.yml` and `intake-label-needs-triage.yml`. [claude-code-plugins#8800](melodic-software/claude-code-plugins#8800) repins both intake callers to that SHA, and its runner-policy gate fails with `runner-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 <date>" 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`: | File | `182aca3` | `3a2c748` (v0.55.0) | `1bb8953` (v0.56.0) | |---|---|---|---| | `intake-triage.yml` | `fa4e86f8` | `d79b7e9e` | `d79b7e9e` | | `intake-label-needs-triage.yml` | `8d274a66` | `8d274a66` | `8d274a66` | `gh api repos/melodic-software/ci-workflows/compare/3a2c748...1bb8953` is one commit ([ci-workflows#836](melodic-software/ci-workflows#836)) touching nine files, all under `.github/actions/pr-require-checks/` plus `README.md`; neither intake file is among them. Against `182aca3`, the compare lists `intake-triage.yml` as modified (that file's reviewed SHA is `3a2c748`, not `182aca3`) and not `intake-label-needs-triage.yml`. No input, secret, caller permission, or `runs-on` routing 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 new `intake-label-needs-triage` entry makes that test fail. - `npm run lint:runner-policy`: `Runner policy passed.` - Against the claude-code-plugins#8800 worktree (`--repository-visibility public`, worktree not modified): - with its vendored policy: the two `runner-target-contract` failures above, and no others; - with `--policy` set to this branch's `policy.json`: `Runner policy passed.`; - with this branch's `runner-policy.mjs` and `policy.json`: `Runner policy passed.` - Every other ci-workflows reusable that #8800 calls stays on a SHA that already has a contract (`pr-review` and `pr-review-security` at v0.48.0, `maintenance-check-links-online` at v0.55.0). The other v0.56.0 pins are composite actions, which need no contract. - lefthook pre-commit (typos, editorconfig, markdownlint, gitleaks, biome): clean. ## Related - [claude-code-plugins#8800](melodic-software/claude-code-plugins#8800) passes its runner-policy gate once this merges and syncs. - Precedent: #828 (v0.55.0 verbatim copies), #811, #802. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Refs: melodic-software/claude-code-plugins#7924
Summary
Registers ci-workflows v0.49.0
intake-triage.yml(ff8cd36321423de961381e608e4a31563e74adb3) in runner policy. claude-code-plugins#7924 repins its intake caller to that SHA, and its runner-policy gate fails today withrunner-target-contract: ... no reviewed runner-input contract (auto-approval declined: inputs changed since the previously reviewed ...intake-triage.yml@182aca3...).Owner sign-off pending. The README rollout paragraph says "sign-off pending"; replace that with "signed off by hand on " when you sign it off, then mark this ready.
Fix
components/runner-policy/policy.json: a newintake-triage.yml@ff8cd36entry that copies the v0.45.0 entry (3c8a4b2) and adds three inputs toallowedInputs:issue-number,allowed-author-idsandallowed-bot-sender-ids. Secrets (CLAUDE_CODE_OAUTH_TOKEN) and caller permissions (contents: read,issues: write) are unchanged.components/runner-policy/README.md: the rollout paragraph for v0.49.0, sign-off pending.components/runner-policy/runner-policy.test.mjs: a test that the v0.49.0 entry is exactly the v0.45.0 entry plus those three inputs, and that it is the only v0.49.0 key.Input diff, v0.45.0 to v0.49.0
workflow_callRead from both files at their SHAs (ci-workflows#773 and #774 are the only intake commits in the range):
issue-numberallowed-author-idsskipped-labelallowed-bot-sender-ids)allowed-bot-sender-idsThe other seven inputs, the outputs (
triage-failed,failure-class) and the one secret are unchanged.Security note
allowed-author-idsandallowed-bot-sender-idsare comma-separated numeric user ids. The jobif:rejects an empty list and a leading, trailing or doubled comma, then matches,<id>,exactly.issue-numberis checked against^[1-9][0-9]{0,9}$in a "Resolve the issue" step, read from the API, and refused when it is a pull request.author_associationgate is replaced by the id allowlist. Anopenedissue runs only when its author opened it and the author's id is listed (a bot's sender id in the bot list).workflow_dispatchpath is admitted only for an actor whosegithub.actor_idis in one of the two lists. Only a listed dispatching bot's login reachesallowed_bots.skippedjob (issues: write, inside the caller's grant) posts a notice and, whenskipped-labelis set, applies that label after checking it exists. No secret reaches it.runs-onrouting or caller-permission change.Verification
ℹ tests 314,ℹ pass 314,ℹ fail 0, including✔ intake-triage at the v0.49.0 tag copies its v0.45.0 entry and adds only the author-gate inputs.node components/runner-policy/runner-policy.mjs --root .in this repository:Runner policy passed.fix/7886-intake-author-ids,--repository-visibility public):.github/workflows/intake-triage.yml#intake-triage: runner-target-contract: the reusable workflow path@SHA has no reviewed runner-input contract (auto-approval declined: inputs changed since the previously reviewed melodic-software/ci-workflows/.github/workflows/intake-triage.yml@182aca3ad32b79fd002def94e58eb498ac49e7af)--policyset to this branch'spolicy.json:Runner policy passed.runner-policy.mjs:Runner policy passed.--policyflag, no file copy).Related
🤖 Generated with Claude Code