docs← Back to article

Markdown for LLMs

Deadlines and calendar: boundaries

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

Download this articlePlain text ↗
# Deadlines and calendar: boundaries

What the construct does NOT do: limits, reserved values, neighbouring constructs and the selection rule.

## Does not do

- **Not read `local_path` directly.** The executor does not read bytes by
  `resource` URI: the normative path is the nearest `law.lock`
  `resources[]` line (`calendar-dataset`, `law.calendar/0.1`, relative
  `path`, `contentHash` = `datasetHash`). A mismatch is a loud refusal naming
  the lock and the node, not `MISSING_CALENDAR`.
- **Not store bytes in CLIR.** The declaration's `content_hash` is a digest
  of the dataset content, not the node's semantic hash; the dataset itself is not
  part of CLIR.
- **Not measure months/years.** "How many months between dates" has no answer
  without a rounding convention: measurements are only `days_between` (days) and
  `hours_between` (hours, with no convention at all). Months/years are
  only built by step.
- **Not derive duration from a unit.** `1 month` has no single
  length in days — the core does not choose one; `policy.month_end` sets it.
- **Not shift a schedule silently.** A `recurring` schedule's `over` anchor
  is immutable, `start_count` does not apply to it: applying it would
  mean silently shifting the whole schedule by a day.
- **Not read context axes.** Calendar terms take the date from the
  question itself; they need neither `legal_time` nor `decision_time`.
- **Not interpret the policy.** `roll` must be `no_roll`, `include_end` — `true`
  on the calendar step; otherwise — `MISSING_POLICY`, not interpretation.

## Reserved and closed

- `DeadlinePolicy` fields are closed: `start_count`, `include_end`, `roll`
  mandatory; `cutoff`, `month_end` optional; field repetition forbidden;
  an extra field is a refusal.
- `roll` on the calendar step is only `no_roll`; months/years plus roll —
  only by composition through `add_business_days` with zero.
- Dataset rules: each weekday exactly once, `working = true` — non-overlapping
  intervals, an override replaces the whole week, dates unique and inside
  `valid`; `24:00:00` — only as an end. Violations go to the semantic validator,
  not JSON Schema.
- Incomplete `timezone_db`, incomplete coverage, mismatched `content_hash` —
  errors before computation.

## Neighbours and the selection rule

- `add_calendar_period` vs `add_business_days`: calendar units without
  a calendar vs business days with an always-snapshot. See the selection table
  in `README.md`.
- Step vs measurement: "N ahead" vs "how many between" (`days_between`).
- Boundaries (`month_start_of`, `year_end_of`, …) vs step: boundaries read neither
  calendar nor policy; the step reads the policy.
- Query `deadline` (duty) vs `due_on` fact: a period as a position's fate
  vs a period as a concluded date. The directory examples give the second;
  the first is the lifecycle ladder (see [lifecycle statuses](/constructs/lifecycle-statuses/)).
- Policy in context (inline vs profile): the case names it — inline;
  reused — `context profile` + `extends`. No ambient policies.
- Official calendar vs snapshot: the source is external context;
  only the pinned digest dataset executes.