Skip to content

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

NameDescription
CONTENT_CONFLICT_CODENo description.
DOCUMENTS_SUBDIRNo description.
DUPLICATE_CASE_CODENo description.
EXPORT_SCHEMA_VERSIONNo description.
SNAPSHOT_CAPABILITYNo description.
SNAPSHOT_CODENo description.
SNAPSHOT_KINDNo description.
SUPPORT_RELATIONSNo description.
UNKNOWN_ALIAS_CODENo description.

Functions

NameDescription
attachment_pathdocuments[].path снимка для документа с локальным uri поставщика:
attachment_problemsВложения снимка по его перечню documents: файл есть, байты сходятся.
composeСоставное дело §168.5 из директив компилятора.
const_closureТРАНЗИТИВНОЕ замыкание констант: константа, ссылающаяся на константу,
const_seedsconst_ref в аргументах литерала записи, в объекте judgment, в
content_hashsha256 канонических байтов артефакта БЕЗ поля contentHash (нерекурсивно).
documenthash_problemdocumentHash каждого экспортированного evidence сверяется с байтами
evidence_sourcesevidenceId → [(package.name, case)…] в порядке sources[] — для слота
imported_evidence_idsДокументы, пришедшие по case.sources[] (правило привязки — docstring модуля).
internal_uriuri документа, указывающий ВНУТРЬ пакета (файл, а не внешняя ссылка).
load_snapshotСнимок по пути от корня пакета: артефакт, лок и вложения (LDC-E8704).
node_namespaceПространство имён узла: поле package понижения, иначе префикс
propositionКанонические байты литерала БЕЗ полярности — ключ отбора опор.
read_exportexport.json снимка: форма по схеме и сходящийся contentHash.
related_edgesОпоры, ОТНОСЯЩИЕСЯ к записям по таблице отбора §168.5, в порядке входа.
snapshot_attachmentsПеречни вложений ВСЕХ закреплённых снимков: documents[].path
snapshot_hashevidenceSnapshotHash: 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) -> str

documents[].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) -> str

sha256 канонических байтов артефакта БЕЗ поля contentHash (нерекурсивно).

documenthash_problemfunction#

def documenthash_problem(artifact: dict) -> str | None

documentHash каждого экспортированного evidence сверяется с байтами вложения — при экспорте и при КОМПОЗИЦИИ (§1.2, §1.3, гейт Astra): импортированный документ проверяется перечнем снимка, а не локом потребителя, и обходить проверку не вправе.

evidence_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 | None

uri документа, указывающий ВНУТРЬ пакета (файл, а не внешняя ссылка).

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) -> dict

export.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]) -> str

evidenceSnapshotHash: sha256 канонического отсортированного уникального массива.

source_evidence_idsfunction#

def source_evidence_ids(case: dict, source: dict) -> list[str]

Документы источника S (§1.7, §78.2.3): названные в поле evidence записей S.records ЛИБО названные from опоры, экспортированной вместе с такой записью — относящейся по таблице отбора И принадлежащей пространству имён поставщика (related_edges с namespace). Порядок — записи, затем опоры.

Documentation for Arxo. Writings — blog.arxo.io.

Anonymous visit counts on stats.arxo.io, no cookies.