Skip to content
docs
Arxo ↗

Exercise 15. A complaint term in business days

For LLMs2 sections

An exercise for the terms page. The archive answers a request within ten business days. The rules allow fifteen for a complaint, counted under the same policy: from the next day, including the last, rolling to a business day.

Setup. Write the complaint-reply term norm and find the date for a complaint received Friday 6 March 2026 under Kazakhstan’s official calendar. Verify with a date a day earlier that the term is exactly that day.

Hint. The answer cannot be reached by counting days on a wall calendar: March holds holidays, and they shift. Let the engine name the date, and explain where it came from.

Below is the solution. Try it yourself first.

The calendar and policy from the page, plus two relations:

Arxo Law
language "law.core" version "0.2";
package tutorial.archive version "0.6.1";
namespace "urn:law:tutorial:archive";
entity Person;
source KZ_OFFICIAL_CALENDAR_2026 {
kind law;
jurisdiction KZ;
number "calendar-2026";
}
calendar archive_calendar_2026 {
timezone "Asia/Almaty";
timezone_db "iana-tzdb@2026a";
period [@2026-01-01, @2027-01-01);
source KZ_OFFICIAL_CALENDAR_2026;
resource "artifact:corpus/clir/kz-official-2026.calendar.json";
format "law.calendar/0.1";
content_hash "sha256:a17b851ac08e622c05c116637ecf8d818bc7b480568f5560407d69461c4b8c21";
}
deadline policy ARCHIVE_BUSINESS_DAYS {
start_count next_day;
include_end true;
roll next_working_day;
}
relation complaint_received(p: Person, on: Date) kind empirical { key(p); }
relation complaint_reply_due(p: Person, due: Date) kind institutional;
rule ComplaintReplyDeadline strict {
for p: Person;
for on: Date;
when complaint_received(p, on);
then complaint_reply_due(p, add_business_days(on, 15 business_day));
}

The test with the engine-named date:

Arxo Law
test "жалоба получена в пятницу 6 марта — ответ до 3 апреля" {
given {
context {
deadline_policy ARCHIVE_BUSINESS_DAYS;
decision_time @2026-04-15T09:00:00+05:00;
knowledge_time @2026-04-15T09:00:00+05:00;
legal_time @2026-03-06;
timezone "Asia/Almaty";
calendar archive_calendar_2026;
}
assert complaint_received(entity_ref("urn:tutorial:ivanova"), @2026-03-06) {
id "assert-complaint";
origin case_input;
}
}
evaluate truth(complaint_reply_due(entity_ref("urn:tutorial:ivanova"), @2026-04-03));
expect truth_status == TRUE_ONLY;
expect evaluation_status == COMPUTED;
}

The test name reads: “Complaint received Friday 6 March — reply due by 3 April.”

Where 3 April comes from. Counting starts the next day, 7 March, and by the 2026 calendar March holds more days off than usual: 8 March shifted to Monday the 9th, 15 March shifted to the 16th, Nauryz 21–23 March shifted to the 24th and 25th, plus weekends. Business days run so: 10–13 March are four, 17–20 eight, 26–27 ten, 30 March – 3 April fifteen. The fifteenth business day is Friday 3 April, with nothing to shift. The page’s request answer, ten days from the same date, ended 27 March by the same chain.

Both tests are in tests/45-exercise-deadlines.lawtest: the solution’s date and a date a day earlier expecting NEITHER. The policy is declared both in the program and in the test file: without the second declaration the runner refuses LDC-E1333, without the first — EVALUATION_REQUEST_INVALID at runtime.

What the exercise teaches. A business-day term is a function of three things: date, policy, and calendar. The norm implies none of them: the policy is named in the case context, the calendar pinned by hash, and the same test on another calendar yields another date, and without a calendar none at all.

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

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