Repository navigation
fix(pr-review-cli): hold only for a real charge or a critical finding - #880
Conversation
Owner decisions Q52 and Q53 (2026-10-24): only a real security issue or a real charge stops a pull request for a person. - hold-paths no longer holds. The compose step lists its globs in the prompt as TRUSTED PATHS for extra security scrutiny, and the hold step neither reads hold-paths nor lists the changed files. - A model trust-gate criterion holds nothing; cost and critical-security still hold. trust-gate stays in the schema and extract allowlist so a review skill that still returns it is not dropped as malformed. - The prompt's hold classes replace the review command's own: cost holds only when the change can cause a real charge (a paid plan, extra usage, auto-reload or a payment method; Azure resources or deploys that bill; GitHub billing). Spend from prepaid API credits or subscription usage is one summary line, not a hold, an inline comment or a finding. The cost-decision carry logic is unchanged. 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 finished @kyle-sexton's task in 2m 18s —— View job Code review complete
Scope note: this repository runs a dedicated security lane ( Findings: 0. This is a tightly scoped, internally consistent change:
Not independently verified: I could not execute claude-lane-summary: lane=claude-review sha=03007c0a40ca5f5783a5a9e3f2a7263f8c049628 run=40110834025 |
|
Claude finished @kyle-sexton's task in 4m 10s —— View job Security review complete
Findings1. CRITICAL — Before this PR, This PR deletes that mechanism entirely:
Net effect: whether a change to trust-boundary code (e.g. weakening Note: the PR body frames this explicitly as a deliberate, reasoned owner decision ("Q52, trusted paths," with a concrete motivating incident). It is disclosed, not hidden, and the new tests ( severity: CRITICAL Manifest checkNo SummaryOne CRITICAL finding: the critical-findings: 1 claude-lane-summary: lane=claude-security-review sha=03007c0a40ca5f5783a5a9e3f2a7263f8c049628 run=40110834025 |
|
claude-review has reviewed this pull request through 03007c0; a later push is reviewed from there. |
|
claude-security-review has reviewed this pull request through 03007c0; a later push is reviewed from there. |
|
Security review finding 1 (CRITICAL, no deterministic trust-gate backstop): this is the owner's decision, so it is not a defect to fix in this PR.
What still stops a trusted-path change after this PR:
The finding text and this classification go to the owner in the session report. Nothing here changes code. |
…contract (#876) Refs: melodic-software/ci-workflows#880 ## Summary Registers the `pr-review-cli.yml` reusable-workflow contract at ci-workflows [v0.65.7](https://github.com/melodic-software/ci-workflows/releases/tag/v0.65.7) (`4c531cea137f5cbb38d4c132dbfa6e38f76fba7d`). Callers pinned to that release then pass runner-policy. ## Fix Copies the v0.65.6 entry (`@914264587c35692c15e05c965103426eec18d1f0`) forward in `components/runner-policy/policy.json` and adds the matching copy-forward test in `runner-policy.test.mjs`, as #874 did. Earlier pins stay as history. `gh api compare v0.65.6...v0.65.7` lists seven files. In `pr-review-cli.yml`, only the compose prompt, the hold step's env and comments change. The `hold-paths` input stays, so inputs, secrets and permissions are unchanged. The change itself is [ci-workflows#880](melodic-software/ci-workflows#880): `hold-paths` becomes extra security scrutiny instead of a hold, and a cost hold needs a real charge. ## Verification - `node components/runner-policy/runner-policy.mjs --root <worktree>`: Runner policy passed. - `node --test components/runner-policy/runner-policy.test.mjs`: 349 tests, 349 pass, 0 fail. ## Related - [melodic-software/ci-workflows#880](melodic-software/ci-workflows#880) (the fix released as v0.65.7) - #874 (the v0.65.6 contract) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
No related issue: owner decisions Q52/Q53 (2026-10-24)
Summary
Owner rule: only a real security issue or the build no longer matching agreed intent stops a pull request for the owner. Two sandbox pull requests stopped today against that rule: pr-pipeline-sandbox#203 (a byte-identical
check-trusted-trigger, 0 security findings, held astrust-gate) and pr-pipeline-sandbox#210 (restoring default turn and time limits, held ascost).Fix
hold-pathsno longer holds. The compose step lists its globs in the prompt asTRUSTED PATHSfor extra security scrutiny. The hold step no longer readshold-pathsor lists the changed files. A modeltrust-gatecriterion holds nothing.trust-gatestays in the schema and in the extract step's allowlist, so a review skill that still returns it does not get the whole review dropped as malformed. A trusted-path change stops only through the security review'scritical-security(CRITICAL) path.costholds only when the change can cause a real charge: enabling or changing a paid plan, extra usage, auto-reload or a payment method; Azure resources or deploys that bill; or GitHub billing (paid seats, paid Actions minutes, larger runners, Codespaces, storage). A change that only spends prepaid API credits or subscription usage (turn limits, timeouts, model or effort choice, more or longer lane runs, extra review runs, schedule frequency) is reported as one summary line. It is not a hold, an inline comment or a finding.hold-pathsstays an input with the same name. Its consumers,pr-review-hosted.ymlandpr-review-security-hosted.ymlin claude-code-plugins, need no change.Verification
nice node --test .github/scripts/*.test.cjs: 689 pass, 0 fail.apply-review-hold.test.cjs(a hold-paths match holds nothing and reads no file list;trust-gatealone holds nothing whilecostandcritical-securitystill hold; a short file list holds nothing; the cost-decision call orders no longer include the file listing) and 1 inpr-review-cli.test.cjs(the prompt carriesTRUSTED PATHSand the real-charge rule, identically in both legs).pr-review-cli-api-calls.test.cjspins a hold-paths change at 8 requests with no hold and acritical-securityhold at 11.actionlintandbiome checkpass on the changed files.Related
plugins/review/skills/code-review/SKILL.mdandsecurity-review/SKILL.mdstill define the oldcostandtrust-gatehold classes. This release meets their recheck trigger ("a ci-workflows release changes theholdschema or its criteria"). The wrapper prompt overrides them in the meantime.🤖 Generated with Claude Code