# lawref.authoring

*module*

Хелперы для hand-authored CLIR 0.2-формы (интерим до парсера M3).

Используются генераторами артефактов векторов и KZ-регрессии. Все узлы получают
детерминированный contentHash; конверт — настоящий semantic_hash ([§209](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#209-theory-hash-и-artifact-hash)).
G-M1b заменит рукописные документы выходом компилятора.

## lawref.authoring.assertion

*function*

```python
def assertion(ns: str, suffix: str, literal: dict, origin: str = 'case_input') -> dict
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L585-L595)

## lawref.authoring.closure

*function*

```python
def closure(ns: str, name: str, predicate: str, domain_id: str, snapshot: str, complete_as_of: str, effective: dict | None = None) -> dict
```

Closed-world declaration [§70](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/10-part-x-propositions-and-four-valued-support.ru.md#70-closed-world-declarations) (домен — const_ref на предикат той же
арности; `effective` [§87](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#87-rule-temporal-qualifiers) — errata E-0087).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L565-L582)

## lawref.authoring.conj

*function*

```python
def conj(*formulas: dict) -> dict
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L467-L468)

## lawref.authoring.const

*function*

```python
def const(ref_id: str) -> dict
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L402-L403)

## lawref.authoring.content_hash

*function*

```python
def content_hash(node: dict) -> str
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L394-L395)

## lawref.authoring.disj

*function*

```python
def disj(*formulas: dict) -> dict
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L471-L472)

## lawref.authoring.duty_template

*function*

```python
def duty_template(ns: str, name: str, bearer: dict, goal_kind: str, condition: dict, window_start: str, window_end: str, beneficiary: dict | None = None, completeness_policy: str | None = None) -> dict
```

NormTemplate [§123](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#123-duty) (DutyPayload по схеме): goal [§124.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#1241-achievement-goal)–2 с обязательным
window; condition — Formula (Literal в v1-срезе).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L149-L175)

## lawref.authoring.entity

*function*

```python
def entity(ref_id: str) -> dict
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L398-L399)

## lawref.authoring.envelope

*function*

```python
def envelope(pkg: str, ns: str, nodes: list[dict], imports: list[dict] | None = None, semantic_version: str | None = None) -> dict
```

CLIR-конверт; `imports` — LockedImport-ы зависимостей (schema legal-ir):
[§209](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#209-theory-hash-и-artifact-hash) — semantic hash программы покрывает хэши импортированных пакетов
(resolver.envelope_imports строит список из resolve-контекста WP-35).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L475-L524)

## lawref.authoring.established

*function*

```python
def established(literal: dict) -> dict
```

