docs← Back to article

Markdown for LLMs

Position statuses and lifecycle

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

Download this articlePlain text ↗
# Position statuses and lifecycle

**In one sentence:** the lifecycle constructs answer "what is the state of
the duty now: created, active, performed, breached, or gone
altogether". The author takes them when a norm cares not only about the conclusion ("due")
but about its fate in time: the performance window, breach, waiver,
defeat of a norm conclusion.

A position moves through a fixed ladder — created, active, satisfied or violated —
and can be defeated, waived, suspended, or terminated; breach, compensation,
and sanction chain from the breach. Norm syntax lives on the [duty](/constructs/duty/),
[prohibition](/constructs/prohibition/), [power](/constructs/power/), and
[liberty](/constructs/liberty-immunity/) pages; only statuses and lifecycle live here.

## 1. When to take it and when not to

| Instead | Selection rule |
|---|---|
| `positions()` vs `truth()` | Asking about the norm's fate ("is the duty performed") — `positions()` with a status (`SATISFIED`, `VIOLATED`, …); asking about a world fact ("is the fee paid") — `truth()`. The same fee is visible to both queries but they answer differently: the fact is `TRUE_ONLY`, the position is `SATISFIED` |
| `VIOLATED` vs `UNDETERMINED` after the deadline | Breach of achievement requires a completeness ground: explicit non-performance, a completeness certificate, or a decision. The deadline passed with no ground — `UNDETERMINED`, not `VIOLATED`. A silent case is no proof of non-payment |
| Achievement `VIOLATED` vs maintenance `VIOLATED` | Achievement is breached by silence under completeness; maintenance — only by an accepted counterexample: a recorded breaching action. No counterexample — no breach, even after the window |
| `DEFEATED` vs `NEITHER` | Defeat means a position created by a rule whose every ground is defeated (an `unless` defeater): it is VISIBLE in `positions` with status `DEFEATED` but publishes nothing. `NEITHER` means no position at all. "No norm" and "norm withdrawn" are different answers |
| A subject-matter predicate (`obligation_terminated`) vs a std literal (`terminated`) | The lifecycle runs on std literals `urn:law:std#waived/suspended/terminated` over the position id: only they move the waiver/suspension/termination ladder. The corpus's own predicates (`obligation_terminated(o)`) do not move the ladder — they are world facts, not lifecycle acts |
| `expired` vs the lifecycle outcomes | The 0.2 duty ladder does not produce `expired`: after the window closes — `SATISFIED`, `VIOLATED`, `UNDETERMINED`, for a `BOTH` pair — `CONFLICTED` plus the waiver/suspension/termination statuses |

## 2. Minimal example

Package `examples/achievement-ladder/`: a member's fee with a window until end of
March, two "as of" moments.

```law
rule MembershipFee(p: Person) strict {
    label ru-KZ official "Участник платит взнос до конца марта";
    when is_member(p);
    then duty PayFee {
        bearer p;
        goal achievement {
            condition fee_paid(p);
            window [@2026-01-01, @2026-03-31];
        }
    };
}
```

Case 1: `is_member(p)` + `fee_paid(p)`, `decision_time` inside the window.
Query: `evaluate positions()`. Case 2: `is_member(p)` only,
`decision_time` after the window.

The engine's actual answer:

```text
law test research.lifecycle.ladder: мир research.lifecycle.ladder
  ok   [research.lifecycle.ladder#authored] tests/01-satisfied.lawtest / urn:query:research-lifecycle-01
  ok   [research.lifecycle.ladder#authored] tests/02-overdue.lawtest / urn:query:research-lifecycle-02
итого: 2 проверено, 2 прошли, 0 не прошли, 0 не исполнены; код 0
```

`law engine check` — `check OK`, no warnings. Sensitivity:
case 1 answers `position(PayFee, SATISFIED)` (accepted support confirms
the condition in the window); case 2 — `position(PayFee, UNDETERMINED)` (window
closed, no performance, no completeness ground — silence is not
a breach). Deleting the `fee_paid` fact changes the outcome from `SATISFIED` to
`UNDETERMINED`, not to `VIOLATED` — the nearest wrong outcome
a newcomer expects.

Second package `examples/defeat-and-violation/` — two ladder rungs missing
from the first:

| Facts | Question | Answer | Why |
|---|---|---|---|
| member + waiver | `positions(), PayFee` | `DEFEATED` | every ground defeated by an `unless` defeater; the position visible, no publications |
| facility running + recorded discharge | `positions(), KeepClean` | `VIOLATED` | an accepted counterexample in the maintenance window |

Second-package sensitivity: deleting `fee_exempt` revives the position
(the ground is defeated no longer — the status leaves `DEFEATED`);
deleting `discharge_detected` lifts the breach (no counterexample).

## 3. Example across domains

- **Law:** Uzbekistan Civil Code (package `uz.civil_code`) — termination of an obligation
  (`rule TerminationOnGround`, see `corpus-forms.md`): the same ladder, but
  with the subject-matter predicate `obligation_terminated(o)` — a known boundary.
- **Standard/protocol:** weekly rest of at least 42 hours —
  package `uz.labor_code` — Labour Code of Uzbekistan
  (`then weekly_rest_violated(...)`): the breach is derived by a rule from
  a measurement, not by the lifecycle engine; the std ladder needs
  a counterexample in a maintenance window.
- **Religion/ethics:** Uzbekistan family code (package `uz.family_code`) — maintenance minimum:
  breach computed by comparison (`amount * 10000 < mrot * 1175`), the same
  boundary: a subject-matter predicate, not a std status.
- **Science/teaching case:** `examples/defeat-and-violation/` — norm-conclusion
  defeat (`DEFEATED`) and maintenance breach (`VIOLATED`) in
  miniature; the 1922 Union Treaty question catalogue
  (package `su.union_treaty_1922`)
  shows the corpus form of a `positions()` query with `ACTIVE`.

## 4. How the engine answers

Table — actual runs of this directory's examples:

| Facts | Question | Answer | Why |
|---|---|---|---|
| member + fee paid, decision in window | `positions(), PayFee` | `SATISFIED` | support confirms the condition in the window |
| member without fee, decision after window | `positions(), PayFee` | `UNDETERMINED` | window closed, no completeness |
| member + waiver | `positions(), PayFee` | `DEFEATED` | ground defeated by `unless` |
| facility + recorded discharge | `positions(), KeepClean` | `VIOLATED` | maintenance counterexample |
| facility without discharge | `positions(), KeepClean` | `ACTIVE` | window open, no counterexample |
| contract, decision before the window | `positions(), PayFee` | `PENDING` | the deadline has not started yet (before the window an unperformed duty is pending) |

- In `positions` every position carries payload, `createdBy`, and proof-refs;
  the `normative_status` summary never destroys the original support:
  on conflict — `CONFLICTED` plus `normative_status_supports`.
- A defeated position is visible and addressable but takes no part in conclusions:
  `normative_status` over it is `DEFEATED`, not `NEITHER`.
- A breach is a derived institutional fact about the position instance
  (`violated(P)`), not a logical conflict: an opposite norm
  alone never gives a breach.
- Chains run as separate rule applications and proof nodes:
  primary breach → compensatory duty → sanction; a step through
  a power effect enters the next step's fixpoint.
- In `why_not` a position with `UNDETERMINED` is explained by missing support and
  completeness, not by "a breach left unproven".

## 5. Common mistakes

1. Reading an overdue deadline without completeness as `VIOLATED` — the engine answers
   `UNDETERMINED` (see `pitfalls.md`).
2. Own predicates (`obligation_terminated`, `minimum_violated`) instead of
   std literals — the waiver/suspension/termination ladder does not move; these are world facts, not
   cycle acts (see `pitfalls.md`).
3. Expecting `DEFEATED` as absence of a position — it is visible in `positions`
   but silent in conclusions (see `pitfalls.md`).
4. Deriving a breach from an opposite norm — a breach is not a conflict (see `pitfalls.md`).
5. Expecting `expired` on a duty — the 0.2 ladder never produces it
   (see `pitfalls.md`).
6. Taking the "as of" moment from `legal_time` — it is
   `decision_time` (different axes: law vs deadline; see `pitfalls.md`).

## 6. References

- The language specification defines position statuses, activation, achievement,
  maintenance, deadlines, waiver, suspension, termination, breach, compensation,
  sanction, and chains; this page states how to use them.
- Tutorials: `/tutorials/writing-tests/` (test observations).
- Details: `corpus-forms.md`, `pitfalls.md`, `boundaries.md`.