ADR 0003: Conflicts are facts about disagreement

Decision

When causally concurrent assertions (neither an ancestor of the other via :event/parents) target the same fact path with different values, the fact becomes conflicted. A conflicted fact — like a disputed one — does not satisfy guards. explain surfaces both claims, both actors, and asks for a superseding assertion. Resolution is a new signed event: a human judgment on the record.

tik ships no conflict-resolution policy language. No latest-wins, no role-priority, no per-process resolution rules.

Context

Most replicated systems ask “how do we make replicas converge?”; the prior question is “what does convergence mean when humans disagree?” Last-write-wins is deterministic but destroys information: an engineer asserting severity=low concurrently with a manager asserting severity=critical is a disagreement, and severity = conflicted is the actual state of the evidence — the disagreement itself is information. Silently picking a winner by timestamp hides exactly the thing the process should surface, and every resolution shortcut fails the same way: latest-wins makes clocks into authority, role-priority embeds organizational judgment in the truth engine (“why did tik choose the manager’s claim?” — “because the kernel says so” is the accountability hole), and per-process resolvers grow into a second governance language hidden in configuration. The causal DAG is what makes the distinction computable: a later assertion that observed the earlier one (an ancestor) is a correction — history, not conflict; only causally concurrent claims disagree.

Consequences

see history · edit this page