lawref.evaluator.document
Манифест входа §170 и канонический документ результата §208.
Хэш-конвенции v1 описаны в докстринге пакета: манифест хэшируется без
semanticHash, граф — без proofHash, документ — без resultHash и
executionReceipt (§2.18/AUDIT §2.13: receipt вне semantic result).
Attributes
| Name | Description |
|---|---|
OUTCOME_PROJECTION_FIELDS | No description. |
SCHEMA_VERSION | No description. |
SCHEMA_VERSION_02 | No description. |
VERIFICATION | No description. |
Functions
| Name | Description |
|---|---|
attach_acceptance | Вложить отчёт acceptance-фазы §78.2.7 и пересчитать resultHash. |
build_document | interpretation_dependent (E-0140, §156): запрос (truth, collect, |
build_manifest | EvaluationInputManifest-минимум по форме примера (SPEC §170). Контекст |
due_verifications | Программы, чья плановая сверка отложена политикой; очередь очищается. |
outcome_projection | Исход без proof-графа (DECISION-0275): те же results, positions, |
program_derived | Производное от ПРОГРАММЫ значение — чистая функция от IR, не зависящая |
verification_pending | Сколько программ ждут отложенной сверки (для /healthz хоста). |
verify_program | Сверить программу с её кэшированным хэшем — то же, что делает inline. |
OUTCOME_PROJECTION_FIELDSattributemodule attribute#
OUTCOME_PROJECTION_FIELDS = ('schemaVersion', 'manifest', 'results', 'positions', 'conflicts', 'issues')SCHEMA_VERSIONattributemodule attribute#
SCHEMA_VERSION = 'law.core.evaluation/0.1'SCHEMA_VERSION_02attributemodule attribute#
SCHEMA_VERSION_02 = 'law.core.evaluation/0.2'VERIFICATIONattributemodule attribute#
VERIFICATION = 'inline'attach_acceptancefunction#
def attach_acceptance(document: dict, report: dict | None) -> dictВложить отчёт acceptance-фазы §78.2.7 и пересчитать resultHash.
Отдельной функцией, а не параметром build_document, по одной причине:
ветвей запроса девять, и каждая строит документ сама. Параметр пришлось бы
провести через все девять, и девятая, забытая, молча теряла бы отчёт — тот
самый класс отказов, ради которого отчёт и заводится. Здесь у поля один
владелец, а resultHash пересчитывается ТЕМ ЖЕ правилом (§208: хэш
документа без resultHash и executionReceipt).
Без выбранной политики (report is None) документ возвращается тем же
объектом: байты запроса без политики обязаны остаться прежними (§78.2.8).
build_documentfunction#
def build_document(manifest: dict, results: list[dict], proof_nodes: list[dict], roots: list[str], issues: list[dict], conflicts: list[dict] | None = None, positions: list[dict] | None = None, interpretation_dependent: bool | None = None) -> dictinterpretation_dependent (E-0140, §156): запрос (truth, collect,
positions) решил зависимость от неразрешённой группы САМ — False значит
«цель вне замыкания от голов заблокированных альтернатив», и документный
проход 0.2 не переносит INTERPRETATION_REQUIRED на такой результат.
None — прежнее поведение для остальных видов запросов: зависимость у
них не определена.
build_manifestfunction#
def build_manifest(ir: dict, case: dict, effective: dict, options: dict, resolved_editions: dict[str, str] | None = None, evidence_pin: dict | None = None) -> dictEvaluationInputManifest-минимум по форме примера (SPEC §170). Контекст приходит материализованным (§89.1: runtime наследования не выполняет — T041). resolvedEditions (§30.2/T010): dynamic reference → exact edition, вход семантики (покрыт semanticHash); резолюция — resolver до вычисления. external snapshots (§170/T025): пиннятся из case.externalData — id → hash; payload хэшируется в caseHash. ExecutionReceipt (§170/§2.18) — метаданные ИСПОЛНЕНИЯ, не вход семантики: options[‘receipt’] сюда не попадает и не влияет ни на манифест, ни на result/proof-хэши (T038).
due_verificationsfunction#
def due_verifications() -> list[dict]Программы, чья плановая сверка отложена политикой; очередь очищается.
Возвращает сами IR — их сверяет verify_program. Порядок — тот, в
котором наступило расписание.
outcome_projectionfunction#
def outcome_projection(document: dict) -> dictИсход без proof-графа (DECISION-0275): те же results, positions, conflicts и issues, что у полного документа (адреса §180.1 уже переписаны), manifest и schemaVersion; proofGraph, proofHash, resultHash и отчёт acceptance не входят. Эталон строит граф и отбрасывает его — форма проекции задаётся здесь, экономия — дело порта.
program_derivedfunction#
def program_derived(ir: dict, name: str, compute)Производное от ПРОГРАММЫ значение — чистая функция от IR, не зависящая от дела и запроса, — в той же записи, что programHash (DECISION-0054).
Заведено 01.09.2026 для стратификации §110: stratification_problem
обходит предикатный граф на каждый вызов evaluate, и на
kz-administrative-code (11 482 узла) это 28 % вызова при неизменной
программе — считался не вывод, а константа программы, тот же класс, что у
хэша до 0054. Один пин объекта, одно вытеснение, один детектор: плановая
сверка хэша на вызовах-степенях двойки поднимает RuntimeError на
мутировавшем IR, и производные от него в тот же момент объявлены негодными
вместе с хэшем. Вызывающий получает кэшированный объект как есть — ему и
не мутировать (engine копирует issue перед вставкой в документ).
verification_pendingfunction#
def verification_pending() -> intСколько программ ждут отложенной сверки (для /healthz хоста).
verify_programfunction#
def verify_program(ir: dict) -> NoneСверить программу с её кэшированным хэшем — то же, что делает inline.
Программа, которой в кэше уже нет (вытеснена LRU), сверке не подлежит: сверять не с чем, и молчание здесь честнее выдуманного отказа.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.