Skip to content

feat(runner-policy): register ci-workflows v0.56.0 intake contracts - #829

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

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

Conversation

@kyle-sexton

Copy link
Copy Markdown
Member

Refs: melodic-software/ci-workflows#818
Refs: melodic-software/ci-workflows#819

Summary

Registers ci-workflows v0.56.0 (1bb8953644d16f21d10718962c6702f01ea3308a) contracts for intake-triage.yml and intake-label-needs-triage.yml. 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 " 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) 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

🤖 Generated with Claude Code

https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw

kyle-sexton and others added 2 commits October 20, 2026 23:56
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
@kyle-sexton
kyle-sexton marked this pull request as ready for review October 21, 2026 04:21
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 21, 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-21T04:23:35.614391Z 65208d6 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 65208d6ca88e524870d6daf842c2d8187c081912: 0 finding(s), 0 as inline comments.

No findings. I reviewed all three changed files against .claude-lane/pr.diff and the PR context.

  • policy.json: I read the new intake-triage.yml@1bb8953… entry and compared it by eye with the v0.55.0 entry (3a2c748…). Inputs, secrets, role and caller permissions are identical. The new intake-label-needs-triage.yml@1bb8953… entry is identical to the 182aca3… entry. Neither entry broadens a grant or changes routing.
  • Test: The new test checks that each v0.56.0 entry deep-equals its source entry and that exactly two keys exist at that SHA. The constants it uses (REPINE_LANE_SHA_V0_42_0, REPINE_LANE_SHA_V0_55_0) are already defined, and both source entries exist in the policy.
  • README: The rollout line is placed with the adjacent v0.5x paragraphs and matches the policy entries.

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 ci-workflows.

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 Refs: lines and the section layout follow the PR body contract. There are no closing issues, so there are no acceptance criteria to check.

@github-actions

Copy link
Copy Markdown

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

Security review: PR #829 (head 65208d6)

No security findings.

The PR changes three files: components/runner-policy/policy.json, components/runner-policy/README.md and runner-policy.test.mjs. It adds two allowlist entries for the ci-workflows v0.56.0 tag 1bb8953644d16f21d10718962c6702f01ea3308a:

  • intake-triage.yml. It is identical to the existing 3a2c748… (v0.55.0) entry. I compared the two entries line by line. Both have the same routing, allowedInputs, allowedSecrets (the two AUTOMATIONS_* Claude credentials), and contents: read plus issues: write caller permissions.

  • intake-label-needs-triage.yml. It is identical to the existing 182aca3… entry. Both allow runner, label, label-prefix and human-label, take no secrets, and grant only issues: write.

  • Widening: No input, secret, caller-permission or routing widening versus the entries they copy.

  • Pin: The new entries are keyed by a full 40-character commit SHA, not a mutable ref.

  • Test: The new test asserts these entries stay deep-equal to the reviewed ones and that only these two entries exist for the new SHA. It guards against drift.

  • README: It adds prose only and removes or softens no standing instruction.

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.

@kyle-sexton
kyle-sexton merged commit d531f9f into main Oct 21, 2026
24 checks passed
@kyle-sexton
kyle-sexton deleted the feat/runner-policy-intake-v0.56.0 branch October 21, 2026 05:02
kyle-sexton added a commit that referenced this pull request Oct 21, 2026
…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>
kyle-sexton added a commit that referenced this pull request Oct 21, 2026
…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>
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