Skip to content
docs
Arxo ↗

Duty: addressee, goal, window

For LLMs8 sections

Updated 3 October 2026: concept, except_when, claim, definition … sufficient, and default strength have been removed, together with their special deprecation diagnostic. References below to the former behavior and corpus sources are historical. New source uses relation, unless, duty, a strict rule, and defeasible.

duty is a normative position that requires of its addressee that something be achieved, maintained, or not done within a given window: the author reaches for it when the source says “is obliged to”, “must”, “ensures”.

A duty always names who owes it, what is owed, and by when: one addressee, one goal, one performance window.

InsteadTake whenSelection rule
prohibitionthe source says “is prohibited”, “is not allowed”write prohibition: it is a duty with a forbearance goal spelled the way the act speaks; do not duplicate it with a paired maintenance duty — you get two VIOLATED for one breach
constrainta whole world must be rejected, not a person addresseda constraint has neither an addressee nor a performance window; a duty always names its addressee
rule strict with an institutional heada status is derived (“is deemed to have defaulted”), not behaviour requireda fact-head has no position lifecycle
claima claim “creditor against debtor” is to be recordedavoid claim: write duty with the parties directly — the debtor in the bearer field, the creditor in the beneficiary field

Three goal kinds: achievement (achieve the condition inside the window), maintenance (hold the condition over the whole window), forbearance (not to perform the action in the window; almost always written as prohibition). A fourth kind, recurring every, is executable in 0.2 (E-0146); mandatory over gives the overall repetition interval.

Grammar: duty, goals, norm head (EBNF verbatim from the language grammar)

Section titled “Grammar: duty, goals, norm head (EBNF verbatim from the language grammar)”
Show syntax reference

The duty form — the addressee (bearer), the beneficiary, and a single goal:

Grammar
duty_conclusion = "duty", [ identifier ], "{",
{ duty_item },
"}" ;
duty_item = "bearer", expression, ";"
| "beneficiary", expression, ";"
| "goal", goal, [ ";" ]
| compact_duty_goal
| "activation", formula, ";"
| "discharge_policy", reference, ";"
| "violation_policy", reference, ";"
| source_anchor_item
| metadata_item ;

The three base forms follow; recurring every <step> { … } over <interval> is executable in 0.2 (E-0146).

Grammar
achievement_goal = "achievement", "{",
"condition", formula, ";",
"window", interval_expression, ";",
{ goal_item },
"}" ;
maintenance_goal = "maintenance", "{",
"condition", formula, ";",
"window", interval_expression, ";",
{ goal_item },
"}" ;
forbearance_goal = "forbearance", "{",
"action", expression, ";",
"window", interval_expression, ";",
{ goal_item },
"}" ;

The norm head — any modality with an optional template StableId annotation. A claim is written as duty with the parties directly — the debtor in the bearer field, the creditor in the beneficiary field:

Grammar
norm_conclusion = { annotation },
( duty_conclusion
| liberty_conclusion
| power_conclusion
| immunity_conclusion
| prohibition_conclusion ) ;

Position statuses and lifecycle live on the lifecycle page; windows as intervals and their computation — on the deadline-calendar page; window syntax is not duplicated here.

Package examples/duty-achievement/: a supplier must deliver goods in March 2026. Full code — examples/duty-achievement/package.law; cases and expectations — examples/duty-achievement/tests/01-in-window.lawtest (scenarios in the window) and tests/02-after-window.lawtest (scenarios after the window).

Arxo Law
rule DeliveryRule defeasible {
for s: Supplier;
for c: Customer;
when contract_signed(s, c);
then duty Deliver {
bearer s;
beneficiary c;
goal achievement {
condition goods_delivered(s, c);
window [@2026-03-01, @2026-03-31];
}
};
}

Case facts: contract_signed(alpha, omega). Query positions().

The engine’s actual answer (see How the engine answers):

  • legal_time @2026-03-15, no delivery → position(Deliver, ACTIVE), not VIOLATED (before the deadline an unperformed duty is active);
  • same date + goods_delivered → position(Deliver, SATISFIED);
  • legal_time @2026-04-10, with no facts of non-performance → position(Deliver, UNDETERMINED), not VIOLATED (absence of proof of performance is not a breach);
  • same date + not goods_delivered → position(Deliver, VIOLATED).

Sensitivity check: remove contract_signed from the case — position Deliver is never created (no body substitution); remove goods_delivered from the second scenario — the answer changes from SATISFIED to ACTIVE. The example is not vacuous.

