Repository navigation
feat(source-control): count the security lane's docs-only skip as review evidence for all-docs pull requests - #8791
Conversation
…iew evidence for all-docs pull requests The merge gate unbound the security lane on skip=docs-only, so a documentation-only pull request never merged unattended (owner decision A7). The skip now binds the security lane, with no findings of its own, when every changed path matches the lane's v0.48.0 docs-only default and none is an agent instruction path. The code review lane is unchanged; open security threads still count, and the skip never reports that a whole review clears. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
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 Security review: incremental since
|
|
claude-review reviewed Incremental review: ca56dc4 → f143a26No findings. I read the incremental diff and the surrounding code in Changes reviewed
Observations, not blocking
|
…ane never reviewed the pull request poteto's review of #8791: a docs-only skip at the head replaced the whole chain, so an earlier security review's summary findings dropped out of the count. The skip now binds only when every record the lane left on the pull request is a docs-only skip. is_docs also refuses \r, \n, U+2028 and U+2029, which the lane's JavaScript `.` never matches, and tests pin the ^...$ anchoring. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
… the docs-only bind Security & Cost's pass on #8791: is_docs now also refuses any reference/ directory (skills read it as instructions, such as the GitHub provider README the babysit skills follow), docs/adr/, docs/conventions/ and docs/standards/, in any case. A docs-only skip also unbinds when the lane's reviewed-head marker is older than every listed run: the lane edits one marker in place, so such a marker came from a run no longer listed that may have reviewed the pull request. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M
…kip as review evidence (#8841) Closes #8827 ## Summary Reverts #8791. Security & Cost found after it merged that the security lane's docs-only skip could still count as review evidence when the reviewing run was deleted, and for `docs/plugin-philosophy.md`, `docs/upstream/**` and `docs/architecture/**`, which instruction files cite. As built it bound 0 of the last 100 lane pull requests, so the revert removes the bypass and loses nothing in practice. Owner decision on #8827, 2026-10-21. ## Fix - `git revert` of the #8791 merge commit: `babysit_review_evidence.py` and its tests return to their state before #8791. - #8791's changelog fragment was never released, so the revert deletes it and adds a `bump: none` fragment for source-control. - A docs-only evidence rule returns only if a real lane needs it, with a recorded-attempt window check and an explicit docs allowlist, passed again by Security & Cost. ## Verification - `scripts/check-affected.sh`: 12 passed, 1 skipped (the changed Python tests and the changelog fragment checks included). - Left out: nothing beyond CI's own suites, which run on this PR. ## Related - #8791: the change reverted. - #8834: the related finding that pr-merge reads merge settings at a PR's stale base. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
No related issue: owner decision A7 (2026-10-21, automation-lanes interview): a security-lane
skip=docs-onlycounts as review evidence for docs-only paths.Hold: a human merges this. It changes merge-gate evidence; poteto reviews first, then the Security & Cost pass, then the owner merges.
Summary
The babysit merge gate (
babysit_review_evidence.py) unbinds the security lane onskip=docs-only(raise Unbound("skip-not-no-change")), so a documentation-only pull request never merges unattended: the security review lane skips it on purpose, and the gate reads that as no review.Fix
bind()computes once whether every changed path (both rename sides) is documentation by the security lane's own rule: itsdocs-only-pathsdefault at the pinned ci-workflows v0.48.0 (docs/**/*.md,**/README.md,**/CHANGELOG.md) minus the agent-instruction paths the lane never counts as documentation. Stricter than the lane, anyreference/directory,docs/adr/,docs/conventions/anddocs/standards/never count, in any case (Security & Cost). A path holding \r, \n, U+2028 or U+2029 is never docs (the lane's JavaScript.stops at them). The globs and the instruction pattern are a byte-level port of the lane'sglobToRegExpandINSTRUCTIONS, fixed in code likeLANES._resolve()binds the security lane'sskip=docs-onlyat the head as a chain of its own only when that flag holds and every record the lane left on the pull request is a docs-only skip (the lane never reviewed it), so an earlier review's findings are never dropped; and the lane's reviewed-head marker is not older than every listed run (a deleted reviewing run would otherwise leave its marker for the skip to edit). Every other skip, and the code review lane's docs-only skip, still unbinds withskip-not-no-change.whole_review_clears, because a whole re-review of an all-docs pull request skips again (avoids a feat(pr-pipeline): request a whole review when a lane PR is held only by findings an incremental review cannot clear #8580 request loop).Verification
python3 -m unittest tests.test_babysit_review_evidence: 136 tests OK at f143a26, including the newSecurityDocsOnlyTests(binds on all-docs, unbinds on one code path, on non-matching docs-looking paths, on instruction paths such asskills/**/README.mdandAGENTS.md, on a rename from code, on an empty diff; an unresolved or agent-resolved security thread still counts; glob grammar).whole_review_clearsguard, the never-reviewed check, the line-break check, or switchingfullmatchtosearcheach fails a test.scripts/run-ruff.sh checkandformat --check: clean.pr-review-security.yml): the skip record is... skip=docs-only, and the reviewed-head marker is written on a skip too.Related
docs-only-pathsdefault is empty), so docs-only PRs still need a real code review.skip=docs-onlyat head with nothrough, so the security lane stays unbound there.🤖 Generated with Claude Code
https://claude.ai/code/session_01DZUxjJX2Sbu4ASZUPcwC3M