Skip to content

lawref.evaluator.document

Манифест входа §170 и канонический документ результата §208.

Хэш-конвенции v1 описаны в докстринге пакета: манифест хэшируется без semanticHash, граф — без proofHash, документ — без resultHash и executionReceipt (§2.18/AUDIT §2.13: receipt вне semantic result).

Attributes

NameDescription
OUTCOME_PROJECTION_FIELDSNo description.
SCHEMA_VERSIONNo description.
SCHEMA_VERSION_02No description.
VERIFICATIONNo description.

Functions

NameDescription
attach_acceptanceВложить отчёт acceptance-фазы §78.2.7 и пересчитать resultHash.
build_documentinterpretation_dependent (E-0140, §156): запрос (truth, collect,
build_manifestEvaluationInputManifest-минимум по форме примера (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) -> dict

interpretation_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) -> dict

EvaluationInputManifest-минимум по форме примера (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.