Skip to content

feat(runner-policy): register the intake-triage contract on the intake funding role - #863

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

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

Conversation

@kyle-sexton

Copy link
Copy Markdown
Member

No related issue: lane-funding roles plan (D)5, owner-approved 2026-10-24.

Summary

Registers intake-triage.yml@b0ecc273abe492d12f2efa98ee4741a84c219ed2 on the intake funding role, so claude-code-plugins' intake caller can read INTAKE_CLAUDE_API_KEY and INTAKE_CLAUDE_CODE_OAUTH_TOKEN instead of the AUTOMATIONS_* pair.

Fix

A contract carries one role, and its caller must pass that literal (runner-policy.mjs, the role check in the reusable-call audit). Changing the v0.65.0 entry in place would fail runner-policy on claude-code-plugins' sync PR, whose caller still passes role: automations. So this adds a contract at a new SHA and leaves the v0.65.0 entry until the caller repins, as the v0.51.0 registration did.

b0ecc27 is ci-workflows main, one commit past v0.65.0 that changes only docs/conventions/source-control/commit-convention.yml (git diff v0.65.0 b0ecc27 -- .github is empty). It is untagged, so the caller pin takes the pin-comment convention's fallback form. The entry is the v0.65.0 entry with role: intake and the two INTAKE_* secrets; inputs, routing and caller permissions are unchanged.

Verification

  • node --test runner-policy.test.mjs in components/runner-policy: 342 pass. That count includes the new test, which checks the b0ecc27 entry deep-equals the v0.65.0 entry apart from role and secrets, and that one contract names the new SHA.

Related

  • Same shape as #856 (v0.65.0).
  • Next: the standards sync into claude-code-plugins, then that repository's intake, pr-unblock and pr-verify wiring PR.

🤖 Generated with Claude Code

…e funding role

Adds intake-triage.yml@b0ecc273abe492d12f2efa98ee4741a84c219ed2, the
v0.65.0 entry with role intake and INTAKE_CLAUDE_API_KEY and
INTAKE_CLAUDE_CODE_OAUTH_TOKEN. b0ecc27 is one docs-only commit past
v0.65.0 with no .github change. The v0.65.0 entry stays until
claude-code-plugins repins its caller, so neither side goes red first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 24, 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-24T02:26:50.478268Z 449f502 PR opened
ℹ️ 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-security-review reviewed 449f502cb28c65c56db1cb3059eebedf901d4a45: 0 finding(s), 0 as inline comments.

Security review: PR #863 at 449f502

Result: no security findings.

The PR adds one allowlist entry to components/runner-policy/policy.json. The entry is intake-triage.yml@b0ecc273abe492d12f2efa98ee4741a84c219ed2. It also adds a test that checks the entry against the prior one.

  • Copied contract: The new entry is the d02b8697… entry copied over. Only two things change: role goes from automations to intake, and the two secret mappings go from AUTOMATIONS_* to INTAKE_CLAUDE_API_KEY and INTAKE_CLAUDE_CODE_OAUTH_TOKEN. The allowed inputs and the caller permissions (contents: read, issues: write) are the same as the prior entry's. Nothing is widened.
  • Pin: The reference is a full 40-character commit SHA, not a tag or branch.
  • Secrets: The entry names exact secret mappings, not secrets: inherit or a wildcard. This moves the workflow onto a separate funding role. It does not give it a wider credential.
  • Test: The new test asserts exact deep-equality with the prior entry plus the role and secrets override. It also asserts the new SHA appears exactly once, so any other difference in the entry would fail it.
  • intake role: This is the first "role": "intake" in policy.json (the other nine are automations). I didn't find anywhere else in the policy that defines or validates role names. A role that doesn't exist yet would fail the approved-contract check, so it can't be used to bypass it. This is not a finding.
  • Instruction surfaces and manifests: The diff doesn't touch AGENTS.md, rules files, hooks, a skill or agent body, or any plugin manifest. No manifest <field> lines apply.
  • Trust-gate paths: It doesn't touch .github/standards/trusted-actors/**, check-trusted-trigger, CODEOWNERS or .gitmodules. No hold is needed.
  • Not checked: The commit message says b0ecc27 has no .github change from v0.65.0. I couldn't check that from this checkout, so I took it from the message.

