# 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/).