Skip to content

lawref.authoring

Хелперы для hand-authored CLIR 0.2-формы (интерим до парсера M3).

Используются генераторами артефактов векторов и KZ-регрессии. Все узлы получают детерминированный contentHash; конверт — настоящий semantic_hash (§209). G-M1b заменит рукописные документы выходом компилятора.

Functions

NameDescription
assertionNo description.
closureClosed-world declaration §70 (домен — const_ref на предикат той же
conjNo description.
constNo description.
content_hashNo description.
disjNo description.
duty_templateNormTemplate §123 (DutyPayload по схеме): goal §124.1–2 с обязательным
entityNo description.
envelopeCLIR-конверт; imports — LockedImport-ы зависимостей (schema legal-ir):
establishedКаноническая форма bare-atom в body (§66 → §204: explicit established).
external_judgmentexternal_decl канала суждения §47.3 (DECISION-0036/0037).
fragmentSource-model fragment (§29; T029): texts = [{language, status, text,
immunity_templateImmunity §128: блокирует соответствующую legal transformation
in_forceLifecycleEvent in_force с полуинтервалом start, end) на legal axis ([§31).
interpretationInterpretation §152/§157: именованный набор узлов (includes ∪
interpretation_groupInterpretation group §155: exactly_one | any_of | compose_explicitly.
labelМетка §218 для узла, порождённого генератором.
liberty_templateLiberty §125: explicit/strong permission — право совершить действие в
litNo description.
monotoneРебро монотонной рекурсии §103 (E-0018): тот же §65-тест, что у
norm_ruleПравило с head norm_template_ref (§135: norm creation).
not_knownDefault negation §113: истинен при NEITHER; проверяется после
power_templatePower §127: payload {holder, exercise: CallTerm-паттерн события,
priorityPriority rule §106: higher/lower — const_ref на id правил (rule-level v1).
prohibition_templateProhibition §130 — сахар: канонический CLIR это duty с forbearance goal
referenceDynamic reference §30.2 (v1: resolve_at — context.legal_time).
refresh_hashesПересчитывает derived-идентичности после изменения конверта.
relationpublic=True — §24 pub: только такие символы экспортируются пакетом
revisionРебро revision graph §32; с операциями — исполняемая дельта §32.1.
revision_opОперация поправки §32.1: РЕЗУЛЬТАТ, а не инструкция изменяющего акта.
ruleNo description.
shaNo description.
source_editionSource edition §29: конкретная редакция work; lifecycle §31 задаёт
source_workSource work §28: акт как понятие, независимое от редакций.
varNo description.
with_labelsСтавит метки на узел и пересчитывает его content hash §202.

assertionfunction#

def assertion(ns: str, suffix: str, literal: dict, origin: str = 'case_input') -> dict

closurefunction#

def closure(ns: str, name: str, predicate: str, domain_id: str, snapshot: str, complete_as_of: str, effective: dict | None = None) -> dict

Closed-world declaration §70 (домен — const_ref на предикат той же арности; effective §87 — errata E-0087).

conjfunction#

def conj(*formulas: dict) -> dict

constfunction#

def const(ref_id: str) -> dict

content_hashfunction#

def content_hash(node: dict) -> str

disjfunction#

def disj(*formulas: dict) -> dict

duty_templatefunction#

def duty_template(ns: str, name: str, bearer: dict, goal_kind: str, condition: dict, window_start: str, window_end: str, beneficiary: dict | None = None, completeness_policy: str | None = None) -> dict

NormTemplate §123 (DutyPayload по схеме): goal §124.1–2 с обязательным window; condition — Formula (Literal в v1-срезе).

entityfunction#

def entity(ref_id: str) -> dict

envelopefunction#

def envelope(pkg: str, ns: str, nodes: list[dict], imports: list[dict] | None = None, semantic_version: str | None = None) -> dict

CLIR-конверт; imports — LockedImport-ы зависимостей (schema legal-ir): §209 — semantic hash программы покрывает хэши импортированных пакетов (resolver.envelope_imports строит список из resolve-контекста WP-35).

establishedfunction#

def established(literal: dict) -> dict

Каноническая форма bare-atom в body (§66 → §204: explicit established).

external_judgmentfunction#

def external_judgment(ns: str, symbol: str, authority: str, request_type: str | None = None) -> dict

external_decl канала суждения §47.3 (DECISION-0036/0037).

Компилятор порождает ДВА следа объявления external judgment relation: effect: "judgment" на самом symbol_decl и вот этот отдельный узел <символ>/external. Authoring писал только первую половину — до relationKind/judgment включительно, — и hand-authored CLIR восьми judgment-векторов расходился с выходом lawc lower ровно на этот узел (байтовая петля G-M1b, verify/ci/gates/compiler/check_lower.py). Форма здесь — та же, что у компилятора (law-hir/src/lower), и сверяется его же выходом.

fragmentfunction#

def fragment(ns: str, name: str, edition: str, fragment_kind: str, locator: str, texts: list[dict]) -> dict

Source-model fragment (§29; T029): texts = [{language, status, text, exactBytes?, contentHash?}] — contentHash точных байтов текста проверяется §194 при evaluation; exactBytes — носитель §13/§28 (errata E-0248).

immunity_templatefunction#

def immunity_template(ns: str, name: str, holder: dict, protected_effect: dict, against: dict | None = None, window_start: str | None = None, window_end: str | None = None) -> dict

Immunity §128: блокирует соответствующую legal transformation (protectedEffect), но не attempted event.

in_forcefunction#

def in_force(start: str, end: str | None = None) -> dict

LifecycleEvent in_force с полуинтервалом [start, end) на legal axis (§31).

interpretationfunction#

def interpretation(ns: str, name: str, includes: list[str], status: str = 'reviewed', of: str | list[str] | None = None, extends: str | list[str] | None = None, excludes: list[str] | None = None, labels: list[dict] | None = None) -> dict

Interpretation §152/§157: именованный набор узлов (includes ∪ effective(extends) − excludes; set composition, не mutation).

interpretation_groupfunction#

def interpretation_group(ns: str, name: str, alternatives: list[str], selection: str = 'exactly_one', labels: list[dict] | None = None) -> dict

Interpretation group §155: exactly_one | any_of | compose_explicitly.

labelfunction#

def label(text: str, language: str = 'ru-KZ', status: str = 'unofficial', forms: dict[str, str] | None = None) -> dict

Метка §218 для узла, порождённого генератором.

Статус по умолчанию — unofficial: у порождённого узла (толкование §152, группа §155) формулировка принадлежит формализатору, а не акту, и объявлять её official значило бы приписать акту слова, которых в нём нет. Официальные названия ставятся в .law автором акта.

liberty_templatefunction#

def liberty_template(ns: str, name: str, holder: dict, action: dict, window_start: str, window_end: str, against: dict | None = None) -> dict

Liberty §125: explicit/strong permission — право совершить действие в окне. Goal у неё нет: разрешение ничего не требует достичь и ничего не требует поддерживать, поэтому статус позиции — доступность (ACTIVE до конца окна, EXPIRED после), как у power/immunity §127–§128.

Окно обязательно (схема LibertyPayload): бессрочное разрешение и отсутствие запрета — разные утверждения, и §126 держит второе отдельным запросом. Конфликт liberty с обязанностью ВОЗДЕРЖАНИЯ — образец 2 §105.1 и с закрытием вехи ИСПОЛНЯЕТСЯ (evaluator/normconflict.py): пара с общим субъектом, общим действием и пересекающимися окнами либо разводится приоритетом §106, либо остаётся с обеими позициями и названным конфликтом.

litfunction#

def lit(polarity: str, predicate: str, args: list[dict]) -> dict

monotonefunction#

def monotone(literal: dict) -> dict

Ребро монотонной рекурсии §103 (E-0018): тот же §65-тест, что у supported, но слой L0 — рекурсия strict-positive не поднимает программу в L3.

norm_rulefunction#

def norm_rule(ns: str, name: str, variables: list[tuple[int, str]], body: dict, template_id: str, strength: str = 'strict') -> dict

Правило с head norm_template_ref (§135: norm creation).

not_knownfunction#

def not_known(literal: dict) -> dict

Default negation §113: истинен при NEITHER; проверяется после завершения producer stratum (страта §110 гарантируется движком).

power_templatefunction#

def power_template(ns: str, name: str, holder: dict, exercise: dict, effect_literal: dict, valid_when: dict, window_start: str | None = None, window_end: str | None = None) -> dict

Power §127: payload {holder, exercise: CallTerm-паттерн события, effect: LegalEffect create(after), validWhen: Formula}. Материализация — двухшаговый runtime (§127): позиция до exercise, эффект после проверок.

priorityfunction#

def priority(ns: str, name: str, higher: str, lower: str) -> dict

Priority rule §106: higher/lower — const_ref на id правил (rule-level v1).

prohibition_templatefunction#

def prohibition_template(ns: str, name: str, bearer: dict, action: dict, window_start: str = '2026-01-01', window_end: str = '2026-12-31', beneficiary: dict | None = None) -> dict

Prohibition §130 — сахар: канонический CLIR это duty с forbearance goal (bearer, action, window; схема требует window). Универсум weak permission §126 находит такие позиции по goal.kind=forbearance.

referencefunction#

def reference(ns: str, name: str, work: str, locator: str | None = None, policy: str | None = None) -> dict

Dynamic reference §30.2 (v1: resolve_at — context.legal_time).

refresh_hashesfunction#

def refresh_hashes(doc: dict) -> dict

Пересчитывает derived-идентичности после изменения конверта.

relationfunction#

def relation(ns: str, name: str, params: list[tuple[str, str]], relation_kind: str = 'institutional', keys: list[list[int]] | None = None, public: bool = False) -> dict

public=True — §24 pub: только такие символы экспортируются пакетом (resolver.exports). Умолчание §24 — internal, и поле не пишется вовсе.

revisionfunction#

def revision(ns: str, name: str, previous: str, next_: str, relation_kind: str, operations: list[dict] | None = None, caused_by: str | None = None, effective_at: str | None = None) -> dict

Ребро revision graph §32; с операциями — исполняемая дельта §32.1.

Ребро без операций остаётся аннотацией связи (форма 0.1); ребро с операциями обязано удовлетворять инварианту консолидации §32.2.

revision_opfunction#

def revision_op(op: str, locator: str, language: str | None = None, text: str | None = None, to_locator: str | None = None, effective_at: str | None = None) -> dict

Операция поправки §32.1: РЕЗУЛЬТАТ, а не инструкция изменяющего акта.

effective_at принадлежит операции, а не ребру: акт вводится поэтапно. Порядок полей фиксируется схемой RevisionOperation, необязательные не пишутся вовсе — пустое поле и отсутствующее поле не должны различаться в канонических байтах.

rulefunction#

def rule(ns: str, name: str, variables: list[tuple[int, str]], body: dict, head: dict, strength: str = 'strict', effective: dict | None = None, anchors: list[str] | None = None, governs: list[dict] | None = None, scope: dict | None = None) -> dict

shafunction#

def sha(data: bytes) -> str

source_editionfunction#

def source_edition(ns: str, name: str, work: str, lifecycle: list[dict], language: str = 'ru', officiality: str = 'official', applicability: str | None = None) -> dict

Source edition §29: конкретная редакция work; lifecycle §31 задаёт применимость на legal axis (in_force-события с extent) — вход резолюции dynamic references §30.2 (T010).

source_workfunction#

def source_work(ns: str, name: str, source_kind: str) -> dict

Source work §28: акт как понятие, независимое от редакций.

varfunction#

def var(index: int) -> dict

with_labelsfunction#

def with_labels(node: dict, labels: list[dict] | None) -> dict

Ставит метки на узел и пересчитывает его content hash §202.

Метки вне semantic hash §209 (errata E-0010): разметка узла — изменение ТЕКСТА, а не смысла, и утверждения ревьюеров по нему переходят в stale_verbalization, а не в stale_semantics (LS §3.6).

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

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