docs← Back to article

Markdown for LLMs

Separate the date of the norm from the date of the relation

The source Markdown for this article. Copy it into your assistant or download it as a text file.

Download this articlePlain text ↗
# 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.