chore(ci): bump the review reusables to pick up infra-failure classes - #1552
Conversation
This repository is where both silent-review blackouts were measured, and it is the one repository still blind to them: it pinned the review reusable at 90f1c54 (2026-07-18) and the security-review reusable at 99cb082 (2026-07-21), both of which predate the infra-failure classifier. When the lane fails here it reports green and says nothing about why. Bumps both to ci-workflows e295107, which carries the classifier from ci-workflows#248 plus the status/substring mirror fix from #249. Infra failures now emit a bare `class=<token>` term in the job's ::error annotation and a `Failure class:` line in the marker-managed infra-status PR comment, with the numeric api_error_status in the safe projection. The classifier is already proven against a live production failure — the lane infra-failed on ci-workflows#248's own run and correctly emitted class=rate-limit with api_error_status 429. Interface compatibility checked rather than assumed: the workflow_call block of claude-review.yml is byte-identical across 90f1c54..e295107, and claude-security-review.yml differs only in the prose of an input default (the security prompt now defers to zizmor's static lane for supply-chain, trigger, permission, and template-injection findings). No input or secret was added, removed, or renamed. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3d45804142
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Blocked on a security decision that is not mine to make — converting to draftThe What the gate foundAuto-approval of a SHA bump requires the reusable's security surface to be structurally identical to a reviewed basis. Diffing the
The upstream input's own description states the constraint plainly:
This repository is public. So the bump would approve, for a public caller, a contract whose surface now includes an opt-in private-content mount that the reusable does not itself police — safe only because this caller never sets the input. That is exactly the judgement the gate exists to force, and it declined on purpose. Why I am not clearing it
There is no clean way around it: the classifier and the What this costs while it sitsNothing regresses — this repo stays exactly as it is today. But it stays blind: when the review lane infra-fails here it reports green with no machine-readable cause. That is the repo where both blackouts were measured (2h52m, 158/159 runs failed, 36/38 PRs merged unreviewed), and a second blackout was live while this PR was opened. Draft until an operator decides whether to add the reviewed contract entry upstream in Upstream: melodic-software/ci-workflows#228, #237, #248, #249. |
|
From a concurrent PR-drain sweep — diagnosis only, no pushes to this branch. This PR cannot go green from inside this repository.
That entry lives in $ git log --oneline -5 -- .github/standards/runner-policy/policy.json
76730807 chore: sync standards components (#1103)
167a9377 chore: sync standards components (#1080)
9533a144 chore: sync standards components (#873)
a08b4ddd chore: sync standards components (#855)
1fd84dad chore: sync standards components (#827)Editing the materialized copy here would be overwritten on the next sync ( The repo already has a worked precedent for exactly this, recorded in
So the ordered path to green is:
Until step 2 lands, keeping this PR in draft is the right state; there is nothing to fix on this |
…in e295107 (#275) ## What Add the reviewed runner-input contracts for `melodic-software/ci-workflows/.github/workflows/claude-review.yml@e2951077a7b43c09fc5a8dee4da52ba6f0fb39ed` and `melodic-software/ci-workflows/.github/workflows/claude-security-review.yml@e2951077a7b43c09fc5a8dee4da52ba6f0fb39ed` (the ci-workflows#248/#249 squash-merge SHA) to `approvedReusableWorkflowContracts`. Both entries are shape-identical to the previously reviewed pins (`claude-review@90f1c54`, `claude-security-review@99cb082e`): same routing (`runner-input` via `runner`), same `allowedInputs` (`runner`, `skip-actors`; plus `paths` for security-review), same single `CLAUDE_CODE_OAUTH_TOKEN` secret mapping, and same `allowedCallerPermissions` (`contents:read`, `pull-requests:write`, `id-token:write`). The superseded entries stay until the last caller re-pins and can then be retired, per the #229 precedent. ## Why The runner-policy gate correctly declined auto-approval on melodic-software/claude-code-plugins#1552: both contracts carry `allowedCallerPermissions`, so a bumped SHA's step content must be human-reviewed and recorded here — auto-approval is categorically declined for that contract class regardless of surface identity. This PR is that review. Contract review of `e2951077` against the reviewed pins: - **No** `workflow_call` input, secret, permission, `runs-on`, or routing change in either workflow. `claude-security-review`'s `prompt` input only changed its **default prose** (defer to zizmor's static lane for what it already covers) — no input added or removed, no type/required change. - Step content changed (the reason human review is required): - `gh` CLI run steps (PR head freshness check, infra-failure PR comment lifecycle, PR file listing) replaced with `actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3`, verified against upstream as the official `v9.0.0` annotated-tag commit. Same API operations under the same implicit `github.token` and unchanged job permission grants. - The generated infra-failure classifier (`.github/scripts/classify-infra-failure.sh`) reads the SDK result file and publishes only structured metadata fields plus a constrained `class` token (`auth|rate-limit|overloaded|other`) — the model-authored free text and raw error stacks never leave the block. - No new secret, no widened permission, no runner-label/routing change — no privilege widening. Once merged, the standards-sync PR carries `.github/standards/runner-policy/policy.json` into consumers, and claude-code-plugins#1552 passes unchanged. ## Verification - `npm run lint:runner-policy` — Runner policy passed. - `npm run test:runner-policy` — 238 pass / 0 fail. - `check-jsonschema --schemafile components/runner-policy/policy.schema.json components/runner-policy/policy.json` — ok. No linked issue (reviewed-contract update; the blocked PR lives in claude-code-plugins). ## Related - melodic-software/ci-workflows#248, melodic-software/ci-workflows#249 (merged, `e295107`) - melodic-software/claude-code-plugins#1552 (blocked on this review + sync) - Precedent: #229 → sync → caller bump 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Summary
This repository is where both silent-review blackouts were measured, and it is the one repository still blind to them. It pinned the review reusable at
90f1c54(2026-07-18) and the security-review reusable at99cb082(2026-07-21) — both predate the infra-failure classifier. When the review lane fails here it reports green and says nothing about why.Bumps both to
ci-workflows@e295107, which carries:auth|rate-limit|overloaded|other, emitted as a bareclass=<token>term in the job's::errorannotation and aFailure class:line in the marker-managed infra-status PR comment, with the numericapi_error_statusalongside in the safe structured projection.Gate behavior is unchanged. Passing the check on an infrastructure failure remains an explicit non-goal upstream; this bump adds diagnosis, not blocking. Nothing about which checks gate a merge here changes.
Why it matters here specifically
The measured impact on this repo, from the investigation on ci-workflows#228:
successThroughout all of it, the only signal was a warning comment. There was no machine-readable cause, and no way to tell a revoked credential from a rate limit without guessing from
duration_ms.Interface compatibility — checked, not assumed
claude-review.yml: theworkflow_callblock is byte-identical across90f1c54..e295107.claude-security-review.yml: differs only in the prose of an input default — the security prompt now defers to zizmor's static lane for supply-chain, dangerous-trigger, excessive-permission, and template-injection findings, so this lane focuses on logic, architecture, data-flow, and trust-boundary reasoning.No input or secret was added, removed, or renamed in either.
Test plan
workflow_callblocks across the pin jump — verified above, no breaking change.e295107contain the class emission (gh api .../contents/...?ref=e295107).ci-workflows@e295107, with the classification branches and the no-leak canary mutation-verified.class=rate-limitwith"api_error_status":429, on the exactsubtype: success/is_error: trueshape both blackouts produced.Related
No linked issue.
Upstream work is melodic-software/ci-workflows#228, #237, #248, #249. The prior diagnosis in this repo, #1122, is closed; this is the consumer-side adoption of the fix that came out of it, not new work needing its own tracking item.