lawref.context
Evaluation context и named profiles (WP-30; SPEC §89, §89.1).
Интерим-представление профилей до surface-синтаксиса M3 (JSON в case):
{"contextProfiles": {"KZ2026": {"extends": null, "fields": {...}}, "KZ_COMPLIANCE": {"extends": "KZ2026", "fields": {...}}}, "context": {"extends": "KZ_COMPLIANCE", "legalTime": "...", ...}}Семантика §89.1: наследование single, acyclic, field-wise; child переопределяет;
контекст материализуется ДО evaluation — runtime наследования не выполняет
(T041: манифест из профильного контекста байтово равен манифесту из
эквивалентного развёрнутого). Для каждого поля хранится origin и полная
override-цепочка — show_expanded обязана их печатать (§89.1).
No hidden defaults (§5.1): в 0.1 legalTime обязателен; в 0.2+ оценщик
разрешает его отсутствие до обращения потребителя (§89.3). Технические поля
дозаполняются С ПРЕДУПРЕЖДЕНИЕМ только при заданном legalTime.
Полей §89 здесь ШЕСТЬ из восемнадцати, и это правило, а не отставание
(DECISION-0034): поле заводится вместе со своим потребителем, а не раньше.
Причина не стилистическая — манифест §170 есть фиксированный набор ключей, чей
semanticHash считается по всему словарю, поэтому у поля два исхода: либо
потребитель проецирует его в манифест и сдвигает байты КАЖДОГО
evaluation-документа, либо поле навсегда остаётся вне semantic hash, то есть
входом семантики, не покрытым хэшем входа. Заведённое вхолостую поле оплачивает
первое дважды. Четыре отсутствующих (territory, source_resolver,
evidence_policy, fact_snapshot) имеют адреса в том же решении.
Attributes
| Name | Description |
|---|---|
DATE_PATTERN | No description. |
INSTANT_PATTERN | No description. |
SILENT_DEFAULTS | No description. |
TECHNICAL_DEFAULTS | No description. |
TIMEZONE_PATTERN | No description. |
TIME_FIELDS | No description. |
Classes
| Name | Description |
|---|---|
ContextError | No description. |
Functions
| Name | Description |
|---|---|
check_temporal_nodes | Check temporal selection before any node can be silently filtered out. |
check_time_axes | Отказ, если ось контекста несёт значение вне своего вида (§2.15/§82). |
expand | Материализация контекста: (effective, override-цепочки, issues). |
require_time | No description. |
show_expanded | context show --expanded (§89.1): effective value, origin и override chain. |
status_moment | Момент «по состоянию на» для статусов позиций §134–§138 (errata E-0212). |
time_value_kind | Вид временного значения §2.15: "date" | "instant"; None — ни то, ни другое. |
DATE_PATTERNattributemodule attribute#
DATE_PATTERN = '^\\d{4}-\\d{2}-\\d{2}$'INSTANT_PATTERNattributemodule attribute#
INSTANT_PATTERN = '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$'SILENT_DEFAULTSattributemodule attribute#
SILENT_DEFAULTS = {'mode': 'audit'}TECHNICAL_DEFAULTSattributemodule attribute#
TECHNICAL_DEFAULTS = {
'timezone': 'UTC',
'decisionTime': '2026-01-01T00:00:00Z',
'knowledgeTime': '2026-01-01T00:00:00Z'
}TIMEZONE_PATTERNattributemodule attribute#
TIMEZONE_PATTERN = '^[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z0-9_+-]+){0,2}$'TIME_FIELDSattributemodule attribute#
TIME_FIELDS: tuple[tuple[str, str], ...] = (
('legalTime', 'LegalTime = Date | Instant'),
('decisionTime', 'Instant'),
('knowledgeTime', 'Instant')
)ContextErrorclass#
class ContextError(code: str, message: str)Bases: Exception
check_temporal_nodesfunction#
def check_temporal_nodes(nodes: list[dict], legal_time: str) -> NoneCheck temporal selection before any node can be silently filtered out.
Called after interpretation selection, and separately for case assertions. Literal dates, event times and source publication metadata do not by themselves depend on the evaluation clock.
check_time_axesfunction#
def check_time_axes(effective: dict[str, Any]) -> NoneОтказ, если ось контекста несёт значение вне своего вида (§2.15/§82).
Ось времени правопорядка сравнивается с границами lifecycle §31 и с окнами
effective §87 ЛЕКСИКОГРАФИЧЕСКИ — это законно ровно потому, что обе
стороны суть ISO-записи одной granularity. Границы приходят из CLIR и
проверены схемой (legal-ir.schema.json, DateString/InstantString);
ось приходила из дела и не проверялась ничем, то есть у сравнения был
проверен ровно один операнд из двух. Строка вне ISO не отвергалась, а
молча занимала место в порядке: не-дата (кириллица выше цифр) читалась
как далёкое будущее, пустая строка и --scenarios — как далёкое прошлое.
expandfunction#
def expand(case: dict, *, allow_timeless: bool = False) -> tuple[dict[str, Any], dict[str, list[str]], list[dict]]Материализация контекста: (effective, override-цепочки, issues).
origins[field] — цепочка записавших уровней от корня к финальному (последний — действующий): [“profile:KZ2026”, “profile:KZ_COMPLIANCE”, “case”] либо [“default”].
require_timefunction#
def require_time(value: str, field: str, consumer: str) -> Noneshow_expandedfunction#
def show_expanded(case: dict) -> strcontext show --expanded (§89.1): effective value, origin и override chain.
status_momentfunction#
def status_moment(effective: dict[str, Any], origins: dict[str, list[str]], semantic_version: str) -> strМомент «по состоянию на» для статусов позиций §134–§138 (errata E-0212).
legal_time выбирает ДЕЙСТВУЮЩЕЕ ПРАВО — редакции §92, окна effective
§87, значения параметров во времени. «Сейчас» статуса позиции — наступил
ли срок, истёк ли он, исполнено ли обязательство — есть другой вопрос, и
отвечает на него decision_time §82 («момент вынесения результата»).
До errata обе величины были одной: спросить «право на дату L, а статус —
на дату решения D» было нельзя.
Правила выбора:
- семантика 0.1 заморожена (инвариант 9) — момент прежний,
legal_time; decision_time, ДОЗАПОЛНЕННЫЙ техническим дефолтом (§5.1,CONTEXT_FIELD_DEFAULTED), решением не является и момента не даёт: дело о нём ничего не сказало, а константа2026-01-01T00:00:00Zотвечала бы за него;- ГРАНУЛЯРНОСТЬ момента остаётся гранулярностью
legal_time: дело, записавшее дату, заявило, что внутри суток ничего не менялось (§135.1), и менять это заявление errata не вправе. Приlegal_timeтипаDateберётся ДАТАdecision_time, приInstant— сам момент; - совпадение (
decision_timeтой же даты либо отсутствие оси) даёт ту же строку, что и прежде, — документ байтово прежний.
Дата decision_time читается ПОЛЕМ ЗАПИСИ, в том смещении, в котором ось
записана делом, а политика §82.1 не спрашивается: здесь не сравниваются
дата с мгновением (единственная потребность, поднимающая отказ §82.1), а
читается календарная дата вынесения решения. Цена названа: дело,
записавшее решение органа из +05:00 в Z, получит дату UTC — и пишет
то смещение, которое имеет в виду.
time_value_kindfunction#
def time_value_kind(value: Any) -> str | NoneВид временного значения §2.15: "date" | "instant"; None — ни то, ни другое.
Проверяются ОБЕ стороны, и вторая из первой не следует: форма записи —
паттернами нормативной схемы, календарная состоятельность — разбором.
2026-13-45 форму проходит и датой не является; 20260101, наоборот,
разбирается (date.fromisoformat принимает базовый формат с Python 3.11),
но записью ISO 8601 в смысле схемы не является.
Разбор мгновения ДОСЛОВНО повторяет values._instant_moment (E-0048: две
разные процедуры чтения одного вида — тот же дефект под другим именем).
Согласие обеих сторожат ворота verify/ci/gates/compiler/check_context_time_format.py, а не
договорённость.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.