Duty pitfalls
Updated 3 October 2026:
concept,except_when,claim,definition … sufficient, anddefaultstrength have been removed, together with their special deprecation diagnostic. References below to the former behavior and corpus sources are historical. New source usesrelation,unless,duty, a strict rule, anddefeasible.
1. Tautological goal: the duty is always SATISFIED
Section titled “1. Tautological goal: the duty is always SATISFIED”when contract_signed(s, c);then duty Deliver { bearer s; goal achievement { condition contract_signed(s, c); window [...]; }};The goal condition is already established when the position is created. The engine answers
SATISFIED always. Diagnostics: warning LDC-E1371.
Detection: law engine check + reading the warnings.
Fix: the goal condition is a performance
predicate (goods_delivered) absent from the body.
2. Two VIOLATED for one prohibition breach
Section titled “2. Two VIOLATED for one prohibition breach”A prohibition + a paired maintenance duty with not_done(x).
The prohibition itself gives VIOLATED; the pair — a second one. Detection: two
VIOLATED in positions() for one action fact. Fix: delete the pair.
3. A dated boundary is effective, not window
Section titled “3. A dated boundary is effective, not window”A norm “in force since March 1” is written effective [@2026-03-01, infinity);
on the rule; the goal window is the performance deadline. At a legal_time outside
effective there is no position at all; at a legal_time outside window there is one
(PENDING / UNDETERMINED). Detection: why_not names the candidate
NOT_APPLICABLE.
4. unless binds not all payload variables
Section titled “4. unless binds not all payload variables”unless force_majeure(s) with beneficiary c — rejection LDC-E4101 on
DeliveryRule/unless/0. The
unless C then not Duty form — LDC-E1302: a position has no complement.
Detection: law engine check fails (ok: false).
5. Mandatory fields and date kinds
Section titled “5. Mandatory fields and date kinds”duty without bearer, a goal without window — LDC-E1305 for each. The string "2026-03-31" passes check as Text and breaks only at
runtime — write @2026-03-31.
6. A second goal is rejected
Section titled “6. A second goal is rejected”A second goal in one norm — LDC-E0201. Two goals means two rules
or two then clauses.
7. Traps for automated authors
Section titled “7. Traps for automated authors”_ingoal.conditionpassescheck, but a literal with_is never found in the store: the duty staysACTIVE, performance is silent (a known open gap). Bind the variable with the rule body.valid_when a and b;without parentheses —LDC-E0201+LDC-E1305, compilation fails; writevalid_when (a and b);.- A body conjunction reads positively: the goal condition must be a NEW predicate, not a copy of a premise (see the tautological-goal trap).
- Rule name = position name —
LDC-E1338: name the rule with aRulesuffix. - Silent outcome:
UNDETERMINEDafter the window with no explicit non-performance is notVIOLATEDand not a package defect.
8. unless on a strict rule — LDC-E4110
Section titled “8. unless on a strict rule — LDC-E4110”A position with an exception is written defeasible: a strict rule with
an unless clause is rejection LDC-E4110. Detection:
law engine check fails (ok: false).
9. The parties to a duty
Section titled “9. The parties to a duty”Write the obligated party in bearer and the beneficiary in
beneficiary (§129.1). Check that the parties match the act before running
the scenarios.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.