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 onceLanding 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 --rebaseOpt 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
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-sessionCaptures (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