lawref.compose
Композиция сведений дел §168.5 (DECISION-0169 §1.5) — эталон.
Потребитель берёт из ДРУГОГО дела выбранные утверждения и их опоры: поставщик
экспортировал снимок law.case-export/0.1 (lawref.export), потребитель
закрепил его ресурсом лока вида case-snapshot и назвал в .lawcase
декларацией snapshot <Alias> "<путь>"; и элементом дела
use <Alias> { record "<StableId>"; … }. Компилятор понижает поверхность в
директивы (snapshots, uses), а составное дело строит compose — одинаково
в обеих реализациях (differential):
- записи копируются как экспортированы:
id,origin, временные поля,evidence,contentHash,provenance[]не меняются (identity неизменна); - маршруты предъявления —
case.sources[]в порядкеuse; bindings→case.constants;evidence,supportEdges,verifications— в свои массивы; порядок — записи дела, затем снимки в порядкеuse, внутри снимка — порядок экспорта;- один
idс побайтово равным содержанием ПО ЛЮБОМУ ПУТИ — снимок ↔ снимок («ромб» A→C и B→C), снимок ↔ дело, дело ↔ дело (локальный дубль не исключение, гейт Astra) — одна запись; иное содержимое —LDC-E1360; два снимка одного дела (параpackage.name+ дело, независимо от версии) —LDC-E1361, и он проверяется РАНЬШЕLDC-E1360; case.options.evidenceSnapshotHash= sha256 канонического отсортированного массиваcontentHashиспользованных снимков — ТОЛЬКО при наличииuse.
Замыкание внутри снимка берётся по ВЫБРАННЫМ записям: документ, общий для
избранной и неизбранной записи поставщика, не протаскивает ребро к
неизбранной пропозиции (группа векторов «выборка» DECISION-0169 §5). Опоры
отбираются по ПРОПОЗИЦИИ БЕЗ ПОЛЯРНОСТИ и по relation (related_edges), а
не по побайтовому равенству литералов.
Без use вход возвращается тем же объектом: ни sources, ни пустых
массивов, ни evidenceSnapshotHash — байты прежних дел не меняются (§1.9).
Привязка документа к источнику (для слота source профиля 0.2 §78.2.3 и для
проверки вложений в ask): документ D относится к источнику S, если D назван
в поле evidence хотя бы одной записи из S.records ЛИБО D есть from
опоры, экспортированной вместе с такой записью: относящейся по таблице
отбора И принадлежащей пространству имён поставщика (related_edges с
namespace; собственная опора потребителя к той же пропозиции — не импорт).
Документ,
пришедший из ДВУХ снимков, получает ДВА факта source: выбор «первого»
скрыл бы половину происхождения (гейт Astra). Носителя «откуда пришёл
документ» у узла нет намеренно (Ф8-2: поле снимка на узле давало бы ложную
коллизию на «ромбе»), а ask исполняет составное дело без снимков — поэтому
правило выводится из case.sources[], записей и опор, и только из них.
Attributes
| Name | Description |
|---|---|
CONTENT_CONFLICT_CODE | No description. |
DOCUMENTS_SUBDIR | No description. |
DUPLICATE_CASE_CODE | No description. |
EXPORT_SCHEMA_VERSION | No description. |
SNAPSHOT_CAPABILITY | No description. |
SNAPSHOT_CODE | No description. |
SNAPSHOT_KIND | No description. |
SUPPORT_RELATIONS | No description. |
UNKNOWN_ALIAS_CODE | No description. |
Functions
| Name | Description |
|---|---|
attachment_path | documents[].path снимка для документа с локальным uri поставщика: |
attachment_problems | Вложения снимка по его перечню documents: файл есть, байты сходятся. |
compose | Составное дело §168.5 из директив компилятора. |
const_closure | ТРАНЗИТИВНОЕ замыкание констант: константа, ссылающаяся на константу, |
const_seeds | const_ref в аргументах литерала записи, в объекте judgment, в |
content_hash | sha256 канонических байтов артефакта БЕЗ поля contentHash (нерекурсивно). |
documenthash_problem | documentHash каждого экспортированного evidence сверяется с байтами |
evidence_sources | evidenceId → [(package.name, case)…] в порядке sources[] — для слота |
imported_evidence_ids | Документы, пришедшие по case.sources[] (правило привязки — docstring модуля). |
internal_uri | uri документа, указывающий ВНУТРЬ пакета (файл, а не внешняя ссылка). |
load_snapshot | Снимок по пути от корня пакета: артефакт, лок и вложения (LDC-E8704). |
node_namespace | Пространство имён узла: поле package понижения, иначе префикс |
proposition | Канонические байты литерала БЕЗ полярности — ключ отбора опор. |
read_export | export.json снимка: форма по схеме и сходящийся contentHash. |
related_edges | Опоры, ОТНОСЯЩИЕСЯ к записям по таблице отбора §168.5, в порядке входа. |
snapshot_attachments | Перечни вложений ВСЕХ закреплённых снимков: documents[].path |
snapshot_hash | evidenceSnapshotHash: sha256 канонического отсортированного уникального массива. |
source_evidence_ids | Документы источника S (§1.7, §78.2.3): названные в поле evidence |
CONTENT_CONFLICT_CODEattributemodule attribute#
CONTENT_CONFLICT_CODE = 'LDC-E1360'DOCUMENTS_SUBDIRattributemodule attribute#
DOCUMENTS_SUBDIR = 'documents'DUPLICATE_CASE_CODEattributemodule attribute#
DUPLICATE_CASE_CODE = 'LDC-E1361'EXPORT_SCHEMA_VERSIONattributemodule attribute#
EXPORT_SCHEMA_VERSION = 'law.case-export/0.1'SNAPSHOT_CAPABILITYattributemodule attribute#
SNAPSHOT_CAPABILITY = 'law.case-export/0.1'SNAPSHOT_CODEattributemodule attribute#
SNAPSHOT_CODE = 'LDC-E8704'SNAPSHOT_KINDattributemodule attribute#
SNAPSHOT_KIND = 'case-snapshot'SUPPORT_RELATIONSattributemodule attribute#
SUPPORT_RELATIONS = ('supports', 'refutes')UNKNOWN_ALIAS_CODEattributemodule attribute#
UNKNOWN_ALIAS_CODE = 'LDC-E1362'attachment_pathfunction#
def attachment_path(uri: str) -> strdocuments[].path снимка для документа с локальным uri поставщика:
путь ВНУТРИ каталога снимка вместе с префиксом documents/ (§168.5);
файл читается как <каталог снимка>/<path>, второй префикс не дописывается.
attachment_problemsfunction#
def attachment_problems(snapshot_dir: Path, artifact: dict, label: str | None = None) -> list[str]Вложения снимка по его перечню documents: файл есть, байты сходятся.
Перечень снимка — единственный источник истины о его вложениях: лок
потребителя закрепляет только export.json, а uri импортированных
документов относительны ПОСТАВЩИКУ и по локу потребителя не ищутся.
label — каталог снимка в сообщениях (путь из лока, без пути хоста).
composefunction#
def compose(root: Path, case: dict, uses: list[dict], snapshots: dict[str, str], lock: dict | None = None, program: list[dict] | None = None, own: tuple[str, str] | None = None) -> dictСоставное дело §168.5 из директив компилятора.
uses — [{"alias", "records": [StableId…]}, …] в порядке use;
snapshots — {alias: путь от корня пакета}; program — узлы мира
потребителя (константы §54 участвуют в проверке столкновений §1.5);
own — пара (package.name, дело) САМОГО потребителя: снимок
собственного дела — тот же LDC-E1361 (§168.5, цикл). Без
uses возвращается сам case (байты прежних дел не меняются). Отказы —
AskError с кодами DECISION-0169 §4; LDC-E8704 — снимок, лок или
вложение.
const_closurefunction#
def const_closure(seeds: set[str], constants: dict) -> tuple[list[str], list[str]]ТРАНЗИТИВНОЕ замыкание констант: константа, ссылающаяся на константу,
тянет и её. Возвращает (разрешённые, недостающие), оба отсортированы.
const_seedsfunction#
def const_seeds(records: list[dict], evidence: list[dict]) -> set[str]const_ref в аргументах литерала записи, в объекте judgment, в
payload документа и в issuer (§168.5, гейт Astra).
content_hashfunction#
def content_hash(artifact: dict) -> strsha256 канонических байтов артефакта БЕЗ поля contentHash (нерекурсивно).
documenthash_problemfunction#
def documenthash_problem(artifact: dict) -> str | Noneevidence_sourcesfunction#
def evidence_sources(case: dict) -> dict[str, list[tuple[str, str]]]evidenceId → [(package.name, case)…] в порядке sources[] — для слота
source профиля 0.2 (§78.2.3). Документ, пришедший из ДВУХ снимков,
получает ДВА факта: выбор «первого» скрыл бы половину происхождения.
imported_evidence_idsfunction#
def imported_evidence_ids(case: dict) -> set[str]Документы, пришедшие по case.sources[] (правило привязки — docstring модуля).
internal_urifunction#
def internal_uri(item: dict) -> str | Noneuri документа, указывающий ВНУТРЬ пакета (файл, а не внешняя ссылка).
load_snapshotfunction#
def load_snapshot(root: Path, path: str, lock: dict) -> dictСнимок по пути от корня пакета: артефакт, лок и вложения (LDC-E8704).
node_namespacefunction#
def node_namespace(node: dict) -> strПространство имён узла: поле package понижения, иначе префикс
StableId до # (узел, поданный по wire без package).
propositionfunction#
def proposition(literal) -> bytesКанонические байты литерала БЕЗ полярности — ключ отбора опор.
read_exportfunction#
def read_export(path: Path, label: str | None = None) -> dictexport.json снимка: форма по схеме и сходящийся contentHash.
label — имя снимка в сообщениях: путь ИЗ ЛОКА (относительно корня
пакета), а не абсолютный путь хоста, — как у lawc; конверт отказа
входит в голдены векторов и не вправе зависеть от каталога checkout.
related_edgesfunction#
def related_edges(edges: list[dict], records: list[dict], namespace: str | None = None) -> list[dict]Опоры, ОТНОСЯЩИЕСЯ к записям по таблице отбора §168.5, в порядке входа.
namespace — пространство имён ПОСТАВЩИКА: в составном деле опора
считается экспортированной вместе с записью источника, только если она
ему принадлежит (node_namespace). Собственная опора потребителя к той
же пропозиции — не импорт: факта source она не получает и по перечню
снимка не проверяется (§78.2.3). Внутри снимка и при экспорте фильтр не
нужен — там все узлы одного поставщика.
snapshot_attachmentsfunction#
def snapshot_attachments(root: Path, lock: dict) -> dict[str, set[str]]Перечни вложений ВСЕХ закреплённых снимков: documents[].path
(documents/<uri поставщика>) → множество sha256. Этим перечнем ask
сверяет импортированный документ (§1.3).
snapshot_hashfunction#
def snapshot_hash(hashes: list[str]) -> strevidenceSnapshotHash: sha256 канонического отсортированного уникального массива.
source_evidence_idsfunction#
def source_evidence_ids(case: dict, source: dict) -> list[str]Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.