Skip to content

lawref.verbalize

B1 — вербализатор CLIR (WP-25 MVP; LAYERS-SURFACES §3).

Детерминированная односторонняя проекция CLIR в контролируемый русский текст. Продукт — ревью-артефакт .lawread.md: юрист читает и утверждает текст, а не код. Вербализация НЕ является официальным текстом и не имеет семантической силы; расхождение утверждённого текста и семантики — всегда дефект template pack (LS §3.1).

Контракт (LS §3.2), проверяемый VER-векторами:

  • чистая функция: ни сети, ни часов, ни внешних сервисов, ни LLM; одинаковые (CLIR, язык, версия pack) дают байтово одинаковый текст;
  • вербализация получает content hash (sha256 байтов документа);
  • тотальность (LS §3.3): у каждого node kind либо шаблон, либо видимый маркер ⟦не вербализуется: … (LDC-E8201)⟧. Молчаливый пропуск запрещён — он прячет семантику от утверждающего.

Формульный стиль — ступень (1) LS §3.8: слоты стоят в именительном падеже и кавычках; морфологические формы §218.1 используются, если метка их несёт, и деградируют к text, если нет.

Attributes

NameDescription
FORMS_FORMATNo description.
GAP_WHAT_KEYSNo description.
GAP_WHAT_RUNo description.
SECTION_ORDERNo description.
SUPPORTED_PACK_FORMATSNo description.
VERBALIZATION_GAPNo description.

Classes

NameDescription
PackErrorДефект template pack: отсутствует обязательная фраза или поле.

Functions

NameDescription
load_packЗагрузка template pack. Pack — данные, а не код (LS §3.2).
local_nameЛокальное имя StableId: часть после #, у порождённых — с суффиксом.
render_atomNo description.
render_formulaNo description.
render_nodeТело блока одной декларации: список абзацев (без заголовка).
render_termNo description.
verbalizeCLIR → ревью-документ .lawread.md.

FORMS_FORMATattributemodule attribute#

FORMS_FORMAT = 'law.verb/0.2'

GAP_WHAT_KEYSattributemodule attribute#

GAP_WHAT_KEYS: tuple[str, ...] = tuple(sorted(GAP_WHAT_RU))

GAP_WHAT_RUattributemodule attribute#

GAP_WHAT_RU: dict[str, str] = {
  'node.kind': '{kind}',
  'node.no_kind': 'узел без kind',
  'term.unknown_shape': 'терм неизвестной формы',
  'term.kind': 'терм {kind}',
  'interval.unknown_shape': 'интервал неизвестной формы',
  'formula.unknown_shape': 'формула неизвестной формы',
  'formula.kind': 'формула {kind}',
  'formula.status': 'статус {status}',
  'formula.quantifier': 'квантор {quantifier}',
  'formula.norm_template_ref': 'формула norm_template_ref',
  'rule.scope': 'область применения правила',
  'definition.part': 'происхождение из определения (§144)',
  'external.effect': 'внешний канал {effect}',
  'norm.no_payload': 'norm_template без payload',
  'goal.unknown_shape': 'цель обязанности неизвестной формы',
  'goal.kind': 'цель обязанности {kind}',
  'effect.unknown_shape': 'правовой эффект неизвестной формы',
  'effect.kind': 'правовой эффект {kind}',
  'interpretation.selection': 'политика выбора толкования {selection}',
  'revision.unknown_shape': 'операция поправки неизвестной формы',
  'revision.op': 'операция поправки {kind}'
}

SECTION_ORDERattributemodule attribute#

SECTION_ORDER: list[tuple[str, str]] = [
  ('source.section', 'source_work'),
  ('source.section', 'source_edition'),
  ('entrenchment.section', 'entrenchment'),
  ('revision.section', 'revision'),
  ('publication.section', 'publication'),
  ('fragment.section', 'fragment'),
  ('reference.section', 'reference'),
  ('interpretation.section', 'interpretation_group'),
  ('interpretation.section', 'interpretation'),
  ('entity.section', 'type_decl'),
  ('relation.section', 'symbol_decl'),
  ('function.section', 'function_decl'),
  ('external.section', 'external_decl'),
  ('assertion.section', 'assertion'),
  ('anchor.section', 'anchor'),
  ('query.section', 'query'),
  ('unit.section', 'unit_decl'),
  ('procedure.section', 'procedure'),
  ('stage.section', 'stage'),
  ('evidence_policy.section', 'evidence_policy'),
  ('temporal_policy.section', 'temporal_resolution_policy'),
  ('evidence.section', 'evidence_item'),
  ('support.section', 'support_edge'),
  ('closure.section', 'closure_policy'),
  ('calendar.section', 'calendar_snapshot'),
  ('deadline.section', 'deadline_policy'),
  ('rule.section', 'rule'),
  ('norm.section', 'norm_template'),
  ('priority.section', 'priority_rule'),
  ('constraint.section', 'constraint'),
  ('precedent.section', 'factor_vocabulary'),
  ('precedent.section', 'precedent_decl'),
  ('counterfactual.section', 'counterfactual_decl')
]

SUPPORTED_PACK_FORMATSattributemodule attribute#

SUPPORTED_PACK_FORMATS = ('law.verb/0.1', 'law.verb/0.2')

VERBALIZATION_GAPattributemodule attribute#

VERBALIZATION_GAP = 'LDC-E8201'

PackErrorclass#

class PackError(ValueError)

Bases: ValueError

Дефект template pack: отсутствует обязательная фраза или поле.

load_packfunction#

def load_pack(path: str | Path) -> dict

Загрузка template pack. Pack — данные, а не код (LS §3.2).

local_namefunction#

def local_name(identifier: str) -> str

Локальное имя StableId: часть после #, у порождённых — с суффиксом.

render_atomfunction#

def render_atom(ctx: _Ctx, literal: dict) -> str

render_formulafunction#

def render_formula(ctx: _Ctx, formula: Any) -> str

render_nodefunction#

def render_node(ctx: _Ctx, node: dict) -> list[str]

Тело блока одной декларации: список абзацев (без заголовка).

render_termfunction#

def render_term(ctx: _Ctx, term: Any) -> str

verbalizefunction#

def verbalize(document: dict, pack: dict) -> dict

CLIR → ревью-документ .lawread.md.

Возвращает {"text", "contentHash", "gaps"}. gaps непуст — документ НЕ ДОЛЖЕН допускаться к утверждению статусом выше draft (LS §3.3).

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

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