Time: pitfalls
Wrong forms, silent outcomes, diagnostics, typical mistakes of formalizers and AI agents, how to detect them.
1. Rule silent on every date
Section titled “1. Rule silent on every date”Check legal_time against effective and against the in_force of the
edition @source leads to: why_not names a NOT_APPLICABLE candidate,
the document — EDITION_NOT_APPLICABLE. A stub edition with
future in_force removes all rules anchored to it at once.
Detection: why_not first, not premise enumeration.
2. Date vs Instant
Section titled “2. Date vs Instant”at < @2026-01-01 with at: Instant — refusal LDC-E2108 on check;
days_between(due, @…T00:00:00Z) passes check, but execution
answers TYPE_ERROR with result status TYPE_ERROR.
Detection: write the threshold in the argument’s kind — date to date,
instant to instant. Instants order by moment: 23:30:00Z 31 December
is later than Almaty midnight 1 January.
3. “30 days” as a magnitude
Section titled “3. “30 days” as a magnitude”days_between(due, paid) >= 30 days — LDC-E2108: 30 days is
Quantity, days_between gives Integer. due + 30 days — the same
refusal: a date does not add a magnitude; a period is built by the period step
(add_calendar_period). Detection: law engine check.
4. Name in a window bound
Section titled “4. Name in a window bound”effective [start_of_regime, infinity) with an undeclared name —
LDC-E1305: a bound is a date, an instant or infinity; a declared constant
is allowed. In a target window a bare name gives LDC-E2115:
write a date, a body variable or the corpus field
[@0001-01-01, infinity).
5. timeless together with lifecycle
Section titled “5. timeless together with lifecycle”applicability timeless next to in_force — LDC-E1305: two
incompatible models of one edition. Doctrine and custom are not
invented dates: without an applicability event the node is outside dating —
“law not dated”, not “not in force”.
6. RESERVED time predicates
Section titled “6. RESERVED time predicates”during, overlaps, before, after as predicates — LDC-E2102:
check refuses. Time conditions are written as date comparisons.
during names in the corpus (74 uses in 12 packages)
are parameters and text, not predicates. (The target short form
achieve … during […] is surface sugar, not a predicate.)
7. Traps for AI agents
Section titled “7. Traps for AI agents”- A term window bound without a period policy silently gives
MISSING_POLICY:window [appointed, add_calendar_period(appointed, 60 calendar_day)]requires a nameddeadline policyand acalendarsnapshot; without them — not “window computed approximately” but no answer. governs event_time …executes, but the axis is not recorded onto a fact by the surface: a.lawtestcase will never support such a rule, andcheckstays silent about it. In acts with surface cases — only fact-date comparison in the body.- A repeated
effectivein one block —LDC-E1329. - Silent outcome:
NEITHERat a date outsideeffectivemeans “rule does not participate”, not “condition false”. Readwhy_not. - The string
"2026-03-31"passescheckasTextand breaks only at execution — write@2026-03-31.
8. Incomparable lifecycle event — EDITION_APPLICABILITY_AMBIGUOUS
Section titled “8. Incomparable lifecycle event — EDITION_APPLICABILITY_AMBIGUOUS”A lifecycle event incomparable with legal_time by kind (date versus
instant) is warning EDITION_APPLICABILITY_AMBIGUOUS: the node stays,
but its dating is shaky. Detection: a warning in check; fixed by aligning
kinds — dates to dates, instants to instants (see item 2).
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.