The same “duty with a window” device in different domains:

  • Law: the duty to insure cargo — examples/duty-maintenance/ (KeepInsured, maintenance with a March window; the counterexample not goods_insured gives VIOLATED immediately).
  • Law: the ban on subcontracting — the same package (NoSubcontracting; prohibition reads as a duty with a forbearance goal; the fact subcontracts in the window gives one VIOLATED).
  • Standard/protocol: the duty to keep a unit ready (package us.army.training — US Army training norms, UnitTrainingReadiness — military training in the same duty form outside civil law).
  • Religion/ethics: the duty to respect all religions (package mng.corpus.yasa — the Mongol Yasa, RespectAllReligions — the same construct for an ethical norm).
  • Custom/casework: court duties in banking disputes (package kz.corpus.np_bank_loan_disputes — Kazakh banking-dispute casework — five duties with a [den, infinity) window).

Forms in detail — corpus-forms.md.

Run output (verbatim):

Output
check OK: docs/research/constructs/10-duty/examples/duty-achievement
law test research.constructs.duty_achievement: мир research.constructs.duty_achievement
ok [research.constructs.duty_achievement#authored] tests/01-in-window.lawtest / in window without delivery — ACTIVE not VIOLATED
ok [research.constructs.duty_achievement#authored] tests/01-in-window.lawtest / delivery inside window — SATISFIED
ok [research.constructs.duty_achievement#authored] tests/02-after-window.lawtest / after window without explicit non-performance — UNDETERMINED
ok [research.constructs.duty_achievement#authored] tests/02-after-window.lawtest / after window with established non-performance — VIOLATED
итого: 4 проверено, 4 прошли, 0 не прошли, 0 не исполнены; код 0
Output
check OK: docs/research/constructs/10-duty/examples/duty-maintenance
law test research.constructs.duty_maintenance: мир research.constructs.duty_maintenance
ok [research.constructs.duty_maintenance#authored] tests/01-violations.lawtest / counterexample inside window violates maintenance
ok [research.constructs.duty_maintenance#authored] tests/01-violations.lawtest / established action inside window violates prohibition once
ok [research.constructs.duty_maintenance#authored] tests/02-excuse.lawtest / force majeure defeats the excusable duty
ok [research.constructs.duty_maintenance#authored] tests/02-excuse.lawtest / without force majeure the duty stays active
итого: 4 проверено, 4 прошли, 0 не прошли, 0 не исполнены; код 0

Position statuses: PENDING (before the window), ACTIVE (in the window, unperformed), SATISFIED, VIOLATED, UNDETERMINED, DEFEATED (defeated by a defeater — status literals are not published), EXPIRED/CREATED for liberties. Observation in a test — position(Name, STATUS); the normative_status aggregate over several norms answers UNDETERMINED. In proof — the support of the applying rule and the support of the goal condition; why_not names the unestablished conjunct.

A window from case variables (tests “case window: ACTIVE before the deadline” and “case window: VIOLATED after the deadline with non-payment”):

FactsQuestionAnswerWhy
invoice_issued(…, 5 March, 15 March)Pay with decision on 10 MarchACTIVEwindow from rule variables, deadline not passed
same + not paidPay with decision on 20 MarchVIOLATEDwindow closed, non-performance established
  1. The goal condition repeats the rule body — the duty is always SATISFIED (tautological goal; warning LDC-E1371).
  2. Two goals in one duty — rejection LDC-E0201.
  3. A prohibition + a paired maintenance duty — two VIOLATED for one breach.
  4. A bare name as a window bound — rejection LDC-E2115; write a date, a body variable, or the open floor [@0001-01-01, infinity).
  5. unless on a norm-head binds not all payload variables — rejection LDC-E4101 on node <Rule>/unless/N.
  6. Rule name coincides with position name — LDC-E1338.
  7. condition with _ — check stays silent, execution never finds the literal (a known open gap; see pitfalls.md).

Each analysed — pitfalls.md.

  • The language specification defines positions, goals, neighbouring forms, the lifecycle, defeat, the positions query, and test observations; this page states how to use them.
  • Tutorials: /tutorials/writing-tests/ (test observations), /tutorials/defeaters/ (defeater versus priority).
  • Details: corpus-forms.md, pitfalls.md, boundaries.md.

Documentation for Arxo. Writings — blog.arxo.io.

Anonymous visit counts on stats.arxo.io, no cookies.