Skip to content
docs
Arxo ↗

Readings: a disputed norm stays disputed

For LLMs7 sections

A norm’s text does not always admit one understanding, and the formaliser is not the one entitled to settle the dispute. Item 4 of the archive rules requires a “valid accreditation”. Only this archive’s, or any state archive’s? The text is silent, practice diverges, yet the package must work today. For this the core offers readings: named sets of rules from which the case selects the needed one — or selects none, and then the disputed part stays silent while the undisputed part works.

Arxo Law
language "law.core" version "0.2";
package tutorial.archive version "0.8.0";
namespace "urn:law:tutorial:archive";
entity Person;
source ARCHIVE_RULES {
kind municipal_act;
jurisdiction VELIKY_USTIN;
number "2026-14";
}
edition ARCHIVE_RULES_2026_RU of ARCHIVE_RULES {
language ru;
officiality official;
adopted @2026-01-15;
in_force [@2026-02-01, infinity);
}
fragment ARCHIVE_RULES_P4 in ARCHIVE_RULES_2026_RU {
kind paragraph;
locator "paragraph/4";
text ru official """Читатель допускается в зал редких фондов, если он состоит в реестре
исследователей и имеет действующую аккредитацию.
""";
content_hash "sha256:7f76a4311e52b9af58fcf3175f613794316583ae19c4f0767d0570774a456688";
}
relation in_researcher_registry(p: Person) kind institutional;
relation own_accreditation(p: Person) kind empirical;
relation accredited_elsewhere(p: Person) kind empirical;
relation accredited(p: Person) kind institutional;
relation may_enter_rare_room(p: Person) kind institutional;

The quoted fragment reads: “A reader is admitted to the rare-collections room if listed in the researcher registry and holding a valid accreditation.”

That the archive’s own accreditation counts is disputed by nobody. That is an ordinary norm, belonging to no reading.

Arxo Law
rule OwnAccreditationCounts strict {
for p: Person;
when own_accreditation(p);
then accredited(p);
}
@source(ARCHIVE_RULES_P4)
rule RareRoomAccess strict {
for p: Person;
when in_researcher_registry(p) and accredited(p);
then may_enter_rare_room(p);
}

The dispute is about another archive’s accreditation. Each side of the dispute is expressed by a rule, and these rules are opposite: one recognises, the other refuses.

Arxo Law
rule ForeignAccreditationRecognized strict {
for p: Person;
when accredited_elsewhere(p);
then accredited(p);
}
rule ForeignAccreditationRejected strict {
for p: Person;
when accredited_elsewhere(p) and not_known(own_accreditation(p));
then not accredited(p);
}

Leaving both rules in the package as is will not do: on a reader with an out-of-town accreditation they would yield BOTH, while resolving the conflict by priority would mean settling the dispute for the lawyers. The rules are laid out into readings.

Arxo Law
interpretation LiteralReading of ARCHIVE_RULES_P4 {
status disputed;
label ru unofficial "прочтение А: «действующая аккредитация» — только аккредитация этого архива";
include ForeignAccreditationRejected;
}
interpretation RecognitionReading of ARCHIVE_RULES_P4 {
status disputed;
label ru unofficial "прочтение Б: аккредитация любого государственного архива признаётся";
include ForeignAccreditationRecognized;
}
interpretation_group AccreditationScope {
alternatives LiteralReading, RecognitionReading;
selection any_of;
}

The labels read: ‘reading A: “valid accreditation” means only this archive’s accreditation’ and ‘reading B: any state archive’s accreditation is recognised’.

of names the fragment under dispute; status is mandatory, with no hidden default — here disputed, and the status vocabulary also holds proposed, reviewed, official, binding, persuasive, rejected, superseded. A status selects nothing by itself: it is information for whoever selects. include takes not one node but the rule’s whole canonical expansion — its alternatives, defeaters from unless, heads; a rule with an exception will not end up half inside a reading.

The group declares the readings alternatives of one dispute, and how to select them. any_of is any subset, including empty.

Ivanova is listed in the registry and accredited at another archive.

