Repository navigation
feat(runner-policy): register the claude-lanes contracts for ci-workflows v0.65.14 - #889
Conversation
…lows v0.65.14 The claude-lanes re-pin (#844) moves pr-review, pr-review-security and maintenance-sync-standards off v0.55.0. Register each at the v0.65.14 tag 3180217 as a verbatim copy of its newest entry: the review lanes from v0.62.0, whose only change since is the isolation install step's id and its install-failed class, and maintenance-sync-standards from v0.55.0, byte-identical at both tags. No input, secret, caller permission or routing widens. The v0.65.14 pr-review-cli test no longer counts every contract at the tag, which this registration adds to. 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 findings in this PR. critical-findings: 0 What the PR changes. It adds three entries to the Why I found nothing. I compared each new entry with its stated predecessor in the file:
Limits of this review.
Owner decisions the PR raises, neither of which is a finding: the verbatim copy still admits |
|
claude-review reviewed No findings. I reported nothing inline. What I checked
Not run Security scope |
…sfying lockstep (#890) No related issue: the defect was found while the claude-lanes repin lane PR (#844) stayed on the human checklist after the contracts were registered (#889). ## Summary `planLockstep` declined any re-pinned caller whose security surface changed from its old pin. It never checked whether `policy.json` already holds a reviewed contract for `<workflowPath>@<newSha>`, though `copyReusableContract` does. The repin lane PR (#844) carried "Runner-policy lockstep requires a human" from 2026-10-22 and kept it after #889 registered the v0.65.14 contracts, with CI green. ## Fix `planLockstep` takes a `hasContract(path, sha)` predicate (default: none). After the renamed-path decline, a pin whose new-SHA contract exists is skipped: neither declined nor copied, and no upstream fetch. The renamed-path decline is unchanged, since a rename always needs a hand-reviewed entry. `main` passes a lookup into `policy.approvedReusableWorkflowContracts`. ## Verification - `node --test components/claude-lanes/repin-policy-lockstep.test.mjs`: 26 pass, including three new cases (surface changed with an existing contract is satisfied; surface changed with none is still declined; a rename with a contract at the new path is still declined). - `bash harness/shell/run-tests.sh components/claude-lanes/repin-callers.test.sh`: pass. - `npx biome check components/claude-lanes/`: clean. ## Related Refs: #844, #889 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01DpzEJAE4EMndcWQXiKSZYn --------- Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Refs: #844
Summary
This PR registers the runner-policy contracts that the claude-lanes re-pin
(#844) needs at
ci-workflows v0.65.14
(
3180217076b19bbdfccc43026c7f91c604da673d). The lockstep declinedpr-review.ymlandpr-review-security.yml, because their inputs changedsince
3a2c748(v0.55.0). It withheldmaintenance-sync-standards.yml. Each ofthe three is registered at the new SHA as a verbatim copy of its newest entry.
Fix
policy.json:pr-reviewandpr-review-securityat3180217copy theirv0.62.0 (
2fe38c0) entries.maintenance-sync-standardsat3180217copiesits v0.55.0 (
3a2c748) entry. Every earlier entry stays.README.md: one rollout record after the existing v0.65.14pr-review-clirecord.
runner-policy.test.mjs: addsREPINE_LANE_SHA_V0_65_14and a verbatimcopy-forward test for the three paths. The feat(runner-policy): register the ci-workflows v0.65.14 pr-review-cli contract #885 v0.65.14
pr-review-clitestasserted that exactly one contract sits at
3180217, and this PR adds threemore. That count is dropped. The test's
deepEqualcopy-forward assertionstays.
Security review, v0.55.0 (
3a2c748) to v0.65.14 (3180217)Both revisions of each file were parsed and compared on
on,workflow_callinputs, secrets and outputs, top-level and jobpermissions,runs-on,needs, jobif, and which steps reference which secrets.credential-name(string, defaultCLAUDE_CODE_OAUTH_TOKEN). It holds a secret's name, never its valuepr-review.yml@3180217:205-214,pr-review-security.yml@3180217:183-192fallback-credential-name(string, default empty)pr-review.yml@3180217:215-222,pr-review-security.yml@3180217:193-200first-attempt-outcome(report-lane-outcome, no secret). It runs only when the fallback attempt runs, which needsfallback-claude-code-oauth-token, and no allowed caller maps that secretpr-review.yml@3180217:1030-1043f27be6b(v1.0.252) to5eb090f3(v1.0.253) in both credential steps. It is one upstream commit that bumps the Claude Code and Agent SDK versionspr-review.yml@3180217:861,1050id: isolate, uses one bounded apt-get deadline, and fails without socat. The status job classifies a failure there asinstall-failedpr-review.yml@3180217:804-838,1397,1421-1425manifest <field>: flaglinespr-review.yml@3180217:1227-1241$/action) writes the lane-outcome record. It uses no new secret, network call or exec, and keeps the sameactions/github-scriptpin.github/actions/report-lane-outcome/action.yml@3180217:191workflow_callsecrets, outputs,on, workflow permissions (contents: read), job permissions (contents: read,pull-requests: write,id-token: write)maintenance-sync-standards.yml93c4c18is the same at both SHAsThere is no class (b), meaning a removed or renamed input that a component
still passes, and no class (c), meaning a change that widens trust.
Verification
node --test components/runner-policy/*.test.mjs components/claude-lanes/*.test.mjspasses 391 of 391,
claude-lanes.test.shpasses 86 of 86, andrepin-callers.test.shpasses 165 of 165.from
3a2c748to3180217. On top of this commit, the same suites pass, andso does
managed-files-guard.test.sh(175 of 175). With this PR'spolicy.jsonreverted, 5 runner-policy tests fail, including "every managedtarget of a claude lane caller admits that caller".
Related
this PR unblocks.
that chore(claude-lanes): re-pin callers to ci-workflows v0.65.14 #844's lockstep note names.
pr-review-cliat the same tag.Owner decisions not taken here
no synced component passes:
incremental-reviewandmodel-argson bothlanes, and
manifest,standards-refandenvironmenton the syncreusable. This keeps the copy-forward shape. It also keeps admitting any
consumer-owned caller that passes them. Narrowing them is a separate decision.
fallback-claude-code-oauth-token. Only thepr-review-clicontracts (v0.65.12 and later) allow
FALLBACK_CLAUDE_CODE_OAUTH_TOKEN. Thechore(claude-lanes): re-pin callers to ci-workflows v0.65.14 #844 re-pin alone therefore gives the
pr-reviewandpr-review-securitylanes no fallback attempt. Getting one takes a component change plus an
allowed-secret addition.
🤖 Generated with Claude Code