Markdown for LLMs
Readings: a disputed norm stays disputed
The source Markdown for this article. Copy it into your assistant or download it as a text file.
# Readings: a disputed norm stays disputed
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.
```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."
## The undisputed and the disputed
That the archive's own accreditation counts is disputed by nobody. That
is an ordinary norm, belonging to no reading.
```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.
```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.
## Two readings and a group
```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.
## What the engine answers
Ivanova is listed in the registry and accredited at another archive.
| Reading in the case | `accredited` | `may_enter_rare_room` |
|---|---|---|
| none selected | `NEITHER` | `NEITHER` |
| A, literal | `FALSE_ONLY` | `NEITHER` |
| B, recognition | `TRUE_ONLY` | `TRUE_ONLY` |
The first row is the test from this page, byte for byte:
```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.
## A rule outside readings always applies
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.
## What is wrong with `exactly_one`
`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.
## Compiler refusals
A reading's and a group's references are checked statically:
```text
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:
```text
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.
## Next
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/](/tutorials/exercise-interpretations/).