Argument status
Flag: --status (or --compute).
Where derived confidence asks “how strong?”, argument status asks a sharper question: “does this claim survive every attack?” The answer is one of three labels.
| Label | Meaning |
|---|---|
in | accepted — every attacker is defeated |
out | defeated — at least one attacker is accepted |
undecided | neither — e.g. a mutual attack with no resolution |
This is the grounded extension from Dung’s argumentation framework (1995).
The attack graph
Only two relations count as attacks:
opposes— rebuts a node.undercuts— defeats an inference.
There’s no separate “defends” relation, because defense falls out for free:
defending X means attacking X’s attacker. If risk is attacked by port-strike,
and guard opposes port-strike, then port-strike goes out and risk is
reinstated to in — automatically.
The labelling
Computed to the least fixpoint:
- Start every contested node
undecided. - Repeatedly:
- label a node
inif all of its attackers are alreadyout(a node with no attackers isinimmediately); - label a node
outif any attacker isin.
- label a node
- Stop when nothing changes.
The result is unique and deterministic. Nodes caught in an unbroken mutual
attack stay undecided.
Worked example
From the bundled pour-the-slab.thml:
link truck-is-booked supports conditions-are-fine
link overnight-freeze opposes conditions-are-fine
overnight-freeze has no attackers → in. It opposes conditions-are-fine,
and that attacker is in, so conditions-are-fine → out. (The supports
edge doesn’t enter the status calculation — support isn’t an attack; it feeds
derived confidence instead.)
That out is exactly what the conflict report compares against
the engineer’s authored 0.88.
Where it appears
argument_status is set on every focus and link that takes part in the attack
graph:
{ "type": "focus", "id": "conditions-are-fine", "argument_status": "out" }
{ "type": "focus", "id": "overnight-freeze", "argument_status": "in" }
It reads as a node colour/badge in the playground’s Argument lens.