# Separate the date of the norm from the date of the relation ## Intention I want to apply a new duty only after the norm enters force and only to new issuances. ## Incorrect form and why it stays silent An entry-into-force date only in window creates a position before the norm appears: ```text title="Incorrect form" // у Report отсутствует effective window [on, @2026-05-01]; ``` ## Correct form ```law language "law.core" version "0.2"; package recipes.e.r04 version "0.1.0"; namespace "urn:recipe:e-time:04"; entity Person; relation registered(p: Person); relation received(p: Person, on: Date); relation submitted(p: Person); rule Report strict { effective [@2026-04-01, infinity); for p: Person; for on: Date; when received(p, on) and on >= @2026-04-01; then duty File { bearer p; goal achievement { condition submitted(p); window [on, @2026-05-01]; } }; } ``` ## Frozen execution scene | Facts / cut | Question | Answer | |---|---|---| | legal_time 15.03, received 10.04 | application of Report | no | | legal_time 15.04, received 01.03 | application of Report | no | | legal_time 15.04, received 10.04 | File | ACTIVE | | without effective: legal_time 15.03, received 10.04 | File | PENDING | ```law test "pre-enactment bars application" { given { context { legal_time @2026-03-15; decision_time @2026-03-15T09:00:00+05:00; knowledge_time @2027-12-31T09:00:00+05:00; timezone "Asia/Almaty"; } assert received(entity_ref("urn:recipe:e-time:04:a"), @2026-04-10); } evaluate positions(); expect not applied(Report); } ``` ```law test "old relation escapes new rule" { given { context { legal_time @2026-04-15; decision_time @2026-04-15T09:00:00+05:00; knowledge_time @2027-12-31T09:00:00+05:00; timezone "Asia/Almaty"; } assert received(entity_ref("urn:recipe:e-time:04:a"), @2026-03-01); } evaluate positions(); expect not applied(Report); } ``` ```law test "new relation activates duty" { given { context { legal_time @2026-04-15; decision_time @2026-04-15T09:00:00+05:00; knowledge_time @2027-12-31T09:00:00+05:00; timezone "Asia/Almaty"; } assert received(entity_ref("urn:recipe:e-time:04:a"), @2026-04-10); } evaluate positions(); expect position(File, ACTIVE); } ``` ```law test "early position stays pending" { given { context { legal_time @2026-03-15; decision_time @2026-03-15T09:00:00+05:00; knowledge_time @2027-12-31T09:00:00+05:00; timezone "Asia/Almaty"; } assert received(entity_ref("urn:recipe:e-time:04:a"), @2026-04-10); } evaluate positions(); expect position(File, PENDING); } ``` ## Counterfactual runs.without drops effective and shows a premature position. teaches duplicates effective: E1329. The condition on >= cutoff separately limits old events. ## Boundary effective reads the date of the law; the comparison reads the date of the relation. Both are needed; the goal window names the performance term. The claim “effective for relations after a date” is wrong without this split. ## Pitfall Before entry into force the result was PENDING, then a retroactive violation followed. The fix is effective and a separate issuance-date guard. The as-of moment for statuses is the decision time (entry into force still reads the law date); every scene names its decision date explicitly.