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
| Name | Description |
|---|---|
ATTEMPTED | No description. |
AXES | No description. |
BLOCKING_STATIC | No description. |
DEFAULT_BUDGET | No description. |
ENTERED | No description. |
HOLDING_STATUSES | No description. |
INSTANCE | No description. |
JOURNAL_SCHEMA_VERSION | No description. |
NODE_PREDICATE_FIELDS | No description. |
REFUSED_STATUSES | No description. |
SCHEMA_VERSION | No description. |
VALID | No description. |
VIOLATING_STATUSES | No description. |
Functions
| Name | Description |
|---|---|
build_run_report | Прогон журнала дела: кадр на шаг, доступные шаги на последнем кадре. |
build_static_report | Структурный отчёт: автоматы пакета плюс находки верификации. |
exit_code | No description. |
procedures | Автоматы пакета, восстановленные из узлов CLIR. |
render_text | No description. |
report_bytes | No description. |
verdict | No 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 = 2000ENTEREDattributemodule 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) -> intproceduresfunction#
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) -> strreport_bytesfunction#
def report_bytes(report: dict) -> bytesverdictfunction#
def verdict(report: dict) -> strverifyfunction#
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.