docs← Back to article

Markdown for LLMs

Time: pitfalls

The source Markdown for this article. Copy it into your assistant or download it as a text file.

Download this articlePlain text ↗
# 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).