Skip to content

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
mainfrom
feat/198-a23-slice-1b-guard-publish

Conversation

@brettheap

@brettheap brettheap commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

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's test_the_exit_3_documentation_agrees_with_the_die_message_it_describes reads this manual and fails against a code leg without 1b.

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 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.

(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 named origin/<b> no longer stands in for origin in a cherry or a reset --keep run as printed (opensoft/openRepoTools#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 (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 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 (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 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 (opensoft/openRepoTools#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 (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 no git 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 to pull --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 commit with 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:

  • 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

🤖 Generated with Claude Code

…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>
@sourcery-ai

sourcery-ai Bot commented Nov 8, 2026 •

Copy link
Copy Markdown

Reviewer's Guide

Documentation

Document 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.

  • docs/README-lanes.md L90-118, L192-243, L897-918 (+6 small edits)

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant