Conflict surface errors
When resolve itself refuses.
Written By Dustin
Last updated 14 minutes ago
Creating a conflict is not an error — the merge completed, conflicts are stored as first-class objects, and the exit code is 0. TVO-CONFLICT-* is for the cases where the conflict surface itself refuses.
Landing a conflicted change on a protected lane
TVO-CONFLICT-003. Resolve first:
tovio conflictstovio resolvetovio health --into mainSync refused on a protected lane
TVO-CONFLICT-009 is the same invariant enforced on the wire: a clone, pull, or sync will not advance a protected lane to a tip whose tree is not conflict-free. The ref-adoption gate refuses atomically — objects may have arrived, but the protected ref never moves, so the lane cannot be wedged at a conflicted commit. The author resolves on the source lane and re-lands; or you pull the unprotected source lane instead.
The same check is re-applied when a Forge advances a review-required lane, where it surfaces over HTTP as 422. That is why a change cannot pass review and then land something conflicted.
An operation that needs a clean tree
TVO-CONFLICT-010, and worth knowing because it surprises people: diff, health’s landing preview, a three-way land, and checkout/materialize all require one version per path and will refuse on a materialized conflict. A conflict object’s address is not content, so these fail closed rather than coerce it.
tovio status --conflicts and the land result surface conflicts as data and do not raise this — so you can always see where you stand.
tovio status --conflictstovio resolveResolution refused
TVO-CONFLICT-002: the conflict is already resolved, the resolution does not parse, or you lack conflict:resolve in scope. TVO-CONFLICT-015 is the neighbouring case — --working-tree on a conflict whose resolution is not a choice of bytes at all, such as a mode, entry-kind, or rename-rename conflict.
tovio conflictsLists each conflict with its type and the resolutions that apply. Match the strategy to the type: --ours/--theirs/--base for content, --keep/--delete for delete-modify, --rename-to for rename-rename.
Resolve hangs or fails in CI
TVO-CONFLICT-012. With no strategy flag, tovio resolve asks for the interactive walk, which needs a terminal. In CI or any non-interactive run, pass an explicit strategy and a path.
--ai refused
TVO-CONFLICT-011— no resolver plugin is bound. Binding a model is a deliberate owner decision the core never makes for you, and the conflict is left unchanged.TVO-CONFLICT-013— resolving would have to send a policy-protected side to the model. Refused fail-closed, and it is the right answer.
Wrong resolution applied
tovio undoReporting it
The code and the conflict type — content, delete-modify, rename-rename, mode. Never the conflicted content, the path, or either side of the diff.