lawref.migrate
Миграции редакций §32.1–§32.2: применение операций поправки (DECISION-0009).
Ребро revision graph §32 может нести операции — формализованную дельту изменяющего акта. Ребро без операций остаётся аннотацией связи; ребро с операциями обязано удовлетворять инварианту консолидации §32.2:
apply(previous, operations) ≡ nextСравнение ведётся по проекции фрагментов §29 — множеству пар (локатор, язык) → текст. Инвариант ловит два различных класса дефектов одной проверкой: ошибку формализации дельты и расхождение официально опубликованной консолидации с текстом самого изменяющего акта.
Проекция здесь несёт ТЕКСТЫ, а не дайджесты (в отличие от
entrenchment.edition_projection): применение обязано класть байты, а не
их хэши. Проверка соответствия этих текстов байтам закреплённой публикации
— отдельная проверка §194 (LDC-E5202), и она настоящей не подменяется;
файловая система здесь не нужна, и функции модуля чистые.
Порядок диагностик — причина раньше следствия. Конфликт операций (§32.1) прекращает разбор: где порядок применения не определён, сообщать о расхождении консолидации значит называть следствие вместо причины. По той же причине несуществующая цель операции отменяет вывод о расхождении.
Отложено: renumber порождает remap-таблицу локаторов для резолюции §30.2
(DECISION-0009, открытый вопрос 2) — здесь операция только применяется к
проекции, а сломанные ею ссылки называются LDC-E5405.
Attributes
| Name | Description |
|---|---|
CONSOLIDATION_MISMATCH_CODE | No description. |
DANGLING_LOCATOR_CODE | No description. |
MIGRATION_BASE_CODE | No description. |
OPERATIONS_OVERLAP_CODE | No description. |
OPERATION_TARGET_CODE | No description. |
STRUCTURAL_OPS | No description. |
TEXTUAL_OPS | No description. |
Functions
| Name | Description |
|---|---|
apply_operations | Применение операций к проекции редакции; чистая функция. |
consolidate | Проекция редакции-результата, вычисленная из основания и операций. |
declared_entrenchment_diagnostics | D4 из узлов entrenchment §32.3 для одного revision edge. |
edition_texts | Редакция → {(локатор, язык): текст} по её фрагментам (§29). |
ordered_operations | Порядок применения §32.1: по возрастанию effective, при равенстве — |
revision_diagnostics | Полная проверка ребра §32.1–§32.2; порядок — причина раньше следствия. |
CONSOLIDATION_MISMATCH_CODEattributemodule attribute#
CONSOLIDATION_MISMATCH_CODE = 'LDC-E5401'DANGLING_LOCATOR_CODEattributemodule attribute#
DANGLING_LOCATOR_CODE = 'LDC-E5405'MIGRATION_BASE_CODEattributemodule attribute#
MIGRATION_BASE_CODE = 'LDC-E5404'OPERATIONS_OVERLAP_CODEattributemodule attribute#
OPERATIONS_OVERLAP_CODE = 'LDC-E5403'OPERATION_TARGET_CODEattributemodule attribute#
OPERATION_TARGET_CODE = 'LDC-E5402'STRUCTURAL_OPSattributemodule attribute#
STRUCTURAL_OPS = ('repeal', 'renumber')TEXTUAL_OPSattributemodule attribute#
TEXTUAL_OPS = ('replace', 'insert')apply_operationsfunction#
def apply_operations(base: dict[tuple[str, str], str], operations: list[dict], edge_effective: str | None = None, revision_id: str = '') -> tuple[dict[tuple[str, str], str], list[dict]]Применение операций к проекции редакции; чистая функция.
Возвращает результат и диагностики LDC-E5402 — операции, чья цель не
существует (replace/repeal/renumber отсутствующего локатора) либо,
наоборот, уже существует (insert). Операция с несуществующей целью
пропускается: применять её не к чему, а домысливать намерение поправки
компилятор не вправе.
consolidatefunction#
def consolidate(nodes: list[dict], revision_id: str) -> dict[tuple[str, str], str]Проекция редакции-результата, вычисленная из основания и операций.
Фаза 1 (DECISION-0009): редакция-результат заводится руками, а функция
служит проверке инварианта §32.2. Фаза 2 сделает её порождающей — тексты
фрагментов next станут производными артефактами.
declared_entrenchment_diagnosticsfunction#
def declared_entrenchment_diagnostics(nodes: list[dict], edge: dict, base: dict[tuple[str, str], str]) -> list[dict]D4 из узлов entrenchment §32.3 для одного revision edge.
Entrenchment связан с source work, а revision — с edition; их сопоставление
идёт через previous edition. Так защита одной Конституции не может
случайно запретить одноимённый locator другого источника.
edition_textsfunction#
def edition_texts(nodes: list[dict], edition_id: str) -> dict[tuple[str, str], str]Редакция → {(локатор, язык): текст} по её фрагментам (§29).
ordered_operationsfunction#
def ordered_operations(operations: list[dict], edge_effective: str | None) -> list[tuple[str, int, dict]]Порядок применения §32.1: по возрастанию effective, при равенстве —
в порядке объявления. Последовательность самого изменяющего акта
авторитетна, поэтому tie-break — индекс, а не локатор.
revision_diagnosticsfunction#
def revision_diagnostics(nodes: list[dict], revision_id: str, protected: list[str] | None = None) -> list[dict]Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.