Repository navigation
The hygiene check reads every exit-3 die of lanes-edit.sh against its cause and both documented rows, so a die that claims nothing was pushed or a fourth die no row documents fails it (#68 item 5) - #259
Merged
Conversation
… cause and both documented rows, so a die that claims nothing was pushed or a fourth die no row documents fails it (#68 item 5) test_the_exit_3_documentation_agrees_with_the_die_message_it_describes extracted ONE of lanes-edit.sh's three `die "..." 3` (the rebase conflict's, found by its own words) and read the two exit-3 rows only for the words timeout, push, pull and peer's anywhere in the table text. git_timeout_die's message and commit_push's six-attempts message could say anything, "nothing was pushed" included where a push may already have landed, and the test stayed green. Measured on scratch copies of the real files: 9 of 15 mutations (either die saying nothing was pushed, either die losing its cause, a fourth die, a call site naming a fetch, a table row losing its timeout or its peer's-file cause) left the old test green. The rule now collects every `die "..." 3`, ties each to its cause by where it sits (the function git_timeout_die; the branch after the dirty_elsewhere guard; the branch after a failed `git_net ... pull`) and never by its words, so the rewording #68 item 3 and the act 2 commit_publish will do cannot blind it, and holds each die and the exit-3 ROW of the table and of the manual to the same three causes. A die no cause explains, or one it cannot read, is a finding; so is a die or a row that claims nothing reached origin (the one true form is "not pushed by this attempt"); and the network operations git_timeout_die is called for are read off its call sites, so a timeout on a fetch the rows never name is caught. The rule is a function over text, with a fixture and 22 red and 7 green cases, so the suite itself keeps the proof. The docstring's stale line numbers are replaced by the functions they meant. Tests only: lanes-edit.sh and docs/README-lanes.md are #214's and are not touched. Part of #68; items 1-4 wait on #214. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Reviewer's GuideStrengthens exit-3 repository hygiene validation by structurally discovering every die site, mapping it to its control-flow cause, and requiring the code table and manual row to document the same causes and timeout operations, with comprehensive mutation and rewording regression tests. File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
…e word, tolerates more than one space before the 3, and its comments name what the anchors and the reader cannot reach (#68 item 5, review of #259) The review of #259 found four things in the rule, all in tests/test_repo_hygiene.py: - The reader for git_timeout_die's calls saw only a double-quoted first argument. #68 item 3 may hand it the operation as a word of its own (`git_timeout_die push "git push ..."`), and the rule would then report "nothing calls git_timeout_die", which is false. Every mention of the name but its definition is now read as a call, and the words after it on its line, a bare or a quoted operation word, name the operation. A call whose shape the reader cannot place is a finding that says exactly that. - _ENDS_IN_EXIT_3 and _DIE_EXIT_3 took exactly one space before the 3, so a die with two spaces slipped past the extractor and the count that guards it. Both take spaces or tabs now, and the comment says what stays out of reach (an exit code in a variable, a backslash-continued 3) instead of "never a hole". - The comment and the docstring called the rebase conflict's anchor "a failed pull". It is the git_net ... pull call that the die sits after. - The ROUND 5 bullets in the test's docstring restated the comment block at _EXIT_3_CAUSES; they are one pointer now, and the two manual-row fixture cases that repeated table cases are gone. Fixture: two red cases added (a bare operation word no row names; a mention of git_timeout_die the reader cannot place as a call) and two dropped (the manual repeats of table cases), two green added (the bare-word call; two spaces before the exit code). 22 red and 9 green, 235 passed in the hygiene file. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
This was referenced Oct 19, 2026
brettheap
marked this pull request as ready for review
October 19, 2026 13:01
|
Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days. You can request another review in 2 days and 6 hours by commenting |
brettheap
added a commit
that referenced
this pull request
Oct 19, 2026
…tead of reading it as no answer, and its window ref is checked as a whole string (#72 item 8, #80 item 4) (#260) Landed on Brett Heap's word "land #259 #260 #261 when green" (2026-10-19), by lane openRepoTools-5. Required Linux CI (guard-launch-mode, tests, tests-no-submodule; run 39246399617) was green on head c249ba6 with main 9b94a59 in its tree. Main ec4555b merged with head c249ba6 is tree 36a1d17, which queue run 39248750040 (workflow_dispatch of tests on 961fcb7) tested whole and green. Independent review (lane 5, Opus, of c9d681f): LAND. Fix round 1 (c249ba6) adds the canon-lane read after the three rungs, so a case-twin lane is refused whichever rung found it, and refuses a window ref carrying a newline. Part of #72 Part of #80 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap
added a commit
that referenced
this pull request
Oct 19, 2026
…, and prints both in its transcript and in CI's step summary (#77, step 1a) (#261) Landed on Brett Heap's word "land #259 #260 #261 when green" (2026-10-19), by lane openRepoTools-5. Required Linux CI (guard-launch-mode, tests, tests-no-submodule; run 39245315763) was green on head d05dc0b with main 08e7550 in its tree. Main add5c15 merged with head d05dc0b is tree ca3c9d5, which queue run 39248755273 (workflow_dispatch of tests on 800ec88) tested whole and green. Independent review (lane 5, Opus, of 6335ca8): LAND. Fix round 1 (d05dc0b) reports the teardown once and names a failed removal, and moves the rows-equal-headings check to the report. Part of #77 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap
pushed a commit
that referenced
this pull request
Oct 19, 2026
Main now holds lane 4 queue, lane 5 queue (#259 #260 #261) and #246 (55aae16). The one conflict is tests/test_repo_hygiene.py import block: #262 adds import sys and #259 adds from collections import namedtuple; both are kept. The tree is lane3-queue/q1d-228pr1-on-p246c, run 39256880821, green. Lane: openRepoTools-3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap
pushed a commit
that referenced
this pull request
Oct 19, 2026
Main moved past this branch's base 5e88a2c: #259, #260, #261 and #246. #246 touches lanes-edit.sh and docs/README-lanes.md too. The merge is clean, the lock lines are main's own, and lanes-edit.sh parses under bash 3.2.57 and 5.2. CI tests the moved main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.



Part of #68 (item 5 only). Items 1-4 wait on #214, which owns
lanes-edit.shanddocs/README-lanes.mdhere, so this PR changes neither.What was wrong
tests/test_repo_hygiene.py::test_the_exit_3_documentation_agrees_with_the_die_message_it_describesread ONE of the threedie "…" 3inlanes-edit.sh: the rebase conflict's (:2192), found by its own words. It never read the other two:git_timeout_die's own message (:1894);commit_push's six-attempts message (:2125, the branch that skips the pull because a peer's uncommitted file blocks it).The two rows (the exit-code table in
lanes-edit.shanddocs/README-lanes.md's copy) were checked only for the words timeout, push, pull and peer's. For the code's table the "row" it was handed was the whole table text, so another row'spushsatisfied it. So either die could say anything, "nothing was pushed" included where a push may already have landed, and the test stayed green.Measured on scratch copies of the real files (below): 9 of 15 mutations left the old test green.
What changed
Only
tests/test_repo_hygiene.py. The rule is now a function over text,_exit_3_findings(src, manual=None), and the existing test calls it (code half first, then the manual's, so a standalone code leg still asserts its half before the spec leg's absence skips, #186 T009).die "…" 3inlanes-edit.sh. There are exactly three today. Adie … 3that no documented cause explains is a finding, and so is one the extractor cannot read (a message holding a command substitution with quotes of its own): a count of lines ending… 3after a closing quote (one or more spaces or tabs before the 3) is compared with what was extracted, so a die of that shape the extractor cannot read is a finding. What stays out of its reach is a die whose exit code is not a literal3on the line that closes its message: the code held in a variable, or a3on a backslash-continued line of its own.git_timeout_die; the branch after thedirty_elsewhereguard; the branch after thegit_net … pullcall (the rebase conflict's die is in itselsearm, reached when that call fails). PR #50 round 5 (Copilot 5203628254): commit_push's recovery block leaves $LANES_REPO unquoted, git cherry unbounded for multi-commit checkouts, and git_timeout_die still push-shaped for a pull timeout #68 item 3 and the act 2commit_publishwill reword these messages, so the anchor survives a rewording that keeps the meaning. The marker is a call and not a word, because the peer branch's ownnotesays "skipping 'pull --rebase'" a few lines above its die.git_timeout_dieis called for are read off its call sites (today a push and a pull), so a timeout on a fetch that neither row names is a finding. A call may hand it the operation as a quoted command (git_timeout_die "git push origin $B") or as a bare or quoted word (git_timeout_die push "git push origin $B", a shape PR #50 round 5 (Copilot 5203628254): commit_push's recovery block leaves $LANES_REPO unquoted, git cherry unbounded for multi-commit checkouts, and git_timeout_die still push-shaped for a pull timeout #68 item 3 may use). Every mention of the name but its definition is read as a call; one whose shape the reader cannot place is a finding that says exactly that, never "nothing calls it".lanes-edit.sh:1166,:1112/1141/1160) are replaced by the functions and branches they meant. The three current lines are named "at main 08e7550".Functions and regions edited
tests/test_repo_hygiene.py: the import block (addsfrom collections import namedtuple).tests/test_repo_hygiene.py: new_Exit3Causeand_EXIT_3_CAUSES,_DIE_EXIT_3,_ENDS_IN_EXIT_3,_NOTHING_REACHED_ORIGIN,_function_around,_exit_3_cause_of,_GIT_TIMEOUT_MENTION,_AT_COMMAND_START,_timeout_operations,_exit_3_dies,_flattened,_exit_3_row_of_the_table,_exit_3_row_of_the_manual,_exit_3_row_findings,_exit_3_findings, placed betweentest_the_exit_code_table_carries_every_code_the_file_exits_withand the exit-3 test.tests/test_repo_hygiene.py:test_the_exit_3_documentation_agrees_with_the_die_message_it_describes(docstring and body, same name:specs/004-migrate-to-triad/test-roots-and-ci-2026-10-08.mdmaps it to the manual's root and that mapping still holds).tests/test_repo_hygiene.py: newEXIT_3_SOURCE,EXIT_3_MANUAL,_a_fourth_die,EXIT_3_REFUSED,EXIT_3_ACCEPTED,_exit_3_fixtureand three tests, directly after the exit-3 test.Not touched:
lanes-edit.sh,docs/README-lanes.md,specs/004-migrate-to-triad/,contracts/openreposhape-pin.yaml,upstream/. None of lane 4's and lane 1's open PRs (#202, #207, #210, #211, #214, #217, #219, #230, #246, #252, read withgh pr diff) changestests/test_repo_hygiene.py. Lane 3's #262 does: it addsimport astandimport systo this file's import block, and this PR addsfrom collections import namedtuplein the same spot, so merging #262 with #259 conflicts at line 25. Resolve it by keeping all the imports.Tests
Added to
tests/test_repo_hygiene.py(a fixture shaped like the three die sites and the two rows, with the decoys that fool simpler rules: adie … 3in a comment, and theskipping 'pull --rebase'note):test_the_exit_3_rule_is_green_on_the_fixture_it_is_mutated_from;test_the_exit_3_rule_is_red_on_a_die_or_a_row_that_disagrees: 22 cases (including a bare operation word no row names, and a mention ofgit_timeout_diethe reader cannot place as a call), each one planted disagreement, and each must be refused in the words of the check that should refuse it, so a case cannot pass for the wrong reason;test_the_exit_3_rule_is_green_on_a_rewording_that_keeps_the_meaning: 9 cases (timeout die reworded, peer's-file die saying "dirty", conflict die's clauses moved,commit_pushrenamed, a call handinggit_timeout_diethe operation as a bare word, two spaces before the exit code, a trailing comment after the exit code, the attempt-scoped phrase wrapped onto a continuation line, the manual spelling "time-out").Fail before, pass after
The gap is in the test, so "before" is the old test run against mutated copies of the REAL
lanes-edit.shand manual, loaded fromgit show 08e7550:tests/test_repo_hygiene.py, beside the new one (scratch script, not shipped; each mutation staged in its own temp directory, the real files untouched):die … 3inrefuse_dirty_checkoutdie … 3whose message holds$(printf "%s" "x")git_timeout_diecall site now names a fetchUnmutated real tree: old green, new green. The new test is red on all 15 (rerun at adb6940, same result).
Run only the hygiene file, through the lock, with every
LANES_*seam andTMUXunset (env | grep '^LANES_\|^TMUX'prints nothing inside it):python3 -m py_compile tests/test_repo_hygiene.pyandgit diff --checkare clean. No bash file changed, so nobash -napplies.Forward check: the new rule on the head
lanes-edit.shanddocs/README-lanes.mdof #214, #219, #230, #246 and #252 (the open PRs that change either file) reports 0 findings on each, so none of them trips it when they land.The full suite was not run locally (CI's
testsjob is the suite of record).Fix round 1 (adb6940, after the independent review of 25ae36d said LAND)
A new commit on the same branch,
tests/test_repo_hygiene.pyonly:git_timeout_die's calls saw only a double-quoted first argument, so a callgit_timeout_die push "git push …"(a shape PR #50 round 5 (Copilot 5203628254): commit_push's recovery block leaves $LANES_REPO unquoted, git cherry unbounded for multi-commit checkouts, and git_timeout_die still push-shaped for a pull timeout #68 item 3 may use) would have made the rule report "nothing callsgit_timeout_die". It now reads every mention of the name but its definition as a call, parses the words after it on its line, and takes the operation from a quoted command, a bare word or a quoted word. A mention it cannot place as a call (not the first word of a command) is a finding that says exactly that. New green case for the bare-word call, new red cases for a bare word no row names (git_timeout_die fetch "…") and for an unplaceable mention._ENDS_IN_EXIT_3(and_DIE_EXIT_3with it, so the two stay consistent) take spaces or tabs before the 3, not exactly one. New green case: two spaces before the exit code. The "never a hole" wording is gone: the comment now names what stays out of reach (an exit code held in a variable, or a3on a backslash-continued line of its own).git_net … pullcall", not "after a failed pull" (the comment on_EXIT_3_CAUSES, the test's docstring, and this body)._exit_3_row_findings, and the ROUND 5 bullets in the test's docstring that restated the comment block at_EXIT_3_CAUSESare now a pointer to it.Local, at adb6940, with the lock and every
LANES_*seam andTMUXunset:python3 -m pytest tests/test_repo_hygiene.pygave 235 passed. The scratch 15-mutation run on the real files and the forward check on #214, #219, #230, #246 and #252 were rerun with the same results (new test red on all 15; 0 findings on each PR's head).🤖 Generated with Claude Code
Summary by Sourcery
Make the exit-3 hygiene validation cover every failure path and its corresponding documentation.
Bug Fixes:
Enhancements:
Tests: