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
| Name | Description |
|---|---|
ARTIFACT_EXCLUDED_KEYS | No description. |
ARTIFACT_TOP_LEVEL_EXCLUDED_KEYS | No description. |
NODE_EXCLUDED_KEYS | No description. |
RECURSIVE_EXCLUDED_KEYS | No description. |
THEORY_EXCLUDED_KEYS | No description. |
TOP_LEVEL_EXCLUDED_KEYS | No description. |
Functions
| Name | Description |
|---|---|
anonymous_assert_id | StableId §207 для анонимного assert из факта и provenance, не позиции. |
artifact_hash | sha256:<hex> идентичности CLIR-артефакта law.core/0.2 (§209). |
canonical_lockfile_bytes | Канонический law.lock (§11): canonical JSON; generated-at/compiler build |
generate_stable_id | Internal StableId по §14: NFC → namespace + "/.generated/" + percent_encode(module::local). |
node_semantic_hash | sha256:<hex> семантической проекции ОДНОГО узла (§209 + §202). |
percent_encode | Percent-encoding §14: unreserved RFC 3986 — как есть, прочее — %XX (верхний hex) по байтам UTF-8. |
semantic_hash | sha256:<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_hash | sha256:<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) -> strStableId §207 для анонимного assert из факта и provenance, не позиции.
artifact_hashfunction#
def artifact_hash(document: dict) -> strsha256:<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) -> strInternal StableId по §14: NFC → namespace + “/.generated/” + percent_encode(module::local).
node_semantic_hashfunction#
def node_semantic_hash(node: dict) -> strsha256:<hex> семантической проекции ОДНОГО узла (§209 + §202).
Тот же фильтр, что у документа, применённый к узлу: метки (E-0010), annotations, sourceSpan и derived-хэши вне preimage. Нужен там, где подписывается отдельная норма, а не пакет целиком — ревью-контур LS §3.6: правка соседней нормы не должна устаревать утверждение этой.
percent_encodefunction#
def percent_encode(text: str) -> strPercent-encoding §14: unreserved RFC 3986 — как есть, прочее — %XX (верхний hex) по байтам UTF-8.
semantic_hashfunction#
def semantic_hash(document: dict) -> strsha256:<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) -> strsha256:<hex> идентичности теории law.core/0.2 (§209).
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.