# Distinguish overdue from waiting for the deadline ## Intention I want to check the status at the deadline boundary when non-performance is known. ## Incorrect form and why it stays silent ```text title="Incorrect form" // Явное not done(p) уже до срока означает VIOLATED. ``` Non-performance before due time is not yet overdue. The closed end is included in the window; the status change comes after it. ## Correct form ```law language "law.core" version "0.2"; package recipes.zh.r02 version "0.1.0"; namespace "urn:recipe:zh-violation:02"; entity Person; relation enrolled(p: Person); relation done(p: Person); rule Primary defeasible { for p: Person; when enrolled(p); then duty Main { bearer p; achieve done(p) during [@2026-09-01, @2026-09-10]; }; } ``` ## Frozen execution scene | Facts and snapshot | Question | Answer | |---|---|---| | before the window; 2026-08-31 | `positions()` | `position(Main, PENDING);` | | before the deadline; 2026-09-05 | `positions()` | `position(Main, ACTIVE);` | | last day; 2026-09-10 | `positions()` | `position(Main, ACTIVE);` | | after the deadline; 2026-09-11 | `positions()` | `position(Main, VIOLATED);` | | after the deadline without a failure; 2026-09-11 | `positions()` | `position(Main, UNDETERMINED);` | ```law test "pending before window" { given { context { legal_time @2026-08-31; decision_time @2026-08-31T09:00:00+05:00; knowledge_time @2026-09-30T09:00:00+05:00; timezone "Asia/Almaty"; } assert enrolled(entity_ref("urn:recipe:zh-violation:02:p")); assert not done(entity_ref("urn:recipe:zh-violation:02:p")); } evaluate positions(); expect position(Main, PENDING); expect evaluation_status == COMPUTED; } ``` ```law test "active before deadline" { given { context { legal_time @2026-09-05; decision_time @2026-09-05T09:00:00+05:00; knowledge_time @2026-09-30T09:00:00+05:00; timezone "Asia/Almaty"; } assert enrolled(entity_ref("urn:recipe:zh-violation:02:p")); assert not done(entity_ref("urn:recipe:zh-violation:02:p")); } evaluate positions(); expect position(Main, ACTIVE); expect evaluation_status == COMPUTED; } ``` ```law test "active on closing day" { given { context { legal_time @2026-09-10; decision_time @2026-09-10T12:00:00+05:00; knowledge_time @2026-09-30T09:00:00+05:00; timezone "Asia/Almaty"; } assert enrolled(entity_ref("urn:recipe:zh-violation:02:p")); assert not done(entity_ref("urn:recipe:zh-violation:02:p")); } evaluate positions(); expect position(Main, ACTIVE); expect evaluation_status == COMPUTED; } ``` ```law test "violated after deadline" { given { context { legal_time @2026-09-11; decision_time @2026-09-11T09:00:00+05:00; knowledge_time @2026-09-30T09:00:00+05:00; timezone "Asia/Almaty"; } assert enrolled(entity_ref("urn:recipe:zh-violation:02:p")); assert not done(entity_ref("urn:recipe:zh-violation:02:p")); } evaluate positions(); expect position(Main, VIOLATED); expect evaluation_status == COMPUTED; } ``` ```law test "undetermined after deadline without failure" { given { context { legal_time @2026-09-11; decision_time @2026-09-11T09:00:00+05:00; knowledge_time @2026-09-30T09:00:00+05:00; timezone "Asia/Almaty"; } assert enrolled(entity_ref("urn:recipe:zh-violation:02:p")); } evaluate positions(); expect position(Main, UNDETERMINED); expect evaluation_status == COMPUTED; } ``` ## Counterfactual Diagnostic mutation `achieve done(p) during [@2026-09-01, @2026-09-10];` → `achieve done(p);`: LDC-E0201. Semantic differences are pinned as separate scenes. ## Boundary Anticipatory breach is a separate rule of the legal order. It does not arise from negative support before the deadline. Postponements and working days are covered by the time recipes.