Каноническая форма bare-atom в body ([§66](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/10-part-x-propositions-and-four-valued-support.ru.md#66-rule-body-default) → [§204](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#204-canonical-rule): explicit established).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L414-L416)

## lawref.authoring.external_judgment

*function*

```python
def external_judgment(ns: str, symbol: str, authority: str, request_type: str | None = None) -> dict
```

`external_decl` канала суждения [§47.3](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#473-judgment) (DECISION-0036/0037).

Компилятор порождает ДВА следа объявления `external judgment relation`:
`effect: "judgment"` на самом `symbol_decl` и вот этот отдельный узел
`<символ>/external`. Authoring писал только первую половину — до
`relationKind`/`judgment` включительно, — и hand-authored CLIR восьми
judgment-векторов расходился с выходом `lawc lower` ровно на этот узел
(байтовая петля G-M1b, `verify/ci/gates/compiler/check_lower.py`). Форма здесь — та же, что у
компилятора (`law-hir/src/lower`), и сверяется его же выходом.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L326-L348)

## lawref.authoring.fragment

*function*

```python
def fragment(ns: str, name: str, edition: str, fragment_kind: str, locator: str, texts: list[dict]) -> dict
```

Source-model fragment ([§29](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#29-alignment-мультиязычных-фрагментов); T029): texts = [{language, status, text,
exactBytes?, contentHash?}] — contentHash точных байтов текста проверяется
[§194](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/27-part-xxvi-static-semantics-and-diagnostics.ru.md#194-sourceprovenance-checks) при evaluation; `exactBytes` — носитель [§13](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/05-part-v-lexis-and-basic-syntax.ru.md#13-кодировка-и-нормализация)/[§28](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#28-fragment) (errata E-0248).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L21-L36)

## lawref.authoring.immunity_template

*function*

```python
def immunity_template(ns: str, name: str, holder: dict, protected_effect: dict, against: dict | None = None, window_start: str | None = None, window_end: str | None = None) -> dict
```

Immunity [§128](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#128-immunity): блокирует соответствующую legal transformation
(protectedEffect), но не attempted event.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L252-L270)

## lawref.authoring.in_force

*function*

```python
def in_force(start: str, end: str | None = None) -> dict
```

LifecycleEvent in_force с полуинтервалом [start, end) на legal axis ([§31](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#31-lifecycle)).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L122-L128)

## lawref.authoring.interpretation

*function*

```python
def interpretation(ns: str, name: str, includes: list[str], status: str = 'reviewed', of: str | list[str] | None = None, extends: str | list[str] | None = None, excludes: list[str] | None = None, labels: list[dict] | None = None) -> dict
```

Interpretation [§152](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/21-part-xx-interpretations-and-theories.ru.md#152-interpretation)/[§157](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/21-part-xx-interpretations-and-theories.ru.md#157-extends): именованный набор узлов (includes ∪
effective(extends) − excludes; set composition, не mutation).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L305-L323)

## lawref.authoring.interpretation_group

*function*

```python
def interpretation_group(ns: str, name: str, alternatives: list[str], selection: str = 'exactly_one', labels: list[dict] | None = None) -> dict
```

Interpretation group [§155](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/21-part-xx-interpretations-and-theories.ru.md#155-interpretation-group): exactly_one | any_of | compose_explicitly.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L351-L358)

## lawref.authoring.label

*function*

```python
def label(text: str, language: str = 'ru-KZ', status: str = 'unofficial', forms: dict[str, str] | None = None) -> dict
```

Метка [§218](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/30-part-xxix-ux-dx-specification.ru.md#218-multilingual-ux) для узла, порождённого генератором.

Статус по умолчанию — `unofficial`: у порождённого узла (толкование [§152](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/21-part-xx-interpretations-and-theories.ru.md#152-interpretation),
группа [§155](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/21-part-xx-interpretations-and-theories.ru.md#155-interpretation-group)) формулировка принадлежит формализатору, а не акту, и
объявлять её `official` значило бы приписать акту слова, которых в нём
нет. Официальные названия ставятся в `.law` автором акта.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L273-L285)

## lawref.authoring.liberty_template

*function*

```python
def liberty_template(ns: str, name: str, holder: dict, action: dict, window_start: str, window_end: str, against: dict | None = None) -> dict
```

Liberty [§125](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#125-liberty): explicit/strong permission — право совершить действие в
окне. Goal у неё нет: разрешение ничего не требует достичь и ничего не
требует поддерживать, поэтому статус позиции — доступность (ACTIVE до
конца окна, EXPIRED после), как у power/immunity [§127](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#127-power)–[§128](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#128-immunity).

Окно обязательно (схема LibertyPayload): бессрочное разрешение и
отсутствие запрета — разные утверждения, и [§126](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#126-weak-permission) держит второе отдельным
запросом. Конфликт liberty с обязанностью ВОЗДЕРЖАНИЯ — образец 2 [§105.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/16-part-xv-defeasible-semantics-and-conflict-resolution.ru.md#1051-базовые-normative-conflict-patterns)
и с закрытием вехи ИСПОЛНЯЕТСЯ (`evaluator/normconflict.py`): пара с общим
субъектом, общим действием и пересекающимися окнами либо разводится
приоритетом [§106](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/16-part-xv-defeasible-semantics-and-conflict-resolution.ru.md#106-priority-relation), либо остаётся с обеими позициями и названным конфликтом.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L225-L249)

## lawref.authoring.lit

*function*

```python
def lit(polarity: str, predicate: str, args: list[dict]) -> dict
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L410-L411)

## lawref.authoring.monotone

*function*

```python
def monotone(literal: dict) -> dict
```

Ребро монотонной рекурсии [§103](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/16-part-xv-defeasible-semantics-and-conflict-resolution.ru.md#103-strict-closure) (E-0018): тот же [§65](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/10-part-x-propositions-and-four-valued-support.ru.md#65-status-tests)-тест, что у
`supported`, но слой L0 — рекурсия strict-positive не поднимает программу
в L3.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L425-L429)

## lawref.authoring.norm_rule

*function*

```python
def norm_rule(ns: str, name: str, variables: list[tuple[int, str]], body: dict, template_id: str, strength: str = 'strict') -> dict
```

Правило с head norm_template_ref ([§135](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/19-part-xviii-norm-lifecycle-fulfillment-violation.ru.md#135-activation): norm creation).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L361-L376)

## lawref.authoring.not_known

*function*

```python
def not_known(literal: dict) -> dict
```

Default negation [§113](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/16-part-xv-defeasible-semantics-and-conflict-resolution.ru.md#113-default-negation): истинен при NEITHER; проверяется после
завершения producer stratum (страта [§110](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/16-part-xv-defeasible-semantics-and-conflict-resolution.ru.md#110-stratification) гарантируется движком).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L419-L422)

## lawref.authoring.power_template

*function*

```python
def power_template(ns: str, name: str, holder: dict, exercise: dict, effect_literal: dict, valid_when: dict, window_start: str | None = None, window_end: str | None = None) -> dict
```

Power [§127](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#127-power): payload {holder, exercise: CallTerm-паттерн события,
effect: LegalEffect create(after), validWhen: Formula}. Материализация —
двухшаговый runtime ([§127](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#127-power)): позиция до exercise, эффект после проверок.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L204-L222)

## lawref.authoring.priority

*function*

```python
def priority(ns: str, name: str, higher: str, lower: str) -> dict
```

Priority rule [§106](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/16-part-xv-defeasible-semantics-and-conflict-resolution.ru.md#106-priority-relation): higher/lower — const_ref на id правил (rule-level v1).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L379-L391)

## lawref.authoring.prohibition_template

*function*

```python
def prohibition_template(ns: str, name: str, bearer: dict, action: dict, window_start: str = '2026-01-01', window_end: str = '2026-12-31', beneficiary: dict | None = None) -> dict
```

Prohibition [§130](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#130-prohibition-sugar) — сахар: канонический CLIR это duty с forbearance goal
(bearer, action, window; схема требует window). Универсум weak
permission [§126](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/18-part-xvii-normative-positions.ru.md#126-weak-permission) находит такие позиции по goal.kind=forbearance.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L178-L201)

## lawref.authoring.reference

*function*

```python
def reference(ns: str, name: str, work: str, locator: str | None = None, policy: str | None = None) -> dict
```

Dynamic reference [§30.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#302-dynamic-reference) (v1: resolve_at — context.legal_time).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L131-L146)

## lawref.authoring.refresh_hashes

*function*

```python
def refresh_hashes(doc: dict) -> dict
```

Пересчитывает derived-идентичности после изменения конверта.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L527-L536)

## lawref.authoring.relation

*function*

```python
def relation(ns: str, name: str, params: list[tuple[str, str]], relation_kind: str = 'institutional', keys: list[list[int]] | None = None, public: bool = False) -> dict
```

`public=True` — [§24](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/06-part-vi-package-and-module-system.ru.md#24-visibility) `pub`: только такие символы экспортируются пакетом
(`resolver.exports`). Умолчание [§24](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/06-part-vi-package-and-module-system.ru.md#24-visibility) — internal, и поле не пишется вовсе.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L539-L562)

## lawref.authoring.revision

*function*

```python
def revision(ns: str, name: str, previous: str, next_: str, relation_kind: str, operations: list[dict] | None = None, caused_by: str | None = None, effective_at: str | None = None) -> dict
```

Ребро revision graph [§32](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#32-revision-graph); с операциями — исполняемая дельта [§32.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#321-операции-поправки).

Ребро без операций остаётся аннотацией связи (форма 0.1); ребро с
операциями обязано удовлетворять инварианту консолидации [§32.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#322-инвариант-консолидации).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L97-L119)

## lawref.authoring.revision_op

*function*

```python
def revision_op(op: str, locator: str, language: str | None = None, text: str | None = None, to_locator: str | None = None, effective_at: str | None = None) -> dict
```

Операция поправки [§32.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#321-операции-поправки): РЕЗУЛЬТАТ, а не инструкция изменяющего акта.

`effective_at` принадлежит операции, а не ребру: акт вводится поэтапно.
Порядок полей фиксируется схемой `RevisionOperation`, необязательные не
пишутся вовсе — пустое поле и отсутствующее поле не должны различаться
в канонических байтах.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L76-L94)

## lawref.authoring.rule

*function*

```python
def rule(ns: str, name: str, variables: list[tuple[int, str]], body: dict, head: dict, strength: str = 'strict', effective: dict | None = None, anchors: list[str] | None = None, governs: list[dict] | None = None, scope: dict | None = None) -> dict
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L598-L624)

## lawref.authoring.sha

*function*

```python
def sha(data: bytes) -> str
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L17-L18)

## lawref.authoring.source_edition

*function*

```python
def source_edition(ns: str, name: str, work: str, lifecycle: list[dict], language: str = 'ru', officiality: str = 'official', applicability: str | None = None) -> dict
```

Source edition [§29](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#29-alignment-мультиязычных-фрагментов): конкретная редакция work; lifecycle [§31](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#31-lifecycle) задаёт
применимость на legal axis (in_force-события с extent) — вход резолюции
dynamic references [§30.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#302-dynamic-reference) (T010).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L51-L73)

## lawref.authoring.source_work

*function*

```python
def source_work(ns: str, name: str, source_kind: str) -> dict
```

Source work [§28](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#28-fragment): акт как понятие, независимое от редакций.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L39-L48)

## lawref.authoring.var

*function*

```python
def var(index: int) -> dict
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L406-L407)

## lawref.authoring.with_labels

*function*

```python
def with_labels(node: dict, labels: list[dict] | None) -> dict
```

Ставит метки на узел и пересчитывает его content hash [§202](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#202-common-node-fields).

Метки вне semantic hash [§209](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#209-theory-hash-и-artifact-hash) (errata E-0010): разметка узла — изменение
ТЕКСТА, а не смысла, и утверждения ревьюеров по нему переходят в
`stale_verbalization`, а не в `stale_semantics` (LS [§3.6](https://github.com/arxohq/law/blob/master/spec/LAYERS-SURFACES.ru.md#36-привязка-утверждения)).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/authoring.py#L288-L302)
