Skip to content

lawref.hashing

Semantic hash, StableId и канонический lockfile (WP-05; SPEC §209, §14, §11).

Семантический фильтр v1 (кросс-языковой контракт с engines/lawc/law-canon):

  • рекурсивно удаляются ключи sourceSpan (§202: исключён из semantic content hash), annotations (§209: non-semantic annotations вне хэша; annotation с semantic = true возможна только у imported feature profile — профилей пока нет, при их появлении фильтр станет выборочным) и labels (§209 ред. E-0010: презентационный слой — перевод и переформулировка метки не меняют семантику; официальный текст меткой не является и остаётся в хэше как texts фрагмента);
  • у элементов parameters в 0.2-форме (ParameterDecl: есть id и объектный type) удаляется name — non-semantic metadata по DECISION-0001 п.4;
  • на верхнем уровне удаляются semanticHash (нельзя хэшировать сам себя) и metadata (§209: local source paths и прочие несемантические сведения);
  • contentHash узлов удаляется как derived-значение (пересчитывается из содержимого; включение derived-хэшей в preimage делало бы формат хрупким).

Всё остальное — включая imports (exact imported package semantic hashes), features и language semantics version в конверте — входит в hash. Метки остаются в content hash узла: он считается по содержимому узла (authoring. content_hash) и в preimage §209 не попадает вовсе.

Attributes

NameDescription
ARTIFACT_EXCLUDED_KEYSNo description.
ARTIFACT_TOP_LEVEL_EXCLUDED_KEYSNo description.
NODE_EXCLUDED_KEYSNo description.
RECURSIVE_EXCLUDED_KEYSNo description.
THEORY_EXCLUDED_KEYSNo description.
TOP_LEVEL_EXCLUDED_KEYSNo description.

Functions

NameDescription
anonymous_assert_idStableId §207 для анонимного assert из факта и provenance, не позиции.
artifact_hashsha256:<hex> идентичности CLIR-артефакта law.core/0.2 (§209).
canonical_lockfile_bytesКанонический law.lock (§11): canonical JSON; generated-at/compiler build
generate_stable_idInternal StableId по §14: NFC → namespace + "/.generated/" + percent_encode(module::local).
node_semantic_hashsha256:<hex> семантической проекции ОДНОГО узла (§209 + §202).
percent_encodePercent-encoding §14: unreserved RFC 3986 — как есть, прочее — %XX (верхний hex) по байтам UTF-8.
semantic_hashsha256:<hex> над каноническими байтами семантической проекции (§209).
snapshot_program_hashПин внешнего снимка §47.2: semantic_hash программы без бухгалтерии импортов.
strip_artifactПроекция artifactHash 0.2: CLIR с provenance, без labels/derived hash.
strip_non_semanticСемантическая проекция документа (preimage для §209).
strip_theoryПроекция theoryHash 0.2: объявления без presentation/provenance.
theory_hashsha256:<hex> идентичности теории law.core/0.2 (§209).

ARTIFACT_EXCLUDED_KEYSattributemodule attribute#

ARTIFACT_EXCLUDED_KEYS = frozenset({'labels'})

ARTIFACT_TOP_LEVEL_EXCLUDED_KEYSattributemodule attribute#

ARTIFACT_TOP_LEVEL_EXCLUDED_KEYS = frozenset({'semanticHash', 'theoryHash', 'artifactHash'})

NODE_EXCLUDED_KEYSattributemodule attribute#

NODE_EXCLUDED_KEYS = frozenset({'contentHash'})

RECURSIVE_EXCLUDED_KEYSattributemodule attribute#

RECURSIVE_EXCLUDED_KEYS = frozenset({'sourceSpan', 'annotations', 'labels'})

THEORY_EXCLUDED_KEYSattributemodule attribute#

THEORY_EXCLUDED_KEYS = frozenset({'sourceSpan', 'annotations', 'labels', 'anchors', 'provenance'})

TOP_LEVEL_EXCLUDED_KEYSattributemodule attribute#

TOP_LEVEL_EXCLUDED_KEYS = frozenset({'semanticHash', 'theoryHash', 'artifactHash', 'metadata'})

anonymous_assert_idfunction#

def anonymous_assert_id(namespace: str, assertion: dict) -> str

StableId §207 для анонимного assert из факта и provenance, не позиции.

artifact_hashfunction#

def artifact_hash(document: dict) -> str

sha256:<hex> идентичности CLIR-артефакта law.core/0.2 (§209).

canonical_lockfile_bytesfunction#

def canonical_lockfile_bytes(lock: dict) -> bytes

Канонический law.lock (§11): canonical JSON; generated-at/compiler build в semantic lockfile отсутствуют по построению. Сортировка semantic-sets по canonical identity — обязанность resolver-а (WP-31); здесь — байтовая форма.

generate_stable_idfunction#

def generate_stable_id(namespace: str, module_path: str, local_name: str) -> str

Internal StableId по §14: NFC → namespace + “/.generated/” + percent_encode(module::local).

node_semantic_hashfunction#

def node_semantic_hash(node: dict) -> str

sha256:<hex> семантической проекции ОДНОГО узла (§209 + §202).

Тот же фильтр, что у документа, применённый к узлу: метки (E-0010), annotations, sourceSpan и derived-хэши вне preimage. Нужен там, где подписывается отдельная норма, а не пакет целиком — ревью-контур LS §3.6: правка соседней нормы не должна устаревать утверждение этой.

percent_encodefunction#

def percent_encode(text: str) -> str

Percent-encoding §14: unreserved RFC 3986 — как есть, прочее — %XX (верхний hex) по байтам UTF-8.

semantic_hashfunction#

def semantic_hash(document: dict) -> str

sha256:<hex> над каноническими байтами семантической проекции (§209).

snapshot_program_hashfunction#

def snapshot_program_hash(document: dict) -> str

Пин внешнего снимка §47.2: semantic_hash программы без бухгалтерии импортов.

Errata E-0216 (DECISION-0347 §2). До неё снимок пиннился programHash манифеста §170, то есть semantic_hash ВСЕГО связанного мира вместе с imports[].contentHash. Снимок kz.corpus.gesv_rules прожил из-за этого 62 минуты: перевыпуск далёкой транзитивной зависимости менял contentHash импорта, не меняя в мире НИ ОДНОГО узла, и набор решений внешнего вычислителя объявлялся снятым с чужой программы. Там же вторая цена: закоммиченный corpus/clir и CLIR, собранный из исходников, давали разные значения при тех же узлах — одного верного не существовало.

Проекция НОРМИРУЕТ поле: imports заменяется пустым списком независимо от того, было ли оно в документе. Всё прочее, что охватывает §209, остаётся — узлы, package, features, semanticVersion, schemaVersion, strata: пин по одним лишь nodes не различал бы мир 0.2 и мир 0.3 с теми же узлами, а это разная семантика.

В манифест §170 это значение НЕ попадает: оно существует ровно для сверки снимка. Парная реализация — law-eval/src/document.rs::snapshot_program_hash.

strip_artifactfunction#

def strip_artifact(document: dict) -> dict

Проекция artifactHash 0.2: CLIR с provenance, без labels/derived hash.

strip_non_semanticfunction#

def strip_non_semantic(document: dict) -> dict

Семантическая проекция документа (preimage для §209).

strip_theoryfunction#

def strip_theory(document: dict) -> dict

Проекция theoryHash 0.2: объявления без presentation/provenance.

theory_hashfunction#

def theory_hash(document: dict) -> str

sha256:<hex> идентичности теории law.core/0.2 (§209).

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

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