# lawref.export

*module*

Экспорт сведений дела [§168.5](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/24-part-xxiii-cases-snapshots-evaluation.ru.md#1685-композиция-сведений-дел-decision-0169) (DECISION-0169 [§1.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/01-part-i-audit.ru.md#1-что-сохраняется-без-изменений)) — эталон `export-case`.

Поставщик ЯВНО называет записи; артефакт `law.case-export/0.1` — каталог с
`export.json` и `documents/<путь>`:

- `source` — пакет (имя, версия, namespace), дело, `resolutionHash` лока;
- `records` — выбранные `assertion`-узлы дела как в `case.json`, с явными
  `id`, в порядке дела (анонимный `assert` — `LDC-E1364`: его ID зависит от
  provenance и при повторном понижении не сохраняется);
- `bindings` — ТРАНЗИТИВНОЕ замыкание констант дела, достижимых из записей:
  `const_ref` в аргументах литерала, в объекте `judgment`, в `payload`
  документа и в `issuer`; константа, ссылающаяся на константу, тянет и её.
  Недостающая привязка — `LDC-E1364` с перечнем, а не молчаливая ссылка на
  константу потребителя;
- `evidence` — документы из полей `evidence` записей И документы, названные
  `from` относящейся опоры (ребро тянет свой документ, даже если ни одна
  запись его не называет);
- `supportEdges` — рёбра, ОТНОСЯЩИЕСЯ к записи по таблице отбора [§168.5](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/24-part-xxiii-cases-snapshots-evaluation.ru.md#1685-композиция-сведений-дел-decision-0169):
  пара «пропозиция БЕЗ полярности + relation». У `assert P` это `supports P`
  и `refutes P`; у `assert not P` — ТЕ ЖЕ рёбра, потому что [§78.2.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/11-part-xi-assertions-facts-evidence.ru.md#7822-единица-решения--опора-а-не-документ-и-не-факт) называет
  штатной опорой отрицания `refutes` с ПОЛОЖИТЕЛЬНЫМ `to`. Отбор по
  равенству литералов терял бы опору всякого отрицательного утверждения;
- `verifications` — проверки этих документов;
- `documents` — вложения этих документов: `uri` из payload, файл поставщика
  по локу вида `document`, копия в `<out>/documents/<uri>`, а `path` перечня
  — `documents/<uri>` (путь внутри каталога снимка, [§168.5](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/24-part-xxiii-cases-snapshots-evaluation.ru.md#1685-композиция-сведений-дел-decision-0169)); `documentHash`
  каждого evidence сверяется с БАЙТАМИ вложения ([§1.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/01-part-i-audit.ru.md#1-что-сохраняется-без-изменений), гейт Astra);
- `contentHash` — sha256 канонических байтов `export.json` без этого поля.

Замыкание, которое нельзя собрать (документ записи не объявлен, константа
не связана) — отказ `LDC-E1364` с перечнем. Понижение дела — работа
компилятора (`lawc lower-ask`), вызывается из CLI; модуль принимает УЖЕ
пониженный документ дела и перечень анонимных утверждений.

## lawref.export.DOCUMENT_CODE

*attribute* · *module attribute*

```python
DOCUMENT_CODE = 'LDC-E8704'
```

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

## lawref.export.EXPORT_CODE

*attribute* · *module attribute*

```python
EXPORT_CODE = 'LDC-E1364'
```

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

## lawref.export.build

*function*

```python
def build(root: Path, *, manifest: dict, lock: dict, case_name: str, case: dict, record_ids: list[str], anonymous: list[str]) -> tuple[dict, list[tuple[str, Path]]]
```

Артефакт без записи на диск и перечень вложений `(uri, файл поставщика)`.

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

## lawref.export.closure

*function*

```python
def closure(case: dict, records: list[dict]) -> tuple[dict, list[dict], list[dict], list[dict]]
```

bindings, evidence, supportEdges, verifications по выбранным записям.

Опоры отбираются `related_edges` — по паре «пропозиция без полярности +
relation» ([§78.2.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/11-part-xi-assertions-facts-evidence.ru.md#7822-единица-решения--опора-а-не-документ-и-не-факт)); документ, названный `from` относящейся опоры, входит
в замыкание, даже если ни одна запись не называет его в поле `evidence`;
константы замыкаются ТРАНЗИТИВНО, недостающая — `LDC-E1364` с перечнем.

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

## lawref.export.select_records

*function*

```python
def select_records(case: dict, wanted: list[str], anonymous: list[str], namespace: str) -> list[dict]
```

Выбранные записи в порядке ДЕЛА. `--record` принимает StableId либо
короткое имя (`<namespace>#<имя>`); анонимный — `LDC-E1364`.

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

## lawref.export.write

*function*

```python
def write(out: Path, artifact: dict, files: list[tuple[str, Path]]) -> Path
```

`<out>/export.json` каноническими байтами и `<out>/documents/<uri>`.

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