Separate the date of the norm from the date of the relation
Intention
Section titled “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
Section titled “Incorrect form and why it stays silent”An entry-into-force date only in window creates a position before the norm appears:
// у Report отсутствует effectivewindow [on, @2026-05-01];Correct form
Section titled “Correct form”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
Section titled “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 |
pre-enactment bars application
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);}old relation escapes new rule
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);}new relation activates duty
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);}early position stays pending
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
Section titled “Counterfactual”runs.without drops effective and shows a premature position. teaches duplicates effective: E1329. The condition on >= cutoff separately limits old events.
Boundary
Section titled “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
Section titled “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.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.