Skip to content
docs
Arxo ↗

Exercise 14. A transition period with two bounds

For LLMs2 sections

An exercise for the time page. The old-card replacement norm on the page applies indefinitely. In the archive rules it is transitional: cards issued before 1 February 2026 are subject to replacement during 2026, and from 2027 the transition period is closed.

Setup. Write the norm so that on the 1 June 2026 date of law, a card of 10 January 2026 is subject to replacement, a card of 1 March 2026 is not, while on the 1 March 2027 date of law the first card is not subject to replacement either, and the norm does not apply to it.

Hint. The norm has two bounds of different nature: the norm’s own validity window and an issue-date condition. The first is effective, the second a date comparison in the condition. They are easy to confuse, with different answers.

Below is the solution. Try it yourself first.

Arxo Law
language "law.core" version "0.2";
package tutorial.archive version "0.4.2";
namespace "urn:law:tutorial:archive";
entity Person;
relation reader_card_issued(p: Person, on: Date) kind empirical { key(p); }
relation card_reissue_required(p: Person) kind institutional;
const OLD_CARD_CUTOFF: Date = @2026-02-01;

The norm with a validity window and a cutoff date:

Arxo Law
rule TransitionalCardReissue strict {
effective [@2026-02-01, @2027-01-01);
for p: Person;
for on: Date;
when reader_card_issued(p, on) and on < OLD_CARD_CUTOFF;
then card_reissue_required(p);
}

The effective window is half-open: 1 January 2027 is already outside it. The cutoff date is a named constant, not a number in a condition: in the text it is the same date as the rules’ commencement, and in a year nobody will guess where it came from.

The closed-window test, expecting “the norm not applied”:

Arxo Law
test "переходный период закончился — старая карточка больше не подлежит замене" {
given {
context {
decision_time @2027-03-01T09:00:00+05:00;
knowledge_time @2027-03-01T09:00:00+05:00;
legal_time @2027-03-01;
timezone "Asia/Almaty";
}
assert reader_card_issued(entity_ref("urn:tutorial:ivanova"), @2026-01-10) {
id "assert-card";
origin case_input;
}
}
evaluate truth(card_reissue_required(entity_ref("urn:tutorial:ivanova")));
expect truth_status == NEITHER;
expect evaluation_status == COMPUTED;
expect not applied(TransitionalCardReissue);
}

The test name reads: “The transition period ended — the old card is no longer subject to replacement.”

On the 1 June 2026 date of law, three cases execute:

FactsAnswer on card_reissue_required(ivanova)
card of 10 January 2026TRUE_ONLY
card of 1 March 2026NEITHER
card of 1 March 2026, without the issue-date conditionTRUE_ONLY

The third row is a counterfactual: without the date comparison the norm would swap all cards in a row. The test above executes on the 1 March 2027 date of law from tests/44-exercise-time.lawtest.

What the exercise teaches. A norm’s window answers “when is the norm in force”, the condition’s date “which facts it concerns”. The first compares against the date of law, the second against the case’s date. Moving the cutoff into effective would say the norm applies from 1 February, not that it concerns cards before 1 February.

Documentation for Arxo. Writings — blog.arxo.io.

Anonymous visit counts on stats.arxo.io, no cookies.