docs← Back to article

Markdown for LLMs

UNRESOLVED_NORMATIVE_CONFLICT — Two norms collide and neither yields

The source Markdown for this article. Copy it into your assistant or download it as a text file.

Download this articlePlain text ↗
# UNRESOLVED_NORMATIVE_CONFLICT — Two norms collide and neither yields

## What it means

Norms can pull in opposite directions over one effect: a power creates it
while an immunity shields against it, and no ranking says which prevails.
The engine keeps both norms — choosing a winner without authority would
be inventing law — and the question about the disputed effect ends in a
reported conflict rather than an answer.

This status preserves the disagreement instead of hiding it. The two
norms stay in force; only the disputed effect is left undecided.

## When you see it

```law
language "law.core" version "0.2";
package demo.diagnostics version "0.1.0";
namespace "urn:law:demo:diagnostics";

entity Applicant;
entity Office;
relation permit_office(o: Office) kind empirical;
relation resells_permit(a: Applicant) kind empirical;
relation revocation_notice(o: Office, a: Applicant) kind empirical;
relation permit_revoked(a: Applicant) kind institutional;

rule RevocationPower strict {
    for a: Applicant;
    for o: Office;
    when permit_office(o) and resells_permit(a);
    then power RevokePermit {
        holder o;
        over a;
        exercise revocation_notice(o, a);
        valid_when (resells_permit(a));
        effect create(permit_revoked(a));
    };
}

rule RevocationShield strict {
    for a: Applicant;
    for o: Office;
    when permit_office(o) and resells_permit(a);
    then immunity NoRevocation {
        holder a;
        against o;
        protected_effect permit_revoked(a);
    };
}
```

```lawtest
language "law.core" version "0.2";
package demo.diagnostics version "0.1.0";
namespace "urn:law:demo:diagnostics";

test "power against immunity" {
    given {
        context { legal_time @2026-03-01; decision_time @2026-03-01T09:00:00Z; knowledge_time @2026-03-01T09:00:00Z; timezone "UTC"; }
        assert permit_office(entity_ref("urn:demo:diagnostics:office")) { origin case_input; }
        assert resells_permit(entity_ref("urn:demo:diagnostics:ann")) { origin case_input; }
        assert revocation_notice(entity_ref("urn:demo:diagnostics:office"), entity_ref("urn:demo:diagnostics:ann")) { origin case_input; }
    }
    evaluate truth(permit_revoked(entity_ref("urn:demo:diagnostics:ann")));
    expect evaluation_status == UNRESOLVED_NORMATIVE_CONFLICT;
}
```

The revocation power and the shield against it both apply to one effect,
and nothing ranks them. The effect stays undecided.

## What to do

Resolve the collision at its level: add a ranking between the two norms,
narrow one of them so they no longer overlap, or obtain the decision that
settles which prevails. More facts about the same situation will not
decide it.

## Related

- [Testing a package](/language/testing-a-package/) — how scenarios pin outcomes.
- [PRIORITY_CONFLICT](/diagnostics/PRIORITY_CONFLICT/) — when the rankings themselves cycle.