critical-findings: 0

@github-actions

Copy link
Copy Markdown

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

No findings. I reported nothing inline.

What the PR does. It adds a contract in components/runner-policy/policy.json for intake-triage.yml@b0ecc273… on the intake funding role, plus one test in runner-policy.test.mjs.

What I checked.

  • Contract content. The new entry (policy.json:336-361) matches the d02b8697… entry (policy.json:310-335) in routing, runnerInput, allowedInputs and allowedCallerPermissions. The only differences are role: "intake" and the two secrets, as the PR says.
  • Secret names. runner-policy.mjs:243-246 accepts the plain secret name or one prefixed with the role in upper case. For intake, INTAKE_CLAUDE_API_KEY and INTAKE_CLAUDE_CODE_OAUTH_TOKEN fit that rule. allowedInputs includes role, which runner-policy.mjs:234 requires when a role is declared.
  • Role is a free literal. Nothing in runner-policy.mjs lists the valid roles. A caller must pass the contract's role as a literal (runner-policy.mjs:977). Registering a new SHA and leaving the v0.65.0 entry matches the stated reason: the old caller still passes role: automations.
  • New test. It looks at the right entries and would catch drift in the new entry's inputs, routing or permissions. It also checks that exactly one contract names the new SHA.

Not verified.

  • I could not run node --test runner-policy.test.mjs. The sandbox refused the command, so the PR's "342 pass" is author-claimed and I did not reproduce it.
  • The claim that git diff v0.65.0 b0ecc27 -- .github is empty concerns another repository, so I did not check it.

PR body contract. The body has the No related issue: line and the Summary, Fix, Verification and Related sections. There is no closing issue, so there were no acceptance criteria to check.

Hold classes. None apply. The change adds no model spend, touches no trusted-actor or CODEOWNERS files, and has no critical security finding.

@kyle-sexton
kyle-sexton merged commit 6b8dccb into main Oct 24, 2026
22 checks passed
@kyle-sexton
kyle-sexton deleted the feat/runner-policy-intake-role branch October 24, 2026 02:41
kyle-sexton added a commit that referenced this pull request Oct 25, 2026
… contract (#879)

Refs: melodic-software/ci-workflows#887

## Summary

Registers the `intake-triage.yml` reusable-workflow contract at
ci-workflows

[v0.65.10](https://github.com/melodic-software/ci-workflows/releases/tag/v0.65.10)
(`215cec5c362f953f8b6196effb04451696c3f970`), so claude-code-plugins can
repin
its intake caller from `b0ecc273abe492d12f2efa98ee4741a84c219ed2` and
pass
runner-policy.

## Fix

- Copies the `intake`-role entry at
`@b0ecc273abe492d12f2efa98ee4741a84c219ed2`
forward verbatim in `components/runner-policy/policy.json`. The b0ecc27
and
  earlier entries stay as history.
- Adds the matching copy-forward test in `runner-policy.test.mjs` and a
  rollout line in the component README.
- v0.65.10
([ci-workflows#887](melodic-software/ci-workflows#887))
keeps an existing Issue Type, applies nothing on a permission denial
over an
otherwise clean triage, adds the `triage-deferred` workflow_call output,
and
logs denied tools inside `::stop-commands::`. `git diff b0ecc27 215cec5
--
  .github/workflows/intake-triage.yml` changes no input, secret or job
  permission.

## Verification

- `node --test components/runner-policy/runner-policy.test.mjs`: 352
pass, 0 fail.
- `node components/runner-policy/runner-policy.mjs --root <worktree>`:
Runner policy passed.
- `biome ci` on the two changed code files and `markdownlint-cli2` on
the README: clean.

## Related

-
[melodic-software/ci-workflows#887](melodic-software/ci-workflows#887)
(released as v0.65.10)
- [#863](#863) (the
b0ecc27 intake-role contract)
- Next: the standards sync into claude-code-plugins, then its intake
caller repin.

🤖 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