Skip to content

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

NameDescription
CONSOLIDATION_MISMATCH_CODENo description.
DANGLING_LOCATOR_CODENo description.
MIGRATION_BASE_CODENo description.
OPERATIONS_OVERLAP_CODENo description.
OPERATION_TARGET_CODENo description.
STRUCTURAL_OPSNo description.
TEXTUAL_OPSNo description.

Functions

NameDescription
apply_operationsПрименение операций к проекции редакции; чистая функция.
consolidateПроекция редакции-результата, вычисленная из основания и операций.
declared_entrenchment_diagnosticsD4 из узлов 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]

Полная проверка ребра §32.1–§32.2; порядок — причина раньше следствия.

Ребро без операций диагностик не порождает: форма 0.1 (аннотация связи) остаётся действительной, и настоящая проверка её не ужесточает.

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

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