Branching, merging, promoting
Three ways to turn part of a conversation into a conversation of its own. None of them touch the transcript they read.
Branch
Put the cursor on a turn in the spine and press b, or:
braids branch --lane 46360382 --at 491 braids branch --lane 46360382 --at 491 --name "try option c" braids branch --lane 46360382 --at 491 --workspace
braids writes a new transcript holding that turn's ancestry from the root, and
nothing after it, then gives you the claude --resume command for
it. The source file is opened read only. A test hashes it before and after to
prove it.
Records are copied as they were, including the environment they captured: the working directory, the git branch, the file snapshots. A branch resumes believing in the world as it was when that turn happened, which is deliberate. The harness already refuses an edit built on a stale read, and that is the only point where the difference can do harm.
A workspace of its own
--workspace gives the branch a git worktree, so two branches can
edit the same file without seeing each other. braids refuses rather than
half-doing it when a worktree cannot exist: the conversation's directory is
not a git repository, or the branch name is taken.
Merge
braids merge --lane 46360382 --from a1b2c3d4 --plan # what would come over
braids merge --lane 46360382 --from a1b2c3d4
This writes a third conversation: the base in full, then the turns that happened on the branch. It is a splice of real messages, not a summary of them. Neither original is touched.
The new records get fresh IDs, because two conversations sharing a message ID
is exactly what braids reads as a fork, and reusing them would leave a lane
that looks like a branch of the thing it was merged from. braids refuses when
one side already contains the other, rather than producing a duplicate under a
new name. --plan reports the turn counts and stops.
Promote a subagent
braids agents --lane 46360382 braids promote --lane 46360382 --agent 9f2a1c
A subagent already holds a complete, linear exchange. It is only marked as a sidechain and filed under its parent. Clearing that mark and giving it a session ID of its own is enough for the harness to resume it, so an exchange that was visible as a single tool call becomes a conversation you can read, search and branch like any other. Its own transcript is left alone.
Carrying on in a terminal
y copies the resume command for the row under the cursor. o opens it. braids drives tmux and iTerm2 directly. Anywhere else, set a template:
export BRAIDS_SPAWN='tmux new-window -c {dir} -n {name} {cmd}'
{cmd}, {name} and {dir} are
filled in. Every value is shell quoted when it is substituted, so do not put
quotes around a placeholder yourself. That quoting is not cosmetic: a
conversation titled with a backtick used to reach sh -c
unquoted.
With no template and no supported terminal, o copies the command instead of guessing at your setup.