lawref.authoring
Хелперы для hand-authored CLIR 0.2-формы (интерим до парсера M3).
Используются генераторами артефактов векторов и KZ-регрессии. Все узлы получают детерминированный contentHash; конверт — настоящий semantic_hash (§209). G-M1b заменит рукописные документы выходом компилятора.
Functions
| Name | Description |
|---|---|
assertion | No description. |
closure | Closed-world declaration §70 (домен — const_ref на предикат той же |
conj | No description. |
const | No description. |
content_hash | No description. |
disj | No description. |
duty_template | NormTemplate §123 (DutyPayload по схеме): goal §124.1–2 с обязательным |
entity | No description. |
envelope | CLIR-конверт; imports — LockedImport-ы зависимостей (schema legal-ir): |
established | Каноническая форма bare-atom в body (§66 → §204: explicit established). |
external_judgment | external_decl канала суждения §47.3 (DECISION-0036/0037). |
fragment | Source-model fragment (§29; T029): texts = [{language, status, text, |
immunity_template | Immunity §128: блокирует соответствующую legal transformation |
in_force | LifecycleEvent in_force с полуинтервалом start, end) на legal axis ([§31). |
interpretation | Interpretation §152/§157: именованный набор узлов (includes ∪ |
interpretation_group | Interpretation group §155: exactly_one | any_of | compose_explicitly. |
label | Метка §218 для узла, порождённого генератором. |
liberty_template | Liberty §125: explicit/strong permission — право совершить действие в |
lit | No description. |
monotone | Ребро монотонной рекурсии §103 (E-0018): тот же §65-тест, что у |
norm_rule | Правило с head norm_template_ref (§135: norm creation). |
not_known | Default negation §113: истинен при NEITHER; проверяется после |
power_template | Power §127: payload {holder, exercise: CallTerm-паттерн события, |
priority | Priority rule §106: higher/lower — const_ref на id правил (rule-level v1). |
prohibition_template | Prohibition §130 — сахар: канонический CLIR это duty с forbearance goal |
reference | Dynamic reference §30.2 (v1: resolve_at — context.legal_time). |
refresh_hashes | Пересчитывает derived-идентичности после изменения конверта. |
relation | public=True — §24 pub: только такие символы экспортируются пакетом |
revision | Ребро revision graph §32; с операциями — исполняемая дельта §32.1. |
revision_op | Операция поправки §32.1: РЕЗУЛЬТАТ, а не инструкция изменяющего акта. |
rule | No description. |
sha | No description. |
source_edition | Source edition §29: конкретная редакция work; lifecycle §31 задаёт |
source_work | Source work §28: акт как понятие, независимое от редакций. |
var | No description. |
with_labels | Ставит метки на узел и пересчитывает его content hash §202. |
assertionfunction#
def assertion(ns: str, suffix: str, literal: dict, origin: str = 'case_input') -> dictclosurefunction#
def closure(ns: str, name: str, predicate: str, domain_id: str, snapshot: str, complete_as_of: str, effective: dict | None = None) -> dictconjfunction#
def conj(*formulas: dict) -> dictconstfunction#
def const(ref_id: str) -> dictcontent_hashfunction#
def content_hash(node: dict) -> strdisjfunction#
def disj(*formulas: dict) -> dictduty_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) -> dictentityfunction#
def entity(ref_id: str) -> dictenvelopefunction#
def envelope(pkg: str, ns: str, nodes: list[dict], imports: list[dict] | None = None, semantic_version: str | None = None) -> dictCLIR-конверт; imports — LockedImport-ы зависимостей (schema legal-ir):
§209 — semantic hash программы покрывает хэши импортированных пакетов
(resolver.envelope_imports строит список из resolve-контекста WP-35).
establishedfunction#
def established(literal: dict) -> dictexternal_judgmentfunction#
def external_judgment(ns: str, symbol: str, authority: str, request_type: str | None = None) -> dictexternal_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]) -> dictimmunity_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) -> dictImmunity §128: блокирует соответствующую legal transformation (protectedEffect), но не attempted event.
in_forcefunction#
def in_force(start: str, end: str | None = None) -> dictLifecycleEvent 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) -> dictinterpretation_groupfunction#
def interpretation_group(ns: str, name: str, alternatives: list[str], selection: str = 'exactly_one', labels: list[dict] | None = None) -> dictInterpretation 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) -> dictLiberty §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]) -> dictmonotonefunction#
def monotone(literal: dict) -> dictnorm_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) -> dictpower_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) -> dictpriorityfunction#
def priority(ns: str, name: str, higher: str, lower: str) -> dictPriority 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) -> dictreferencefunction#
def reference(ns: str, name: str, work: str, locator: str | None = None, policy: str | None = None) -> dictDynamic 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) -> dictrevisionfunction#
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) -> dictrevision_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) -> dictshafunction#
def sha(data: bytes) -> strsource_editionfunction#
def source_edition(ns: str, name: str, work: str, lifecycle: list[dict], language: str = 'ru', officiality: str = 'official', applicability: str | None = None) -> dictsource_workfunction#
def source_work(ns: str, name: str, source_kind: str) -> dictSource work §28: акт как понятие, независимое от редакций.
varfunction#
def var(index: int) -> dictwith_labelsfunction#
def with_labels(node: dict, labels: list[dict] | None) -> dictDocumentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.