You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Amendment 17 tooling: lane-handoff + /handoff (swap kept as alias), PAUSED gains agent + transcript, lane-start --agent <name> resumes a lane from the handoff with any agent #36
Tooling half of Lane Collision Protocol Amendment 17 — brettheap/new-workstation#32 (governing), #33 (DRAFT text). Brett Heap, 2026-09-14, verbatim: "/btw, so we can do a lane-handoff command and it just does the same as a handoff for a ctx clear or account swap. so really swap and handoff are the same from the lane point of view. then I could resume that from a gpt or claude session" → "lane-handoff + /handoff, swap kept as alias (Recommended)", "lane-start --agent (Recommended)", "Amendment 17 + tooling (Recommended)".
Acts (lane openRepoTools-3, here, after or with the Amendment 12/13/15/16 items #25/#29/#31/#35):
lane-handoff [why] on PATH — the /lane-swap skill's steps as a command run from a shell in the lane's window (identity triple fixed; handoff refreshed with a fresh Rule 3 top block; running writers polled; PAUSED written with Amendment 11(c)'s payload PLUS agent <name>; transcript <id|none>; the restart line printed). skills/handoff/SKILL.md is the skill; lane-swap and the /swap command become aliases of it (same steps, same record). --install places it (artifact count +1 everywhere stated).
lanes-edit.sh: the PAUSED writer takes and validates agent/transcript; swapped and every reader of the record print them; the launcher (pclaude, workBenches#71) reads them without breaking on their absence in older records.
lane-start <repo> <n> [--agent <name>]: with no --agent, default = the agent of the last PAUSED, else claude. Claude with its transcript here → today's case (a) --resume <uuid>; otherwise a LAUNCHER TABLE: claude → claude --name <lane> --session-id <uuid> with the handoff's top block as the first prompt; codex → codex with the top block as the first prompt (its resumable id read back where it prints one); a name not in the table → refusal naming the table. Before the launch: the Rule 3 stamp RESUMED by <agent> <id> (lane <lane>) at <UTC> written into the handoff (single-use), and the row's session cell appended in the agent's spelling (harness <uuid> / Codex <id> / <agent> <id>). restart (Amendment 11) inherits --agent.
Docs: docs/README-lanes.md (the act under its three names; the record's two sub-fields; the launcher table); the skill texts.
Tests in tests/test_lane_helpers.sh: a fake codex in the sandbox bin logging its argv; lane-start --agent codex delivers the top block as the first prompt, stamps RESUMED first, appends Codex <id> to the cell; --agent claude with no transcript here → the named new session with the prompt; unknown agent → refusal; no --agent → the last PAUSED's agent; lane-handoff writes PAUSED with both sub-fields and the aliases write the same line; older PAUSED lines without the sub-fields still read.
Add to the acts (Amendment 17 rev 2, clause (f), Brett Heap 2026-09-14 verbatim "the /ctx should also run the first prompt and restart all. so the user only does /ctx and it is all automatic from there"): /ctx = /handoff --restart — write the record + a refreshed top block with a WRITERS section (worktree, branch, brief, last commit) FIRST; then tmux respawn-pane -k the lane's own pane through the launcher with the new session's first prompt = the top block; the top block stamps RESUMED and relaunches every writer. Refuse before killing anything when the record cannot be written. Tests: fake launcher logs the delivered first prompt; record-before-respawn; no-record → no respawn.
Amendment 17 is IN FORCE (brettheap/new-workstation#33 → ceb2e63; ratified 2026-09-14T09:45:33Z 'Ratify revision 2 (Recommended)', clause (f) /ctx included). Buildable here with the Amendment 12/13/15/16 items.
Two acts added on Brett Heap's word, 2026-09-14 (in session, interactive multi-choice, verbatim "Add to #36 (Recommended)"), on his question, verbatim: "what is the best process if it ran out of tokens and the never did the swap. then how should user get new account loaded and resume that old session?"
6. The transcript follows the lane.lane-start's resume case (a) looks for <the row's last id>.jsonl only under the CURRENT profile's projects directory (transcript_dirs: $CLAUDE_PROJECTS_DIR, default $CLAUDE_CONFIG_DIR/projects). So a lane restarted under a new profile after a usage limit never resumes its conversation: it falls to case (c), a new session primed by a handoff the stuck session never refreshed. Act: search EVERY profile's projects directory for the row's last id under the lane's cwd slug(s) — the same sweep step 3 already makes over every profile's sessions/*.json for liveness — and where the transcript sits in another profile, MOVE it into this profile's directory before --resume (a copy would leave two live transcripts of one uuid to diverge), leave a pointer <uuid>.jsonl.moved-to-<profile>-<UTC> where it was, and say so on one line. A uuid whose holder is LIVE in the other profile is step 3's refusal, never a move. Proof first, on a throwaway session: that claude --resume <uuid> under another CLAUDE_CONFIG_DIR continues a moved transcript; the act is void without it and the report says which way it went.
7. lane-handoff --late (and /handoff --late). The record written AFTER THE FACT, by the resumed session, for a swap that never ran: one PAUSED for the old binding — why late; usage limit hit before the swap at <UTC>; Amendment 11(c)'s and 17(b)'s sub-fields as the record's own last lines have them; the session field the OLD uuid where the resumed conversation IS that uuid (act 6), else the writer's — immediately followed by the RESUMEDlane-start writes anyway, and the handoff file refreshed by the session that now holds the knowledge. Refuses where the lane's last lane-kind line is already a PAUSED.
Tests (tests/test_lane_helpers.sh): a transcript seeded in a second sandbox profile's projects directory is moved and resumed by id, the pointer left, no copy made; a live holder in the other profile refuses; --late writes the pair; --late on an already-paused lane refuses.
The process until this is built, as answered in session: wait for the window reset and run /lane-swap from the same session; or exit the stuck session, mv its <uuid>.jsonl into the new profile's projects directory under the same cwd slug, run pclaude <new-profile> in the same window, and write the late record first. The usage guard was found unarmed on Eagle and its 95% line still advice rather than the /lane-swap directive Amendment 11(4) describes — armed globally and filed in workBenches on the same word.
Act 6 corrected by a measured fact (2026-09-14T12:35Z): on a launcher-configured workstation every profile's projects/ is ONE shared directory — readlink -f ~/.claude-profiles/profiles/opensoft/team/<any>/projects → ~/.claude-profiles/state/opensoft/projects. So a transcript needs NO move to be resumed under another profile: pclaude <new> in the lane's window → lane-start case (a) finds <uuid>.jsonl in that shared dir and resumes it by id. Act 6 therefore shrinks to: lane-start SAYS where it found the transcript (the shared state dir, or this profile's own), and performs the move ONLY where the two profiles' projects/ resolve to different directories (a workstation without the launcher's layout), with the pointer as specified. The by-hand mv described earlier is unnecessary on Eagle. Act 7 (lane-handoff --late) stands unchanged. Seen the same hour: a harness --fork-session minted a NEW id for the resumed transcript, so the row must follow the new id (which lane-start 3b does) — and #39 covers the duplicate-process hazard that fork created.
Act 8 note (Amendment 18 Addendum 2, DRAFT, Brett Heap 2026-09-14): the /ctx respawn of Amendment 17(f) relaunches the lane's own pane with lane <name> (its parked branch is Amendment 11(i)'s act: the launcher's path, the recorded directory and profile, asking nothing) — not restart <lane>, which leaves the person's PATH with #43. /restart (the inside half) is unchanged.
Amendment 17 Addendum 1 is DRAFTED at brettheap/new-workstation#40 (awaits Brett Heap's ratify): a writer survives an IN-PROCESS clear (/clear, a /ctx clearing in place) and dies only with a RESPAWN. For this issue when it lands: the top block's WRITERS first line becomes "count the live writers first (ListAgents); a live writer owns its worktree; relaunch only the ones not live"; PAUSED carries the kind after its why (clear in-process / clear respawn / kind unknown for a /handoff without --restart); /ctx writes which it did; the WRITERS section is filled from the live count; suite cases for the line, each kind, and "expect every writer below live". Measured on the 20:10Z /clear in lane openRepoTools-3: the handoff said every agent had died; five were live on their worktrees.
Amendment 17 Addendum 1 is IN FORCE: ratified by Brett Heap 2026-09-14T20:59:31Z ("ratify 40"), brettheap/new-workstation#40 → main 26a0d5b. PR #47 implements it (the top block's ListAgents-first WRITERS line, the PAUSED kind, /ctx writing which it did); its prose may now cite the addendum as in force.
Activity
brettheap commentedon Sep 14, 2026
Add to the acts (Amendment 17 rev 2, clause (f), Brett Heap 2026-09-14 verbatim "the /ctx should also run the first prompt and restart all. so the user only does /ctx and it is all automatic from there"):
/ctx=/handoff --restart— write the record + a refreshed top block with a WRITERS section (worktree, branch, brief, last commit) FIRST; thentmux respawn-pane -kthe lane's own pane through the launcher with the new session's first prompt = the top block; the top block stamps RESUMED and relaunches every writer. Refuse before killing anything when the record cannot be written. Tests: fake launcher logs the delivered first prompt; record-before-respawn; no-record → no respawn.Lane: openrepotools-3 (openRepoTools-3)
brettheap commentedon Sep 14, 2026
Amendment 17 is IN FORCE (brettheap/new-workstation#33 → ceb2e63; ratified 2026-09-14T09:45:33Z 'Ratify revision 2 (Recommended)', clause (f) /ctx included). Buildable here with the Amendment 12/13/15/16 items.
Lane: openrepotools-3 (openRepoTools-3)
brettheap commentedon Sep 14, 2026
Lane: openrepotools-3 (openRepoTools-3)
Two acts added on Brett Heap's word, 2026-09-14 (in session, interactive multi-choice, verbatim "Add to #36 (Recommended)"), on his question, verbatim: "what is the best process if it ran out of tokens and the never did the swap. then how should user get new account loaded and resume that old session?"
6. The transcript follows the lane.
lane-start's resume case (a) looks for<the row's last id>.jsonlonly under the CURRENT profile's projects directory (transcript_dirs:$CLAUDE_PROJECTS_DIR, default$CLAUDE_CONFIG_DIR/projects). So a lane restarted under a new profile after a usage limit never resumes its conversation: it falls to case (c), a new session primed by a handoff the stuck session never refreshed. Act: search EVERY profile's projects directory for the row's last id under the lane's cwd slug(s) — the same sweep step 3 already makes over every profile'ssessions/*.jsonfor liveness — and where the transcript sits in another profile, MOVE it into this profile's directory before--resume(a copy would leave two live transcripts of one uuid to diverge), leave a pointer<uuid>.jsonl.moved-to-<profile>-<UTC>where it was, and say so on one line. A uuid whose holder is LIVE in the other profile is step 3's refusal, never a move. Proof first, on a throwaway session: thatclaude --resume <uuid>under anotherCLAUDE_CONFIG_DIRcontinues a moved transcript; the act is void without it and the report says which way it went.7.
lane-handoff --late(and/handoff --late). The record written AFTER THE FACT, by the resumed session, for a swap that never ran: onePAUSEDfor the old binding — whylate; usage limit hit before the swap at <UTC>; Amendment 11(c)'s and 17(b)'s sub-fields as the record's own last lines have them; the session field the OLD uuid where the resumed conversation IS that uuid (act 6), else the writer's — immediately followed by theRESUMEDlane-startwrites anyway, and the handoff file refreshed by the session that now holds the knowledge. Refuses where the lane's last lane-kind line is already aPAUSED.Tests (
tests/test_lane_helpers.sh): a transcript seeded in a second sandbox profile's projects directory is moved and resumed by id, the pointer left, no copy made; a live holder in the other profile refuses;--latewrites the pair;--lateon an already-paused lane refuses.The process until this is built, as answered in session: wait for the window reset and run
/lane-swapfrom the same session; or exit the stuck session,mvits<uuid>.jsonlinto the new profile's projects directory under the same cwd slug, runpclaude <new-profile>in the same window, and write the late record first. The usage guard was found unarmed on Eagle and its 95% line still advice rather than the/lane-swapdirective Amendment 11(4) describes — armed globally and filed in workBenches on the same word.🤖 Generated with Claude Code
brettheap commentedon Sep 14, 2026
Lane: openrepotools-3 (openRepoTools-3)
Act 6 corrected by a measured fact (2026-09-14T12:35Z): on a launcher-configured workstation every profile's
projects/is ONE shared directory —readlink -f ~/.claude-profiles/profiles/opensoft/team/<any>/projects→~/.claude-profiles/state/opensoft/projects. So a transcript needs NO move to be resumed under another profile:pclaude <new>in the lane's window →lane-startcase (a) finds<uuid>.jsonlin that shared dir and resumes it by id. Act 6 therefore shrinks to:lane-startSAYS where it found the transcript (the shared state dir, or this profile's own), and performs the move ONLY where the two profiles'projects/resolve to different directories (a workstation without the launcher's layout), with the pointer as specified. The by-handmvdescribed earlier is unnecessary on Eagle. Act 7 (lane-handoff --late) stands unchanged. Seen the same hour: a harness--fork-sessionminted a NEW id for the resumed transcript, so the row must follow the new id (whichlane-start3b does) — and #39 covers the duplicate-process hazard that fork created.brettheap commentedon Sep 14, 2026
Lane: openrepotools-3 (openRepoTools-3)
Act 8 note (Amendment 18 Addendum 2, DRAFT, Brett Heap 2026-09-14): the
/ctxrespawn of Amendment 17(f) relaunches the lane's own pane withlane <name>(its parked branch is Amendment 11(i)'s act: the launcher's path, the recorded directory and profile, asking nothing) — notrestart <lane>, which leaves the person's PATH with #43./restart(the inside half) is unchanged.`lane-handoff` is a command in the index and not only after `--instal…
The `/ctx` respawn types the word Amendment 18 Addendum 2 gives it — …
Amendment 18 clauses (d) and (e) get the comment that says WHERE they…
brettheap commentedon Sep 14, 2026
Amendment 17 Addendum 1 is DRAFTED at brettheap/new-workstation#40 (awaits Brett Heap's ratify): a writer survives an IN-PROCESS clear (
/clear, a/ctxclearing in place) and dies only with a RESPAWN. For this issue when it lands: the top block's WRITERS first line becomes "count the live writers first (ListAgents); a live writer owns its worktree; relaunch only the ones not live";PAUSEDcarries the kind after its why (clear in-process/clear respawn/kind unknownfor a/handoffwithout--restart);/ctxwrites which it did; the WRITERS section is filled from the live count; suite cases for the line, each kind, and "expect every writer below live". Measured on the 20:10Z/clearin lane openRepoTools-3: the handoff said every agent had died; five were live on their worktrees.brettheap commentedon Sep 14, 2026
Amendment 17 Addendum 1 is IN FORCE: ratified by Brett Heap 2026-09-14T20:59:31Z ("ratify 40"), brettheap/new-workstation#40 → main 26a0d5b. PR #47 implements it (the top block's ListAgents-first WRITERS line, the PAUSED
kind,/ctxwriting which it did); its prose may now cite the addendum as in force.A pane is never respawned over a record that is only part written, a …
The name guard refuses a prompt whose window, session name and regist…
Amendment 17 tooling: a handoff is the swap under one name — `lane-ha…