# lawref.applicability

*module*

Машина применимости редакции по lifecycle-статусам [§31](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#31-lifecycle) (D1).

v1 резолюции [§30.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#302-dynamic-reference) (`resolver.resolve_dynamic_references`) читает ровно один
статус — `in_force`. Этого хватало корпусу, но не хватает ни решению
конституционного суда о неконституционности акта («прекращает действие со дня
решения» — Конституция РК ст. 75), ни смене самой конституции (переходные
положения ст. 94–96), ни приостановлению действия акта. Здесь статусы [§31](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#31-lifecycle)
получают семантику применимости, а `resolver` переключается на неё отдельным
шагом — файл резолвера сейчас в правке параллельной полосы, и модуль написан
самодостаточным именно поэтому.

Классы статусов ([§31](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#31-lifecycle): Core не hard-code-ит последствия ВСЕХ labels, но
`in_force` имеет стандартный смысл; здесь фиксируется минимальный набор,
остальные статусы применимость не меняют):

- **открывающие** `in_force`, `restored` — редакция применима с момента
  события и до конца его extent;
- **приостанавливающие** `suspended` — не применима на протяжении extent;
- **закрывающие** `repealed`, `expired`, `invalidated` — не применима с
  момента события и НЕОБРАТИМО: открывающее событие после закрывающего есть
  дефект данных (`LDC-E5302`), а не «воскрешение» редакции;
- **нейтральные** `adopted`, `published` — фиксируют историю, применимость
  не меняют (в корпусе `adopted` встречается вместе с `in_force`).

`invalidated` реализует ровно ex nunc («со дня решения»): признание
неконституционным задаётся событием с началом в дату решения. Ex tunc
(недействительность с момента принятия) в v1 НЕ выражается и не
подразумевается: для неё нужен отдельный статус со своей семантикой, и
молчаливо трактовать `invalidated` как ретроактивный — значило бы решать за
правопорядок.

## lawref.applicability.CLOSING

*attribute* · *module attribute*

```python
CLOSING = ('repealed', 'expired', 'invalidated')
```

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

## lawref.applicability.LIFECYCLE_INCONSISTENT_CODE

*attribute* · *module attribute*

```python
LIFECYCLE_INCONSISTENT_CODE = 'LDC-E5302'
```

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

## lawref.applicability.OPENING

*attribute* · *module attribute*

```python
OPENING = ('in_force', 'restored')
```

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

## lawref.applicability.SUSPENDING

*attribute* · *module attribute*

```python
SUSPENDING = ('suspended')
```

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

## lawref.applicability.TIMELESS_LIFECYCLE_CODE

*attribute* · *module attribute*

```python
TIMELESS_LIFECYCLE_CODE = 'LDC-E5308'
```

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

## lawref.applicability.applicable_editions

*function*

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

Редакции источника, применимые на момент, + диагностики данных.

Замена v1-фильтра `resolve_dynamic_references` (тот считал применимой
любую редакцию с покрывающим `in_force`-событием и не видел ни
прекращения, ни приостановления). На данных из одних лишь `in_force`
и `adopted`-событий ответ совпадает с v1 — проверяется воротами.

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

## lawref.applicability.edition_state

*function*

```python
def edition_state(edition: dict, legal_time: str) -> dict
```

Состояние редакции на момент: применима, приостановлена, закрыта или
ещё не открыта.

Возвращает `{"state": …, "since": …, "status": …, "mismatched": …}`, где
`state` — `applicable | suspended | closed | not_yet`, `mismatched` —
граница lifecycle с granularity, отличной от `legal_time` ([§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-было-слишком-узким):
сравнение Date-vs-Instant требует TemporalResolutionPolicy, которой в v1
нет; вызывающий обязан отклонить резолюцию как ambiguous).

Правило: состояние определяет ПОСЛЕДНЕЕ наступившее событие, extent
которого покрывает момент; открывающее событие с истёкшим extent
применимость не даёт (редакция действовала, но перестала).

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

## lawref.applicability.is_applicable

*function*

```python
def is_applicable(edition: dict, legal_time: str) -> bool
```

Короткая форма: применима ли редакция на момент (без деталей).

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

## lawref.applicability.lifecycle_diagnostics

*function*

```python
def lifecycle_diagnostics(edition: dict) -> list[dict]
```

Дефекты данных lifecycle: открывающее событие после закрывающего.

Закрывающие статусы необратимы ([§31](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/07-part-vii-source-and-document-model.ru.md#31-lifecycle): consolidated/новая редакция — это
НОВЫЙ edition с provenance chain, а не оживление старого).

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