When two Decisions contradict each other
Two Decisions in force can say opposite things: one says invoices are never changed, the other that a wrong invoice is corrected in place. This page says what Smeldr does about that, and first what it does not do.
What Smeldr does not do
Smeldr does not read what a Decision says. It does not compare Decisions, it does not find a contradiction, and it does not stop one. Two ratified Decisions in the same place can disagree, and nothing marks it until someone records it.
Record a contradiction
A person or an agent who sees that two Decisions disagree records it, with the relation contradicts from one Decision to the other.
The examples use the places from Domains and Areas. Two ratified Decisions sit in the Area ARE1 "Billing": D3 "Invoices are immutable" and D4 "A wrong invoice is corrected in place". The examples on this page are MCP tool calls, sent as Getting started shows. The MCP tool assert_relation records the contradiction:
{"source_type": "Decision", "source_id": "D3", "relation_kind": "contradicts", "target_type": "Decision", "target_id": "D4"}
The relation reads the same from both sides: recording that D4 contradicts D3 gives the same relation, not a second one. It runs only from a Decision to a Decision, and never from a Decision to itself. It can also be recorded with a Decision that is still proposed.
Who may record it: a person or an agent with the right to write, which an author grant gives. The right to ratify alone is not enough: a person who may ratify in the place but holds no grant to write is refused, and so is an agent that may only read. The refusal is forbidden.
What recording it opens
Recording a contradiction opens two conditions of the type conflict-detected, one about each Decision:
D3 contradicts a Decision
D4 contradicts a Decision
Each message names only its own Decision, never the other, so someone who may read one of the two Decisions learns nothing about the other from it. Each condition is placed where its Decision is placed. For a contradiction between Decisions in two Domains, the readers of each Domain see the condition about their own Decision.
Recording the same contradiction again, while its conditions are open, adds nothing.
Who sees the conditions
The conditions are addressed to ratify, the right to ratify, and everyone who may read the Decision's place sees them. The MCP tool list_signals lists them:
{"receiver": "ratify"}
An agent that may only read Billing sees both, though it can do nothing about them. A person who may ratify in the place but holds no grant to read there does not see them: list_signals refuses them with forbidden. Whoever is to settle contradictions in a place needs to be able to read there, as well as to ratify.
An open condition stops nothing
Both Decisions stay ratified, and both apply. While the conditions are open, a Decision on either side can still be ratified, replaced or retired. The condition tells the people who decide that two of their Decisions disagree; it decides nothing.
Commands shown once run unchanged in bash and in Windows PowerShell, with the files named as in Getting started. cmd.exe is not covered. They were run as written on Linux and in Windows PowerShell on Windows 11.
How it closes
Between two ratified Decisions, the conditions close by themselves when the contradiction no longer holds, in one of three ways. Each closed condition says why, in its resolution, which the MCP tool get_signal shows.
- The relation is withdrawn, because the two Decisions did not disagree after all, or one was recorded by mistake. Both conditions read
the contradicts relation ended (withdrawn). Withsmeldr-cli, find the relation's id andrev, then withdraw it with a reason:
bash ./smeldr-cli relation list --kind contradicts --json ./smeldr-cli relation withdraw <id> --rev <rev> --reason "D4 was reworded and no longer conflicts"
An author grant is enough to withdraw it. The relation stays on record as ended, with the reason.
- One side is replaced (the MCP tool
supersede_decision, orsmeldr-cli decision supersede). The condition about the replaced Decision readsD3 is no longer ratified (superseded); the other readsthe contradicting Decision is no longer ratified. - One side is retired (
retire_decision, orsmeldr-cli decision retire). The condition about it readsD4 is no longer ratified (retired); the other againthe contradicting Decision is no longer ratified.
Settling a contradiction is a decision like any other: replace or retire one of the two, or withdraw the relation when they did not disagree. How a Decision moves shows who may replace or retire a Decision. When a Decision another rests on leaves force, Smeldr opens a condition by itself, without anyone recording anything: it is placed with its Decision too, and it closes too when a later move ends what it describes. See When a premise leaves force.