docs← Back to article

Markdown for LLMs

A real article: source and anchor

The source Markdown for this article. Copy it into your assistant or download it as a text file.

Download this articlePlain text ↗
# A real article: source and anchor

Until now we worked with a fictional archive. Now — article 175 of the
Social Code of the Republic of Kazakhstan, the right to disability
benefit. A formalisation of this article already exists:
[the worked example](https://github.com/arxohq/law/blob/master/spec/examples/kz/social-code-art175.law),
selected as pilot teaching material.

The first thing worth seeing in a real act is how little of it is rules
proper and how much is **binding to the text**.

## The ontology speaks Russian

Declarations carry labels. These are not comments: a label is what
the predicate will be called in the verbalised exposition a lawyer reads.
A declaration without a label is verbalised by its identifier, and
the lawyer signs a text that reads as code.

```law
language "law.core" version "0.2";
package tutorial.kz.social version "0.1.0";
namespace "urn:law:tutorial:kz:social";

entity Actor {
    label ru-KZ official "Субъект права";
}
entity Person : Actor {
    label ru-KZ official "Лицо";
}
entity DisabilityStatus {
    label ru-KZ official "Группа инвалидности";
}
entity Benefit {
    label ru-KZ official "Пособие";
}

const KZ: Jurisdiction = entity_ref("urn:law:jurisdiction:KZ");
const DisabilityBenefit: Benefit = entity_ref("urn:law:tutorial:kz:social#DisabilityBenefit") {
    label ru-KZ official "Пособие по инвалидности";
};

relation disability_established(person: Person, status: DisabilityStatus, from: Date) kind institutional {
    label ru-KZ official "инвалидность установлена";
}
relation permanently_resident(person: Person, jurisdiction: Jurisdiction, during: Interval<Date>) kind institutional {
    label ru-KZ official "постоянно проживает на территории";
}
relation citizen_of(person: Person, jurisdiction: Jurisdiction) kind institutional {
    label ru-KZ official "является гражданином";
}
relation foreign_citizen(person: Person) kind institutional {
    label ru-KZ official "является иностранцем";
}
relation stateless_person(person: Person) kind institutional {
    label ru-KZ official "является лицом без гражданства";
}
relation entitled(person: Person, benefit: Benefit) kind institutional {
    label ru-KZ official "имеет право на пособие";
}
```

The labels read: "Subject of law", "Person", "Disability group", "Benefit", "Disability benefit", "disability is established", "permanently resides on the territory", "is a citizen", "is a foreigner", "is a stateless person", "is entitled to the benefit".

`KZ` and `DisabilityBenefit` are not "domain constants" or strings: they
are **individuals**, declared as constants. The core rejects a bare name in
term position (`LDC-E1330`), and not from pedantry:
an unresolved name would pass the whole pipeline silently, and the norm
would never fire. The declaration gives the individual an `entity_ref`
address by which the case recognises it.

Note `permanently_resident`: the third argument is `Interval<Date>`.
Residence is not a fact but a fact **over an interval**, and the article
speaks exactly so. The temptation to drop the interval ("let us assume
residence now") costs dearly: it cannot be restored later, because the
case will no longer hold interval data.

## The norm

```law
@source("KZ-SOCIAL-CODE-224-VII-ART-175")
rule DisabilityBenefitEntitlement strict {
    label ru-KZ official "Статья 175. Право на пособие по инвалидности";
    for person: Person;
    for status: DisabilityStatus;
    for from: Date;
    when disability_established(person, status, from)
        and permanently_resident(person, KZ, [from, infinity))
        and (citizen_of(person, KZ) or foreign_citizen(person) or stateless_person(person));
    then entitled(person, DisabilityBenefit);
}
```

The rule label reads: "Article 175. The right to disability benefit".

The three branches in parentheses — citizen, foreigner, stateless
person — are not the formaliser's caution but the article's literal
composition. The disjunction is material here: removing any branch
narrows the circle of entitled persons, and does so silently.

## An anchor is an address, not bytes

`@source("KZ-SOCIAL-CODE-224-VII-ART-175")` is a string. It says where the
norm is derived from and lands in the proof: the explanation of the
answer will show it next to the conclusion. But it **guarantees nothing
about the text**. If
the statute changes, the string stays the same.

This is easy to verify: search the repository for this anchor and you
will find only the example itself and the CLIR produced from it. Not
a single declared `source`, not one edition, not one fragment with
a hash.

This is no reproach to the example. It is the boundary between two
different things that are easy to confuse:

| | What it gives | What it does not give |
|---|---|---|
| `@source("…")` | the norm's address in the act, landing in the proof | any link to the text bytes |
| `source` / `edition` / `fragment` | pinned text, verified by a content hash | by itself — nothing about applicability |

## What binding looks like

The three levels from the first tutorial, now on a real act.

```law
source SOCIAL_CODE {
    kind code;
    jurisdiction KZ;
    number "224-VII";
}

edition SOCIAL_CODE_2023_RU of SOCIAL_CODE {
    language ru-KZ;
    officiality official;
    adopted @2023-04-20;
    in_force [@2023-07-01, infinity);
    materialization_status ABSTRACT_ONLY;
}
```

And here is the fragment — where one must be precise about what exactly
is declared.

```law
fragment SOCIAL_CODE_ART175_TEACHING in SOCIAL_CODE_2023_RU {
    kind article;
    locator "article/175";
    text ru-KZ unofficial """Учебная выдержка, не официальный текст: право на пособие по
инвалидности имеют лица с установленной инвалидностью, постоянно проживающие
на территории Республики Казахстан.
""";
    content_hash "sha256:46a9b7144940cc1e85c2878749f2903a7ba915b8f72bf9ec29a72808dbc7483d";
}
```

The quoted fragment reads: "Teaching excerpt, not the official text: persons with established disability permanently residing on the territory of the Republic of Kazakhstan are entitled to disability benefit."

The word `unofficial` carries all the weight here. The official text of
article 175 is concrete bytes published by the authorised body; they
cannot be written from memory, they are **pinned** — downloaded, placed
next to the package, and presented to the compiler, as shown in
[the pinned-edition lesson](/tutorials/pinned-edition/). Several acts
are pinned this way, including the Civil Code and the republican
budget law.

The edition honestly declares `materialization_status ABSTRACT_ONLY`:
there is nothing to pin as a publication. This is no formality — this
field decides what the compiler requires of fragments, and how the
coverage report counts the act's textual coverage.

Meanwhile it is useful to remember the asymmetry: declaring text official
is easy, while the compiler answers for it. It recomputes a fragment's
`content_hash` at every `check`: replace even one word in the text
without touching the hash, and the build stops with `LDC-E5201`. Lying
about the text content works only once.

## Next

Article 175 speaks not only of the right but of the **date** from which
the benefit is granted — and on that date the core says "no". The next
tutorial: from the article text to the norm, and where the boundary of
the expressible runs.

The exercise for this page is [/tutorials/exercise-real-article-source/](/tutorials/exercise-real-article-source/).