# lawref.evaluator.editions

*module*

[§92.3](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/13-part-xiii-context-scope-applicability.ru.md#92-edition-applicability): применимость редакции на дату права — проекция [§31](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#31-lifecycle) ВНУТРИ evaluate.

Errata E-0095, плечо (а), решение владельца 02.09.2026. До него `evaluate`
обеих реализаций звал машину применимости D1 (`lawref.applicability`) только
для динамических ссылок [§30.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#302-dynamic-reference), и правило, чьи якоря ведут на редакцию,
закрытую на дату права, исполнялось как действующее — обе реализации были
согласны, и differential этого не видел по построению.

Критерий — тот же, что у внешней проекции `impact.edition_projection`, с
одним намеренным отличием, названным ниже:

- проецируются нормативные узлы (`NORMATIVE_KINDS`) с непустыми якорями;
  фрагмент датирует узел своей редакцией [§28](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#28-fragment), редакция — собой;
- якорь, не разрешившийся ни во фрагмент, ни в редакцию, узел НЕ датирует
  (строки внешнего реестра вида `KZ-MARRIAGE-CODE-ART-11` — провенанс, а не
  lifecycle);
- узел ИСКЛЮЧАЕТСЯ из вычисления, если ВСЕ его датирующие редакции на дату
  права неприменимы (`closed | suspended | not_yet`); достаточно одной
  применимой, чтобы узел остался;
- **редакция без единого события применимости** (`in_force`, `restored`,
  `suspended`, `repealed`, `expired`, `invalidated`) и без `applicability:
  timeless` считается ВНЕ ДАТИРОВКИ и узел не исключает. Это и есть отличие
  от внешней проекции, которая такую редакцию читает как `not_yet` и снимает
  всё заякоренное на любую дату: обычай, доктрину и памятник (`tuystyq`: 88
  правил из 93 на редакции без `in_force`) никто в действие датой не вводил,
  и для них «право не датировано» — ответ, а не «право не действует».
  Внешняя проекция при этом строже внутренней, поэтому раннеры, проецирующие
  снаружи, после проекции внутри не меняют ни байта: снимать уже нечего.

Граница [§82](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#82-temporal-axes)/[§2.15](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/01-part-i-audit.ru.md#215-legal_time-date-было-слишком-узким): событие lifecycle с granularity, отличной от даты права
(`Date` против `Instant`), сравнению не подлежит — TemporalResolutionPolicy в
v1 нет. Такая редакция читается как вне датировки (узел остаётся), и о ней
сообщает предупреждение `EDITION_APPLICABILITY_AMBIGUOUS`: молчать здесь
значило бы вернуть E-0095 другой дверью.

Отчёт — двумя каналами и ровно там, где [§92](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/13-part-xiii-context-scope-applicability.ru.md#92-edition-applicability) их обещает («каждый шаг
появляется в proof/explanation»):

- одна issue `EDITION_NOT_APPLICABLE` (severity `info`) НА РЕДАКЦИЮ с
  перечнем исключённых узлов — документы без исключений не меняются ни
  байтом, и это ровно граница перезаморозки голденов «по факту»;
- у `why_not(P)` [§185](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/26-part-xxv-proof-graph-and-explanations.ru.md#185-why-not) исключённое правило-кандидат отвечает
  `applicability: NOT_APPLICABLE` с причиной [§92.3](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/13-part-xiii-context-scope-applicability.ru.md#92-edition-applicability) — тем же словарём, что у
  окна `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) (условие 4 списка [§92](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/13-part-xiii-context-scope-applicability.ru.md#92-edition-applicability); здесь — условие 3).

Ex tunc в [§31](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#31-lifecycle) по-прежнему невыразим (`invalidated` — ex nunc, docstring
`applicability`), и времени ЗАПИСИ у lifecycle-события нет: оба предела
названы E-0095 и здесь не закрываются.

## lawref.evaluator.editions.EDITIONS_AS_PRESENTED_CODE

*attribute* · *module attribute*

```python
EDITIONS_AS_PRESENTED_CODE = 'EDITIONS_AS_PRESENTED'
```

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

## lawref.evaluator.editions.EDITION_AMBIGUOUS_CODE

*attribute* · *module attribute*

```python
EDITION_AMBIGUOUS_CODE = 'EDITION_APPLICABILITY_AMBIGUOUS'
```

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

## lawref.evaluator.editions.EDITION_NOT_APPLICABLE_CODE

*attribute* · *module attribute*

```python
EDITION_NOT_APPLICABLE_CODE = 'EDITION_NOT_APPLICABLE'
```

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

## lawref.evaluator.editions.NORMATIVE_KINDS

*attribute* · *module attribute*

```python
NORMATIVE_KINDS = ('assertion', 'constraint', 'norm_template', 'priority_rule', 'rule')
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/editions.py#L55-L56)

## lawref.evaluator.editions.anchor_edition

*function*

```python
def anchor_edition(by_id: dict[str, dict], anchor: str) -> dict | None
```

Редакция, которой якорь датирует узел: фрагмент → его редакция [§28](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#28-fragment),
либо редакция напрямую; иначе `None` (якорь узел не датирует).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/editions.py#L68-L78)

## lawref.evaluator.editions.describe_state

*function*

```python
def describe_state(state: dict) -> str
```

Словесная форма состояния редакции — одна на обе реализации (байты).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/editions.py#L89-L106)

## lawref.evaluator.editions.is_dated

*function*

```python
def is_dated(edition: dict) -> bool
```

Несёт ли редакция хоть одно событие применимости [§31](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#31-lifecycle) (или `timeless`).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/editions.py#L81-L86)

## lawref.evaluator.editions.presented_issue

*function*

```python
def presented_issue(as_of: str, legal_time: str) -> dict
```

[§92](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/13-part-xiii-context-scope-applicability.ru.md#92-edition-applicability) (E-0167): состав редакций предъявлен вызывающим — одна issue.

Проекция вызывающего НЕ проверяется: проверить её значило бы вновь
исполнить условие 3 по дате дела, то есть исполнить пересечение двух
проекций — ровно тот дефект, ради которого поле заведено (отчёт О-2).
Поэтому режим не доказывается, а НАЗЫВАЕТСЯ: здесь — в документе, и
полем `editionsAsPresented` в манифесте [§170](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/24-part-xxiii-cases-snapshots-evaluation.ru.md#170-evaluation-input-manifest-и-execution-receipt). Читатель обязан видеть, что
перед ним контрфактический ответ «то же дело при предъявленном составе
редакций», а не право на дату дела.

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

## lawref.evaluator.editions.project_editions

*function*

```python
def project_editions(nodes: list[dict], legal_time: str) -> tuple[list[dict], list[dict], dict[str, str], list[dict]]
```

Проекция [§92.3](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/13-part-xiii-context-scope-applicability.ru.md#92-edition-applicability) → (оставшиеся узлы, исключённые правила,
причина по id исключённого узла, issues).

Порядок узлов сохраняется ([§211](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/29-part-xxviii-compiler-pipeline.ru.md#211-determinism)); issues — по id редакции, узлы внутри
issue — по id. Правила возвращаются отдельно ради `why_not` [§185](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/26-part-xxv-proof-graph-and-explanations.ru.md#185-why-not): в
вычислении их нет, а в объяснении они обязаны быть названы.

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