Skip to content

feat(runner-policy): register ci-workflows v0.58.0 intake contracts - #832

Merged
kyle-sexton merged 1 commit into
mainfrom
feat/runner-policy-intake-v058
Oct 21, 2026
Merged

kyle-sexton merged 1 commit into
mainfrom
feat/runner-policy-intake-v058

Conversation

@kyle-sexton

Copy link
Copy Markdown
Member

Refs: melodic-software/ci-workflows#840
Refs: melodic-software/ci-workflows#841

Summary

Registers ci-workflows
v0.58.0
(5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c) contracts for
intake-triage.yml and intake-label-needs-triage.yml, so
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 " 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,
    L527,
    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).
  3. A new handoff job output on claude and subscription
    (L340,
    L866).
    These are job outputs, not workflow_call outputs.
  4. fallback-reason: auth in the subscription job's lane record
    (L1295),
    and a status-job warning and class=auth when the key was refused
    (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

🤖 Generated with Claude Code

Copy the v0.56.0 intake-triage and intake-label-needs-triage entries
forward verbatim to the v0.58.0 tag (5e18f3d6). intake-label-needs-triage
is byte-identical; intake-triage keeps its workflow_call inputs, secrets,
outputs and job permissions and changes only steps and job outputs (the
401/402 subscription handoff and the latest CLI default).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kyle-sexton
kyle-sexton marked this pull request as ready for review October 21, 2026 14:48
@kyle-sexton
kyle-sexton enabled auto-merge (squash) October 21, 2026 14:48
@github-actions

Copy link
Copy Markdown

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

No findings on PR #832.

Checked

  • I read policy.json at both pins. The two new entries (intake-triage and intake-label-needs-triage at 5e18f3d6…) match their v0.56.0 (1bb8953…) entries field for field. That covers inputs, secrets, caller permissions and routing, and nothing is added or widened.
  • The new test compares both v0.58.0 entries with their v0.56.0 entries using deepEqual. It also asserts that exactly those two keys exist at the new SHA. The assertions are sound.
  • The README rollout line is consistent with the policy change. It says the CLI default moves to latest and the subscription job also runs on 401/402.

Could not run

  • I could not run npm run test:runner-policy here because the sandbox required approval. The PR's "324 pass" claim is author-claimed and unverified by me.

For the owner, not a code defect

  • The PR body says the latest CLI default is a supply-chain change that the contract does not model. It also says the 401/402 handoff widens when the subscription token is used. Merging registers intake-triage@5e18f3d6 as an approved contract while the README says "sign-off pending". The author flagged this and asks the owner to replace the line with "signed off by hand on " at sign-off. I raised no finding on it.

Closing issues: none. The PR uses Refs: for ci-workflows#840 and #841, which are in another repo, so the lane had no closing-issue sections to check. The body follows the PR body contract.

@github-actions

Copy link
Copy Markdown

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

Security review: PR #832 (head c6ceb4c)

Result: no security findings. No inline comments were posted.

Scope: The PR touches only components/runner-policy/{README.md,policy.json,runner-policy.test.mjs}. It registers approved reusable-workflow contracts for intake-triage.yml and intake-label-needs-triage.yml, pinned to ci-workflows v0.58.0 (5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c).

What I checked:

  • Both new policy.json entries copy their v0.56.0 entries field for field: routing, allowedInputs, allowedSecrets and allowedCallerPermissions.
  • intake-triage keeps contents: read and issues: write, and the same two secrets (AUTOMATIONS_CLAUDE_API_KEY, AUTOMATIONS_CLAUDE_CODE_OAUTH_TOKEN). intake-label-needs-triage has no secrets and only issues: write. No new input, secret or permission is introduced.
  • The new test uses deepEqual against the v0.56.0 entries and asserts exactly two entries exist for the new SHA, so drift or an extra entry for that SHA would fail it.
  • The pin is a full 40-character SHA, not a mutable tag.
  • The diff deletes no standing instruction, guardrail or allowlist entry, so the instruction-surface lens did not apply.

Limitation: The sandbox denied my attempt to read the ci-workflows repo at 5e18f3d6. I could not confirm that the SHA matches the v0.58.0 tag, that the workflow's inputs, secrets and permissions match the "no interface change" claim, or that the 401/402 subscription handoff behaves as described. The README marks the sign-off as pending, which is the right place for that check. It is a provenance check on the upstream pin, not a flaw in this diff. The instruction exception register was not consulted, because the diff has no instruction-surface deletions.

@kyle-sexton
kyle-sexton merged commit f4294f1 into main Oct 21, 2026
23 checks passed
@kyle-sexton
kyle-sexton deleted the feat/runner-policy-intake-v058 branch October 21, 2026 14:51
@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-21T14:58:18.242784Z c6ceb4c 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.

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