Markdown for LLMs
Time: pitfalls
The source Markdown for this article. Copy it into your assistant or download it as a text file.
# Time: pitfalls Wrong forms, silent outcomes, diagnostics, typical mistakes of formalizers and AI agents, how to detect them. ## 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` `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 `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 `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 `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 `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 - A term window bound without a period policy silently gives `MISSING_POLICY`: `window [appointed, add_calendar_period(appointed, 60 calendar_day)]` requires a named `deadline policy` and a `calendar` snapshot; 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 `.lawtest` case will never support such a rule, and `check` stays silent about it. In acts with surface cases — only fact-date comparison in the body. - A repeated `effective` in one block — `LDC-E1329`. - Silent outcome: `NEITHER` at a date outside `effective` means "rule does not participate", not "condition false". Read `why_not`. - The string `"2026-03-31"` passes `check` as `Text` and breaks only at execution — write `@2026-03-31`. ## 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).