Skip to content

lawref.population

population-impact/0.1 — эталон оценки реформы на закреплённой выборке (DECISION-0255; трек О, spec/LAYERS-NEXT.ru.md §2–§3).

Оркестрация без семантики (инвариант CLAUDE.md №5): строка банка — два вызова операции ask §168.4 (lawref.ask) над пакетами-делами сторон; исход сравнивается проекцией scenario._outcome_view, модели — semdiff §215. Инструмент ничего не выводит из права: состояние стороны — механическая проекция закрытого evaluation-документа по матрице §5 решения, как impact.verdict. Взвешенные суммы — арифметика хоста над уже вычисленными значениями Money (§6 решения), а не правовой ответ, и так не называются.

Поток (последовательный: у эталона одна задача — байты). Все отказы §12 — до первой строки:

USAGE флаги, --bank, компилятор (CLI)
→ путь хранилища, без создания каталога (POPULATION_STORE_ERROR)
→ форма банка по схеме, самопин, веса (POPULATION_BANK_INVALID)
→ открытие стороны: пины law.toml, law.lock, ресурсы; понижение ОДНОГО
корня, связанный мир W, theoryHash/artifactHash [§209](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#209-theory-hash-и-artifact-hash)
(POPULATION_WORLD_MISMATCH)
→ semantic diff [§215](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/29-part-xxviii-compiler-pipeline.ru.md#215-semantic-diff) миров сторон
→ банк против сторон: одно множество [[cases]] и равные байты .lawcase;
понижение дел строк, один вид legalTime (H4), Instant со смещением и не
точнее микросекунд ([§2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/01-part-i-audit.ru.md#2-что-необходимо-исправить)) (POPULATION_BANK_INVALID)
→ дело каждой строки (POPULATION_CASE_UNKNOWN)
→ мера на обеих сторонах, статически (POPULATION_MEASURE_INVALID)
→ создание каталога хранилища (POPULATION_STORE_ERROR)
→ строка за строкой: ask(before), ask(after) → документы в хранилище
по sha256 канонических байтов → состояния сторон → класс строки
→ покрытие, суммы, вердикт [§7](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/03-part-iii-architecture-and-conformance.ru.md#7-обязательные-компоненты-реализации) → reportCore (канон [§208](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#208-canonical-serialization)) + receipt.

Сбой посреди прогона — FAILED строки: в ядре только код и фиксированное сообщение по коду (FAILED_MESSAGES), подробность — в receipt.failures и stderr (§5). Необработанное исключение хоста и сбой, после которого отчёт выдать нельзя, — код 4 без отчёта с диагностикой в stderr (§12).

Понижение исходников — работа компилятора: модуль получает функции Lower (дело) и LowerRoot (корень), а вызов lawc живёт в CLI (lawc_lowering, тот же путь, что у python -m lawref ask).

Attributes

NameDescription
AMBIGUOUS_MEASURENo description.
ASK_FAILED_MESSAGENo description.
BANK_INVALIDNo description.
BANK_SCHEMA_VERSIONNo description.
BLOCKING_SEVERITIESNo description.
CASE_LOWERINGNo description.
CASE_UNKNOWNNo description.
CLASSESNo description.
CRASH_EXITNo description.
DOCUMENT_CANONNo description.
EXCLUDEDNo description.
EXIT_CODESNo description.
EXIT_HELPNo description.
FAILEDNo description.
FAILED_MESSAGESNo description.
LowerNo description.
LowerRootNo description.
MEASURE_CURRENCYNo description.
MEASURE_INVALIDNo description.
MEASURE_KINDNo description.
MISSING_PARAMETER_VALUENo description.
MONEY_TYPENo description.
MONEY_TYPE_NAMESNo description.
NO_COMPARABLE_VALUENo description.
NO_VALUENo description.
PANICNo description.
REFUSED_EXITNo description.
REPORT_SCHEMA_VERSIONNo description.
RESULT_COUNTNo description.
SIDESNo description.
STORE_ERRORNo description.
TOOLNo description.
USAGENo description.
USAGE_TEXTNo description.
VALUENo description.
VALUE_AFTER_ONLYNo description.
VALUE_BEFORE_ONLYNo description.
VALUE_ON_BOTHNo description.
VERDICT_CHANGENo description.
VERDICT_INCOMPLETENo description.
VERDICT_NO_COMPARABLE_WEIGHTNo description.
VERDICT_NO_WEIGHTED_CHANGENo description.
WORLD_MISMATCHNo description.

Classes

NameDescription
LoweredПонижение дела на стороне: (CLIR корня, документ дела) либо сбой.
OutcomeИтог ask одной стороны: документ либо сбой.
PopulationRefusalОтказ §12 решения: отчёта нет, код выхода 2.
SideОткрытая сторона банка: пакет-дело с проверенными пинами.

Functions

NameDescription
bank_content_hashСамопин банка (§8): sha256 канонических байтов §208 банка без
build_reportПолный прогон банка: отчёт {reportCore, reportCoreHash, receipt};
canonical_legal_timeКаноническая форма §208 даты банка (§2): Instant — представление UTC
check_bankФорма банка по схеме целиком — закрытость, обязательные поля, запрос
check_case_sets§1: одно множество имён [[cases]] и побайтово равные .lawcase.
check_legal_time_kindsH4: один вид legalTime на банк (Date либо Instant).
check_legal_time_precision§2: Instant без явного смещения или с дробью секунд длиннее шести
check_measure§3 статически: вид запроса, distinct (H2), options.empty в терме
check_store_pathОтказ STORE второй после USAGE (§12), но каталог здесь НЕ создаётся:
create_storeСоздание каталога хранилища после всех отказов §12, до первой строки.
decimal_textТочная десятичная запись §208 (канон canonical_decimal).
executeask пониженного дела на стороне. Отказ подготовки и крах — FAILED.
exit_codeNo description.
failed_recordСостояние FAILED в ядре: код и фиксированное сообщение по коду (§5).
failureСбой стороны: код (в ядро) и подробность (в квитанцию и stderr).
lawc_loweringПонижение дела тем же путём, что python -m lawref ask: корень — `lawc
lawc_root_loweringПонижение одного корня (lawc lower --imports) — шаг открытия стороны
legal_time_sectionРаспределение дат банка (§2): минимум и максимум — по моменту UTC для
load_bankNo description.
lower_rowsПонижение дел строк до первой строки: дата дела нужна проверке H4.
mainpython -m lawref population-impact --bank B --store D [--json] [--lawc L].
open_sideОткрытие стороны (§1): пины, понижение ОДНОГО корня, связывание мира,
prepare_storeПроверка пути и создание каталога разом (для вызывающих вне прогона).
render_textСводка для человека; полный отчёт — --json.
report_bytesNo description.
root_lowering_ofПонижение корня к поданному понижению дела: атрибут root (так его
row_classКласс строки по паре состояний (§5). FAILED старше EXCLUDED: неполный
side_stateСостояние стороны по матрице §5: (запись ядра, значение Money, сбой).
store_documentАтомарная запись <sha256>.json; повтор того же хэша — не ошибка (§9).
verdict§7: 4 → 1 → 3 → 0. «Изменение найдено» — положительное утверждение и
world_pinsПины стороны в форме банка (без package) — для сверки и для

AMBIGUOUS_MEASUREattributemodule attribute#

AMBIGUOUS_MEASURE = 'AMBIGUOUS_MEASURE'

ASK_FAILED_MESSAGEattributemodule attribute#

ASK_FAILED_MESSAGE = 'подготовка или исполнение ask отказали (§168.4)'

BANK_INVALIDattributemodule attribute#

BANK_INVALID = 'POPULATION_BANK_INVALID'

BANK_SCHEMA_VERSIONattributemodule attribute#

BANK_SCHEMA_VERSION = 'law.population.bank/0.1'

BLOCKING_SEVERITIESattributemodule attribute#

BLOCKING_SEVERITIES = ('error', 'fatal')

CASE_LOWERINGattributemodule attribute#

CASE_LOWERING = 'POPULATION_CASE_LOWERING'

CASE_UNKNOWNattributemodule attribute#

CASE_UNKNOWN = 'POPULATION_CASE_UNKNOWN'

CLASSESattributemodule attribute#

CLASSES = (
  VALUE_ON_BOTH,
  VALUE_BEFORE_ONLY,
  VALUE_AFTER_ONLY,
  NO_COMPARABLE_VALUE,
  EXCLUDED,
  FAILED
)

CRASH_EXITattributemodule attribute#

CRASH_EXIT = 4

DOCUMENT_CANONattributemodule attribute#

DOCUMENT_CANON = 'POPULATION_DOCUMENT_CANON'

EXCLUDEDattributemodule attribute#

EXCLUDED = 'EXCLUDED'

EXIT_CODESattributemodule attribute#

EXIT_CODES = {
  VERDICT_INCOMPLETE: 4,
  VERDICT_CHANGE: 1,
  VERDICT_NO_COMPARABLE_WEIGHT: 3,
  VERDICT_NO_WEIGHTED_CHANGE: 0
}

EXIT_HELPattributemodule attribute#

EXIT_HELP = 'коды выхода population-impact: 0 NO_WEIGHTED_CHANGE, 1 CHANGE, 2 отказ (USAGE, POPULATION_*), 3 NO_COMPARABLE_WEIGHT, 4 INCOMPLETE либо сбой без отчёта (у impact и impact-editions коды 3 и 4 значат другое)'

FAILEDattributemodule attribute#

FAILED = 'FAILED'

FAILED_MESSAGESattributemodule attribute#

FAILED_MESSAGES = {
  CASE_LOWERING: 'понижение дела на стороне не удалось (§168.4)',
  RESULT_COUNT: 'документ несёт не один результат запроса меры (§4)',
  STORE_ERROR: 'запись документа в хранилище не удалась (§9)',
  DOCUMENT_CANON: 'документ не канонизируется по §208',
  PANIC: 'крах исполнения строки (§5)'
}

Lowerattributemodule attribute#

Lower = Callable[[Path, RegisteredCase, dict], tuple[dict, dict]]

LowerRootattributemodule attribute#

LowerRoot = Callable[[Path, dict], dict]

MEASURE_CURRENCYattributemodule attribute#

MEASURE_CURRENCY = 'MEASURE_CURRENCY'

MEASURE_INVALIDattributemodule attribute#

MEASURE_INVALID = 'POPULATION_MEASURE_INVALID'

MEASURE_KINDattributemodule attribute#

MEASURE_KIND = 'MEASURE_KIND'

MISSING_PARAMETER_VALUEattributemodule attribute#

MISSING_PARAMETER_VALUE = 'MISSING_PARAMETER_VALUE'

MONEY_TYPEattributemodule attribute#

MONEY_TYPE = 'urn:law:std#Money'

MONEY_TYPE_NAMESattributemodule attribute#

MONEY_TYPE_NAMES = frozenset({'Money', MONEY_TYPE})

NO_COMPARABLE_VALUEattributemodule attribute#

NO_COMPARABLE_VALUE = 'NO_COMPARABLE_VALUE'

NO_VALUEattributemodule attribute#

NO_VALUE = 'NO_VALUE'

PANICattributemodule attribute#

PANIC = 'PANIC'

REFUSED_EXITattributemodule attribute#

REFUSED_EXIT = 2

REPORT_SCHEMA_VERSIONattributemodule attribute#

REPORT_SCHEMA_VERSION = 'law.population.impact-report/0.1'

RESULT_COUNTattributemodule attribute#

RESULT_COUNT = 'POPULATION_RESULT_COUNT'

SIDESattributemodule attribute#

SIDES = ('before', 'after')

STORE_ERRORattributemodule attribute#

STORE_ERROR = 'POPULATION_STORE_ERROR'

TOOLattributemodule attribute#

TOOL = 'population-impact'

USAGEattributemodule attribute#

USAGE = 'USAGE'

USAGE_TEXTattributemodule attribute#

USAGE_TEXT = 'python -m lawref population-impact --bank <bank.json> (--store <каталог> | --no-store | --no-proof) [--json] [--lawc <бинарь>]'

VALUEattributemodule attribute#

VALUE = 'VALUE'

VALUE_AFTER_ONLYattributemodule attribute#

VALUE_AFTER_ONLY = 'VALUE_AFTER_ONLY'

VALUE_BEFORE_ONLYattributemodule attribute#

VALUE_BEFORE_ONLY = 'VALUE_BEFORE_ONLY'

VALUE_ON_BOTHattributemodule attribute#

VALUE_ON_BOTH = 'VALUE_ON_BOTH'

VERDICT_CHANGEattributemodule attribute#

VERDICT_CHANGE = 'CHANGE'

VERDICT_INCOMPLETEattributemodule attribute#

VERDICT_INCOMPLETE = 'INCOMPLETE'

VERDICT_NO_COMPARABLE_WEIGHTattributemodule attribute#

VERDICT_NO_COMPARABLE_WEIGHT = 'NO_COMPARABLE_WEIGHT'

VERDICT_NO_WEIGHTED_CHANGEattributemodule attribute#

VERDICT_NO_WEIGHTED_CHANGE = 'NO_WEIGHTED_CHANGE'

WORLD_MISMATCHattributemodule attribute#

WORLD_MISMATCH = 'POPULATION_WORLD_MISMATCH'

Loweredclassdataclass#

class Lowered(root_ir: dict | None, case: dict | None, failure: dict | None)

Понижение дела на стороне: (CLIR корня, документ дела) либо сбой.

caseattributeinstance attribute#

case: dict | None

failureattributeinstance attribute#

failure: dict | None

root_irattributeinstance attribute#

root_ir: dict | None

legal_timeproperty#

legal_time: str | None

Outcomeclassdataclass#

class Outcome(document: dict | None, failure: dict | None)

Итог ask одной стороны: документ либо сбой.

documentattributeinstance attribute#

document: dict | None

failureattributeinstance attribute#

failure: dict | None

PopulationRefusalclass#

class PopulationRefusal(code: str, message: str)

Bases: Exception

Отказ §12 решения: отчёта нет, код выхода 2.

codeattributeinstance attribute#

code = code

messageattributeinstance attribute#

message = message

linemethod#

def line() -> str

Sideclassdataclass#

class Side(label: str, root: Path, context: dict, world: dict, cases: dict[str, RegisteredCase], resources: ask_module.ResourcesChecked | None = None, registration: RegistrationChecked | None = None)

Открытая сторона банка: пакет-дело с проверенными пинами.

casesattributeinstance attribute#

cases: dict[str, RegisteredCase]

contextattributeinstance attribute#

context: dict

labelattributeinstance attribute#

label: str

registrationattributeclass attributeinstance attribute#

registration: RegistrationChecked | None = None

resourcesattributeclass attributeinstance attribute#

resources: ask_module.ResourcesChecked | None = None

rootattributeinstance attribute#

root: Path

worldattributeinstance attribute#

world: dict

bank_content_hashfunction#

def bank_content_hash(bank: dict) -> str

Самопин банка (§8): sha256 канонических байтов §208 банка без contentHash, строки упорядочены по rowId — перестановка строк во входе хэш не меняет.

build_reportfunction#

def build_report(bank_path: Path, store_path: str | Path | None, lower: Lower, lower_root: LowerRoot | None = None, write_store: bool = True, record_proof: bool = True) -> dict

Полный прогон банка: отчёт {reportCore, reportCoreHash, receipt}; отказ §12 — PopulationRefusal, всегда до первой строки.

def canonical_legal_time(value: str) -> str

Каноническая форма §208 даты банка (§2): Instant — представление UTC Z (2026-01-01T12:00:00+05:00 → 2026-01-01T07:00:00Z, дробь секунд без хвостовых нулей); Date и прочее — как есть. lawref.canon мгновений не нормализует, поэтому запись — здесь.

check_bankfunction#

def check_bank(bank: object) -> None

Форма банка по схеме целиком — закрытость, обязательные поля, запрос меры, закреплённые ресурсы (§1) — плюс отрицательный вес, уникальность rowId и самопин (§6, §8, §12).

check_case_setsfunction#

def check_case_sets(before: Side, after: Side) -> None

§1: одно множество имён [[cases]] и побайтово равные .lawcase.

def check_legal_time_kinds(lowered: dict[str, dict[str, Lowered]]) -> None

H4: один вид legalTime на банк (Date либо Instant).

def check_legal_time_precision(lowered: dict[str, dict[str, Lowered]]) -> None

§2: Instant без явного смещения или с дробью секунд длиннее шести знаков — отказ банка. Момент без смещения не определён (SPEC §5: у литералов нет скрытой зоны), точность сверх микросекунд — граница 0.1.

lawc lower-ask дело с legal_time без смещения понижает; отказ CONTEXT_FIELD_INVALID дала бы лишь подготовка ask уже в строке, поэтому проверка стоит до первой строки (фикстура: bank-instant-no-offset).

check_measurefunction#

def check_measure(measure: dict, side: Side, case_name: str) -> None

§3 статически: вид запроса, distinct (H2), options.empty в терме запроса (H3), явный тип переменной в любой записи, разрешение в мире стороны.

check_store_pathfunction#

def check_store_path(path: str | Path | None) -> Path

Отказ STORE второй после USAGE (§12), но каталог здесь НЕ создаётся: банк, отвергнутый позже, не оставляет пустого хранилища (§9).

create_storefunction#

def create_store(store: Path) -> Path

Создание каталога хранилища после всех отказов §12, до первой строки.

decimal_textfunction#

def decimal_text(value: Fraction) -> str

Точная десятичная запись §208 (канон canonical_decimal).

Веса и значения Money — конечные десятичные дроби, а их суммы и произведения конечны по построению; иной знаменатель означает дефект инструмента, а не округление (§58: float и молчаливое округление запрещены).

executefunction#

def execute(side: Side, case_name: str, lowered: Lowered, query: dict, record_proof: bool = True) -> Outcome

ask пониженного дела на стороне. Отказ подготовки и крах — FAILED.

exit_codefunction#

def exit_code(report: dict) -> int

failed_recordfunction#

def failed_record(code: str) -> dict

Состояние FAILED в ядре: код и фиксированное сообщение по коду (§5).

failurefunction#

def failure(code: str, detail: str) -> dict

Сбой стороны: код (в ядро) и подробность (в квитанцию и stderr).

lawc_loweringfunction#

def lawc_lowering(lawc: list[str]) -> Lower

Понижение дела тем же путём, что python -m lawref ask: корень — lawc lower --imports, дело — lawc lower-ask под тем же контекстом, композиция §168.5 — core_cli._composed_case. Атрибут root — понижение одного корня.

lawc_root_loweringfunction#

def lawc_root_lowering(lawc: list[str]) -> LowerRoot

Понижение одного корня (lawc lower --imports) — шаг открытия стороны (§1), общий с python -m lawref ask (core_cli._lower_package_root).

legal_time_sectionfunction#

def legal_time_section(dates: set[str]) -> dict

Распределение дат банка (§2): минимум и максимум — по моменту UTC для Instant, печать и счёт различных — в канонической форме §208.

load_bankfunction#

def load_bank(path: Path) -> dict

lower_rowsfunction#

def lower_rows(side: Side, names: list[str], lower: Lower) -> dict[str, Lowered]

Понижение дел строк до первой строки: дата дела нужна проверке H4. Сбой понижения — всегда POPULATION_CASE_LOWERING при любом коде компилятора; исходный код и текст — в подробности (§5).

mainfunction#

def main(argv: list[str], lower: Lower | None = None, lower_root: LowerRoot | None = None) -> int

python -m lawref population-impact --bank B --store D [--json] [--lawc L].

lower/lower_root — понижение дела и корня, поданные вызывающим вместо компилятора (ворота и замеры); CLI их не принимает.

open_sidefunction#

def open_side(label: str, pin: dict, base: Path, lower_root: LowerRoot) -> Side

Открытие стороны (§1): пины, понижение ОДНОГО корня, связывание мира, хэши §209. Дел не понижает: сбой понижения дела — FAILED его строки. Отказ — POPULATION_WORLD_MISMATCH.

prepare_storefunction#

def prepare_store(path: str | Path | None) -> Path

Проверка пути и создание каталога разом (для вызывающих вне прогона).

render_textfunction#

def render_text(report: dict) -> str

Сводка для человека; полный отчёт — --json.

report_bytesfunction#

def report_bytes(report: dict) -> bytes

root_lowering_offunction#

def root_lowering_of(lower: Lower) -> LowerRoot

Понижение корня к поданному понижению дела: атрибут root (так его несёт lawc_lowering), иначе — компилятор по умолчанию CLI (core_cli._lawc_command: LAWREF_LAWC, PATH). Совместимость для вызывающих, подающих одну Lower; явный lower_root старше.

row_classfunction#

def row_class(before: dict, after: dict) -> tuple[str, str | None]

Класс строки по паре состояний (§5). FAILED старше EXCLUDED: неполный прогон обязан дойти до вердикта INCOMPLETE.

side_statefunction#

def side_state(outcome: Outcome, measure: dict, store: Path | None, record_proof: bool = True) -> tuple[dict, Fraction | None, dict | None]

Состояние стороны по матрице §5: (запись ядра, значение Money, сбой). record_proof=False (DECISION-0275): документа с proof нет, адреса нет — сторона несёт только outcomeHash.

store_documentfunction#

def store_document(store: Path | None, document: dict) -> str

Атомарная запись <sha256>.json; повтор того же хэша — не ошибка (§9).

Временный файл — mkstemp: создание с O_EXCL и случайным именем, то есть уникальное между процессами, пишущими в одно хранилище. Сбой записи посреди прогона — FAILED строки, а не отказ §12.

verdictfunction#

def verdict(complete: bool, classes: dict[str, _Tally], absolute: Fraction) -> str

§7: 4 → 1 → 3 → 0. «Изменение найдено» — положительное утверждение и стоит без сравнимого веса; «изменения нет» не печатается, пока судить нечем.

world_pinsfunction#

def world_pins(root: Path, context: dict, world: dict) -> dict

Пины стороны в форме банка (без package) — для сверки и для сборки фикстур тем же вычислением, что проверяет инструмент.

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

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