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 main

Sync 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 resolve

Resolution 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 conflicts

Lists 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 undo

Reporting 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.