Repository navigation
T017: A lane control root that cannot be searched is read as not read, not as no trees: lane-state and lane-trees exit 10, the listing says UNREAD, and a sync keeps the lane's rows (opensoft/openRepoTools#291) (part of opensoft/openRepoTools#186) - #8
Merged
Merged
Conversation
… is read as not read instead of as no trees: lane-state and lane-trees exit 10 instead of 8, the listing says UNREAD, and an inventory sync keeps the lane's rows This is the T017 continuation, in this leg (opensoft/openRepoTools-spec), of the original opensoft/openRepoTools branch fix/control-root-unsearchable-291 at 3e97ae51445291fc3efdd36da5709edee3103549, issue opensoft/openRepoTools#291. The original branched from main 50d05d4 and its head merges 50d05d4, so its own change is its head against 50d05d4 with that merge left out (the merge's tree equals git's automatic merge). Spec-leg part of its own change: docs/README-lanes.md (+25 -8: the exit-code row for 10, the unreadable row of the verdict table, a paragraph under Where it lives on when a rung is passed over, the lane-trees paragraph, the inventory index's path row and marker-row paragraph, and the named-read paragraph). Its other paths (lanes-edit.sh, lanes-index, lanes and tests/test_unsearchable_control_root_291.py) belong to the code leg and are the paired commit there; the leg table sends docs/ to this leg with no rename. This continuation stacks on the one for opensoft/openRepoTools#301, as ORDER.md's chain has it; the two touch different hunks of the manual and the apply was clean. The subjects below are quoted from the originals; a bare #N in them is opensoft/openRepoTools#N. Old-to-new receipt, the original's own non-merge commits in opensoft/openRepoTools (50d05d4..3e97ae5): a431854c42c4 Test that a lane control root nobody could search is never read as a lane with no trees, and that an inventory sync keeps that lane's rows (#291) 02571b4ade4f A lane control root that cannot be searched is read as not read, never as no trees, so an inventory sync keeps the lane's rows (#291) af4d132af4c7 A lane whose inventory could not be read is no longer said to have one that is there, because a blocked lookup never saw whether it was (#291) 124b509eb6f0 Test that a write under a lane control root nobody could look for fails and is filed nowhere else, and that a .lane-state link whose target is gone is unread, never none (#291) b0a631baa46c lane_generation's docstring no longer says that a snapshot it could not read is there, because a blocked lookup never saw whether it was (#291) 7db059f458a7 The README's rung section says that a rung is passed over only where its directory is established absent, and that a rung nobody could look for keeps its root, so its reads are 10 and its writes fail (#291) 468b20e6c411 lane-reconcile no longer says that a trees directory nobody could look for is there, and says instead that whether it is there could not be read, and why (#291) 3af5006f565f The lanes-index marker comment, the second exit-10 header in lanes-edit.sh and the README's unreadable verdict row no longer say that a record nobody could look for is there (#291) a3ea2af1946a Only the #291 cases that set a mode skip as root, so the links that cannot be followed, which set none, are proved there too (#291) 82ac6b742392 lookup_blocked's comment names its limit: a denial that the mode bits do not show still reads as absent (#291) 3e97ae514452 The README's rung paragraph now names what each surface says where a rung could not be looked for, instead of calling every read 10 (#291) Lane: openRepoTools-4 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Reviewer's GuideDocumentationRead the exit-code, verdict, and rung guidance together to verify how blocked control-root lookups are distinguished from absence across the lane interfaces.
Check the lane-trees guidance for consistent lookup behavior, including how a recorded directory affects control-root selection.
Read the inventory-index and named-read guidance together to confirm that unread lanes retain their rows and are reported as UNREAD.
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
This was referenced Nov 7, 2026
brettheap
marked this pull request as ready for review
November 8, 2026 13:47
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.
What this is
This is the T017 continuation, in this leg (opensoft/openRepoTools-spec), of the
opensoft/openRepoToolsbranchfix/control-root-unsearchable-291at3e97ae514452, for opensoft/openRepoTools#291 (part of opensoft/openRepoTools#186). The original tree and branch stay as the archived original (lane 4's decision, opensoft/openRepoTools#186 comment 6548343086). One commit here,0b6f2a0be00a, carries it.It carries the spec-leg part of that branch's own change, which is its head against
50d05d4with its merge of main50d05d4(457b73b) left out:docs/README-lanes.md, +25 −8, seven hunks. The change's other four paths (lanes-edit.sh,lanes-index,lanesandtests/test_unsearchable_control_root_291.py) are the paired commit in opensoft/openRepoTools-code. It is stacked on the spec PR for opensoft/openRepoTools#301 (#7), as the chain has it; the two touch different hunks of the manual, and the patch applied without conflict, at no offset.What was wrong and what changed
What was wrong
The manual described a lane's control root and its reads as if a path that tests false were always a path that is gone. opensoft/openRepoTools#291's code now tells a control root nobody could look for (a folder on the way cannot be searched, or a link on the way cannot be followed) from an absence that was looked for, and reads the first as not read:
lane-stateandlane-treesexit 10, not 8, the listing names the laneUNREAD, a sync keeps the lane's rows, andlane-reconcileisindeterminate. The manual's exit-code row for 10, itsunreadableverdict row, its rung section, itslane-treesparagraph and its inventory-index text covered only a snapshot or atreesdirectory that is there and cannot be read.Two of the original's review findings are about this text. SHOULD-1: the rung section still described the old fall-through, and the first fix (
7db059f) overstated, saying "every read under it is 10", where onlylane-stateandlane-treesexit 10 andlane-reconcileand the listing exit 0 withindeterminateor anUNREADline;3e97ae5, a manual-only commit, replaces that sentence. The manual's earlier "every write there fails" has one exception, which is opensoft/openRepoTools#309's (see Not in this PR).What changed
docs/README-lanes.md, +25 −8, seven hunks, in the order of the file:lane-stateandlane-treesspend 10 too where the record could not even be looked for: its control root, or a directory above it, cannot be searched, or a link on the way cannot be followed.unreadablerow of the verdict table: a snapshot that is there and cannot be opened is not a lane that has none, and nor is one that could not even be looked for;lane-stateexits 10 for both, never the 8 that means "this lane has no snapshot, go on".lane-stateandlane-treesexit 10 there, the listing names the laneUNREAD,lane-reconcilepronouncesindeterminate, and every write there fails rather than filing under the next rung.lane-treesparagraph: atreesdirectory that could not even be looked for is exit 10 too, the read walks up to the deepest name that is there and answers 8 only where that name could answer for the one below it,lane-stateanswers for the snapshot the same way, and a recordeddirwhose parent could not be looked for keeps its own control root rather than falling to$PROJECTS_ROOT's.pathrow: the lane of a sidecar that could not be read isUNREADbeside it, so a sync keeps that lane's rows rather than replace the tree's row with one keyed by the record's id.treesdirectory is there and cannot be listed, could not even be looked for, or holds a record that could not be read keeps its rows.treesdirectory, its control root or a directory above it cannot be listed or searched, or a record of its trees cannot be read) is that lane's ownUNREADline, and only that lane's rows are held; the named read never printsPARTIAL.The manual's added text keeps the original's bare issue numbers, such as
(#N), byte for byte. In this leg's manual they name opensoft/openRepoTools issues, as its other pre-split text does.Not in this PR
lane_state_renameis a write that does not: it moves nothing and says nothing. That, withset-lane-state's fence reading a snapshot it cannot look for as none, is the older problem filed as A control root nobody can search reads as an empty one in two writers: rename-lane leaves the lifecycle records behind without a word, and set-lane-state's fence says 7 for a race that never happened (from #291) openRepoTools#309 on Brett Heap's word of 2026-10-22; the paragraph stays as the original wrote it.lookup_blocked, the rungs, the reads, the listing,lane-reconcile, the writes and the tests.Old to new: the receipt
The original's own non-merge commits in
opensoft/openRepoTools(50d05d4..3e97ae5), 11 in all, are carried by one commit in this leg,0b6f2a0be00a. The list is the commit's own body, and it equals the original's non-merge commits read from the chain'srefs/root/ref (checked).The subjects are the original's, byte for byte; a bare
(#N)in them names the root issue.Of these, the commits that touch
docs/README-lanes.md(the original's range on that path) are02571b4ade4f,7db059f458a7,3af5006f565f,3e97ae514452. The others change code-leg paths only, and their part is the paired code PR's.Resolutions
None. The patch applied clean, with no offset, onto the commit for opensoft/openRepoTools#301.
The pairing
The code part of this change is the commit
ca9b847f678eonfix/control-root-unsearchable-291in opensoft/openRepoTools-code, its own PR, opensoft/openRepoTools-code#5 (basefix/subfield-misreads-301). The code leg's checks read the manual throughOPENREPOTOOLS_SPEC_ROOT:tests/test_repo_hygiene.pyreadsdocs/README-lanes.md(call sites at lines 1373, 1404, 1423, 3139 and 3572 of the code leg'smain; 1404 is the tuple of surfaces that a loop reads throughdoc()) andtests/test_test_roots.pypins which manual a run reads. The code leg's own CI (OPENREPOTOOLS_COMPOSED: '0', no spec leg beside the checkout) skips those checks, so they bind only in a composed run or with the variable set to a spec clone. A search of the manual lines this change touches for the strings those checks pin (the rung-count heading, the two settlement quotes,every lane on this workstation, the exit-code section's two markers andlane-end <lane> --retire) finds none: read, not run. So the two PRs are one change in two repositories, and they land together, as a pair. The code PR goes first, so that the manual never describes behaviour the code lacks: the paired code PR, opensoft/openRepoTools-code#5, first, then this one. The state that order passes through, the code chain's tip beside the spec leg'smain, passed-k test_repo_hygienein the independent review (run (e) under Tests: 223 passed, 14 skipped; that run read the chains' tips, not this commit alone). The other order's state, the spec tip beside the code leg'smain, was not run. I found no check that turns either order red; that is a reading, not a run.Tests
The manual is tested from the code leg, not here: this leg has no code and no CI workflow of its own.
tests/test_repo_hygiene.pyreadsdocs/README-lanes.mdthroughOPENREPOTOOLS_SPEC_ROOT(tests/test_test_roots.pypins which manual a run reads). The pair isfix/control-root-unsearchable-291in opensoft/openRepoTools-code, commitca9b847f678e.The pair's hygiene runs, from lane 4's independent paired review (2026-10-31), with
OPENREPOTOOLS_SPEC_ROOTset to the spec clone shown (env -i,TMPDIR=/tmp). They read the spec chain's tip, which carries this PR's commit with the later commits of the chain; none read the manual at this commit alone. The letters are the review report's own: (c) is the shell-suite run, in the paired code PR, and (d) was skipped.-k test_repo_hygiene5f2995d43893+ spec tip8104f2cf965c-k test_repo_hygiene, baselinemain2a057a6+ specmain9f8b21a-k test_repo_hygiene5f2995d43893+ specmain9f8b21aThe pair runs read the chains' tips as they were before the message amend (code
5f2995d43893, spec8104f2cf965c). The amend kept every tree (git difffrom each old commit to its new one is empty), so the runs stand for the amended tips, code2c15aa6613c3and spec430ea20784ac. No failure is new at the tips.Release notes (v1.2.0)
The release-notes lines for this change are in the paired code PR, opensoft/openRepoTools-code#5 (
fix/control-root-unsearchable-291in opensoft/openRepoTools-code), once, in the PR that carries the code change. This PR repeats none.Review
READY, lane 4's independent paired review of both chains, 2026-10-31. It found no MUST and no SHOULD against the commits, and three NITs. Report sha256:
4ac9e5441affc6aeac48e6d73419580f6786440dc0e5dd32722cc40b8070a682. The review read the chains before the message amend (tips5f2995d43893and8104f2cf965c, the same trees as the amended tips).lanes-indexlines 1904 to 1905, docstring only:lane_generation's docstring reads as the full list oflane-state's 10s, but since A lane control root that cannot be searched reads as "no trees", so an inventory sync removes its rows (from #289's review) openRepoTools#291 there is a third, a blocked lookup; optional, and the same text would arise when the root branches land.rc_tree_idlacks the 180-character cap, so the shell suite fails when the run root is longer than about 111 characters, and the shell suite does not setXDG_STATE_HOME, so run (c) left two files outside its run root.The original's recorded review, from the root repository (no lane 3 review comment exists for it): the independent review of
124b509is LAND, with no MUST; its SHOULD-1, the manual's rung section, is fixed in7db059fand, after the second read found "every read under it is 10" overstated, in3e97ae5. Both are manual-only and are in this PR's single commit. The fix round was checked by a second read: items 2 to 6 VERIFIED, and item 1 fixed by3e97ae5.Landing
It lands only on Brett Heap's word, PR by PR; nothing in this text is a landing.
fix/subfield-misreads-301(the spec PR for Three ways a stored lane sub-field is misread: a TAB in a recorded dir drops the lane from worktrees --all, payload_subfield expands backslash escapes through awk -v, and request-handoff writes its by host sub-field unquoted openRepoTools#301, T017: A dir with a TAB or a backslash is listed, indexed and reached as recorded, a stored sub-field reads back as written, and request-handoff refuses a host or container the fence rejects (opensoft/openRepoTools#301) (part of opensoft/openRepoTools#186) #7), which lands before it. The original is independent of Three ways a stored lane sub-field is misread: a TAB in a recorded dir drops the lane from worktrees --all, payload_subfield expands backslash escapes through awk -v, and request-handoff writes its by host sub-field unquoted openRepoTools#301; the two touch different hunks of the manual.fix/subfield-misreads-301, the branch of T017: A dir with a TAB or a backslash is listed, indexed and reached as recorded, a stored sub-field reads back as written, and request-handoff refuses a host or container the fence rejects (opensoft/openRepoTools#301) (part of opensoft/openRepoTools#186) #7.mainshowsMerge pull request #1). A merge commit keeps this commit's message and its receipt byte for byte, and the stacked chain lands as built, each PR after the one its base names. A PR stacked on this one is retargeted tomainbefore this PR's branch is deleted: deleting a merged base branch first closes the dependent PR.33ce26dinto the branch at open", with its push and the PR's own CI record:33ce26dis the root's frozenmain, and this leg's ownmainis the base here (the head is the commit above, with nothing merged in).[REFRESH AT PR TIME ...]and[REFRESH AT LAND TIME ...]brackets, which name the root's own CI runs and the root landing; this leg's own checks at open are recorded when the PR is opened; the leg has no CI workflow of its own.Closes #Nline and itsgh pr merge --squash --match-head-commit --body-filesteps, with theland-ort4.shandland-ort3.shnotes: the commit's own message stands in, byte for byte, andCloses #Nbecomes "part of", with no closing keyword.Lane: openRepoTools-4
Claim: opensoft/openRepoTools#291 (comment 6313861277)
🤖 Generated with Claude Code
Summary by Sourcery
Document inaccessible lane control roots as unreadable and preserve their existing inventory rows during synchronization.
Enhancements:
Documentation: