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