Skip to content
docs
Arxo ↗

Separate a monthly step from a working-day roll

For LLMs7 sections

I want to resolve month-end explicitly and roll a non-working cutoff separately.

A monthly step needs a policy carrying month_end:

Incorrect form
// Days без month_end
add_calendar_period(@2026-01-31, 1 calendar_month)

Monthly and yearly units still require the month_end field; a daily unit does not read that field at all. Without the required roll, the policy declaration itself is also incomplete.

Arxo Law
language "law.core" version "0.2";
package recipes.e.r03 version "0.1.0";
namespace "urn:recipe:e-time:03";
source SyntheticCalendar { kind standard; jurisdiction "none"; number "E-CALENDAR"; }
calendar Calendar {
timezone "Asia/Almaty";
timezone_db "iana-tzdb@2026a";
period [@2024-01-01, @2028-01-01);
source SyntheticCalendar;
resource "resources/calendar-2024-2027.json";
format "law.calendar/0.1";
content_hash "sha256:dfd0181e1347cc2fd48b5fd81d27f3551cabae10eaefbf8b4dffb70bcbb3cd12";
}
deadline policy Months {
start_count same_day;
include_end true;
roll no_roll;
month_end last_day_of_month;
}
deadline policy Days {
start_count next_day;
include_end true;
roll next_working_day;
}
relation marker();
Facts / cutQuestionAnswer
Months: 31.01.2026 + 1 monthdate28.02.2026
Days: end of February, roll by zero business daysdate02.03.2026
Months: step 1 calendar_daydate2026-02-01, COMPUTED — a daily unit does not read month_end
nonexistent day resolves to month end
Arxo Law
test "nonexistent day resolves to month end" {
given {
context {
legal_time @2026-03-10;
decision_time @2027-12-31T09:00:00+05:00;
knowledge_time @2027-12-31T09:00:00+05:00;
timezone "Asia/Almaty";
deadline_policy Months;
}
}
evaluate add_calendar_period(@2026-01-31, 1 calendar_month);
expect value == @2026-02-28;
expect evaluation_status == COMPUTED;
}
month end rolls to working day
Arxo Law
test "month end rolls to working day" {
given {
context {
legal_time @2026-03-10;
decision_time @2027-12-31T09:00:00+05:00;
knowledge_time @2027-12-31T09:00:00+05:00;
timezone "Asia/Almaty";
deadline_policy Days;
}
}
evaluate add_business_days(month_end_of(@2026-02-10), 0 business_day);
expect value == @2026-03-02;
}
daily step under monthly policy computes
Arxo Law
test "daily step under monthly policy computes" {
given {
context {
legal_time @2026-03-10;
decision_time @2027-12-31T09:00:00+05:00;
knowledge_time @2027-12-31T09:00:00+05:00;
timezone "Asia/Almaty";
deadline_policy Months;
}
}
evaluate add_calendar_period(@2026-01-31, 1 calendar_day);
expect value == @2026-02-01;
expect evaluation_status == COMPUTED;
}

The calendar is synthetic: Mon–Fri, 9 March 2026 is a conventional non-working day; this is not an official calendar.

The third scene shows a daily step under a monthly policy: the computation goes through and month_end is not read. teaches removes roll from Months and gets E1307.

One policy applies to the whole case. A shared composition “month and roll” cannot be promised under two different policies of one query. Here the second query rolls a known month-end through month_end_of; an arbitrary monthly term and its roll need separate explicitly pinned computations.

A monthly step still requires month_end in the policy, while a daily step ignores the field; the scenario keeps that split and does not substitute a date from outside.

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

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