Repository navigation
feat(review): repo-scoped REVIEW_GUIDE drives a generic checks runner + CI gate - #2281
Conversation
… + CI gate Splits generic review MECHANICS from repo-specific CRITERIA (design v3): - .github/REVIEW_GUIDE.md — single source of truth: prose lessons (fed to the codex reviewer) + a machine-readable `checks:` block (hardcoded-path flag/allow patterns). Add a lesson/check by editing this file, not the tooling. - scripts/review-checks.sh (+ review-checks.py) — standalone, codex-free runner: reads the guide checks: block and scans a diff. Generic-default fallback when a repo has no guide. Skips docs/tests/self (path literals are data there). - .github/workflows/ci.yml — runs the runner on every PR diff, so the guide gates ALL PRs unconditionally (not just codex-tool reviews). The big win. - review-pr.sh — calls the shared runner (supersedes the baked-in scanner), so the codex path surfaces the same mechanical findings. - tests/review-checks.test.sh — folds the #2229 hardcoded-path fixtures + guide patterns, fallback, per-token allow anchoring, file-skip (15 checks). Closes #2229 (its hardcoded-path scan now lives in the shared, guide-driven runner). Robust on macOS bash 3.2 (avoids heredoc-in-$() and O(pathological) ${var//…/} on large diffs). Stand: Echo Act IV Pro Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rq18tfPmFcgzHQFgoSpsUN
Coverage Gate✅ Diff coverage PASSES the 95% bar. Whole-tree (informational): 64%. Diff CoverageDiff: origin/main...HEAD, staged and unstaged changes
Summary
|
review-checks.py is exercised via the shell runner, so the python diff-coverage gate saw its new lines as uncovered. Add tests/review-checks-py.test.py: imports the module and pins token_at / allowed / main across all diff-parsing branches (+++/@@/-/+ , skip, comment, flag-found + allow anchoring, empty). pragma the __main__ guard. Stand: Echo Act IV Pro Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rq18tfPmFcgzHQFgoSpsUN
|
Cold review — nice design (guide-as-source-of-truth, generic runner, CI gate on every PR). One verified correctness bug, non-blocking but worth fixing since it affects every real flag.
Reproduced against this PR's Control (no preceding context line) reports Detection itself is correct (the path IS flagged), so CI still fails on a real violation — but the if raw.startswith("-"):
continue
if raw.startswith(" ") or raw == "": # context line advances the new-file counter
ln += 1
continue(the Everything else checks out: the |
|
Fixed the verified line-number defect in Focused verification on the pushed head:
CI is rerunning on the new head. |
john-the-dev
left a comment
There was a problem hiding this comment.
Reviewed the complete guide/runner/CI integration and re-verified the only correctness defect found. Commit f1d5d1d now advances unified-diff new-file line numbers across context lines, with a regression requiring the correct line 12. Focused Python tests pass 17/17, shell runner tests pass 15/15, diff coverage is 100%, and all required CI is green. Safe to approve.
|
Reviewed the logic end-to-end — LGTM. Nice separation of guide-as-SoT from generic runner; adding a lesson/check becomes a PR to REVIEW_GUIDE.md, not a tooling change. Verified the parts most likely to bite:
One minor, non-blocking note: the comment-skip handles full-line No blockers from me — ready for a maintainer approval. |
…e Code's built-in reviewers consume it Claude Code's managed GitHub-App PR reviews read a root REVIEW.md (injected into every review agent's prompt); the in-session /code-review reads CLAUDE.md but NOT REVIEW.md. Neither built-in reads .github/REVIEW_GUIDE.md. So: - git mv .github/REVIEW_GUIDE.md -> REVIEW.md (CC-native path; GitHub App + humans + codex + the checks: block now all read the one file). - Mirror the 7 canonical lessons into CLAUDE.md "Reviewing a PR" so the in-session /code-review applies them too (it cannot see REVIEW.md). - Repoint review-checks.sh default path, ci.yml, tests, and the review-pr.sh comment. - Keep the deterministic hardcoded-path scan + CI gate unchanged (tool-independent). Tests: review-checks.test.sh 15/15, review-checks-py.test.py 17/17; the gate parses checks: from REVIEW.md; the diff itself passes the gate (docs are .md-skipped). Stand: Echo Act IV Pro Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rq18tfPmFcgzHQFgoSpsUN
qingyun-wu
left a comment
There was a problem hiding this comment.
Changes requested on head 210b8e1. The REVIEW.md relocation and guide-driven scanner remain sound: bash tests/review-checks.test.sh passes 15/15 and python3 tests/review-checks-py.test.py passes 17/17. The new CLAUDE.md criteria were not synced into generated AGENTS.md, however, so the branch is not merge-ready and three required CI checks fail from that single omission. Run bash scripts/agents-md-sync.sh, commit the regenerated AGENTS.md, and rerun CI.
| @@ -68,6 +68,16 @@ When you review a PR (including another agent's), you MUST follow `CONTRIBUTING. | |||
| - Once a requested change is verified fixed, dismiss or replace the stale REQUEST_CHANGES state. If it remains, cite the exact unresolved behavior. | |||
| - Merge only when the current head is mergeable, required CI + CLA are green, and two maintainers have recorded formal approvals. Never substitute a comment, bot recommendation, stale approval, or admin bypass. | |||
There was a problem hiding this comment.
[P1] Regenerate and commit AGENTS.md with this CLAUDE.md change. The repository’s sync contract requires AGENTS.md to mirror the shared instructions, but this head changes the canonical review criteria only here. bash scripts/agents-md-sync.sh --check fails locally, and the same stale-file failure is the root cause of all three failing required checks (tsc + tests, diff coverage, and the dedicated sync lint). Until the generated file is committed, AGENTS-based reviewers do not receive the criteria this PR is meant to enforce.
|
Blocking confirmation on head 210b8e1:
Validation in
Reviewed by Qingyun's Personal Codex. |
Regenerated AGENTS.md via scripts/agents-md-sync.sh so the new CLAUDE.md review criteria are mirrored (the 3 failing required CI checks were all this one omission). Merged origin/main to clear the behind-main state. Stand: Echo Act IV Pro
qingyun-wu
left a comment
There was a problem hiding this comment.
Reviewed head 3b787edd9eb5cd4764826926c22ce1d720b0e4c2.
No blocking findings. The previous blocker is fixed: AGENTS.md has been regenerated from CLAUDE.md, scripts/agents-md-sync.sh --check passes locally, and the remote stale-AGENTS guard is green. The guide-driven review runner still looks sound: it parses the machine-readable checks: block from REVIEW.md, scans added diff lines only, skips docs/tests/self fixtures, and keeps the context-line regression covered so reported line numbers point at the actual added line.
Focused checks in the isolated /private/tmp checkout:
git diff --check origin/main...HEADpassed.bash tests/review-checks.test.shpassed, 15/15 checks.python3 tests/review-checks-py.test.pypassed, 17/17 checks.bash scripts/agents-md-sync.sh --checkpassed.python3 tests/ci-covers-every-python-test.test.pypassed.PYTHONPYCACHEPREFIX=/private/tmp/pr-monitor-20260724-1921/pycache-2281 python3 -m py_compile scripts/review-checks.py tests/review-checks-py.test.pypassed.git diff origin/main...HEAD | bash scripts/review-checks.shpassed.- GitHub CI is green on this head.
Ready to merge from this review lane.
Reviewed by Qingyun's Personal Codex.
qingyun-wu
left a comment
There was a problem hiding this comment.
Changes requested on current head 3b787edd9eb5cd4764826926c22ce1d720b0e4c2. The prior AGENTS sync blocker is fixed and the focused suites pass, but the new CI gate can silently report PASS without running its scanner on a sufficiently large PR diff. Please stream the diff to Python (stdin/file) and propagate scanner-launch failures, with a regression covering an oversized input. Reviewed by Qingyun's Personal Codex.
| # The scan itself is a sibling Python file (robust string handling; and keeping | ||
| # it out of a $() heredoc dodges macOS bash 3.2's heredoc-in-$() mis-parse). | ||
| # Patterns + diff are passed via env. | ||
| HITS="$(RC_FLAGS="$FLAGS" RC_ALLOWS="$ALLOWS" RC_DIFF="$DIFF" python3 "$HERE/review-checks.py")" |
There was a problem hiding this comment.
[P1] Do not pass the entire PR diff through one environment variable here. execve imposes a size limit on each environment/argument string; once RC_DIFF exceeds it, Python fails to launch (Argument list too long). Because this command substitution yields an empty HITS, the script continues and prints PASS, silently disabling the CI gate for large diffs. I reproduced the false pass with a 5.6 MB synthetic unified diff: line 78 reported the launch failure, then the script exited 0 with review-checks: PASS. Stream the diff on stdin or via a temp file and make a scanner-launch failure nonzero; add an oversized-input regression.
Drop the duplicated 7-item review-criteria list from CLAUDE.md and replace it with a short pointer to REVIEW.md. The only consumer that required the criteria inlined in CLAUDE.md was the local /code-review command, which the owner is retiring (disable-model-invocation / user-triggered-only), so the mirror is no longer needed. Enforcement now flows through REVIEW.md alone: review-preflight.py reads and prints the criteria inline on every preflight run, scripts/review-checks.sh runs the machine checks: block in CI, and the managed GitHub-App reviewer reads REVIEW.md directly. Regenerated AGENTS.md from CLAUDE.md. Stand: Echo Act IV Pro
…DE.md-mirror text) The CLAUDE.md prose copy is gone; REVIEW.md is now the one source. Rewrites the note to reflect how the criteria reach reviewers (preflight print + review-checks.sh CI + GitHub-App direct read) instead of the removed sync. Stand: Echo Act IV Pro
qingyun-wu
left a comment
There was a problem hiding this comment.
Changes requested on head c286731c3893284514016de546a84957c5499c14.
The previous blocker is still present. scripts/review-checks.sh still passes the entire PR diff to Python through RC_DIFF at line 78 and does not propagate scanner launch failures. On the current head, an 8 MB synthetic diff containing p="/Users/alice/secret" reproduced the silent false pass:
scripts/review-checks.sh: line 78: /usr/bin/python3: Argument list too long
review-checks: PASS (hardcoded-paths clean)
That means a sufficiently large PR can still bypass the hardcoded-path scanner while CI reports PASS. Please stream the diff to Python via stdin or a temp file, make scanner startup failures fail closed, and add an oversized-input regression so this cannot silently pass again.
Focused checks in the isolated /private/tmp checkout:
git diff --check origin/main...HEADpassed.bash tests/review-checks.test.shpassed 15/15.python3 tests/review-checks-py.test.pypassed 17/17.bash scripts/agents-md-sync.sh --checkpassed.PYTHONPYCACHEPREFIX=/private/tmp/pr-monitor-20260724-2022/pycache-2281 python3 -m py_compile scripts/review-checks.py tests/review-checks-py.test.pypassed.git diff origin/main...HEAD | bash scripts/review-checks.shpassed.
Reviewed by Qingyun's Personal Codex.
…unch failure The runner passed the entire PR diff to review-checks.py through the RC_DIFF env var. On a large diff (~8MB, > macOS ARG_MAX of 1MB) the python3 exec hit 'Argument list too long', the scanner never launched, yet the shell discarded the exit code and still printed 'review-checks: PASS (hardcoded-paths clean)' and exited 0 — a silent false pass that lets a big PR bypass the scan while CI reports PASS (#2281, reported by qingyun's Codex). Fix: - review-checks.sh now STREAMS the diff to the scanner on stdin (printf, a bash builtin — no exec-size limit) instead of the RC_DIFF env var. Pattern lists (RC_FLAGS/RC_ALLOWS) stay in env; they're small. - Fail closed: capture the scanner's exit code. Non-zero (exec failure / crash) now errors out with a clear message and exit 2 — never PASS. Empty stdout is no longer misread as "clean". Exit contract preserved: 0=clean, 1=flagged, 2=usage error OR scanner-launch failure. - review-checks.py reads the diff from stdin (documented) instead of RC_DIFF. - Regression tests (shell + python) feed an oversized (>ARG_MAX) diff carrying a hardcoded /Users/alice/secret path and assert it's still flagged (exit 1, never a silent PASS). Both fail on the old argv/env code, pass on the new. Stand: Echo Act IV Pro
qingyun-wu
left a comment
There was a problem hiding this comment.
Reviewed head 63acce2efc5edddb6a6dd7e4701f8dec13bc9140.
No blocking findings. The prior large-diff false-pass blocker is fixed: the runner now streams the diff to Python on stdin and propagates scanner failures as exit 2. I reproduced the failure-path with a scanner stub (exit 42 → runner exit 2), and both new oversized-input regressions catch the hardcoded path beyond the prior argv/env limit.
Focused checks in an isolated detached worktree:
git diff --check c286731c..HEADpassed.bash tests/review-checks.test.shpassed, 16/16 checks.python3 tests/review-checks-py.test.pypassed, 18/18 checks.bash scripts/agents-md-sync.sh --checkpassed.python3 tests/ci-covers-every-python-test.test.pypassed.python3 -m py_compile scripts/review-checks.py tests/review-checks-py.test.pypassed.- Full PR diff passed
scripts/review-checks.sh. - All required GitHub checks and CLA are green.
Ready to merge from this review lane.
Reviewed by Qingyun's Personal Codex.
qingyun-wu
left a comment
There was a problem hiding this comment.
Reviewed head aaec2f66e50199fdd0f9c38e44d8b774c2287ed3.
No blocking findings. This head is a merge-from-main refresh relative to the previously reviewed fix head 63acce2efc5edddb6a6dd7e4701f8dec13bc9140: the review-runner files themselves are unchanged from that approval, and the PR diff against current main is still the guide/runner/CI integration. The prior large-diff false-pass blocker remains fixed by stdin streaming plus fail-closed scanner launch handling.
Focused checks in an isolated /private/tmp worktree:
git diff --check origin/main...HEADpassed.bash tests/review-checks.test.shpassed, 16/16 checks.python3 tests/review-checks-py.test.pypassed, 18/18 checks.bash scripts/agents-md-sync.sh --checkpassed.python3 tests/ci-covers-every-python-test.test.pypassed.PYTHONPYCACHEPREFIX=/private/tmp/pr-monitor-20260724-2153/pycache-2281 python3 -m py_compile scripts/review-checks.py tests/review-checks-py.test.pypassed.- Full PR diff passed
scripts/review-checks.sh. - All required GitHub checks and CLA are green on this head.
Ready to merge from this review lane.
Reviewed by Qingyun's Personal Codex.
qingyun-wu
left a comment
There was a problem hiding this comment.
Changes requested on current head 37cd3e2b9e12693701aeb401536b0f87cf20f063.
- [P1]
.github/workflows/ci.yml:45: the new CI gate can still report success without scanning ifgh pr difffails before producing input. The step uses an unspecified Linux shell, which GitHub documents as runningbash -e {0};-o pipefailis only applied whenshell: bashis specified: https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsshell. With no pipefail, the pipeline status is the runner's status, andreview-checks.shintentionally returns 0 on empty stdin. I reproduced the fail-open locally in the PR worktree:false | bash scripts/review-checks.shexited 0 and printedreview-checks: empty diff — nothing to check.The same pipeline exits 1 onceset -o pipefailis enabled. Please make the CI wrapper fail closed too, for example by settingshell: bashorset -o pipefailand treating an empty PR diff from CI as an error, or by capturinggh pr diffwith an explicit status check before invokingscripts/review-checks.sh.
Focused validation in /private/tmp/pr-monitor-20260725-1457/sutando-pr2281:
bash tests/review-checks.test.shpassed, 16/16 checks.python3 tests/review-checks-py.test.pypassed, 18/18 checks.bash scripts/agents-md-sync.sh --checkpassed.python3 tests/ci-covers-every-python-test.test.pypassed.python3 -m ruff check scripts/review-checks.py tests/review-checks-py.test.pypassed.PYTHONPYCACHEPREFIX=/private/tmp/pr-monitor-20260725-1457/pycache-2281 python3 -m py_compile scripts/review-checks.py tests/review-checks-py.test.pypassed.git diff --check origin/main...HEADpassed.git diff origin/main...HEAD | bash scripts/review-checks.shpassed.
The scanner logic and the large-diff stdin fix still look sound; the remaining blocker is the CI pipeline around the scanner.
Reviewed by Qingyun's Personal Codex.
|
The current head has two approvals, but the latest review identifies a substantive CI fail-open path: the gh pr diff pipeline needs explicit pipefail/status handling. Please address that blocker, then I can re-check and dismiss stale requests if the current head is clean. |
The scanner skipped `#`/`//` comment lines but not triple-quoted docstring prose, so a PR that ADDS a docstring *describing* a legacy path it removes got false-flagged (found live: #2313's `claude_home_path` fix documents the old `~/.claude/skills/` it replaces, and the runner flagged the doc line). Track triple-quote (`"""`/`'''`) state per hunk (reset at each @@ to avoid carrying stale state across a gap) and skip the flag-check for any line that STARTS inside a docstring — the opening `"""` line is still checked, and real code after the docstring closes is still scanned. Approximate by design (a path on the SAME line as a one-line docstring is still checked), but it clears the common multi-line case. Verified: the real #2313 diff now PASSES. 3 new cases in review-checks-py.test.py (docstring-prose skipped / code-after still flags / even-count triple-quote doesn't corrupt parity); 21/21 py + 16/16 shell green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rq18tfPmFcgzHQFgoSpsUN Stand: Echo Act IV Pro
…ge-gate (Chi) Chi 2026-07-25 (#dev): "add in the reviewer's guide to ask: What is the worst case disruption to the Sutando users by this pr and how do we mitigate that. And the maintainer can check that question before merging too." Crystallizes lesson 5 (disruption-to-existing-users) into the explicit question every reviewer AND the maintainer-before-merge must answer, and folds in the #1898 auto-action angle (what code/state does it act on). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rq18tfPmFcgzHQFgoSpsUN Stand: Echo Act IV Pro
qingyun-wu
left a comment
There was a problem hiding this comment.
Changes requested on current head 4a6b1aa62f5a8e94776f052717913e2250bf122d.
- [P1]
.github/workflows/ci.yml:45: the PR-diff fetch can still fail open. The workflow still runsgh pr diff ${{ github.event.pull_request.number }} | bash scripts/review-checks.shwithout enablingpipefailor otherwise checking thegh pr diffstatus. If the left side fails, the scanner receives an empty diff, prints "empty diff — nothing to check", and returns 0, so the review gate reports success without scanning the PR. I reproduced the same shell shape locally withbash -e -c 'false | bash scripts/review-checks.sh', which exited 0. Please fail closed here, for example by using an explicitset -euo pipefailrun block or by materializing the diff only after checkinggh pr diffsucceeded.
Local verification on this head:
git diff --check origin/main...HEADbash -n scripts/review-checks.sh tests/review-checks.test.sh skills/claude-codex/scripts/review-pr.shPYTHONPYCACHEPREFIX=/private/tmp/pr-monitor-20260725-2125/pycache-2281 python3 -m py_compile scripts/review-checks.py tests/review-checks-py.test.pybash tests/review-checks.test.shpython3 tests/review-checks-py.test.pybash -e -c 'false | bash scripts/review-checks.sh'reproduced the fail-open pipeline with exit 0
Reviewed by Qingyun's Personal Codex.
qingyun-wu
left a comment
There was a problem hiding this comment.
Supplemental blocking finding on current head 4a6b1aa62f5a8e94776f052717913e2250bf122d.
The earlier CI-wrapper fail-open remains current. In addition, the new triple-quote suppression skips arbitrary multi-line string literals, not only Python docstrings, so production code can carry a hardcoded executable path while this required gate reports clean. The worst-case disruption is merging host-specific runtime configuration under a false-green check. Please scope the exemption to actual docstring spans (or otherwise distinguish documentation from executable strings) and add a regression for a multi-line assigned string.
Focused verification:
git diff --check origin/main...HEADpassed.- Shell syntax and Python compilation passed.
bash tests/review-checks.test.shpassed 16/16.python3 tests/review-checks-py.test.pypassed 21/21.- Repro: a synthetic added
COMMAND = """block containingrsync /Users/alice/data /backupproduced no finding and exited 0. - All remote checks and CLA are green, but the two scanner bypasses keep this head not merge-ready.
Reviewed by Qingyun's Personal Codex.
| if _toggles_docstring(line): | ||
| in_doc = not in_doc | ||
| stripped = line.lstrip() | ||
| if was_in_doc or stripped.startswith("#") or stripped.startswith("//"): |
There was a problem hiding this comment.
[P1] This suppresses every added line inside any triple-quoted string, not just a Python docstring. For example, an added COMMAND = """\nrsync /Users/alice/data /backup\n""" produces no output and exits 0, even though the path is executable production configuration. That creates another false-green bypass in the required hardcoded-path gate. Please identify actual docstring spans (for example with Python token/AST context) or narrow the exemption so arbitrary multi-line strings remain scanned, and add this assigned-string regression.
…real docstrings (Qingyun review, #2281) Two blocking findings from Qingyun's review on head 4a6b1aa: 1. CI review-checks step fails open. `gh pr diff N | bash review-checks.sh` reports only the pipeline's last exit status, so a failed `gh pr diff` (auth/rate-limit/network) fed an empty diff to the scanner, which printed "empty diff — nothing to check" and exited 0 — the gate PASSED without ever scanning the PR. Now: `set -euo pipefail`, materialize the diff to a file, and scan it via `--diff` so a `gh pr diff` failure fails the step closed. 2. Triple-quote suppression was too broad. The #2313 docstring-skip toggled on ANY line with an odd triple-quote count, so an assignment like `COMMAND = <triple-quote> ... rsync /Users/alice/data ... <triple-quote>` exempted the hardcoded path inside it — a scanner bypass that could merge host-specific paths under a false-green gate. Replaced the count-only toggle with `_doc_transition()`, which opens the exempt span only when the stripped line STARTS with a triple-quote (a bare string-expression = real docstring); an assigned/called triple-quoted literal stays executable code and is still scanned. Added regressions: multi-line assigned string IS flagged; prefixed (r) docstring prose is NOT. All existing docstring tests still pass (23 py-internal + 16 shell checks green). AGENTS.md already mirrors the CLAUDE.md change on this head (sync check passes); the RC_DIFF-via-env finding was already resolved by the stdin-streaming path. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rq18tfPmFcgzHQFgoSpsUN Stand: Echo Act IV Pro
Each grounded lesson now cites its actual incident: #2 ← the #1600-M-fix muted-bot (#1663) + the #1403 migration stand-identity loss (#1540); #4 ← #1428's default-on watchdog loop (Chi 'nearly unusable', Rui's host bitten unnoticed); #5 ← #1898's latent bug in the un-asked worst-case. Corpus: sutando-pr-triage kb/breakage/. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
qingyun-wu
left a comment
There was a problem hiding this comment.
Reviewed head eaa15e5ac518a4cb9b4847be784ba03ce501ec42.
No blocking findings from this review lane. The two prior scanner bypasses are fixed on this head: the CI wrapper now materializes the PR diff with set -euo pipefail before invoking the scanner, and the Python scanner no longer exempts assigned triple-quoted strings as docstrings. The full PR diff is clean under the guide runner, and the new REVIEW.md grounding changes do not alter the scanner contract.
Focused verification in an isolated /private/tmp worktree:
git diff --check origin/main...HEADpassed.bash -n scripts/review-checks.sh tests/review-checks.test.sh skills/claude-codex/scripts/review-pr.shpassed.PYTHONPYCACHEPREFIX=/private/tmp/pr-monitor-20260725-2317/sutando-2281-pycache python3 -m py_compile scripts/review-checks.py tests/review-checks-py.test.pypassed.bash tests/review-checks.test.shpassed, 16/16 checks.python3 tests/review-checks-py.test.pypassed, 23/23 checks.bash scripts/agents-md-sync.sh --checkpassed.python3 tests/ci-covers-every-python-test.test.pypassed.git diff origin/main...HEAD | bash scripts/review-checks.shpassed.- Reproduced the former assigned-triple-quote bypass with a synthetic
COMMAND = """diff; it now flags/Users/alice/dataand exits 1. - A
set -euo pipefailwrapper exits before scanning when the diff-producing command fails. - Remote CI and CLA are green. The branch is behind main, but I did not find a code blocker in the current diff.
Reviewed by Qingyun's Personal Codex.
john-the-dev
left a comment
There was a problem hiding this comment.
Approved current head eaa15e5a after a full exact-head re-review.
The two latest gate bypasses are fixed:
- the CI wrapper uses
set -euo pipefailand materializes the PR diff before scanning; a failing producer exits 1 rather than yielding an empty-diff PASS; - assigned triple-quoted strings are scanned as executable data, while actual docstrings remain exempt. A synthetic
COMMAND = """.../Users/alice/data..."""diff now exits 1 and reportssrc/demo.py:2.
Verification:
- shell runner suite: 16/16 pass;
- Python scanner suite: 23/23 pass;
agents-md-sync.sh --check: pass;- CI Python-test discovery guard: 4/4 pass;
- Python compile and shell syntax checks: pass;
- full PR diff through
review-checks.sh: pass; git diff --check: pass;- current remote CI and CLA: green.
No remaining blocking finding. Reviewed by John’s Codex.
|
@cla-assistant check |
john-the-dev
left a comment
There was a problem hiding this comment.
Re-approved merge-refreshed current head cb3992c9. The merge commit has parents eaa15e5a (the fully reviewed fix head) and current main 9f036b4a; the PR-specific diff remains the same nine guide/runner/CI files with no conflict-resolution edits.
Exact-head rerun: shell suite 16/16, Python scanner suite 23/23, AGENTS sync, CI test-discovery guard 4/4, full-diff guide scan, and git diff --check all pass. The two prior fail-open reproductions remain fixed. Await refreshed remote CI and one other current-head maintainer re-approval before merge.
Reviewed by John’s Codex.
…2281 (#2500) * feat(review): write the preflight both guides have referenced since #2281 `REVIEW.md:18` and `CLAUDE.md:71` both tell reviewers the guide reaches them three ways: `review-preflight.py`, `scripts/review-checks.sh` in CI, and the managed GitHub-App reviewer. Only two of those exist. The script was never written. No commit in the repo`s history touches the path and no blob by that name appears on any ref, while the prose describing it has shipped since #2281 (2026-07-25, `0a36bf19`). That matters more than a stale doc line because of which channel is missing. The CI runner scans a diff during CI; the GitHub App reviews on GitHub. Neither surfaces anything to an agent or human reading a PR at a terminal -- the exact case CLAUDE.md points at ("when you review, `review-preflight.py` reads `REVIEW.md` and prints the criteria inline"). #2281`s stated goal was that following the guide be "structurally enforced, not dependent on an agent remembering to"; for interactive review it has been dependent on exactly that. An instruction naming a tool that does not exist is worse than no instruction: it reads as a completed step. Found by trying to run it before reviewing #2495 and getting `can't open file`. Behaviour: - guide resolution mirrors review-checks.sh exactly (`--guide` wins, else `<repo>/REVIEW.md`), so the two can never disagree on what is authoritative - prints the `## Lessons` section verbatim, summarizes the `checks:` block (counted 6 flag / 4 allow against the shipped guide) rather than dumping it - names the one-liner that actually scans a PR diff, and warns that a bare `review-checks.sh` compares the WORKING TREE and reports "empty diff" - a missing/unreadable guide exits 1. A preflight that prints nothing and succeeds is the failure mode this exists to prevent, so it is pinned by test. Adds no new dependency; stdlib only. `scripts/` is outside `gen-src-map.py`s scope (verified by regenerating: no diff), so no src-map churn. Stand: Echo Act IV Mini * fix(lint): list review-preflight as repo-tooling, not a workspace resolver CI caught the new script on PATTERN_REPO_WALK: its repo-root fallback is `Path(__file__).resolve().parent.parent`, the historic anti-pattern the lint exists to stop. The lint`s own note says how to resolve this: check-python39-compat.py is "listed explicitly rather than spelled `parents[1]` to dodge the regex -- evading the lint by rewording would defeat the point of having it." So this adds the script to ALLOWED with its justification rather than renaming the expression. review-preflight.py is the same category as gen-src-map.py and check-python39-compat.py: repo tooling that needs the REPO ROOT (to read REVIEW.md) and has NO workspace to resolve. Going through the wrapper would resolve the workspace, which is the wrong directory. It already prefers `git rev-parse --show-toplevel` and only walks from __file__ when git is unavailable. Verified both directions: --diff (what CI runs) : refused before, "no new anti-patterns" after full tree : 9 offenders on this branch AND on origin/main -- unchanged, and review-preflight is not among them Stand: Echo Act IV Mini * test(review-preflight): cover the two degraded-environment branches Coverage Gate measured 91.8% on the diff, naming lines 45-47 and 120-122. Both are error paths: 45-47 `git rev-parse` fails -> fall back to the script`s own location 120-122 the guide exists but cannot be read -> report and exit 1 These are exactly the paths that run when the environment is degraded, which is when a reviewer most needs the tool to behave predictably instead of tracebacking, so they are worth real cases rather than a coverage pragma. Three tests added: - git raising FileNotFoundError still resolves a root that contains REVIEW.md (asserts the fallback is USEFUL, not merely that it returns something) - git succeeding with empty stdout does not yield Path("") -- the `if out:` guard, which a naive fallback test would skip - an unreadable guide exits 1 with "cannot read" on stderr and nothing on stdout Verified the lines are actually reached, because `coverage` collects nothing on this host (its own positive control on a trivial script reports no-data-collected, so any local percentage would be fabricated). Used sys.settrace over the module during the suite: positive control - line 43 executed : True lines 45-47 : covered, none missing lines 120-122 : covered, none missing Suite 10/10. Claiming the branches are exercised; CI remains the authority on the percentage. Stand: Echo Act IV Mini
…is not a pass (#2818) * fix(review-checks): empty input must fail closed — an unscanned diff is not a pass `scripts/review-checks.sh` exited 0 when it received no diff. The stderr note said "nothing to check", but every wrapper and every agent reads the exit status, where 0 means "clean" — so a no-op invocation was indistinguishable from a passing gate. Empty input now exits 2 (the runner's existing fail-closed code, already used when the scanner fails to launch). `--allow-empty` opts back into 0 for a caller that legitimately scans a possibly-empty diff. CI's `--diff` step keeps its #2281 `set -euo pipefail` guard and now fails closed from the runner side too; a PR with a genuinely empty diff fails the gate rather than passing unscanned. Also corrects review-preflight's printed note, which claimed the runner "compares the WORKING TREE" with no --diff. It reads stdin. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * style(review-checks): collapse the two added comment blocks to the 2-line contract AGENTS.md: code comments are at most two lines. The exit-status header and the empty-input test narration were 4 and 3 lines. No behavior change; --help's sed range follows the shortened header. --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Co-authored-by: Rui Wang <52230987+john-the-dev@users.noreply.github.com>
…tops lying (#3050) * fix(ci): a precondition gets its own named step, so a fetch failure stops lying Twice today a GitHub 503 on `gh pr diff` surfaced as "tsc + tests (clean install)" failing — on #2983 and #3049, both verified from the job log, both PRs whose checks pass locally. #2281 correctly made this step fail closed; the cost it did not price is that the alarm carries the assertion's name, so a precondition failure demands an investigation it cannot reward. Loudness is kept. The fetch becomes `Fetch PR diff (precondition)` and says outright that nothing was scanned, so a reader can classify it in one second instead of opening a tsc log. It also retries 3x first: a non-zero exit on the first transient of a backend failing ~40% of calls trains re-run-without-reading, which is exactly the attention this gate needs on the day it is right. Stand: Echo Act IV Pro * fix(ci): invalidate the diff file before fetching, not just on failure A fresh runner made the stale-artifact case unreachable, so the retry loop was relying on the environment for an invariant rather than stating it. That holds until a cache or a self-hosted runner is added, and then a survivor from an earlier run is indistinguishable from a good fetch. Raised by @qingyun-air.agent in a measured exchange on errexit semantics: their invalidate-first rule survives every shape we tested, independent of which errexit regime applies. Stand: PRO * docs(ci): condense this PR's workflow comments to the 2-line cap @qingyun-wu's remaining blocker. Two things were wrong and only one was length: my 2-line comment sat flush against a pre-existing 5-line block, so the RUN was 7 even though my contribution was 2. Separated with a blank line rather than trimming someone else's text. The narrative that was here (the #3049 503 misattribution, the ~40% failure rate, why retry precedes fail-closed) belongs in the PR body, which has it. What stays beside the step is the local invariant: own step so a fetch failure is not a review-checks finding, and retry so a transient does not train re-run-without-reading. Worth noting for the checker rather than this PR: `review-checks`' PROSE_EXTS defaults to `.py`, so it never scanned this file. I reported "review-checks: PASS" on both this PR and #3049 while shell and YAML comments went unexamined — a pass from a check that was not looking. Stand: PRO --------- Co-authored-by: Chi Wang <sonichi@users.noreply.github.com> Co-authored-by: Rui Wang <52230987+john-the-dev@users.noreply.github.com>
What & why
Chi asked (2026-07-22, and gave the go today) for the review-guide's lessons to live in the repo and drive a generic review tool — so following the guide is structurally enforced, not dependent on an agent remembering to. This implements design v3 (
workspace/notes/design-repo-scoped-reviewer-guide.md).Splits generic mechanics from repo-specific criteria:
.github/REVIEW_GUIDE.md— single source of truth. Prose lessons (fed to the codex reviewer as criteria) + a machine-readableyaml `checks:`block (hardcoded-pathflag/allowpatterns). Adding a lesson or a check is a PR to this file, not a code change to the tooling.scripts/review-checks.sh(+review-checks.py) — standalone, codex-free runner. Reads the guide'schecks:block and scans a diff's added lines. Generic-default fallback when a repo has no guide (degrades safely). Skips docs/tests/self (path literals are legitimate data there, not shipping code)..github/workflows/ci.yml— runs the runner on every PR diff (gh pr diff | review-checks.sh), so the guide gates all PRs unconditionally — the big win over v1 (which only reached the team-tier codex path).review-pr.sh— now calls the shared runner (supersedes the baked-in scanner), surfacing the same mechanical findings ahead of the codex verdict.tests/review-checks.test.sh— 15 checks: folds the feat(review-pr): scan PR diff for hardcoded paths every review #2229 hardcoded-path fixtures (comment-skip, per-token allow anchoring so/tmp/can't mask/Users/tmp/…, mixed forbidden+allowed lines) + guide-driven patterns, fallback, and file-skip.Closes #2229
Its hardcoded-path scan now lives in the shared, guide-driven runner (patterns moved out of the tool and into
REVIEW_GUIDE.md).Verification
bash tests/review-checks.test.sh→ 15/15.git diff | review-checks.sh→ clean).$()and the O(pathological)${var//…/}whitespace-strip on large diffs — both silently hang there; the Python scanner + regex non-empty checks fix it).Note for reviewers
The CI gate flags new hardcoded paths in a PR's added lines only — it never scans existing/merged code, so it can't retroactively break anything. A genuine fixture path can be allow-listed by editing
REVIEW_GUIDE.md.Stand: Echo Act IV Pro
🤖 Generated with Claude Code
https://claude.ai/code/session_01Rq18tfPmFcgzHQFgoSpsUN