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.
# 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.