Skip to content

[no-ticket] Add verification and automation review rules - #35

Open
bockets wants to merge 1 commit into
mainfrom
add-verification-and-automation-review-rules
Open

[no-ticket] Add verification and automation review rules#35
bockets wants to merge 1 commit into
mainfrom
add-verification-and-automation-review-rules

Conversation

@bockets

@bockets bockets commented Aug 21, 2026

Copy link
Copy Markdown
Member

[no-ticket]

BiggerPockets/biggerpockets#30384 shipped a scheduled review-app sweeper that has never expired a single app. The job declared issues: read, but the /cwa override check reads comments on a PR-backed issue, which also requires pull-requests: read. Every sweep since the merge 403s, curl -sf turns that into an empty string, and the fail-closed guard keeps every app. Fixed in BiggerPockets/biggerpockets#30502.

The review approved it, and two specific moves in that review are what these rules address.

It reported "issues: read permission is correctly declared for the new job". That established a permissions: key was present, not that its scope covered the endpoint the script calls — and the unchecked half was the entire defect. A confident wrong conclusion is worse than silence, because it closes the question for later readers.

It also retired the finding that would have caught this. The first pass raised the swallowed curl -sf failure as a Medium; the approving pass retired it as parity with cleanup-review-apps.yml/destroy-review-app.yml and as self-healing, since a failed delete leaves the app created and the next sweep retries. That reasoning is correct about the DELETE call it was written about, and got applied to the whole script. On the comments call the same construct is not self-healing: it disables the feature permanently and silently.

prompts/_shared/verification-rules.md

Governs how claims are stated and how findings are retired: no affirmative correctness claim without a check that could have come back the other way (and for a declared scope, permission, credential, or version constraint, the check is against the consuming API's documented requirements, not a sibling file); repository parity is evidence about whether something is a regression and never about whether it is a bug; a retired finding names its exact call site and the conditions its reasoning depends on.

Injected into step 10 of both Claude arms, where findings are validated and discarded.

prompts/_shared/automation-rules.md

CI, workflow, and unattended-job diffs currently have no domain block — privacy, perf, parsing, and navigation are all app-code rules, so a workflow-only diff has nothing to anchor on. This one covers external calls whose failures must be surfaced rather than swallowed, declared token scopes checked against the endpoint (including that a GitHub Actions permissions: block replaces the default set, and that PR comments need pull-requests despite the issues path), fail-closed guards that must distinguish "nothing to do" from "could not tell", and success signals that mean something.

Added as a new step to both Claude arms and to the Codex first pass.

Effect on the arm comparison

Both arms change identically and stay byte-identical through their shared steps, so experiment_split_percent results remain comparable across the roll. Prompt versions are content-derived, so both bump automatically.

Ran the validate-prompts.yml checks locally against this branch: registry config valid, resolver deterministic for a fixed PR, no unresolved markers in either resolved prompt, both templates include-expanded, both arms reachable and resolving, assignment stable.

A review of BiggerPockets/biggerpockets#30384 approved a scheduled job
that could never do its work, and stated the defect was correct: the job
declared issues: read, the /cwa check reads comments on a PR-backed
issue, that endpoint also needs pull-requests: read, and the summary
recorded the scope as correctly declared. The finding that would have
caught it — a swallowed curl -sf failure — was retired as parity with
sibling workflows and as self-healing, reasoning that held for the
DELETE call it was written about and not for the comments call it was
applied to.

verification-rules.md governs claims and dismissals: no affirmative
correctness claim without a check that could have failed, parity is
evidence about regression rather than about correctness, and a retired
finding names its call site instead of generalizing.

automation-rules.md gives CI and unattended-job diffs the domain block
the other four shared rules already give app code: surfaced failures on
external calls, declared scopes checked against the endpoint, a
fail-closed guard that separates nothing-to-do from could-not-tell, and
a success signal that means something.

Both Claude arms and the Codex first pass get the automation step, and
both arms get the verification rules on the validate step, so the arms
stay byte-identical through their shared steps and remain comparable.
@bockets
bockets marked this pull request as ready for review August 21, 2026 14:33
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