Skip to content

feat(runner-policy): register ci-workflows v0.49.0 intake contract - #802

Merged
kyle-sexton merged 2 commits into
mainfrom
feat/runner-policy-intake-v0.49.0
Oct 18, 2026
Merged

kyle-sexton merged 2 commits into
mainfrom
feat/runner-policy-intake-v0.49.0

Conversation

@kyle-sexton

Copy link
Copy Markdown
Member

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 with runner-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 new intake-triage.yml@ff8cd36 entry that copies the v0.45.0 entry (3c8a4b2) and adds three inputs to allowedInputs: issue-number, allowed-author-ids and allowed-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_call

Read from both files at their SHAs (ci-workflows#773 and #774 are the only intake commits in the range):

Input v0.45.0 v0.49.0 Registered here
issue-number absent added yes
allowed-author-ids absent added yes
skipped-label absent added no: no caller passes it (same rule v0.45.0 applied to allowed-bot-sender-ids)
allowed-bot-sender-ids declared, unregistered declared yes: the #7924 caller now passes it

The other seven inputs, the outputs (triage-failed, failure-class) and the one secret are unchanged.

Security note

  • Each new input is a numeric-id allowlist or an issue number. allowed-author-ids and allowed-bot-sender-ids are comma-separated numeric user ids. The job if: rejects an empty list and a leading, trailing or doubled comma, then matches ,<id>, exactly. issue-number is 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.
  • The OWNER or MEMBER author_association gate is replaced by the id allowlist. An opened issue runs only when its author opened it and the author's id is listed (a bot's sender id in the bot list).
  • The workflow_dispatch path is admitted only for an actor whose github.actor_id is in one of the two lists. Only a listed dispatching bot's login reaches allowed_bots.
  • A new skipped job (issues: write, inside the caller's grant) posts a notice and, when skipped-label is set, applies that label after checking it exists. No secret reaches it.
  • No secret, runs-on routing or caller-permission change.

Verification

  • Runner-policy tests: ℹ 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.
  • Against the claude-code-plugins#7924 worktree (fix/7886-intake-author-ids, --repository-visibility public):
    • with its current vendored policy: .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)
    • with --policy set to this branch's policy.json: Runner policy passed.
    • with this branch's runner-policy.mjs: Runner policy passed.
    • That worktree was not modified (--policy flag, no file copy).
  • Pre-commit hooks: typos, editorconfig, markdownlint, gitleaks and biome clean.

Related

🤖 Generated with Claude Code

kyle-sexton and others added 2 commits October 18, 2026 01:24
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>
@kyle-sexton
kyle-sexton marked this pull request as ready for review October 18, 2026 05:42
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-18T05:43:48.002478Z 42cfb09 Draft marked ready
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions

Copy link
Copy Markdown

claude-review reviewed 42cfb09988cfefa7a26b68201dd9aa293e4209dc: 0 finding(s), 0 as inline comments.

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.

  • policy.json: I diffed the new intake-triage.yml@ff8cd36… entry against the v0.45.0 entry (@3c8a4b2…) in the file. It is identical except for the three appended inputs (issue-number, allowed-author-ids, allowed-bot-sender-ids). Secrets and caller permissions are unchanged. I did not check the ci-workflows v0.49.0 workflow_call inputs themselves.
  • runner-policy.test.mjs: The new constant and test are consistent with the earlier v0.45.0 and v0.48.0 tests. The test checks that the new entry equals the v0.45.0 entry plus exactly those three inputs, and that it is the only key at that SHA, so a drifting or duplicate registration would fail it.
  • README.md: The added text continues the existing rollout paragraph. It matches the policy entry: skipped-label stays unregistered, with no secret or runs-on change. It records "signed off by hand on 2026-10-18".
  • PR body (advisory): The body still says "Owner sign-off pending" and asks for that wording to be replaced, but the README now records the sign-off. The body is stale, so refresh it before merging. The body follows the contract (Refs: line plus Summary, Fix, Verification and Related).
  • Not available: Closing issues are none (Refs: only, no Closes). No standards-index paved-path row was checked. The only path-scoped rule file, pr-body-contract.md, is body-format guidance with no paths: match to the changed files.

@github-actions

Copy link
Copy Markdown

claude-security-review reviewed 42cfb09988cfefa7a26b68201dd9aa293e4209dc: 0 finding(s), 0 as inline comments.

No security findings.

The PR registers the ci-workflows v0.49.0 intake-triage contract in components/runner-policy. The diff is policy.json, the README and the test.

  • Pin: the new entry is pinned to the full 40-character SHA ff8cd36321423de961381e608e4a31563e74adb3.
  • Same grant as v0.45.0: I compared it with the v0.45.0 entry. It has the same routing and runnerInput. It has the same single secret, CLAUDE_CODE_OAUTH_TOKEN, and the same caller permissions, contents: read and issues: write.
  • New inputs are narrow: it adds only three inputs, issue-number, allowed-author-ids and allowed-bot-sender-ids. The README says these tighten the author gate to a numeric-id allowlist. The README also says skipped-label stays unregistered, so no caller can set it.
  • Test: the new test asserts the entry equals the v0.45.0 entry plus exactly those three inputs, and that exactly one contract uses that SHA.
  • Instruction surface: no standing instruction or guardrail is deleted or softened.

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.

@kyle-sexton
kyle-sexton merged commit 380e088 into main Oct 18, 2026
39 of 41 checks passed
@kyle-sexton
kyle-sexton deleted the feat/runner-policy-intake-v0.49.0 branch October 18, 2026 05:53
kyle-sexton added a commit that referenced this pull request Oct 21, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant