Skip to content
docs
Arxo ↗

Duty pitfalls

For LLMs9 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.

1. Tautological goal: the duty is always SATISFIED

Section titled “1. Tautological goal: the duty is always SATISFIED”
Arxo Law
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.

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

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.

A second goal in one norm — LDC-E0201. Two goals means two rules or two then clauses.

  • _ in goal.condition passes check, but a literal with _ is never found in the store: the duty stays ACTIVE, 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; write valid_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 a Rule suffix.
  • Silent outcome: UNDETERMINED after the window with no explicit non-performance is not VIOLATED and not a package defect.

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

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.