Repository navigation
Land on the organization's repository as the merging account; stale-review rule and local reviews for the Codex gate - #1061
Merged
seathatflowsinourveins merged 4 commits intoOct 13, 2026
Conversation
…tale-review rule and local reviews to the Codex gate - nas_land.sh: R comes from LANDING_REPO, default native-agent-stack/native-agent-stack. GitHub redirects the old slug (github/docs@be38ec5d transferring-a-repository.md:62) until a repository is created at the old location (:68-69). - Both scripts (CC correction #198): the no-reply author is LG_AUTHOR_LOGIN, default seathatflowsinourveins, and R's owner only when it is unset. A login of another shape is refused before any call (exit 11). The form <id>+<login>@users.noreply.github.com is unchanged (email-addresses-reference.md:47). - codex_gate.py (CC correction #200): a review shown running with no connector activity for 90 minutes gives 5. This is the CC's operational block, ported byte for byte. - Local reviews: LOCAL_REVIEWS, with its alias CODEX_LOCAL_REVIEW, names normalized review files, and the gate decides from them alone: - 2 for a file that is malformed, of another head or not completed; - 4 for a P0 or P1 finding; - 0 otherwise, with P2 and P3 counted. lg_gate passes on the heads that carry the read head's change (lg_same_change). - review_normalize.py writes the normalized files from a `codex review` rollout (openai/[email protected]) or from the /code-review plugin's comment (anthropics/claude-plugins-official@f359d43b). - The new tests fail at c63c83a (104 failures, 7 errors) and pass here (133 tests). Co-Authored-By: Claude Opus 5.5 <[email protected]>
…eview arm advisory The CC's follow-up to the first commit of this pull request. - review_normalize.py carries Codex's overall_correctness verbatim, and overall_confidence_score when present. openai/[email protected] rubric.md:85 fixes "patch is correct" | "patch is incorrect", while the wire type is a free String (protocol.rs:3507). The mirror at 092d3acd6 holds the same bytes as the tag. - codex_gate.py: - "patch is incorrect" blocks (4), whatever the findings' priorities; - any verdict other than exactly those two stops (2), as does a set with no completed codex-review (the required arm). - The /code-review arm is advisory until the review-replay addendum measures it (arms E and F). Below a score of 80 the plugin does not proceed to its comment (code-review.md:26), and it skips a pull request it already reviewed (:11). So its issues are counted and a missing comment is noted, and neither stops the gate. - The new tests fail at a6c8bf7 (134 tests: failures=76, errors=2) and pass here (134 tests). Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ty variable, refine the stale rule, drop host-only digests From the CHANGES_REQUESTED reads at c999eee: the CC's Claude read, the CC's /code-review probe and Astra's read. - P1, the base: a codex-review now records the merge base its request named (openai/[email protected] review_request.rs:21, :62-70; branch.rs:13-15), and lg_gate requires it to be git merge-base <head> origin/main. Base = head and base = head^ stop. - P1, an empty variable: a set but empty LOCAL_REVIEWS or CODEX_LOCAL_REVIEW now selects local mode and stops (2), instead of falling back to the connector. - P2, the order: a review of our head that ended other than Completed gives 4 before the stale 5. A trigger after a stall gets the NOSTART grace, and the eyes reaction with no Running row is bounded. - #200's value: OpenAI's Codex docs state no review time limit. The README records the measured basis (nas#1056) and keeps the value in one constant. - P3s: - LANDING_REPO must have the owner/name shape, and every -R "$R" is quoted; - users/<login> must be of type User; - Legacy rollouts are refused, fail closed (exec/src/lib.rs:1425-1432; rollout/src/policy.rs:141-155); - codex_wait gives a local 2 its own message; - the plugin comment is bound to --head by its full-SHA links. - Astra P1-3: the README carries no digest or prefix of a host-only file any more, and a test refuses any digest that is neither a tracked file's nor a named public artifact's. - Astra's follow-ups 1 and 2: a refused retry removes the earlier --out file, and a non-finite confidence stops the gate. - The new tests fail at c999eee (144 tests: failures=164, errors=2) and pass here (144 tests). Co-Authored-By: Claude Opus 5.5 <[email protected]>
…e eyes bound, harden the digest guard The fixes for the CC's Claude delta and Astra's read at 974090c, both CHANGES_REQUESTED: - nas_land.sh requires local reviews (the CC's ruling). With LOCAL_REVIEWS and CODEX_LOCAL_REVIEW both unset it stops with 2 before any call, before the lock, update-branch and ready. The one exception is LOCAL_REVIEW_WAIVER: a file whose last Waiver line reads "Waiver: local reviews for #<pr> at <head8>", checked in verdict_gate and again by final_gate. A waived landing asks the connector as before and records the waiver in its squash body, after the body GitHub offers for the squash (viewerMergeBodyText, where gh's own edit step starts). uet_land.sh keeps the connector path; neither the shared block nor codex_gate.py changes for this. - codex_gate.py, Astra's P2: the latest review of our heads since the trigger decides. An earlier completion hid a later Cancelled review: beside a stale row of another commit the gate gave 5, and with no row running 0. Both give 4 now; a later completion still supersedes a failure. The base's test that pinned "any completion evidence passes" is flipped. - codex_gate.py: the connector's eyes reaction with no Running row waits (3) with no bound again, as at c999eee; 974090c's 5 was a new opening. - Sources cited: the users API's type and the owner/repo parameters (github/rest-api-description@58b1e0c0), the repository-name rule (github/docs@be38ec5d), the set-or-unset tests (bash(1), cpython v3.13.16 os.environ), os.replace and os.unlink, json's number parsing and math.isfinite. - The digest guard reads any letter case and bare prefixes (a commit id must be a named public commit), the four scripts and, with LANDING_PR_BODY, a pull request's body; its known digests are the files git tracks. - README: the requirement and the waiver, the latest-review rule, the eyes revert, the guard and its residuals, the clean-comment limit, the sources and the files as committed. manifests/evidence.json: the six records. The module run against 974090c's tools/landing: 156 tests, FAILED (failures=31, skipped=1). The guard's probes are measured against 974090c's guard, which finds none of them. Co-Authored-By: Claude Opus 5.5 <[email protected]>
seathatflowsinourveins
force-pushed
the
foundation/landing-org-local-codex-20261013
branch
from
October 13, 2026 06:24
f9266fd to
8374e91
Compare
seathatflowsinourveins
deleted the
foundation/landing-org-local-codex-20261013
branch
October 13, 2026 06:51
5 tasks done
seathatflowsinourveins
added a commit
that referenced
this pull request
Oct 13, 2026
… uet_land.sh The CC's read of #1075's first commit: codex_gate.py now decides with LOCAL_REVIEW_ADJUDICATION wherever it is set. uet_land.sh runs the same gate, but would neither bind the record to the pull request and the head nor record it in a squash body. Either variable can be inherited, for example from a nas landing in the same shell, so the first commit created the gap. - uet_land.sh stops with exit 2 when LOCAL_REVIEW_ADJUDICATION or SQUASH_BODY_FILE is set, an empty value included (${VAR+x}, the #1061 P1 test). It prints one line naming the variable as nas-only, before the lock and any call (uet_land.sh:34-40, outside the shared block). - Tests: - uet_land.sh with each variable set, to a valid record beside the local review it decides or a body file, and to an empty value, gives exit 2 with no call of any kind, a held lock included; - the text test that pinned "not in uet_land.sh" now pins the refusal: once, after the arguments, before the shared block and the lock, and read nowhere else. At 25a9b48 each of these landings merged, the valid record on the gate's adjudicated 0. - README: "A nas input in a uet landing", uet_land.sh in the variables table and the exit codes, the gap removed from Known gaps, and the new digests. manifests/evidence.json re-registers the changed files (scripts/host_receipts.py register_file). Co-Authored-By: Claude Opus 5.5 <[email protected]>
seathatflowsinourveins
added a commit
that referenced
this pull request
Oct 13, 2026
… review; port SQUASH_BODY_FILE (#1075) * Let the CC's adjudication decide a P2-only "patch is incorrect" local review; port SQUASH_BODY_FILE The CC's ruling of 2026-10-13: after a pull request's bounded rounds, a local re-review that says "patch is incorrect" with only P2 and P3 findings is decided by the CC, not looped. Until now codex_gate.py gave 4 for it whatever the priorities (codex_gate.py:52, :327-329 at 993cc89). - codex_gate.py: LOCAL_REVIEW_ADJUDICATION names the CC's record. It turns that 4 into 0 only when all of these hold: - no codex-review has a P0 or P1 finding; - exactly one says "patch is incorrect"; - the record's last Adjudication line names that file's sha256 (of the bytes the gate parsed), the pull request and the read head; - its Finding lines are exactly that review's findings, one disposition each (fixed, follow-ups or rejected). The gate renders each finding's lines and compares whole lines. Anything else stays 4, with a reason in fixed words. A record set where no review says "patch is incorrect" also gives 4, so no squash body records a record that no gate checked. - nas_land.sh verdict_gate reads the record once at each check (lg_text), as it reads the waiver. The record must name the pull request, the read head and a listed review file, and at the final gate the same file as at its first read; otherwise exit 2. The squash body records "Adjudication: local review <sha256> for #<pr> at <head8> (LOCAL_REVIEW_ADJUDICATION)". - nas_land.sh SQUASH_BODY_FILE comes from the CC's live copy (gh pr merge --body-file). These stop with exit 2 before the lock: - "-"; - a value that is not a readable, non-empty regular file; - a set but empty value (the live copy took it for unset). Beside a waiver or an adjudication, the body is the file's text, a blank line and that line, because gh takes --body or --body-file, never both (cli/[email protected] pkg/cmd/pr/merge/merge.go:138-143, :146-153, :177; pkg/cmdutil/file_input.go:8-15). - README: the variables, the exit codes, "Local reviews", "The squash body" and the sources. manifests/evidence.json re-registers the four files (scripts/host_receipts.py register_file). - The new tests fail at 993cc89 (51 failures, 1 error, all in the 9 new tests) and pass here. The module ran 165 tests: OK. Co-Authored-By: Claude Opus 5.5 <[email protected]> * Refuse the nas-only LOCAL_REVIEW_ADJUDICATION and SQUASH_BODY_FILE in uet_land.sh The CC's read of #1075's first commit: codex_gate.py now decides with LOCAL_REVIEW_ADJUDICATION wherever it is set. uet_land.sh runs the same gate, but would neither bind the record to the pull request and the head nor record it in a squash body. Either variable can be inherited, for example from a nas landing in the same shell, so the first commit created the gap. - uet_land.sh stops with exit 2 when LOCAL_REVIEW_ADJUDICATION or SQUASH_BODY_FILE is set, an empty value included (${VAR+x}, the #1061 P1 test). It prints one line naming the variable as nas-only, before the lock and any call (uet_land.sh:34-40, outside the shared block). - Tests: - uet_land.sh with each variable set, to a valid record beside the local review it decides or a body file, and to an empty value, gives exit 2 with no call of any kind, a held lock included; - the text test that pinned "not in uet_land.sh" now pins the refusal: once, after the arguments, before the shared block and the lock, and read nowhere else. At 25a9b48 each of these landings merged, the valid record on the gate's adjudicated 0. - README: "A nas input in a uet landing", uet_land.sh in the variables table and the exit codes, the gap removed from Known gaps, and the new digests. manifests/evidence.json re-registers the changed files (scripts/host_receipts.py register_file). Co-Authored-By: Claude Opus 5.5 <[email protected]> * Bind the adjudication to the recorded review, tighten the record, and check the body file's content The three reads of #1075 at ca6f880: the Claude read (CHANGES_REQUESTED, no P0 or P1), the co-op's local codex review (pr1075-ca6f880b, two P2s) and Astra's first read (CHANGES_REQUESTED, two P2s). - The digest the gate decides on (the co-op's P2 at codex_gate.py:391-392, Astra's P2-2): nas_land.sh exports the review file's sha256 from the record's first read as LG_ADJUDICATION_SHA256, cleared at the start. codex_gate.py adjudicates only the file whose bytes have it, so files replaced between nas's final read and the gate's no longer pass on review B while the squash body records review A. - The body file's content (the co-op's P2 at nas_land.sh:585-586, Astra's P2-1): one bounded reader refuses a NUL byte, more than 64 KiB, anything but strict UTF-8 and a file with no text. It reads before any call (exit 2), when the body is built (exit 7) and at the final gate (exit 7, also when the text changed). The merge takes that snapshot as --body, alone too: --body-file would read the file again after the final gate. The 64 KiB bound is under one argument's MAX_ARG_STRLEN (torvalds/linux v6.18 include/uapi/linux/binfmts.h:15). The waiver or the record is also read and checked again when the body is built. - The record (the Claude read): - P3-1: a NUL byte stops both layers (nas_read; the gate); - P3-2: only the Finding lines after the last Adjudication line count; - P3-3: one line for each finding, identical ones included, a line beyond the review's count refused, and the dispositions counted a line each; - P3-4: LOCAL_REVIEW_ADJUDICATION on the waiver path stops with exit 2 before any call; - P3-5 (the CC's ruling): a "patch is incorrect" review with no finding is not adjudicable. - P2-1, the sha256 forms, cited in the README ("The sha256 forms") and in both scripts: - cpython v3.13.16 hexdigest is lowercase (Modules/_hashopenssl.c:652, Python/pystrhex.c:145-148, :88-89, Python/codecs.c:20; Doc/library/hashlib.rst:217-220 says only "hexadecimal digits"); - uutils coreutils 0.10.0 sha256sum prints hex::encode, lowercase in hex 0.4.3, then a space, the Text mode's space and the name (measured too). - The coverage asked for: a record bound from the start to another listed file (it kills a mutant of the gate's binding check, measured), an adjudicated landing through CODEX_LOCAL_REVIEW, a title holding ( and ), and a record and a body file of mode 000. - README: "The squash body", "The CC's adjudication", "The sha256 forms", the variables, the exit codes, the known gaps (rejected-with-evidence is the CC's to review, Astra's P3), the tests, the sources and the digests. manifests/evidence.json re-registers the changed files. - The new tests fail at ca6f880 (30 failures and 1 error, all in the 13 new or changed tests) and pass here. Co-Authored-By: Claude Opus 5.5 <[email protected]> * Write the squash body file's bytes, not locale-encoded text; correct nas_land.sh's header The co-op's local re-review of #1075 at f3f1cab raised one P2, which the CC's delta read found too and adjudicated as fix in this landing. - nas_land.sh:95, the body reader: it wrote the decoded text through sys.stdout, whose encoding is the locale's (cpython v3.13.16 Doc/library/sys.rst:1838-1839). Under an ISO-8859-1 locale "é" came out as the one byte e9, and "€" ended the reader with nothing written (UnicodeEncodeError, exit 1), while every check passed. It now writes the validated bytes through sys.stdout.buffer, their trailing CR and LF bytes dropped as before. - The test compiles an ISO-8859-1 locale with localedef into a scratch LOCPATH (glibc, locale(7)). LC_ALL=C cannot show the defect: Python turns on its UTF-8 Mode for the C or POSIX locale (Doc/library/os.rst:142-144; measured: utf8_mode 1, stdout utf-8). The reader's output must be the file's bytes under that locale for "é" and "€", with a C.UTF-8 control, and a landing under it must carry the body's UTF-8 bytes. Where no such locale can be compiled, the test is skipped. At f3f1cab it fails: 3 failures. - The doc-only P3-2: the header's exit 2 and exit 7 lists now match the code, the body is passed as --body, and "-" is refused because to gh --body-file it means standard input, while this reader would open a file called "-". - README: the reader's bytes, the shifted line citations, the test and the digests. manifests/evidence.json re-registers the changed files (scripts/host_receipts.py register_file). Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Scope
nas_land.shtakes the repository fromLANDING_REPO, defaultnative-agent-stack/native-agent-stack;LG_AUTHOR_LOGIN(CC correction Wire the order-contract boundary into every Alpaca paper submit (local refusal before any network call) #198);LOCAL_REVIEWS, with the aliasCODEX_LOCAL_REVIEW.tools/landing/review_normalize.py, which writes the normalized file from acodex reviewrollout or from the official/code-reviewplugin's comment.c63c83a822f2687c3e7aed2d3b3ede0413119c9blane:foundationtools/landing/(README.md,codex_gate.py,nas_land.sh,uet_land.sh, newreview_normalize.py);tests/test_landing_scripts.py;manifests/evidence.json(the six records of those files).Per item
R=${LANDING_REPO:-native-agent-stack/native-agent-stack}. The old slug is redirected, but GitHub deletes those redirects if a repository is created at the old location, so the default is the new slug.Rmust have GitHub's owner/name shape (exit 2 before any call), and every-R "$R"is quoted. Since the fourth, the rule cites the REST API'sownerandrepopath parameters and the docs' repository-name rule.lg_author_emailuses${LG_AUTHOR_LOGIN:-<R's owner>}, and both scripts setLG_AUTHOR_LOGIN=${LG_AUTHOR_LOGIN:-seathatflowsinourveins}.users/<login>reply of typeUsergives an id (exit 11 otherwise). Since the fourth, the filter cites the API:typeis a free string, "User" in its example and "Organization" for an organization's account.<id>+<login>@users.noreply.github.comis unchanged.codex reviewis the required arm; the/code-reviewplugin is advisory until the review-replay addendum measures it.codex-reviewfile carries Codex's verdict (patch is incorrectblocks with 4; any other value than the two stops with 2) and, since the third commit, the merge base its review request named.lg_gatepasses the gate<head>:<git merge-base <head> origin/main>for the read head and each pure rebase of it (the scripts'lg_same_change). A review against another base stops (2).nas_land.shrequires local reviews. With neither variable set it stops with 2 before any call. The one exception isLOCAL_REVIEW_WAIVER, a file whose lastWaiver:line readsWaiver: local reviews for #<pr> at <head8>. It is checked inverdict_gateand again byfinal_gate. A waived landing asks the connector as before, and its squash body records the waiver after GitHub's default body.uet_land.shis unchanged.The third commit: CHANGES_REQUESTED at c999eee, all three reviews
LANDING_REPOshape and quoting,type == "User", the Legacy rollout refused (fail closed, documented), and the bounded 👀. The fourth commit reverts the bound./code-reviewprobe (advisory).codex_wait's message on a local 2.--headby its full-SHA links.--outfile.The fourth commit: CHANGES_REQUESTED at 974090c, the CC's Claude delta and Astra
update-branchandready.verdict_gate, again byfinal_gate, and recorded in the squash body.codex_gate.py, anduet_land.shkeeps the connector path.github/rest-api-description@58b1e0c0for the users API'stypeand theowner/repoparameters, with the docs' repository-name rule.LANDING_PR_BODYnames it;bash(1), cpython'sos.environ), the users API'stype, the repository name,os.replaceandos.unlink, andjsonwithmath.isfinite.SOTA sources
openai/[email protected](installed: codex-cli 0.162.1), https://github.com/openai/codex/tree/rust-v0.162.1codex-rs/protocol/src/items.rs:173-183:EnteredReviewModeItem.target, andExitedReviewModeItem.review_output: Option<ReviewOutputEvent>.codex-rs/protocol/src/protocol.rs:3503-3545:ReviewOutputEventandReviewFinding.priority: i32.:3507givesoverall_correctness: String, a free String, and:3509the confidence.codex-rs/prompts/templates/review/rubric.md:85: the two verdict values.:58and:78: a priority may be omitted or null.codex-rs/core/src/tasks/review.rs:94-95: an abort.:188-208: the parse fallback.codex-rs/history/src/rollout_payload.rs:32-33: how a rollout line is tagged.codex-rs/prompts/src/review_request.rs:21: "The merge base commit for this comparison is {{merge_base_sha}}".:20: the fallback prompt with no SHA.:62-70: when each is used (sha256f4896d67…).codex-rs/git-utils/src/branch.rs:13-15:merge_base_with_head"mirrorsgit merge-base HEAD <branch>" (sha25686774c34…).baseBranchrollouts: 3 named the merge base withorigin/main, and 3 were delta reviews against a commit of the pull request's own branch.codex-rs/exec/src/lib.rs:1425-1432: falls back from paginated history;:1461is the paginated default (sha25651b62cef…).codex-rs/rollout/src/policy.rs:141-155: only Legacy rollouts persistEnteredReviewMode/ExitedReviewMode(sha25665ce50e8…).72459eb4…).:129; sha256c18b2fe1…).:52,:170,:196-205; sha2561ab50213…).github/docs@be38ec5d78e24172587e61b3c6ff40ace1865c71content/repositories/creating-and-managing-repositories/transferring-a-repository.md:62,:68-69, sha256ed316b3f…).github/docs@be38ec5dcontent/account-and-profile/reference/email-addresses-reference.md:47, "[email protected]", sha256fbbf1c5f…).github/docs@be38ec5dusername-considerations-for-external-authentication.md:94,:103,:126-127(sha256591df6bd…)./code-reviewplugin, run as shipped: https://github.com/anthropics/claude-plugins-official/blob/f359d43b406057f1a8cdbc4ea93b827642c162e6/plugins/code-review/commands/code-review.md (sha2567d5a0bc9…).:2is theallowed-toolsline,:11the skip of an already reviewed PR,:26"do not proceed" below 80,:50-92the comment format,:80-84the clean comment, which has no link, and:86-92the full-SHA links.README.md:157-167covers "No review comment posted".3ed09565…). It givesIssueComment.authorandlastEditedAt(nullable) at:21215and:21287-21290, andPullRequest.headRefOidat:44787. For the fourth commit::45597-45605viewerMergeBodyText(mergeType: PullRequestMergeMethod): String!, and:26079-26082MergePullRequestInput.commitBody, "if omitted, a default message will be used".github/rest-api-description@58b1e0c00b39descriptions/api.github.com/api.github.com.json(sha256da3d22e4…).:88612-88614GET /users/{username}.:126248-126250and:160055-160058:typeis a free string, "User" in the example.:311038: an organization's "Organization".:344898-344915: theownerandrepopath parameters.github/docs@be38ec5ddata/reusables/repositories/repo-name.md:1(sha2565a1343a0…): at most 100 characters, ASCII letters, digits,.,-and_.cli/[email protected](the commitfc4b137c).pkg/cmd/pr/merge/merge.go:146-147and:176:--bodysets the body.:721-735: the "edit the commit message" step starts fromviewerMergeBodyText(sha256ca3849b4…).pkg/cmd/pr/merge/http.go:72-75and:121-158:CommitBody, and the query (sha25617eb5418…).squashMergeCommitMessageisCOMMIT_MESSAGES, and--jqprints the string raw.bash(1)of the installed bash 5.3, Parameter Expansion: "Omitting the colon tests only for a parameter that is unset".python/[email protected]:Doc/library/os.rst:184-186(os.environ, a mapping),Lib/os.py:704, andLib/_collections_abc.py:808-813(getgivesNoneonly for a missing key).os.rst:2754-2760(os.replace),:3671-3676and:2661-2665(os.unlink),Doc/library/json.rst:308-311(float(num_str)), andDoc/library/math.rst:370-373(isfinite).Evidence-class table
git archive c63c83a8 tools/landing tests: FAILED (failures=104, errors=7)git archive a6c8bf7c tools/landing tests: 134 tests, FAILED (failures=76, errors=2)git archive c999eee5 tools/landing tests manifests/evidence.json: 144 tests, FAILED (failures=164, errors=2); the README custody check finds 7 full digests and 4 prefixes theregit archive 974090cf tools/landing tests manifests/evidence.json, made a git work tree: 156 tests, FAILED (failures=31, skipped=1)readme_digest_custodyon the new probes: 0 of 5 found (upper case, an upper-case prefix, a bare prefix, ASCII dots, a longer run), and an untracked file's digest passedpython3 -m unittest tests.test_landing_scripts: 156 tests OK (skipped=1, the body check, which needsLANDING_PR_BODY), also withCI=true; withLANDING_PR_BODYnaming this body, the body check passescodex_gate.py: identical (no digest of the live copy is published)flock -n -E 75probe at every gate call: held; after the landing: freebaseBranchrollouts, read only: 3 namedgit merge-base <head> origin/main; 3 delta reviews covered 1, 1 and 2 commits, leaving out 1, 5 and 1baseBranchreview of 8eb4b53 completed; acustomand anuncommittedChangesrollout refused on their targetviewerMergeBodyTextquery on this pull request, read only: the commit messages;squashMergeCommitMessageisCOMMIT_MESSAGESgh -R)Local commands run
shellcheck was not run: CI does not run it on these scripts, and it is not installed on this host.
bash -npasses for both.Decision record
None separate. The README's "Local reviews" section and its 2026-10-13 sources tables record the schema, the required and advisory arms, the base rule, nas's requirement and its waiver, the pins, the measured facts and the untested boundaries.
Host evidence
Not applicable: no file under
evidence/hosts/changes.Checklist
Risks
--commitreviews are refused. The normalizer accepts only abaseBranchreview, the pull request's whole change against its base. A review the co-op wrapper runs with--commitcovers one commit and is refused, so the required arm must run in the wrapper's default mode, against the head's merge base withorigin/main.Follow-ups
review_normalize.py(exit 2, such as--head bad) leaves an earlier--outfile. Trigger: retry automation, or a claim that every failed attempt invalidates the output.lg_author_emailis reachable only through the shared helper, since both scripts set a login. Trigger: the helper's calling convention changes.lg_gaterepeats per-file git work at every gate call. Trigger: large local review sets or repositories; measure it first.PUBLIC_DIGESTSnames public artifacts but does not verify their bytes against a mirror. Trigger: the guard's next change.manifests/evidence.json; this PR changes none of them.🤖 Generated with Claude Code