Land a lane

tovio land: the target, the gates it runs first, and the flags worth knowing.

Written By Dustin

Last updated 26 minutes ago

tovio land                     # the current lane, into maintovio land --into develop      # into a different targettovio land feature-x           # name the source explicitlytovio land feat-a feat-b       # octopus: fold several lanes at once

Landing integrates one or more source lanes into a target. With no positional lane the source is the current lane; with two or more, the target and every listed lane are folded over their common base into one multi-parent commit.

Look before you leap

tovio land --dry-run           # assess, advance nothingtovio land --explain           # print the full merge trace, then landtovio land --explain --dry-run # trace onlytovio land --explain --format html > land.html

--explain prints the merge-process trace: the base it picked, the per-file merge algebra, and every gate with its verdict. --format takes human (default), json or html, and a global --json always wins. Both flags are two-way only — tracing an octopus land is not supported yet and is refused with TVO-OP-005.

Merge, or rebase

tovio land --rebase

Opt in to a linear mainline: the source's changes are re-derived onto the target tip (keeping their change ids) and the target fast-forwards. The cost is that each change is re-signed by you, the lander, rather than surviving verbatim as a reviewed, attested parent — which is why merge stays the default. --rebase is two-way only and cannot be combined with --explain.

What is checked before anything advances

GateRefusal
Preconditions — self-target, an unborn lane, unrelated historiesTVO-OP-005
The lane's tip change is a draft or was abandonedTVO-OP-012
The merge leaves unresolved conflicts and the target is protectedTVO-CONFLICT-003
A breaking interface change where the target sets semantic-check = requiredTVO-SEM-004
A conflict on a path someone holds an exclusive lock onTVO-LOCK-002
An enforcing pre-land plugin refusedTVO-PLUGIN-013

Every one of these is checked before a single ref moves, so a refused land leaves the repository exactly as it was — no ref advanced, no conflict object written, no orphan commit.

The conflict gate is the one that behaves differently by target. A protected target must stay conflict-free, so the land is refused. Landing onto an unprotected target instead succeeds and records the conflicts as conflict objects on the integration commit: your tree still builds, and tovio conflicts lists what is left to resolve. A background auto-sync integration always takes the refusing path, never the materializing one.

Descendants are re-stacked for you

Landing a lane other lanes are stacked on re-derives those descendants onto the landed result, preserving every change id. If the land succeeds but some descendant pointer could not be advanced you get TVO-OP-032: the land is real and recorded, the re-derived commits exist, and the named lanes simply still point at the old base. Re-stack one with tovio change rebase <change> --onto <lane>, or reverse the whole thing with tovio undo.

Attaching your agent session

tovio land --session-from claude-codetovio land --no-session

Captures (or declines) an agent transcript for the integration commit you author. It attaches to the merge commit you write, never to the changes you landed. --session-from is refused outright alongside --rebase, --dry-run or --no-session, because those shapes structurally author no commit of yours. A land that turns out to be a fast-forward or already up to date also writes no commit of yours, and there the flag is simply accepted and captures nothing — the parser cannot know the outcome in advance.

Check first, or land part of it

tovio health --into maintovio change split <id> --paths 'src/api/**'

Undoing a land

tovio undo