Skip to content

lawref.process

Процессный слой — О-5 плана LAYERS-NEXT (моделирование процессов поверх профиля procedure §159–§164, DECISION-0013).

Оркестрация без семантики (инвариант CLAUDE.md №5): модуль восстанавливает структуру автомата из УЖЕ порождённых компилятором узлов CLIR и исполняет дело существующими входами — evaluate §168–§178 через impact.run_scenario, проекция as-of §31 через impact.edition_projection. Ни одно правило права здесь не интерпретируется; отчёт сравнивает и называет выходы движка.

Почему структура восстановима механически

Десугаризация §160 (DECISION-0013 §2.1) эмитирует ровно три вида правил, и каждое несёт ребро автомата в собственных термах — читать исходник не нужно:

Правило Форма Что даёт
<P>/initial entered_state(v, S) :- established(procedure_instance(v)) начальное состояние
<P>/<T>/valid valid_transition(v, T) :- attempted(v,T) ∧ supported(entered_state(v, F)) ∧ Gi состояние-ИСТОЧНИК и гарды
<P>/<T>/enters entered_state(v, O) :- supported(valid_transition(v, T)) состояние-ЦЕЛЬ

Восстановление идёт по ПРЕДИКАТАМ профиля, а не по строкам id: при двух и более процедурах в пакете имена квалифицируются (P__valid_transition, DECISION-0013 §2.3), и группировка по квалификатору отделяет автоматы друг от друга там, где id-шаблон одинаков. Имя процедуры при этом читается из id — оно больше нигде в CLIR не сохранено.

Что объявлено границей, а не забыто

  • terminal в CLIR отсутствует. Терминальность §160 — маркер исходника, проверяемый компилятором (LDC-E1313), и в узлы не попадает. Поэтому состояние без исходящих переходов называется SINK_STATE и лежит в notes, а не в findings: отличить законный терминал от тупика по CLIR нельзя, и врать об этом инструмент не будет (§249 — не угадываем, сообщаем).
  • current_state §161 не вычисляется — его нет в срезе 0.1 (DECISION-0013 §2.2: нет времени событий §79–§81). Кадр называет enteredStates — «входило ли когда-либо», множество, а не точку. Возврат в состояние неотличим от невыхода из него, и это свойство ядра, а не отчёта.
  • Доступные шаги считаются только для последнего кадра. Гипотетический прогон стоит по вызову evaluate на переход; на каждом кадре это удорожало бы обход в |steps| раз. Граница названа в манифесте (availableStepsAt).
  • Событие on E §79 в валидность перехода не входит — его не исполняет ядро (DECISION-0013 §2.2). Журнал даёт попытку перехода эмпирическим фактом §164, ровно как срез и предусматривает.

Вердикт

Три исхода, и средний из них — не дефект инструмента, а предмет §164:

  • CLEAN (0) — дело прошло без нарушенных позиций и без попыток без эффекта;
  • FINDINGS (1) — есть нарушенная позиция §140, попытка перехода без правового эффекта §164, отказ движка либо застревание (ни один переход не доступен, а достигнутые состояния не тупиковые);
  • JUDGMENT (3) — движок ответил REQUIRES_JUDGMENT §47.3: ход дела зависит от человека, и отчёт не выдаёт это ни за «чисто», ни за «нарушение».

Утверждение о деле и утверждение о прогоне не смешиваются

Отдельная линия, стоившая правки уже написанного слоя. «Переход не признан состоявшимся» §164 — утверждение о ПРАВЕ; «посчитать не удалось» — утверждение о ПРОГОНЕ. Первая редакция сливала их: при отказе движка на каждом вызове отчёт печатал ATTEMPT_WITHOUT_EFFECT, то есть утверждал о деле, не вычислив ничего, а журнал без попытки в тех же условиях давал CLEAN и код 0.

Отсюда REFUSED_STATUSES и три следствия: у попытки есть поле computed; ATTEMPT_WITHOUT_EFFECT эмитируется только из вычисленного ответа; STUCK не утверждается при непосчитанных шагах, усечении бюджета и любом отказе. Отказ называется сам — находкой EXECUTION_REFUSED с кодом и запросом.

Attributes

