Repository navigation
feat(pr-pipeline): fund intake, pr-unblock and pr-verify from their own role secrets - #9552
Conversation
…wn role secrets intake-triage passes role intake with INTAKE_*, on the intake reusable at ci-workflows b0ecc27 (registered on that role by standards#863). pr-unblock and pr-refine's fix-docs pass role pr-unblock with PR_UNBLOCK_*; pr-verify passes role pr-verify with PR_VERIFY_*. The catalog, the read-run secret allowlist and the docs follow, and callers.test.mjs checks each catalog lane's secrets and role: together. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…orkflow Every pr-run-activity read or write caller in a single-role catalog workflow must pass that role, so a write caller that reads no Claude secret cannot keep a stale role label. pr-run-activity.md credits fix-docs to pr-refine.yml, and ADR 0074 names the pr-unblock role. 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-security-review reviewed No security issues found in this pull request. critical-findings: 0 Scope: I read the full diff ( What I checked:
I did not consult |
|
claude-review reviewed No findings. I read the full diff (14 files) and the PR context, and checked the secret and role changes against the rest of the repository by search. I ran no tests, so the PR's verification section is author-claimed and unverified by me. What I checked
Manifests Closing issues Hold Not verifiable from the diff |
No related issue: lane-funding roles plan (D)5, owner-approved 2026-10-24.
Summary
The intake, pr-unblock and pr-verify lanes stop reading
AUTOMATIONS_CLAUDE_API_KEYandAUTOMATIONS_CLAUDE_CODE_OAUTH_TOKENand run on their own funding roles' org secrets, which now exist:INTAKE_*,PR_UNBLOCK_*andPR_VERIFY_*. Each run's lane-outcomecredential=then names its own role, so spend is attributed per role.Fix
intake-triage.yml:role: intake,INTAKE_CLAUDE_API_KEYandINTAKE_CLAUDE_CODE_OAUTH_TOKENon the reusable call, andINTAKE_CLAUDE_CODE_OAUTH_TOKENon the refine-issue claude-code-action step (the catalog files refine-issue under intake). The reusable moves fromd02b8697(v0.65.0) tob0ecc27, ci-workflows main one docs-only commit later, with no.githubchange. A runner-policy contract holds one role, so the intake role needed a new SHA: standards#863 registered it and left the v0.65.0 entry for the old caller. The pin comment takes the pin-comment convention's fallback form, since b0ecc27 is untagged.pr-unblock.yml: every job that passedAUTOMATIONS_*passesPR_UNBLOCK_*, and everyrole: automationsisrole: pr-unblock(fix-ci, fix-ci-rung-up, address-feedback, review-dependency, resolve-conflicts, their-subscriptionlegs, and the write-runner jobs that name the role).pr-refine.yml:fix-docs,fix-docs-subscriptionandapply-docs-patchmove the same way, because.github/lane-funding.jsonlists fix-docs under the pr-unblock role.pr-verify.yml: both legs passrole: pr-verifyandPR_VERIFY_*, including the credential-presence checks and the owner warnings..github/lane-funding.json: each moved lane'scurrentSecretsnames its role's secrets. The role list stays at six (reviews,issue-lane,intake,pr-unblock,pr-verify,automations): each one has lanes in a workflow and both its secrets exist in the org. The plan's separateREVIEWS_SECURITYrole does not exist; both review lanes readREVIEWS_*.scripts/check-read-caller-keys.mjs(and its header and doc): the read-run secret allowlist admitspr_unblock_claude_api_keyandpr_unblock_claude_code_oauth_tokenin place of theautomations_pair, since no read caller passes those any more.callers.test.mjs: a new test fails when a catalog lane reads a secret that is not its role's, or passes arole:(job-level or step-level) other than its role's id. run-claude-cli buildscredential=fromrole:, never from the secret passed, so this test is what ties the two together. The fix-ci/fix-docs fallback test and the refine-issue test move to the new names..github/scripts/pr-verify/workflow.test.mjs: pr-verify's role, secret names and warning text.pr-run-activity.mdnamesPR_UNBLOCK_*and the full read-run allowlist.Left as they are: the review lanes (
REVIEWS_*), work-resolve-issue (ISSUE_LANE_*), eval-browser-dispatch and maintenance-audit-lane-runs (AUTOMATIONS_*). No token-broker-pinned file changed.Verification
nice bash scripts/check-affected.sh --tests: 11 passed, 3 skipped, 0 failed.node --testat a time: 1348 pass, 0 fail (callers.test.mjs162 of them,pr-verify/workflow.test.mjs15)..github/requirements-ci.txt: 2220 passed.scripts/check-read-caller-keys.test.sh: 48 pass, including a new case thatAUTOMATIONS_CLAUDE_API_KEYis now refused for a read caller.scripts/check-read-caller-keys.sh --checkpasses.runner-policy.mjs --root .passes on the policy from standards#863 and fails on the intake caller under the policy synced before it.role: automationsback on one pr-verify leg makescallers.test.mjsfail.Related
credential=INTAKE_CLAUDE_API_KEY,PR_VERIFY_CLAUDE_API_KEYorPR_UNBLOCK_CLAUDE_API_KEY.🤖 Generated with Claude Code