docs← Back to article

Markdown for LLMs

LDC-W4114 — Defeasible rule reads a position status it never sees

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

Download this articlePlain text ↗
# LDC-W4114 — Defeasible rule reads a position status it never sees

## What it means

A `defeasible`, `default` or `defeater` rule with an ordinary conclusion
reads the status of a normative position directly — `violated`,
`satisfied`, `active`, `created` or `undetermined` — in its body, its
scope or one of its `unless` conditions.

Position statuses are settled by the norm lifecycle, which runs after the
ranked rules of the package. The current release re-runs only strict
readers after that lifecycle, so this rule is evaluated before any status
exists and its conclusion stays unestablished, with no other signal. A rule
that creates a norm reads statuses at any strength and gets no warning;
neither do the position metadata readers `bearer_of` and `instance_of`, a
strict reader, or a local relation that happens to share a status name.

The warning disappears once the release your package selects declares that
ranked readers are supported. Until then, write the reader as `strict`, or
keep the status test in a strict rule that derives an ordinary fact for the
ranked rule to read. The warning never fails the check.

## Example

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

entity Driver;
relation involved(d: Driver) kind empirical;
relation stopped(d: Driver) kind empirical;
relation breach(d: Driver) kind institutional;

rule MustStop(d: Driver) strict {
    when involved(d);
    then duty StopDuty { bearer d; maintain stopped(d) during [@2023-07-01, infinity); };
}

rule Breach(position: PositionInstance, d: Driver) defeasible {
    when violated(position); when instance_of(position, StopDuty); when bearer_of(position, d);
    then breach(d);
}
```

## Fix

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

entity Driver;
relation involved(d: Driver) kind empirical;
relation stopped(d: Driver) kind empirical;
relation breach(d: Driver) kind institutional;

rule MustStop(d: Driver) strict {
    when involved(d);
    then duty StopDuty { bearer d; maintain stopped(d) during [@2023-07-01, infinity); };
}

rule Breach(position: PositionInstance, d: Driver) strict {
    when violated(position); when instance_of(position, StopDuty); when bearer_of(position, d);
    then breach(d);
}
```

## Engine message

The engine reports this in its own wording:

```text
example.law:16:10: warning LDC-W4114: rule Breach reads position status violated with defeasible strength and an ordinary conclusion; the selected release does not re-run that reader after the norm lifecycle, so it never sees the status (§143, §280.3)
```

## Related

- [Lifecycle statuses](/constructs/lifecycle-statuses/) — how positions become violated or satisfied.
- [Defeasible rules and exceptions](/constructs/rule-defeasible-unless/) — rule strength and `unless`.
- [Strict rules](/constructs/rule-strict/) — the reader form that sees statuses.