Repository navigation
A silent tmux is no longer read as a dead window, the companion verdict is read off the lane's live window from any window, and the guard's cure for a lane named before Rule 4 says what it cannot fill in (#73) - #222
Merged
Conversation
…ct is read off the lane's live window from any window, and the guard's cure for a lane named before Rule 4 says what it cannot fill in (#73) Three surfaces printed a wrong instruction in a rare state (#73). 1. record_window_state answered 1 ("refuted") both for a window the tmux server does not have and for a server that never answered, and transcript_holders writes every 1 as "(gone)", which lane-end --retire reads as "not the lane's own session". Measured on f87fd5a: with tmux installed and its server silent, `lane-end repoGD-1 --retire <the lane's own pid>` exited 0 and printed Amendment 6(d)'s `/rename repoGD-1 · retired <date>` for the conversation that IS the lane. A second, untargeted question (tmux_server_answers) now tells a silent server from a refuted window: the record reads "(no answer)", which protects the process exactly as "(not asked)" does, and lane-end's refusal names the silence instead of claiming a window it could not see. 2. transcript_holders read the companion relation relative to the ASKING window, so from a bare shell or another lane's window every holder came back `unrelated`, the harness's bg companion included. It is now read off the lane's live window record (the interactive record in a window the server resolves and agrees with) when nothing is `here`; only one profile may answer. lane-end already refused the companion from another window through #61's profile fallback, which stays because duplicate_holder_pids applies the same rule; what changes is the read that refusal points at. 3. The (b) table's rows 1, 5 and 6 printed `lane_start_args` straight, so a lane named before Rule 4 was told `run: lane-start --no-launch --dir <path> legacy-ui`. guard_refuse_start fills the command in where it can and otherwise says so in the offer's words, printing the offer's own `--dir <that lane's checkout>` line. The row format of transcript-holders is unchanged; only which verdict a row gets, and the `where` text for a silent server, are new. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reviewer's GuideThe PR fixes three rare-state instruction errors: it fails closed when tmux is silent, resolves companions relative to the lane’s uniquely live window, and avoids printing unfillable directory placeholders for pre-Rule-4 lanes, with documentation and targeted regression coverage. Sequence diagram for silent tmux duplicate protectionsequenceDiagram
participant LE as lane-end
participant RH as record_window_state
participant TM as tmux
participant TH as transcript_holders
LE->>RH: record_window_state(tmux_window)
RH->>TM: tmux_window_field(window, session_name)
TM-->>RH: empty
RH->>TM: tmux_server_answers()
alt server answers
TM-->>RH: session name
RH-->>LE: status 1: window gone
else server silent
TM-->>RH: no answer
RH-->>LE: status 2: window unknown
LE-->>LE: refuse own-pid retirement
end
TH->>RH: record_window_state(tmux_window)
RH-->>TH: status 2
TH-->>TH: render window (no answer)
Sequence diagram for guard refusal with unknown checkoutsequenceDiagram
participant G as guard_run
participant R as guard_refuse_start
participant F as guard_args_filled
participant O as guard_refuse
G->>R: guard_refuse_start(reason, lane, flag)
R->>F: guard_args_filled(lane)
alt checkout can be derived
F-->>R: success
R->>O: guard_refuse(reason, filled lane-start command)
else checkout unknown
F-->>R: failure
R->>O: guard_refuse(reason plus offer sentence, --dir <that lane's checkout>)
end
Flow diagram for lane-relative companion detectionflowchart TD
A[transcript_holders reads transcript records] --> B{Asking window has a record?}
B -->|yes| C[Use asking record profile]
B -->|no| D[Find interactive record whose window resolves and agrees]
D --> E{Exactly one live profile?}
E -->|no| F[Mark rows unrelated]
E -->|yes| G[Use lane live window profile]
C --> H[bg record in profile becomes companion]
G --> H
H --> I[Companion is recognized from any asking window]
C --> J[Anchor record remains here]
G --> K[Anchor record remains unrelated]
File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
This was referenced Oct 13, 2026
… this PR on today's main One conflict, in tests/test_lane_helpers.sh's `cleanup` trap: #215 (61a7378) added a removal of `$A11T_ROOT`, #180's short checkout root for the clause (c) TAIL case that lives outside `$SANDBOX`, at the same place this PR added the kill of `$TH73_PID`, the live sleep its window-twin case records. Both are kept: the `TH73_PID` kill stays with the other fixture-process kills, and #215's comment and `A11T_ROOT` removal follow it, ahead of the `$SANDBOX` removal. They do not interact, and the resolved file is exactly main's version plus this PR's own change to it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… this PR on today's main No conflict: #209 (2cb14a9) touches tests/test_lane_helpers.sh (header and bin-directory comments, the repoG#8 assertion, a new `lanes` getopt fence case) and docs/README-lanes.md (two wording lines) only in regions away from this PR's hunks, and both files merged as exactly main's version plus this PR's own change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… this PR on today's main No conflict: of the three commits since 2cb14a9, #238 and #240 touch only park, resume, status and their tests, and #213 touches lanes-edit.sh (managed_seam_refuse, managed_local_hint, managed_local_remedy, lane_trees_list and the managed-projection and lane-trees verbs), docs/README-lanes.md and tests/test_lane_helpers.sh (its managed-seam cases) only away from this PR's functions and hunks, and all three shared files merged as exactly main's version plus this PR's own change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… this PR on today's main One conflict, in tests/test_lane_helpers.sh, in the FAKE TMUX header: #220's paragraph on FAKE_TMUX_RENAME_FAIL (its code is the rename-window arm below, which merged cleanly) and this PR's FAKE_TMUX_SILENT paragraph and block both insert directly before `case "${1-}" in`. Resolved as #220's independent review asked: #220's FAKE_TMUX_RENAME_FAIL comment first, then a `#` separator, then this PR's FAKE_TMUX_SILENT comment and block, both before the `case`. They do not interact: the silent-server exit answers before any arm runs, and the rename refusal lives in the rename-window arm. Every line of both sides is kept. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
brettheap
added a commit
that referenced
this pull request
Oct 18, 2026
… act on every verified child, not the first (#76, #86) (#205) Landed on Brett Heap's word "land #205 #222 #223 #239 when green" (2026-10-18), by lane openRepoTools-5. Required Linux CI (guard-launch-mode, tests, tests-no-submodule; run 39148145583) was green on head 4c7e847 with main babd9fe in its tree. Main a059c1a merged with head 4c7e847 is tree 55e51f6, which queue run 39154616302 (workflow_dispatch of tests on cb9da52) tested whole and green. Independent review (lane 5, Opus, of d4cf2ee) and delta review of de0809c with its polish 0cf7417 confirmed: LAND; the merges of main add nothing to the PR's own lines. The --resume condition is Brett Heap's ruling of 2026-10-18. Closes #76 Closes #86 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap
marked this pull request as ready for review
October 18, 2026 19:51
|
Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days. You can request another review in 2 days and 23 hours by commenting |
brettheap
added a commit
that referenced
this pull request
Oct 18, 2026
… being bound, so the offer's yes no longer records a RESUMED nobody is in (#70) (#223) Landed on Brett Heap's word "land #205 #222 #223 #239 when green" (2026-10-18), by lane openRepoTools-5. Required Linux CI (guard-launch-mode, tests, tests-no-submodule; run 39096012830) was green on head e40c067 with main 2cb14a9 in its tree. Main 0f53e40 merged with head e40c067 is tree d2da196, which queue run 39154627955 (workflow_dispatch of tests on 2109b12) tested whole and green. Independent review (lane 5, Opus, of a4acad3) and delta review of e40c067: LAND; the merges of main add nothing to the PR's own lines. Closes #70 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap
added a commit
that referenced
this pull request
Oct 18, 2026
…otes, and the suite stops counting its bash files (#54 part b, #58) (#239) Landed on Brett Heap's word "land #205 #222 #223 #239 when green" (2026-10-18), by lane openRepoTools-5. Required Linux CI (guard-launch-mode, tests, tests-no-submodule; run 39136612565) was green on head 7c4df04 with main 586dea2 in its tree. Main 7748375 merged with head 7c4df04 is tree 8c13769, which queue run 39154634006 (workflow_dispatch of tests on 1d149e3) tested whole and green. Independent review (lane 5, Opus, of bb3c7dc): LAND; the later commits 5f1c329 and 7c4df04 change comments only. Closes #54 Closes #58 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 19, 2026
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.



Three surfaces printed a wrong instruction in a rare state (#73). Each one is fixed here, with a regression case that fails on
f87fd5aand passes on this branch.What was wrong, with evidence
Measured on
f87fd5ain an isolated mini-suite: the suite's own sandbox setup plus the Amendment 12 section'srepoGDfixtures. The commands below are run as the suite runs them.1. A silent tmux read as a dead window.
record_window_statereturned 1 ("refuted") both when the server does not have the window and when no server answered at all.transcript_holderswrites every 1 as(gone), andlane-end --retirereads(gone)as "not the lane's own session". With tmux installed but its server silent:That is Amendment 6(d)'s retitle, printed for the conversation that IS the lane.
2. The companion was judged relative to the asker.
transcript_holdersmarkedhereonly from$LANES_THIS_WINDOWand the pane's process tree. Asked from another window, the harness'sbgcompanion therefore came backunrelated:lane-end --retire <companion>from another window is already refused by name onf87fd5a. #61 added that through its profile fallback (dup_int_profs), after this issue was filed, solane-end's companion branch does run today. What remained wrong is the read itself:transcript-holders, the read that refusal tells a person to run because it "says which is which", saidunrelatedfor every row.3. The guard's cure carried a
<path>placeholder. Rows 1, 5 and 6 of the (b) table printedlane_start_argsstraight. A lane named before Rule 4 was therefore toldrun: lane-start --no-launch --dir <path> legacy-ui. #52 had fixed the offer and left this diagnostic beside it.What changed
record_window_stateasks a second, untargeted question only when its targeted read came back empty. The newtmux_server_answersrunstmux display-message -p '#{session_name}'with no-t.(gone).transcript_holderswrites aswindow … (no answer).lane-end'scase "$dr_where"already protects anywindow …that is not(gone), so the lane's own pid is now refused. The refusal names the silence ("tmux did not answer at all … whether that window is still there could not be read") rather than asserting the window is the lane's.@idprints an empty line and exits 0. That is why a status code read off the first question cannot tell the two cases apart.here,transcript_holdersreads the companion off the lane's live window record: the interactive record whose window this server resolves and agrees with (rc 0). That is the recordlane-endalready calls "the lane's session". Akind: bgrecord in that record's profile is thencompanionfrom any window.unrelated, as before.unrelated, because it is not the asking window's.ssb_name_lineread onlyhereandduplicate.lane-start'sdup_check, every outcome is unchanged and only the message differs. Thebindcall always finds this window's own recordhere, so the new branch never runs there. Theresumebranch still refuses on the harness's own fence for any non-interactive record.lane-endandduplicate_holder_pidsalready treat this set as companions, through the profile fallback.lane-endstays as it was, becauseduplicate_holder_pidsapplies the very same rule. Only its comments are updated.guard_refuse_startreusesguard_args_filled. It prints the filled-in command where it can. Where it cannot, it appends the offer's sentence ("lane-startneeds that lane's DIRECTORY and nothing in the register, the window or this session says which one it is — the checkout is yours to supply") and prints the offer's own line:lane-start [--no-launch] --dir <that lane's checkout> <lane>.transcript-holdersrow format and field order are unchanged:pid US kind US tgt US prof US where US verdict US file. What is new is which verdict a row can get, and thewheretext(no answer).docs/README-lanes.mddocuments all three: the guard-table note, the companion sentence and the silent-tmux sentence in the duplicate-read section.Functions and regions edited
lanes-edit.sh: record_window_state: header comment and body, lines 8463-8499 at HEADlanes-edit.sh: tmux_server_answers: new, lines 8502-8514lanes-edit.sh: transcript_holders: header comment (wheretext, thecompanionandunrelatedverdicts, lines 8546-8631), variable init (8647-8651), pass 1 (8693-8718), pass 2 (8724-8741)lanes-edit.sh: guard_run: the (b)-table header comment (9337-9339) and the cures for rows 1, 5 and 6 (9731, 9802, 9806)lanes-edit.sh: guard_refuse_start: new, afterguard_args_filled, lines 9874-9891lane-end: the--retiresession-record block. Comments in thedup_int_profspass and thedr_wherecase (1389-1414, 1451-1455), and the own-session refusal, which gains a(no answer)arm (1490-1500). Lines 1107-1300 are not touched.tests/test_lane_helpers.sh:cleanup():$TH73_PID.$FAKE_TMUX_SILENTseam and an untargeted'#{session_name}'answer, lines 301-312 and 347.bgtwincompanion case (7227-7297), and one after the legacy-ui offer block (7352-7391).docs/README-lanes.md: the guard table ("The table — one row per state") and "The duplicate read (Amendment 18(h))"Tests
One case per item in
tests/test_lane_helpers.sh, Amendment 12 section. 31 assertions in all.transcript-holdersunderFAKE_TMUX_SILENT=1readswindow gdsess:@12 (no answer).FAKE_TMUX_WINDOWS=""), it still reads(gone).lane-end repoGD-1 --retire <lane's own pid>under a silent tmux exits 2, names the silence, and prints no duplicate and no/rename … · retired.othersess:@55, thebgrecord beside the lane's live window iscompanionand the lane's own record staysunrelated.companion, unchanged.lane-end --retire <bg>from the other window still refuses it by name.bgrecord in another profile staysunrelated.unrelated.claude, sessionlegacy-ui), row 5 (superseded id of a newlegacy-gdrow) and row 6 (an id in no row) each print the offer's sentence and its--dir <that lane's checkout>line.--dir <path>.Fail-before / pass-after, proved in isolation. The full suite was not run locally, per AGENTS.md. Instead, a mini-suite was built from this branch's own test file: the sandbox setup, the Amendment 12 fixtures and the three new blocks, extracted verbatim. It was run with
env -u LANES_EDIT -u LANES_WORKSPACE_ROOT -u LANES_REPO -u LANES_LANE:f87fd5a16 passed, 15 failed: 7 fails in item 1, 1 in item 2, 7 in item 331 passed, 0 failedThe whole Amendment 12 section, run the same way:
241 passed, 0 failedf87fd5a226 passed, 15 failed. The failing set is byte-identical to the 15 new assertionsThe Amendment 11 section, which holds #39's
duplicate-holderand--retirecases, and the Amendment 11 hotfix section, which holds ruling (g)'s companion cases throughlane-start, give identical results on both trees. The few failures there come from fixtures defined in sections the extract leaves out, so none comes from this change.bash -npasses onlanes-edit.sh,lane-endandtests/test_lane_helpers.sh, and the added lines carry no bash-4-only construct.Left as it is, on purpose
who's window column still marks a log-recorded window(gone)whentmux_window_fieldcomes back empty (lanes-edit.sh~7498). That check runs only for rows with no live record, and for a LIVE row the column comes from the live record and offers the attach. So it prints no instruction against a live conversation.lanedispatcher's fake tmux (lanebin) answers no untargeted'#{session_name}', so under it an unresolvable window reads(no answer). No assertion in the suite reads that label, andlane-startuses it for display only.Closes #73
🤖 Generated with Claude Code
Summary by Sourcery
Correct lane diagnostics and retirement safeguards for unverified tmux state, cross-window companion reads, and legacy lane names with unknown checkouts.
Bug Fixes:
<path>placeholders and provide an actionable checkout-supply instruction.Enhancements:
Documentation:
Tests: