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, prohibition, power, and liberty pages; only statuses and lifecycle live here.
1. When to take it and when not to
Section titled “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
Section titled “2. Minimal example”Package examples/achievement-ladder/: a member’s fee with a window until end of
March, two “as of” moments.
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:
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 не исполнены; код 0law 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
Section titled “3. Example across domains”- Law: Uzbekistan Civil Code (package
uz.civil_code) — termination of an obligation (rule TerminationOnGround, seecorpus-forms.md): the same ladder, but with the subject-matter predicateobligation_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 (packagesu.union_treaty_1922) shows the corpus form of apositions()query withACTIVE.
4. How the engine answers
Section titled “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
positionsevery position carries payload,createdBy, and proof-refs; thenormative_statussummary never destroys the original support: on conflict —CONFLICTEDplusnormative_status_supports. - A defeated position is visible and addressable but takes no part in conclusions:
normative_statusover it isDEFEATED, notNEITHER. - 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_nota position withUNDETERMINEDis explained by missing support and completeness, not by “a breach left unproven”.
5. Common mistakes
Section titled “5. Common mistakes”- Reading an overdue deadline without completeness as
VIOLATED— the engine answersUNDETERMINED(seepitfalls.md). - 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 (seepitfalls.md). - Expecting
DEFEATEDas absence of a position — it is visible inpositionsbut silent in conclusions (seepitfalls.md). - Deriving a breach from an opposite norm — a breach is not a conflict (see
pitfalls.md). - Expecting
expiredon a duty — the 0.2 ladder never produces it (seepitfalls.md). - Taking the “as of” moment from
legal_time— it isdecision_time(different axes: law vs deadline; seepitfalls.md).
6. References
Section titled “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.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.