NameDescription
ATTEMPTEDNo description.
AXESNo description.
BLOCKING_STATICNo description.
DEFAULT_BUDGETNo description.
ENTEREDNo description.
HOLDING_STATUSESNo description.
INSTANCENo description.
JOURNAL_SCHEMA_VERSIONNo description.
NODE_PREDICATE_FIELDSNo description.
REFUSED_STATUSESNo description.
SCHEMA_VERSIONNo description.
VALIDNo description.
VIOLATING_STATUSESNo description.

Functions

NameDescription
build_run_reportПрогон журнала дела: кадр на шаг, доступные шаги на последнем кадре.
build_static_reportСтруктурный отчёт: автоматы пакета плюс находки верификации.
exit_codeNo description.
proceduresАвтоматы пакета, восстановленные из узлов CLIR.
render_textNo description.
report_bytesNo description.
verdictNo description.
verifyНаходки и заметки по структуре одного автомата: (findings, notes).

ATTEMPTEDattributemodule attribute#

ATTEMPTED = 'attempted_transition'

AXESattributemodule attribute#

AXES = ('decisionTime', 'knowledgeTime')

BLOCKING_STATICattributemodule attribute#

BLOCKING_STATIC = (
  'NO_INITIAL_STATE',
  'UNREACHABLE_STATE',
  'DEAD_TRANSITION',
  'TRANSITION_WITHOUT_TARGET'
)

DEFAULT_BUDGETattributemodule attribute#

DEFAULT_BUDGET = 2000

ENTEREDattributemodule attribute#

ENTERED = 'entered_state'

HOLDING_STATUSESattributemodule attribute#

HOLDING_STATUSES = ('TRUE_ONLY', 'BOTH')

INSTANCEattributemodule attribute#

INSTANCE = 'procedure_instance'

JOURNAL_SCHEMA_VERSIONattributemodule attribute#

JOURNAL_SCHEMA_VERSION = 'law.process.journal/0.2'

NODE_PREDICATE_FIELDSattributemodule attribute#

NODE_PREDICATE_FIELDS = (
  ('instance', 'instancePredicate'),
  ('attempted', 'attemptedPredicate'),
  ('valid', 'validPredicate'),
  ('entered', 'enteredPredicate'),
  ('left', 'leftPredicate'),
  ('initial', 'initialPredicate'),
  ('stateBefore', 'stateBeforePredicate'),
  ('currentState', 'currentStatePredicate'),
  ('completed', 'completedPredicate')
)

REFUSED_STATUSESattributemodule attribute#

REFUSED_STATUSES = ('ERROR', 'BUDGET_EXHAUSTED')

SCHEMA_VERSIONattributemodule attribute#

SCHEMA_VERSION = 'law.process/0.1'

VALIDattributemodule attribute#

VALID = 'valid_transition'

VIOLATING_STATUSESattributemodule attribute#

VIOLATING_STATUSES = ('VIOLATED', 'CONFLICTED')

build_run_reportfunction#

def build_run_report(document: dict, journal: dict, budget: int = DEFAULT_BUDGET, procedure_name: str | None = None, resources: dict | None = None) -> dict

Прогон журнала дела: кадр на шаг, доступные шаги на последнем кадре.

resources — байты, которые журналу не принадлежат и в JSON не пишутся: сегодня это calendar_resource_bytes §85, без которых дневной срок (add_business_days) отказывает MISSING_CALENDAR. Ключ набора при этом остаётся в деле (case.options.calendarSnapshot) и входит в caseHash.

build_static_reportfunction#

def build_static_report(document: dict) -> dict

Структурный отчёт: автоматы пакета плюс находки верификации.

exit_codefunction#

def exit_code(report: dict) -> int

proceduresfunction#

def procedures(document: dict) -> list[dict]

Автоматы пакета, восстановленные из узлов CLIR.

Порядок — по имени процедуры; состояния и переходы — по id. Байты отчёта тем самым не зависят от порядка узлов во входе.

§201.1 (DECISION-0156): автомат — ДАННЫЕ узла procedure; правил <P>/initial, <P>/<T>/valid, <P>/<T>/enters десугаризация больше не эмитирует, и узел читается напрямую. Ветка восстановления из правил остаётся для CLIR, порождённого до S3.

render_textfunction#

def render_text(report: dict) -> str

report_bytesfunction#

def report_bytes(report: dict) -> bytes

verdictfunction#

def verdict(report: dict) -> str

verifyfunction#

def verify(procedure: dict) -> tuple[list[dict], list[dict]]

Находки и заметки по структуре одного автомата: (findings, notes).

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

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