Repository navigation
The lane manual carries act 2 slice 1b: every write takes Amendment 23 S3 under its lock and publishes by S4 with no pull, and old main's register hardening keeps its text where the two meet (opensoft/openRepoTools#198, slice 1b) - #15
Draft
brettheap wants to merge 2 commits into
Draft
brettheap wants to merge 2 commits into
brettheap wants to merge 2 commits into
Conversation
…3 S3 under its lock and publishes by S4 with no pull, and old main's register hardening keeps its text where the two meet (opensoft/openRepoTools#198, slice 1b) What this carries: slice 1b's whole change to the spec leg's paths, as `git diff 6ca31581c4410e736ce78da373a12388e94da939 4b79d6718f19973e3266cac4e3988de23e51a72e -- docs specs openspec` on opensoft/openRepoTools (old 1a..1b, the archived feat/198-a23-slice-1b-guard-publish). That is docs/README-lanes.md alone, eight hunks, +131 -132. Act 2 moves by cherry-pick, not by merge (opensoft/openRepoTools#186, comment 6548291952, S18); the code half goes to opensoft/openRepoTools-code. This leg's main already holds old main's opensoft/openRepoTools#263 (175daf9 here, d9065df there), which slice 1b never merged. Six of 1b's eight hunks apply as they are. Where the two meet, the text is resolved by the rules of lane 2's 10-24 rehearsal of the merge of old main 33ce26d into slice 1b (writer w1b-c19, its tools/c19/resolve.py and tools/c19/fixes.py). That merge's README is this one: the same base, the same two sides, the same two conflicts. - Exit codes, rows 5 and 6 (a conflict; R1): #263's row 5, the register rewrite whose copy, write or result could not be proved (#120 item 1), and 1b's row 6, the commit kept on HEAD and named. Each side changed its own row; both are kept whole, and 1b's change to rows 0, 2, 3 and 6 lands byte for byte. - "Nothing is half-PUBLISHED", the sweep paragraph (a conflict; R2): 1b's text (S3 refuses the act over a peer's uncommitted edit and captures nothing; S3, not the withdrawn dirty-checkout guard, refuses the re-run), with #263's three additions: "or could not be proved (the register is put back where the write cut it short, #120 item 1)"; the refusal that says this act has committed nothing and lists what it had written; and the before-edit copy kept as `lanes-edit-register-before-edit.<UTC>.<pid>`. #263's "(a peer's edit it found and captured first is a commit of its own)" goes, with the capture 1b deletes. - add-row's take-back paragraph (merged clean, rewritten; fixes.py): #263 says add-row removes its row in a compensating local commit after a peer's archive arrives in its `pull --rebase`. Slice 1b deletes that pull. The paragraph now says what holds under 1b: a peer's archive line, retirement or row that lands while add-row is publishing meets the same checks on S4's replay, which drops add-row's commit by what it is, so nothing is left to publish or take back. The rehearsal drafted this text for the commit after its merge. Here there is no merge, so it rides in this commit. (#120 and #263 above are opensoft/openRepoTools issues and pull requests.) Everything else of #263, and of opensoft/openRepoTools#289 (b69b1b2 here), stands as on main. Receipt: the old act-2 commits of opensoft/openRepoTools whose changes to docs/ this carries (`git log --format='%h %s' 6ca3158..4b79d67 -- docs`). The split rewrote this leg's history, so these ids are the assembly's, which kept the whole history: 458cdde The recovery commands S4's refusals print name origin's tracking ref in full, `refs/remotes/origin/<b>`, so a local branch named `origin/<b>` no longer stands in for origin in a `cherry` or a `reset --keep` run as printed (#198, slice 1b) 59551dd A write whose `LANES_REPO` names a directory below its checkout's top level refuses with 2 before any edit, naming the top level and the register, instead of making its edit and dying 6 at `git add` (#198, slice 1b) 173f3c8 The refusal with origin unmoved lists the commits under this write's with the STOP line before any reset, and step 5 and exit row 6 say that `commit`'s carry form drops to its own parent, so a commit under it stays and the re-run refuses on it with 2 (#198, slice 1b) aa0f864 A claim's re-run is said to make no GitHub read, not no network read: S3's fetch, the push and its read-back still run on it, each bounded by `git_net` (#198, slice 1b) 15e71d9 `commit`'s carry tries `git apply -C0` only where every line the hand edit replaces occurs once in origin's version and once in the version it was made on, so an edit of a copy a peer changed or removed is refused and kept instead of landing on the copy nobody touched (#198, slice 1b) fc6f34d Exit row 3, in both tables and in the manual's step 5, says the unconfirmed commit stays on HEAD unless another writer rewrote it while its push was in flight, which the words then say (#198, slice 1b) 333af4e The manual names the re-run decisions 19 and 22 made: where S3's fetch finds origin moved under `claim`'s or `add-row`'s own checks, nothing is written and the verb runs again from the top with the lock held, reading nothing from GitHub again (#198, slice 1b) db4d2a4 `commit`'s carry retries a hand edit with `git apply -C0` only where every line it replaces occurs once in origin's version, so the second of two identical lines, or a blank line, is refused and kept instead of edited at another copy (#198, slice 1b) dba848a A write knows its own commit by what it is, not by reading HEAD after `git commit`, and the replay's drop is made only where that commit sits on origin's history, so a commit an unlocked writer lands beside it is never dropped with it (#198, slice 1b) 5588307 The manual says what `add-row`'s refusal of a row a peer pushed says: it names the row verbs, which fast-forward the checkout first, and no `git pull --rebase` (#198, slice 1b) c71621f SHOULD C (rv1b-c2's re-check at d9ff4e6): the replay's drop is a compare-and-swap of the branch from this write's own commit, so a commit that lands in its window is never dropped, and an up-to-date pull that rewrites ORIG_HEAD no longer loses the write while saying it is kept (#198, slice 1b) d9ff4e6 SHOULD A and NITs 1-2 (rv1b-c's re-check at 10169f3): a commit another writer rewrote is named as rewritten, not as kept on HEAD; a commit that lands during the replay's reset is put back; and exit rows 2 and 6 name the re-run's bound (#198, slice 1b) 92fbe46 SHOULD 1 and NIT 1 (rv1b's pre-review): the manual no longer describes the withdrawn capture and dirty-checkout guard as current, the carry rule reads the manual a paragraph at a time and knows the capture's words, and the no-pull rule is no longer stopped by a `#` (#198, slice 1b) c454247 MUST 4 (rv1b's pre-review): a refused push whose commit is no longer HEAD is not replayed, so a commit another writer made on top of it in the same checkout is never dropped by the replay's reset; both are kept on HEAD and named, exit 6 (#198, slice 1b) e3b6810 Amendment 23 S3 for the sweeps and `rename-lane`: each takes S3 under its lock and asks every path it commits again before its first byte, the dirty-checkout guard and the pre-existing capture are deleted, and no message tells a person to `pull --rebase` (#198, slice 1b stage 3) ef1377f Amendment 23 S4: every write commits by pathspec, pushes with no pull and reads origin back, a refused push replays the one edit on origin's new tip six times at most, and `commit` with nothing staged is the publish act (#198, slice 1b stage 2) Checks: this leg has no CI of its own (no .github/ on any ref). The composed job in opensoft/openRepoTools runs the code leg's suite against a pinned spec commit, so this text is checked there once a pin names it. Run locally, with this tree as OPENREPOTOOLS_SPEC_ROOT: - the five tests of slice 1b's own tests/test_repo_hygiene.py (at 4b79d67) that read this manual: 5 passed (on this leg's main: 2 failed, the exit-3 row and the carry rule); - the shell suite's 18 assertions that quote this manual, replayed alone: 18 passed; - the code leg's main (2a057a6), which has none of slice 1b's code: its exit-3 row test fails, as it must until the code half lands. This commit and the code leg's slice 1b move into the assembly together. Lane: openreposhape-2 (openRepoShape-2) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reviewer's GuideDocumentationDocument Amendment 23’s lock-protected fetch-and-fast-forward preflight, no-pull publishing and confirmation flow, retries, recovery, and revised handling of shared register edits and races.
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
This was referenced Nov 8, 2026
…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>
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.
Lane: openreposhape-2 (openRepoShape-2)
Claim: opensoft/openRepoTools#198 (comment)
Act 2, slice 1b: the spec leg's half. This lands together with its code half, opensoft/openRepoTools-code#17 (head
34799b7), never ahead of it: the code leg'stest_the_exit_3_documentation_agrees_with_the_die_message_it_describesreads this manual and fails against a code leg without 1b.Re-homed from Amendment 23 slice 1b: every writer fetches and fast-forwards under its lock or refuses with nothing written, pushes with no pull and reads origin back, a refused push replays the one edit, and
commitwith nothing staged is the publish act (#198) openRepoTools#307 (old head4b79d67), as Brett Heap's Amendment 22 act 2: the SQL register under lanes-edit.sh — mode=primary writers in one transaction each, the estate switch and lanes/STORE, the write journal and the renderer (one mirror commit per write), exit 69, fail-closed readers, lanes-index import/rollback, SERIALIZABLE claim order, and the agreement tests openRepoTools#165 Q28 ruled (Lane writers commit first and sync second, so a pull that refuses or conflicts strands the commit and later writes stack on it: fast-forward before the edit, and refuse before committing (fail closed) openRepoTools#198, comment 6722244541). The old PR stays open as the archived original until Brett decides (T019).The head, and its merge of
main. The head is0cca4284df365f62dc7c1f096b715fbd977bd590. It is the slice's one commit,df909ba, plus a merge of this leg'smainaed1852into it, made in place as a fast-forward of the draft branch: no force-push, anddf909bastays an ancestor.4233c9a, and this leg'smainhas since taken 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 to 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 (T017; +74 -20 in the manual). A landing is a merge, so its tree has to equal the tree its head was tested with, and the old head's tree could not.git merge-tree --write-tree df909ba aed1852gave tree70b03371cb7e9ad7aff05c00cc2f08ff37ae75afwith no conflict, and the merge commit has exactly that tree.docs/README-lanes.mdis the only file either side changed, no conflict was resolved by hand, and no line of the slice's text was changed. Landing this head on amainthat is stillaed1852writes this head's own tree.mainaed1852is +145 -158 in that one file, the same as the old commit's over4233c9a.Stack: slice 2a's spec half, The lane manual's exit rows 2, 6 and 7 carry act 2 slice 2a:
write-handoffanswers the restart fences 7, keeps on HEAD a handoff origin changed or deleted meanwhile, and names an Amendment 8(d) handoff whose commit or push failed #16 (docs/README-lanes.mdrows 2, 6 and 7), follows on top of this branch. It has merged this head (its merge is7f8fd70), so its tree is this one plus its three rows.The assembly's code and spec pins move in one commit. The opening line's order (this half never ahead of the code half) is the order of the two legs' own landings. The composed job in opensoft/openRepoTools reads the pinned spec, so a pin bump that moves one without the other fails. Lane openRepoTools-3's review measured both directions: code
34799b7with this leg'smainas the spec root fails 2 hygiene cases, the exit-3 documentation test andtest_no_text_promises_the_carry; and slice 1a's code head903d751(Every register write goes through its lane's own checkout <W>-lanes/<lane>/, where lane-start and lane-end read the lane's row; a LANES_REPO naming W refuses; locks name their holder's container; refresh-workspace fast-forwards W (Amendment 23) openRepoTools-code#16) with the slice's commitdf909baas the spec root fails the exit-3 documentation test.Two figures in the commit message below follow the old slice, not this PR:
docs/over its old base (6ca3158..4b79d67). This PR's diff is +145 -158, as above;maintoday.Checks run here: the spec leg has no CI workflow. Old 1b's five hygiene tests that read the manual pass against the slice's commit (5 passed; on spec
mainthey give 2 failed and 3 passed). The shell suite's 18 assertions that quote the manual pass onmain, 1b and 2a. Lane openRepoTools-3's review ran the hygiene module with the slice merged ontoaed1852as the spec root, against code34799b7: 239 passed, 14 skipped (the 14 skips are the assembly root's README, CLAUDE and AGENTS). That merge and this head have one tree,70b0337.The commit message of
df909ba, the slice's commit, follows in full: what this carries, how each meeting with opensoft/openRepoTools#263 is resolved, and the receipt. The merge commit's own message says what the bullets above say.The lane manual carries act 2 slice 1b: every write takes Amendment 23 S3 under its lock and publishes by S4 with no pull, and old main's register hardening keeps its text where the two meet (opensoft/openRepoTools#198, slice 1b)
What this carries: slice 1b's whole change to the spec leg's paths, as
git diff 6ca31581c4410e736ce78da373a12388e94da939 4b79d6718f19973e3266cac4e3988de23e51a72e -- docs specs openspeconopensoft/openRepoTools (old 1a..1b, the archived
feat/198-a23-slice-1b-guard-publish). That is docs/README-lanes.md alone,
eight hunks, +131 -132. Act 2 moves by cherry-pick, not by merge
(opensoft/openRepoTools#186, comment 6548291952, S18); the code half goes
to opensoft/openRepoTools-code.
This leg's main already holds old main's opensoft/openRepoTools#263 (175daf9
here, d9065df there), which slice 1b never merged. Six of 1b's eight hunks
apply as they are. Where the two meet, the text is resolved by the rules of
lane 2's 10-24 rehearsal of the merge of old main 33ce26d into slice 1b
(writer w1b-c19, its tools/c19/resolve.py and tools/c19/fixes.py). That
merge's README is this one: the same base, the same two sides, the same two
conflicts.
rewrite whose copy, write or result could not be proved (Three hardenings Copilot round 5 raised on #93, filed rather than taken: the register rewrite's unchecked status, the sweep's weakened published-path preflight, and retire-rows' wrong exit for an already-closed log openRepoTools#120 item 1),
and 1b's row 6, the commit kept on HEAD and named. Each side changed its
own row; both are kept whole, and 1b's change to rows 0, 2, 3 and 6
lands byte for byte.
text (S3 refuses the act over a peer's uncommitted edit and captures
nothing; S3, not the withdrawn dirty-checkout guard, refuses the re-run),
with The register's rewrites refuse a copy or write they cannot prove and put a cut-short register back, retire-rows refuses an unpushed log rename before it writes and calls a lane closed only from its published log, and add-row refuses an archive row it cannot read and takes back a row refused after its rebase (#120, #122) openRepoTools#263's three additions: "or could not be proved (the register is put
back where the write cut it short, Three hardenings Copilot round 5 raised on #93, filed rather than taken: the register rewrite's unchecked status, the sweep's weakened published-path preflight, and retire-rows' wrong exit for an already-closed log openRepoTools#120 item 1)"; the refusal that says
this act has committed nothing and lists what it had written; and the
before-edit copy kept as
lanes-edit-register-before-edit.<UTC>.<pid>.The register's rewrites refuse a copy or write they cannot prove and put a cut-short register back, retire-rows refuses an unpushed log rename before it writes and calls a lane closed only from its published log, and add-row refuses an archive row it cannot read and takes back a row refused after its rebase (#120, #122) openRepoTools#263's "(a peer's edit it found and captured first is a commit of its
own)" goes, with the capture 1b deletes.
says add-row removes its row in a compensating local commit after a peer's
archive arrives in its
pull --rebase. Slice 1b deletes that pull. Theparagraph now says what holds under 1b: a peer's archive line, retirement
or row that lands while add-row is publishing meets the same checks on
S4's replay, which drops add-row's commit by what it is, so nothing is
left to publish or take back. The rehearsal drafted this text for the
commit after its merge. Here there is no merge, so it rides in this
commit.
(opensoft/openRepoTools#120 and opensoft/openRepoTools#263 above are opensoft/openRepoTools issues and pull requests.)
Everything else of opensoft/openRepoTools#263, and of opensoft/openRepoTools#289 (b69b1b2 here),
stands as on main.
Receipt: the old act-2 commits of opensoft/openRepoTools whose changes to
docs/ this carries (
git log --format='%h %s' 6ca3158..4b79d67 -- docs).The split rewrote this leg's history, so these ids are the assembly's,
which kept the whole history:
458cdde The recovery commands S4's refusals print name origin's tracking ref in full,
refs/remotes/origin/<b>, so a local branch namedorigin/<b>no longer stands in for origin in acherryor areset --keeprun as printed (opensoft/openRepoTools#198, slice 1b)59551dd A write whose
LANES_REPOnames a directory below its checkout's top level refuses with 2 before any edit, naming the top level and the register, instead of making its edit and dying 6 atgit add(opensoft/openRepoTools#198, slice 1b)173f3c8 The refusal with origin unmoved lists the commits under this write's with the STOP line before any reset, and step 5 and exit row 6 say that
commit's carry form drops to its own parent, so a commit under it stays and the re-run refuses on it with 2 (opensoft/openRepoTools#198, slice 1b)aa0f864 A claim's re-run is said to make no GitHub read, not no network read: S3's fetch, the push and its read-back still run on it, each bounded by
git_net(opensoft/openRepoTools#198, slice 1b)15e71d9
commit's carry triesgit apply -C0only where every line the hand edit replaces occurs once in origin's version and once in the version it was made on, so an edit of a copy a peer changed or removed is refused and kept instead of landing on the copy nobody touched (opensoft/openRepoTools#198, slice 1b)fc6f34d Exit row 3, in both tables and in the manual's step 5, says the unconfirmed commit stays on HEAD unless another writer rewrote it while its push was in flight, which the words then say (opensoft/openRepoTools#198, slice 1b)
333af4e The manual names the re-run decisions 19 and 22 made: where S3's fetch finds origin moved under
claim's oradd-row's own checks, nothing is written and the verb runs again from the top with the lock held, reading nothing from GitHub again (opensoft/openRepoTools#198, slice 1b)db4d2a4
commit's carry retries a hand edit withgit apply -C0only where every line it replaces occurs once in origin's version, so the second of two identical lines, or a blank line, is refused and kept instead of edited at another copy (opensoft/openRepoTools#198, slice 1b)dba848a A write knows its own commit by what it is, not by reading HEAD after
git commit, and the replay's drop is made only where that commit sits on origin's history, so a commit an unlocked writer lands beside it is never dropped with it (opensoft/openRepoTools#198, slice 1b)5588307 The manual says what
add-row's refusal of a row a peer pushed says: it names the row verbs, which fast-forward the checkout first, and nogit pull --rebase(opensoft/openRepoTools#198, slice 1b)c71621f SHOULD C (rv1b-c2's re-check at d9ff4e6): the replay's drop is a compare-and-swap of the branch from this write's own commit, so a commit that lands in its window is never dropped, and an up-to-date pull that rewrites ORIG_HEAD no longer loses the write while saying it is kept (opensoft/openRepoTools#198, slice 1b)
d9ff4e6 SHOULD A and NITs 1-2 (rv1b-c's re-check at 10169f3): a commit another writer rewrote is named as rewritten, not as kept on HEAD; a commit that lands during the replay's reset is put back; and exit rows 2 and 6 name the re-run's bound (opensoft/openRepoTools#198, slice 1b)
92fbe46 SHOULD 1 and NIT 1 (rv1b's pre-review): the manual no longer describes the withdrawn capture and dirty-checkout guard as current, the carry rule reads the manual a paragraph at a time and knows the capture's words, and the no-pull rule is no longer stopped by a
#(opensoft/openRepoTools#198, slice 1b)c454247 MUST 4 (rv1b's pre-review): a refused push whose commit is no longer HEAD is not replayed, so a commit another writer made on top of it in the same checkout is never dropped by the replay's reset; both are kept on HEAD and named, exit 6 (opensoft/openRepoTools#198, slice 1b)
e3b6810 Amendment 23 S3 for the sweeps and
rename-lane: each takes S3 under its lock and asks every path it commits again before its first byte, the dirty-checkout guard and the pre-existing capture are deleted, and no message tells a person topull --rebase(opensoft/openRepoTools#198, slice 1b stage 3)ef1377f Amendment 23 S4: every write commits by pathspec, pushes with no pull and reads origin back, a refused push replays the one edit on origin's new tip six times at most, and
commitwith nothing staged is the publish act (opensoft/openRepoTools#198, slice 1b stage 2)Checks: this leg has no CI of its own (no .github/ on any ref). The
composed job in opensoft/openRepoTools runs the code leg's suite against a
pinned spec commit, so this text is checked there once a pin names it.
Run locally, with this tree as OPENREPOTOOLS_SPEC_ROOT:
4b79d67) that read this manual: 5 passed (on this leg's main: 2 failed,
the exit-3 row and the carry rule);
18 passed;
exit-3 row test fails, as it must until the code half lands. This commit
and the code leg's slice 1b move into the assembly together.
Lane: openreposhape-2 (openRepoShape-2)
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
🤖 Generated with Claude Code