Repository navigation
T017: Where a lane's log or register cannot be read, a named worktree read is UNREAD, not none, the listing says what is missing, a writer is unknown, not 0, and lane-state exits 10, not 8 (opensoft/openRepoTools#290) (part of opensoft/openRepoTools#186) - #10
Conversation
…e read says UNREAD instead of none, the lanes listing says what is missing, a tree's writer is unknown instead of 0, and lane-state exits 10 instead of 8 This is the T017 continuation, in this leg (opensoft/openRepoTools-spec), of the original opensoft/openRepoTools branch fix/named-read-none-290 at b99f904e15b88da1e3f575e258cbd134f7747f63, issue opensoft/openRepoTools#290. The original branched from main 50d05d4 and its head merges 50d05d4 at db5d564, 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 (+31 -8: the exit-code table's row for 10, the list of reads that fail closed and its paragraph on the other list and exit 1, the named read, the writer_live column, the log file that will not open, and lane-state's read of its log). Its other paths (lanes-edit.sh, lanes-index, tests/test_lanes_index.py and tests/test_named_read_unreadable_290.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#302, as ORDER.md's chain has it, and two hunks of the manual overlap opensoft/openRepoTools#291's, resolved as recorded below. 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..b99f904): b4b0355fd081 Add the tests that a read which could not be made never answers none: the named worktree read, the lanes listing, the no-origin log read and lanes-index's generation read (#290) 286e82197e9a Add the guards a fix for the named read needs: one read of the lane's log, no writer over a binding nobody read, no DORMANT class over a log list that failed, and lane-state's 10 naming the snapshot it found (#290) f14efed183bd WIP: A named worktree read says NOT READ where its lane's log or the register its name is resolved by could not be read, the lanes listing says a log list it could not make, and lane-state is 10 over a log it could not read (#290) - written, not yet run green 4b1031d78337 The guard for a lane with no published log asks with no control-root override, as a workstation does, so a read that took "no such log" for "could not be read" now fails it (#290) 41ca9cb19683 A named read whose lane's log tree cannot be listed is pinned as an UNREAD line, so the ls-tree that tells an unreadable log from an absent one is tested (#290) e5069fe5e236 The lanes contract, both exit-code tables and the manual's list of reads that fail closed now name what #290 changed: the listing's 1, lane-state's 10 over a log it could not read, and the events' list of the logs (#290) a2b52ed1c8a5 The comment over the inventory read's own two log-list reads no longer says known_lanes answers 0 either way: its published list answers 1 where it could not be made (#290) da187ba448d5 The hold lanes-index makes over lane-state's 10 gives lane-state's own sentence with LANES_DEBUG set, not the "(exit 10)" line die adds after it (#290) 9c0aae54978e Add the test that lane-state finds a lane's snapshot by the whole dir its log records, bare with a quote mark in it as on main, and quoted with a space in it (#290) bc825a4bf326 lane-state hands the dir it read on quoted only where it holds a space, as lane-start writes it, so a bare dir with a quote mark in it finds its snapshot as on main (#290) b99f904e15b8 The lane-state dir test now pins a bare dir holding a TAB and a quote mark, read whole as on main, so the rule stays a space and not any whitespace (#290) Recorded resolutions: docs/README-lanes.md, the exit-code row for 10: kept both sides, opensoft/openRepoTools#290's lane-state clause (the object log could not be read) and opensoft/openRepoTools#291's closing sentence (Both spend it, too, ...); a word-level three-way merge of the row is clean. docs/README-lanes.md, the named-read paragraph: kept opensoft/openRepoTools#291's sentence (with opensoft/openRepoTools#302's wording) first, so that Nor does still follows never prints PARTIAL, then opensoft/openRepoTools#290's sentences; opensoft/openRepoTools#290's opening It reads became The named read reads, so that It does not point at the UNREAD line of the sentence before. Lane: openRepoTools-4 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Reviewer's GuideDocumentationUpdate the exit-code contract to make
Document the additional fail-closed log-list read and explain when the listing reports missing log-list, register, or archive reads instead of treating them as no lane.
Explain that
Clarify that
Specify that named worktree reads report an unreadable log or register as
Document that an unreadable log file is named as unreadable and does not prevent later logs from being read.
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
…tree equals the tree its head was tested with: the head was cut from 4233c9a, and #7 to #10 changed the manual since (opensoft/openRepoTools#198) The merge is clean. Its tree equals what `git merge-tree --write-tree` gave for df909ba and aed1852 before the merge was made (70b0337), and `docs/README-lanes.md` is the only file either side touched. No conflict was resolved by hand, and no line of the slice's text was changed. This is an added commit on the draft branch, not a rewrite: df909ba stays an ancestor, so the push is a fast-forward. Lane: openreposhape-2 (openRepoShape-2) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
What this is
This is the T017 continuation, in this leg (opensoft/openRepoTools-spec), of the
opensoft/openRepoToolsbranchfix/named-read-none-290atb99f904e15b8, for opensoft/openRepoTools#290 (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,430ea20784ac, carries it.It carries the spec-leg part of that branch's own change, which is its head against
50d05d4with its merge of main50d05d4(db5d564) left out:docs/README-lanes.md, +31 −8 in the original; the commit's own diff against the chain's base is +31 −7, and the SPEC writer's proof found five of the seven hunks identical to the original's and the other two to be the conflict regions below, compared with git's own marker merge. The change's other four paths (lanes-edit.sh,lanes-index,tests/test_lanes_index.pyandtests/test_named_read_unreadable_290.py) are the paired commit in opensoft/openRepoTools-code. It is stacked on the spec PR for opensoft/openRepoTools#302 (#9), as the chain has it; two hunks of the manual overlap opensoft/openRepoTools#291's, resolved as recorded below.What was wrong and what changed
What was wrong
The manual's exit-code row for 10 and its list of reads that fail closed did not cover a lane's log or the register that could not be read; its text on the named read, its
writer_livecolumn and its account of a log file that will not open described reads that, where the log or the register could not be read, answered as if there were nothing to read (none, 8,0, or no warning). opensoft/openRepoTools#290's code now says that it could not read: a namedworktrees <lane>is oneUNREADline and not none, thelaneslisting says what is missing and exits 1 where it names no lane for that reason, a tree's writer is unknown and not0, andlane-stateexits 10, not 8, over a log it could not read, solanes-indexholds the lane's rows.What changed
docs/README-lanes.md, +31 −7 against the chain's base, seven hunks at git's default context, grouped here as six items in the order of the file:lane-statealso spends it where noLANES_LANE_STATE_ROOTnames the control root and the lane's object log could not be read, so where its snapshot is kept is not known. (Resolution 1 below: this row also keeps 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's closing sentence.)lane-state's read of its log: it finds the snapshot under the control root its log'sdirplaces and reads that log once, with its status; a log git could not read is 10 as well, andlanes-indexholds such a lane's rows for that reason, inlane-state's own words.writer_livecolumn: NULL also where the register's ids or the lane's log, which holds its binding, could not be read.LANES_LANE_STATE_ROOTnames the root, the lane is oneUNREADline and exit 0, never the 8 of none; so is a name whose register read failed where no tree was found under it.lanes --worktrees <lane>prints either asinventory NOT READ.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
writer_live, the listing's wording and exit 1, the no-originparse,lane-state'sdirhand-off,lanes-index's hold and the tests.Old to new: the receipt
The original's own non-merge commits in
opensoft/openRepoTools(50d05d4..b99f904), 11 in all, are carried by one commit in this leg,430ea20784ac. 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.f14efed183bdis a WIP checkpoint whose subject says "written, not yet run green"; it is the original's own commit, listed as it was written, and this commit carries the final state that the later commits turned green.Of these, the commits that touch
docs/README-lanes.md(the original's range on that path) aref14efed183bd,e5069fe5e236. The others change code-leg paths only, and their part is the paired code PR's.Resolutions
Two conflicts, both in the manual and both against opensoft/openRepoTools#291's text; the other hunks applied at offsets +13, +31 and +30, because the chain carries opensoft/openRepoTools#291's and opensoft/openRepoTools#302's added lines.
lane-stateclause (the object log could not be read) and 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's closing sentence ("Both spend it, too, ..."); a word-level three-way merge of the row is clean.PARTIAL", then A named worktree read answers "none" for a lane whose log or register could not be read (from #289's review) openRepoTools#290's sentences; A named worktree read answers "none" for a lane whose log or register could not be read (from #289's review) openRepoTools#290's opening "It reads the lane's log once" became "The named read reads the lane's log once", so that "It" does not point at theUNREADline of the sentence before.Not established: whether lane 3 prefers the other wording. Resolution 2 is a judgment on wording, not a mechanical merge: the root drafts' ORDER.md names no text for it, and it was settled on the plain intent of both sides. Lane 4's independent paired review found that the words that come from neither side are the only ones in either chain, and judged them minimal and correct. The alternative is opensoft/openRepoTools#290's sentences first, then opensoft/openRepoTools#291's, with no edit at all.
The paragraph's join, as the SPEC writer's report shows it (its
…marks text left out here):The pairing
The code part of this change is the commit
2c15aa6613c3onfix/named-read-none-290in opensoft/openRepoTools-code, its own PR, opensoft/openRepoTools-code#7 (basefix/pathless-tree-record-302). 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#7, 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/named-read-none-290in opensoft/openRepoTools-code, commit2c15aa6613c3.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 is this PR's commit, with the code chain's tip beside it. 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#7 (
fix/named-read-none-290in 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
db5d564is LAND, with no MUST; its N1 (the contract comment, the exit-code table's row for 10 and the list of reads that fail closed) is fixed ine5069fe, whose manual part is in this PR's commit with the rest of the manual's part. The later quoting fix and its delta review touch no manual text.Landing
It lands only on Brett Heap's word, PR by PR; nothing in this text is a landing.
fix/pathless-tree-record-302(the spec PR for A tree record with no path: line still swaps the tree's row in the inventory index for a row keyed by the record's id: the loss #291's part F fixes for an unreadable record is open for a malformed one openRepoTools#302, T017: A tree record that names no absolute path makes its lane UNREAD, so a sync and a reconcile keep the lane's rows instead of swapping the tree's row for one keyed by the record's id (opensoft/openRepoTools#302) (part of opensoft/openRepoTools#186) #9), which lands before it. It carries the two resolutions of the manual against 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's text, recorded above.fix/pathless-tree-record-302, the branch of T017: A tree record that names no absolute path makes its lane UNREAD, so a sync and a reconcile keep the lane's rows instead of swapping the tree's row for one keyed by the record's id (opensoft/openRepoTools#302) (part of opensoft/openRepoTools#186) #9.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.b99f904into Most reads of a lane's log cannot tell a failed read from a lane with no log: lane-dir, lane-profile, lane-agent, lane-transcript, history, lane-last, binding and lane-trees answer 8 ("none") over a log git could not read (from #290) openRepoTools#303 and A lane name typed in another case resolves only through a readable register row: over an unreadable register, or for a lane known only by its log or archive row, lane-state, lane-trees and worktrees answer 8 (none) (from #290) openRepoTools#310" step.Lane: openRepoTools-4
Claim: opensoft/openRepoTools#290 (comment 6313867435)
🤖 Generated with Claude Code
Summary by Sourcery
Update the lanes specification to distinguish unreadable state from absent state across lane listings, named reads, and lifecycle inspection.
Bug Fixes:
Enhancements:
Documentation: