Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions docs/README-lanes.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# `lanes/LANES.md` — how the estate lane register is stored, and the commands that write it

**THE TOOLING LIVES HERE; THE DATA LIVES IN YOUR WORKSPACE REPOSITORY.**
Amendment 9, 2026-09-13. This manual and the four commands it describes —
Amendment 9, 2026-09-13. This manual and the commands it then described —
`lanes-edit.sh`, `lane-start`, `lane-end` and `link-estates` — came to
`opensoft/openRepoTools` from `opensoft/brett-wip` with their history, because
a `<user>-wip` is a person's DATA and its own rules file says so: "No secrets
Expand Down Expand Up @@ -73,7 +73,7 @@ workstation**.
| the object logs | `<the checkout>/lanes/log/<lane>.md` — one per lane (Amendment 7) |
| the alias table | two layers: `repos.tsv` shipped by openRepoTools and installed beside the commands, then `<the checkout>/lanes/repos.tsv` where you keep an override (Amendment 9(b)) |
| who places the symlinks | `link-estates`, an installed command. It places the handoffs links, the register link and the `lanes-edit.sh` link — **and no longer the two `~/.local/bin` ones**, which `--install` owns |
| who installs all of it | `openRepoTools --install` (thirteen files, idempotent, all-or-nothing) |
| who installs all of it | `openRepoTools --install` (every command and the alias table, idempotent, all-or-nothing) |
| the lane alias table | `<the checkout>/lanes/aliases.tsv` — `<old><TAB><new><TAB><UTC>`, written by `lane-rename` and by nothing else, resolved by every reader that takes a lane name (Amendment 16(e)) |

Why `main` of the workspace repository and not the aggregation's: the
Expand Down Expand Up @@ -286,7 +286,7 @@ a row exists.
canonical** (Amendment 15, in force 2026-09-14T00:07:18Z). `lane-start
openxfactory 2` and `lane-start openXfactory 2` are the same lane: every lookup
of a name — the row, the object log, the tmux window, the session name,
`LANES_LANE`, and every `<lane>` argument of the four commands — compares
`LANES_LANE`, and every `<lane>` argument of the commands here — compares
case-insensitively, and the row's own spelling is what the window is renamed to,
what the launch is `--name`d with, what the log file is called, and what every
line and stamp writes. A name typed in another case RESOLVES to it and is never
Expand All @@ -298,9 +298,10 @@ register already holds two rows differing only by case, **every writer refuses,
naming both**, until they are merged by hand — 15(d): the newer row's session
id(s) appended to the older row's session cell, in order, and the newer row
removed in the SAME commit, whose message names both spellings. `lanes-edit.sh
canon-lane <name>` is that resolver as a read, and the one all four commands
share: **0** with the canonical spelling (the typed one where no row matches, so
`add-row` can still create a lane), **2** for the pair, **64** usage — and that
canon-lane <name>` is that resolver as a read, and the one the commands share
rather than each keeping its own: **0** with the canonical spelling (the typed
one where no row matches, so `add-row` can still create a lane), **2** for the
pair, **64** usage — and that
2 is RELAYED by `lane-start`, `lane-end` and `lane` rather than carried past,
because the pair may be on `origin/<branch>` while this checkout still holds one
row. `add-row` asks the published register as well as this copy of it for the
Expand Down Expand Up @@ -2789,7 +2790,7 @@ Historical `ready` intents do not control an ordinary resume.
The pane is respawned with `lane-handoff --supervise --lane <lane> --operation
<id>`, **by absolute path**, because a respawned pane's `PATH` is whatever the
person's shell profile makes of it. It is a MODE of a command that is already
installed and not a thirteenth word: Amendment 18 Addendum 2 (i-8) is explicit
installed and not one more word: Amendment 18 Addendum 2 (i-8) is explicit
that *"no word is kept on `PATH` for it alone"*, which is the ground on which
`restart` was taken off `PATH` in the first place.

Expand Down Expand Up @@ -4128,8 +4129,8 @@ link-estates # repoints ~/projects/xFac
```

**You are not asked to remember it: `--install` refuses** (A9 Addendum 4,
R-A9-12). In its planning phase, before any of the twenty-seven artifacts is placed,
it walks all thirteen targets and dies naming every one that is not a regular file,
R-A9-12). In its planning phase, before any of its artifacts is placed, it walks
every target in the bin directory and dies naming every one that is not a regular file,
what it is, and the one `rm` that clears them. `cp` FOLLOWS A SYMLINK, so an
install over these would leave the two commands UNINSTALLED — the targets stay
links — and would write the post-move bytes into `opensoft/brett-wip`'s working
Expand Down
6 changes: 3 additions & 3 deletions lane
Original file line number Diff line number Diff line change
Expand Up @@ -1218,9 +1218,9 @@ if [ -n "$name" ]; then
# name is one name under any case"* (ratified 2026-09-14T00:07:18Z verbatim
# "Ratify as drafted"), and `lanes-edit.sh canon-lane` is the ONE resolver
# every command that takes a `<lane>` shares — for the reason clause (h) gives
# every other read here: four implementations of *which row is this name's* is
# how the four come to disagree about it. This is `restart`'s own call, moved
# here with the act under Amendment 18 Addendum 2.
# every other read here: an implementation of *which row is this name's* in
# each command is how they come to disagree about it. This is `restart`'s own
# call, moved here with the act under Amendment 18 Addendum 2.
#
# `2` IS TWO ANSWERS AND ONE OF THEM IS A REFUSAL. It is what a helper
# predating Amendment 15 spends on an unknown subcommand — silent, expected,
Expand Down
8 changes: 4 additions & 4 deletions lane-end
Original file line number Diff line number Diff line change
Expand Up @@ -858,10 +858,10 @@ if [ -z "${LANES_FILE:-}" ]; then die "$(lanes_workspace_why)" 1; fi
# ------------------------- AMENDMENT 15: THE ROW'S SPELLING IS THE LANE'S NAME
#
# **A lane name is one name under any case** (ratified 2026-09-14T00:07:18Z),
# and `lanes-edit.sh canon-lane` is the ONE resolver all four commands share —
# for the reason Amendment 11 clause (h) gives every other read here: four
# implementations of "which row is this name's" is how the four would come to
# disagree about it.
# and `lanes-edit.sh canon-lane` is the ONE resolver the commands share rather
# than each keeping its own — for the reason Amendment 11 clause (h) gives every
# other read here: an implementation of "which row is this name's" in each
# command is how they would come to disagree about it.
#
# `2` IS TWO ANSWERS AND ONE OF THEM IS A REFUSAL (Copilot round 4 on
# openRepoTools#41). It is what a helper predating this amendment spends on an
Expand Down
4 changes: 2 additions & 2 deletions lane-start
Original file line number Diff line number Diff line change
Expand Up @@ -1066,8 +1066,8 @@ if [ -z "${LANES_FILE:-}" ]; then die "$(lanes_workspace_why)" 1; fi
#
# ONE RESOLVER, SHARED. `lanes-edit.sh canon-lane` is the same read `lane-end`,
# `lanes` and `restart` make, for the reason clause (h) gives every other read
# in this toolset: four implementations of "which row is this name's" is how the
# four would come to disagree about it.
# in this toolset: an implementation of "which row is this name's" in each
# command is how they would come to disagree about it.
#
# 2 IS TWO ANSWERS AND THE REFUSAL IS THE ONE THAT MATTERS (Copilot round 4 on
# openRepoTools#41). It is the code a helper predating this amendment spends on
Expand Down
7 changes: 4 additions & 3 deletions lanes-edit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16242,9 +16242,10 @@ EOF

# AMENDMENT 15 — THE RESOLVER, EXPOSED, because `lane-start`, `lane-end`,
# `lanes` and `restart` all take a `<lane>` argument and the amendment gives
# all four the SAME resolver. Four implementations of "which row is this
# name's" is how the four would come to disagree about it — which is the whole
# reason clause (h) turned `window-lane` and `session-lane` into subcommands.
# them all the SAME resolver. An implementation of "which row is this name's"
# in each command is how they would come to disagree about it — which is the
# whole reason clause (h) turned `window-lane` and `session-lane` into
# subcommands.
#
# Read-only, out of `origin/<branch>` like every other state read (R19).
# 0 the canonical spelling — the row's own where a row matches ignoring
Expand Down
2 changes: 1 addition & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -592,7 +592,7 @@ def required_dependency():
#: but `park`, `resume` and `openRepoTools` are bash scripts that run `make` in
#: a root which execs a shebang script, and a shebang means nothing to
#: CreateProcess. Skipping is honest because there is no Windows twin to run
#: instead: these three files are bash, and on Windows the way in is WSL2,
#: instead for any shipped bash file, and on Windows the way in is WSL2,
#: exactly as it is for openRepoShape's own `setup.sh`. What the Windows job
#: still proves is the checkout and the hygiene tests, which need no shell.
#: A shared `skipif` object rather than a named marker because there is no
Expand Down
2 changes: 1 addition & 1 deletion tests/test_lane_helpers.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8831,7 +8831,7 @@ rm -f "$sessions_dir/a16i.json"
# ============ Copilot round 4 on openRepoTools#81 ============================

# ---- THE ALIAS-READ REFUSAL HAS ITS OWN EXIT CODE, because 2 already carries
# two meanings to the four commands that read `canon-lane`.
# two meanings to the commands that read `canon-lane`.
ren_unread3="$WIP/lanes/aliases-unread3.tsv"
printf 'someLane-1\tsomeLane-2\t2026-09-15T00:00:00Z\n' > "$ren_unread3"
chmod 0000 "$ren_unread3"
Expand Down
6 changes: 3 additions & 3 deletions tests/test_openrepotools_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@
#: reason `AGENTS.md` gives for the submodule SKIP.
#:
#: The tests NOT marked are the ones that never reach the merge: the refusals,
#: `--help`, `--version`, and `test_install_places_all_nine_or_none`, which is
#: `--help`, `--version`, and `test_install_places_all_or_none`, which is
#: refused at `collect_commands` before `plan_hook_merge` is called at all.
#: `test_without_jq_it_refuses_and_places_nothing` is the positive case for the
#: same fact and is deliberately unmarked.
Expand Down Expand Up @@ -392,7 +392,7 @@ def test_install_refuses_a_second_argument_and_installs_nothing(tmp_path):

@NEEDS_JQ
def test_install_writes_an_executable_copy(tmp_path):
"""All NINE files, each 755 and byte-identical to this checkout's.
"""Every `INSTALLED` file, each 755 and byte-identical to this checkout's.

A `park` that is not executable is not a command, and a `park` that is a
near-copy is a command whose refusals nobody reviewed — so the bytes are
Expand Down Expand Up @@ -2256,7 +2256,7 @@ def offline_github(tmp_path):
return fake_github(tmp_path, FETCHED)


def test_install_places_all_nine_or_none(tmp_path):
def test_install_places_all_or_none(tmp_path):
"""ALL IN HAND BEFORE ANY IS PLACED (openRepoShape #82, F10 of the review
on its #83). One file at a time, dying on the first fetch that failed,
leaves a person with a NEW `openRepoTools` and no `park` — a half-install
Expand Down
Loading
Loading