Reading in the caseaccreditedmay_enter_rare_room
none selectedNEITHERNEITHER
A, literalFALSE_ONLYNEITHER
B, recognitionTRUE_ONLYTRUE_ONLY

The first row is the test from this page, byte for byte:

Arxo Law
test "иногородняя аккредитация без выбранного прочтения — право молчит" {
given {
context {
decision_time @2026-03-01T09:00:00+05:00;
knowledge_time @2026-03-01T09:00:00+05:00;
legal_time @2026-03-01;
timezone "Asia/Almaty";
}
assert in_researcher_registry(entity_ref("urn:tutorial:ivanova")) {
id "assert-reg";
origin case_input;
}
assert accredited_elsewhere(entity_ref("urn:tutorial:ivanova")) {
id "assert-elsewhere";
origin case_input;
}
}
evaluate truth(may_enter_rare_room(entity_ref("urn:tutorial:ivanova")));
expect truth_status == NEITHER;
expect evaluation_status == COMPUTED;
}

The test name reads: “Out-of-town accreditation with no reading selected — law stays silent.”

Without a selection, both readings’ rules are simply inactive, and a question to the disputed head honestly yields NEITHER — “the package did not settle the dispute”. The case selects a reading via the interpretation Name; axis in the context, and the test guards the choice with the interpretations(Name) observation. This is a case axis, not a fact: a reading cannot be fed as a statement, and it must be passed where the other axes live — through the query options, not through facts, or the selection silently fails to act.

Three scenes are mandatory for every group: without a reading, under the first, under the second — the last two on the same facts with different answers. A group under which the answer does not change is decorative. A fourth scene confirms the undisputed is unharmed: with her own accreditation, access holds under any choice and without one.

Remove the include line from reading B, leaving the rule in the package, and the answer changes: for Ivanova with an out-of-town accreditation, access becomes TRUE_ONLY with no reading selected. A rule included in no reading is an ordinary package norm and applies in all cases. This is the quietest mistake on this page: the reading declared, the group declared, while the disputed rule lies alongside and always works.

selection exactly_one claims two things at once: the readings exhaust the dispute, and exactly one is correct. The price is technical and normative together. With no reading selected, the evaluator puts INTERPRETATION_REQUIRED on the whole document — on every query to the package, including questions unrelated to the disputed item. Replace any_of with exactly_one here and the page’s first test falls: INTERPRETATION_REQUIRED instead of COMPUTED, though the question is the same. In the corpus, 37 scenarios out of 37 turned red so over a dispute about one reference.

exactly_one fits when the text itself closes the list: two editions of one act, two documents named by name. A reading derived by interpretation is always any_of: declaring exactly one of two correct would settle the dispute by the form of declaration.

A reading’s and a group’s references are checked statically:

Output
error LDC-E1205: interpretation "LiteralReading": ссылка "ForeignAccreditationRefused" не объявлена в package
error LDC-E1205: interpretation "LiteralReading": `of` ссылается на необъявленное имя "ARCHIVE_RULES_P9"
error LDC-E1205: interpretation_group "AccreditationScope": alternative "CourtReading" не является interpretation

The diagnostics read: ‘reference “ForeignAccreditationRefused” is not declared in the package’; “‘of’ refers to the undeclared name ‘ARCHIVE_RULES_P9’”; ‘alternative “CourtReading” is not an interpretation’.

Status and selection policy are mandatory:

Output
error LDC-E0201: interpretation требует явный status (§154; скрытого значения по умолчанию нет)
error LDC-E0201: interpretation_group требует selection (§155)

The diagnostics read: “‘interpretation’ requires an explicit status (there is no hidden default)” and “‘interpretation_group’ requires a selection”.

All five refusals belong to the language. Replacing any_of with exactly_one is invisible to the compiler: it is a normative choice, not an error, and only scenes catch it.

This page’s layer is L3: the layer view names readings a disputed construction, an exact measure. The dispute is not settled here but recorded so that each side is verifiable. Who selects a reading in a concrete case and on what ground — a court, an agency, a contract — is a question not for the core but for the process around it; the core guarantees the choice cannot be made silently.

The exercise for this page is /tutorials/exercise-interpretations/.

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

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