# Keep interval bounds open ## Intention I want to include the start date in full and exclude the end date in full. ## Incorrect form and why it stays silent A zone in context does not replace a Date→Instant policy: ```text title="Incorrect form" // CivilDay удалена; окно Date сравнивается с legal_time Instant. ``` An undeclared name boundary instead of a date is a separate compiler rejection. ## Correct form ```law language "law.core" version "0.2"; package recipes.e.r12 version "0.1.0"; namespace "urn:recipe:e-time:12"; entity Person; relation registered(p: Person); temporal_resolution_policy CivilDay { utc_offset "+05:00"; day_boundary "00:00:00"; timezone "Asia/Almaty"; } relation submitted(p: Person); rule Report strict { for p: Person; when registered(p); then duty File { bearer p; goal achievement { condition submitted(p); window [@2026-03-10, @2026-03-11); } }; } rule ClosedRule strict { for p: Person; when registered(p); then duty Closed { bearer p; goal achievement { condition submitted(p); window [@2026-03-10, @2026-03-11]; } }; } rule OpenLeftRule strict { for p: Person; when registered(p); then duty OpenLeft { bearer p; goal achievement { condition submitted(p); window (@2026-03-10, @2026-03-12]; } }; } rule OpenBothRule strict { for p: Person; when registered(p); then duty OpenBoth { bearer p; goal achievement { condition submitted(p); window (@2026-03-10, @2026-03-12); } }; } ``` ## Frozen execution scene | Facts / cut | Question | Answer | |---|---|---| | 10.03 00:00 | File | ACTIVE | | 10.03 23:59 | File | ACTIVE | | 11.03 00:00 | File | UNDETERMINED | | legal_time Date 11.03, closed end | Closed | ACTIVE | | legal_time Date 10.03, open start | OpenLeft, OpenBoth | PENDING | | without CivilDay, cut at an instant | positions | ACTIVE, COMPUTED without issue — divergence from the required fatal rejection | ```law test "included start activates" { given { context { legal_time @2026-03-10T00:00:00+05:00; decision_time @2026-03-10T00:00:00+05:00; knowledge_time @2027-12-31T09:00:00+05:00; timezone "Asia/Almaty"; } assert registered(entity_ref("urn:recipe:e-time:12:a")); } evaluate positions(); expect position(File, ACTIVE); } ``` ```law test "last minute stays active" { given { context { legal_time @2026-03-10T23:59:00+05:00; decision_time @2026-03-10T23:59:00+05:00; knowledge_time @2027-12-31T09:00:00+05:00; timezone "Asia/Almaty"; } assert registered(entity_ref("urn:recipe:e-time:12:a")); } evaluate positions(); expect position(File, ACTIVE); } ``` ```law test "excluded end releases duty" { given { context { legal_time @2026-03-11T00:00:00+05:00; decision_time @2026-03-11T00:00:00+05:00; knowledge_time @2027-12-31T09:00:00+05:00; timezone "Asia/Almaty"; } assert registered(entity_ref("urn:recipe:e-time:12:a")); } evaluate positions(); expect position(File, UNDETERMINED); } ``` ```law test "unresolved granularity still answers" { given { context { legal_time @2026-03-10T12:00:00+05:00; decision_time @2026-03-10T12:00:00+05:00; knowledge_time @2027-12-31T09:00:00+05:00; timezone "Asia/Almaty"; } assert registered(entity_ref("urn:recipe:e-time:12:a")); } evaluate positions(); expect position(File, ACTIVE); expect not issue(TEMPORAL_RESOLUTION_POLICY_MISSING); } ``` ```law test "closed date includes full day" { given { context { legal_time @2026-03-11; decision_time @2026-03-11T12:00:00+05:00; knowledge_time @2027-12-31T09:00:00+05:00; timezone "Asia/Almaty"; } assert registered(entity_ref("urn:recipe:e-time:12:a")); } evaluate positions(); expect position(Closed, ACTIVE); } ``` ```law test "open start excludes first day" { given { context { legal_time @2026-03-10; decision_time @2026-03-10T12:00:00+05:00; knowledge_time @2027-12-31T09:00:00+05:00; timezone "Asia/Almaty"; } assert registered(entity_ref("urn:recipe:e-time:12:a")); } evaluate positions(); expect position(OpenLeft, PENDING); expect position(OpenBoth, PENDING); } ``` ## Counterfactual runs.without removes CivilDay. A fatal missing-policy refusal is required, but both implementations answer ACTIVE with empty issues — remeasured with the decision date named explicitly. The scene records the observation and does not treat it as the norm. This is a defect of both implementations, still live. teaches separately substitutes an unresolved name for a date and requires E2115. ## Boundary For [D1,D2] day D2 is included in full; for [D1,D2) it is not included by any instant. infinity is allowed for an ordered extension, as with immunity in [Limit a legal change with immunity](/recipes/e-time/retroactivity-immunity/). A mixed window comparison without a policy cannot be treated as correct because of a green answer: the current check gap is documented in the counterfactual. The corrected form always presents CivilDay. ## Pitfall A closed date includes the civil day, an open one excludes it; mixed comparison without a policy is inadmissible. The probe checks exactly midnight of the excluded day.