lawref.delegation
Делегационная цепочка: основание подзаконного акта → power-норма родителя.
Ступень 2 связей между актами (DECISION-0010). «Акт издан в пределах компетенции, данной законом» — не семантическое следование (то неразрешимо статически и живёт в proof graph §179–187), а КОНЕЧНАЯ проверка цепочки:
- подчинённый акт объявляет основания — id power-норм родительского пакета («издан на основании ст. X закона Y»); их бывает несколько, и каждое проверяется отдельно (DECISION-0046);
- основание разрешается: узел существует и действительно power (§105.1 п. 4, payload норм-шаблона §127);
- power действовала на дату принятия подчинённого акта: хотя бы одна
редакция родителя применима на эту дату — машина применимости D1
(
applicability.edition_state, статусы §31) переиспользуется, а не дублируется; её диагностики lifecycle (LDC-E5302) пробрасываются; - издатель совпадает с holder power.
Как и entrenchment (D4), объявление основания — ДАННЫЕ пакета, а не знание
компилятора. С DECISION-0042 оно живёт в самом CLIR (§27.1 basis), а
параметр CLI остался переопределением для гипотез.
Статика сознательно НЕ проверяет:
- validWhen/exercise power — условия осуществления компетенции проверяет движок при вычислении (§127–§128);
- смысловое соответствие предмета: сверяется ВКЛЮЧЕНИЕ двух объявленных
перечислений (§27.1
regulates⊆ §127subject, DECISION-0043), а не «полномочие охватывает эту норму вообще» — последнее §105.1 запрещает; - параметризованный holder (
var) — статически не сверяем, сверка ложится на validWhen при exercise. Раньше этот пропуск был МОЛЧАЛИВЫМ и покрывал куда больше объявленного: сверялась ровно одна формаentity_ref, которой в корпусе нет ни одной — поверхностная константа.lawлоуверится вconst_ref, и на ЕДИНСТВЕННОЙ форме, что порождает компилятор, проверка издателя проходила всегда. Сегодня поимённые формы сверяются обе, а несверяемая форма называет себя предупреждениемLDC-W5301.
Коды §199, диапазон E5 (source/provenance), продолжение за E5301 (D4) и E5302 (D1).
Attributes
| Name | Description |
|---|---|
BASIS_UNRESOLVED_CODE | No description. |
CROSS_PACKAGE_CODE | No description. |
EDITION_NOT_PINNED_CODE | No description. |
HOLDER_NOT_COMPARABLE_CODE | No description. |
NAMED_HOLDER_KINDS | No description. |
NO_BASIS_CODE | No description. |
ORGAN_MISMATCH_CODE | No description. |
POWER_NOT_IN_FORCE_CODE | No description. |
SUBJECT_EXCEEDED_CODE | No description. |
SUBJECT_NOT_DECLARED_CODE | No description. |
Functions
| Name | Description |
|---|---|
adoption_date | Дата принятия акта: самое раннее adopted-событие его редакций (§31). |
check_delegation | Цепочка против ОДНОГО родителя — частный случай check_delegation_all. |
check_delegation_all | Проверка цепочки против НЕСКОЛЬКИХ родителей; [] — цепочка цела. |
declared_bases | Основания, объявленные САМИМ актом (§27.1 basis, DECISION-0042). |
declared_organ | Издатель из §27.1 authority: (id, форма-которую-не-прочесть). |
declared_subjects | Предмет акта (§27.1 regulates, DECISION-0043) — что он регулирует. |
evidence_gap | Пробел доказательства ли неприменимость родителя на дату adopted. |
find_power | Power-норма по id основания: (узел, None) либо (None, причина). |
BASIS_UNRESOLVED_CODEattributemodule attribute#
BASIS_UNRESOLVED_CODE = 'LDC-E5304'CROSS_PACKAGE_CODEattributemodule attribute#
CROSS_PACKAGE_CODE = 'LDC-W5304'EDITION_NOT_PINNED_CODEattributemodule attribute#
EDITION_NOT_PINNED_CODE = 'LDC-W5303'HOLDER_NOT_COMPARABLE_CODEattributemodule attribute#
HOLDER_NOT_COMPARABLE_CODE = 'LDC-W5301'NAMED_HOLDER_KINDSattributemodule attribute#
NAMED_HOLDER_KINDS = ('entity_ref', 'const_ref')NO_BASIS_CODEattributemodule attribute#
NO_BASIS_CODE = 'LDC-E5303'ORGAN_MISMATCH_CODEattributemodule attribute#
ORGAN_MISMATCH_CODE = 'LDC-E5306'POWER_NOT_IN_FORCE_CODEattributemodule attribute#
POWER_NOT_IN_FORCE_CODE = 'LDC-E5305'SUBJECT_EXCEEDED_CODEattributemodule attribute#
SUBJECT_EXCEEDED_CODE = 'LDC-E5307'SUBJECT_NOT_DECLARED_CODEattributemodule attribute#
SUBJECT_NOT_DECLARED_CODE = 'LDC-W5302'adoption_datefunction#
def adoption_date(nodes: list[dict]) -> str | NoneДата принятия акта: самое раннее adopted-событие его редакций (§31).
У работы одна дата принятия; несколько adopted у разных редакций —
следствие консолидаций, принятие акта фиксирует самое раннее.
check_delegationfunction#
def check_delegation(sub_nodes: list[dict], parent_nodes: list[dict], *, basis: str | list[str] | None = None, organ: str | None = None, require_basis: bool = False) -> list[dict]Цепочка против ОДНОГО родителя — частный случай check_delegation_all.
Форма сохранена: у неё есть потребители (CLI, ворота, MCP), и вызов с одним родителем остаётся самым частым.
check_delegation_allfunction#
def check_delegation_all(sub_nodes: list[dict], parents: list[list[dict]], *, basis: str | list[str] | None = None, organ: str | None = None, require_basis: bool = False) -> list[dict]Проверка цепочки против НЕСКОЛЬКИХ родителей; [] — цепочка цела.
basis/organ — ПЕРЕОПРЕДЕЛЕНИЕ: по умолчанию и то, и другое берётся из
самого пакета (§27.1 basis/authority, DECISION-0042), а параметр нужен
там, где акт ещё не объявил основание сам либо проверяется гипотеза «а если
бы издал другой орган». Приём тот же, что у --protected D4.
Несколько родителей (DECISION-0048) закрывают границу, объявленную DECISION-0047 §5: пока цепочка брала одного родителя за вызов, половина предмета акта на двух основаниях всегда оставалась несопоставимой, и предметная компетенция не устанавливалась НИ ОДНИМ вызовом. Каждое основание адресуется родителю по пространству имён, звенья «дата» и «издатель» считаются у своего родителя, а предмет сверяется против ОБЪЕДИНЕНИЯ предметов всех разрешившихся полномочий — то есть против всей делегации, а не её половины.
Пустой список НЕ означает правомерности акта в целом: соблюдение процедуры издания и условий validWhen проверяется отдельно (§127–128, часть XXI) — здесь только само звено «основание → действовавшая компетенция → издатель».
declared_basesfunction#
def declared_bases(nodes: list[dict]) -> list[str]Основания, объявленные САМИМ актом (§27.1 basis, DECISION-0042).
Список, а не одно значение (DECISION-0046): приказ V2000021744 издан «в соответствии с подпунктом 62) статьи 7 Кодекса … И пунктом 1 статьи 34 Закона …», и оснований у акта столько, сколько он назвал. Пока поле было одиночным, второе основание приходилось выбрасывать — то есть терять половину делегации молча.
До переноса поля в CLIR основание жило только параметром CLI: знание о
том, на чём акт стоит, не ездило вместе с пакетом. Ровно один
source_work — то же ограничение v1, что у темпорального звена ниже.
declared_organfunction#
def declared_organ(nodes: list[dict]) -> tuple[str | None, str | None]Издатель из §27.1 authority: (id, форма-которую-не-прочесть).
Возвращает id, если authority назван поимённо (entity_ref — форма
самого §27.1, const_ref — во что лоуверится константа поверхности), и
имя нечитаемой формы иначе. Второй компонент существует, чтобы
«объявлено, но не прочитано» не выглядело как «не объявлено».
declared_subjectsfunction#
def declared_subjects(nodes: list[dict]) -> list[str]Предмет акта (§27.1 regulates, DECISION-0043) — что он регулирует.
evidence_gapfunction#
def evidence_gap(parent_nodes: list[dict], adopted: str) -> boolПробел доказательства ли неприменимость родителя на дату adopted.
Различаются ДВА случая, которые до 28.08.2026 схлопывались в один
LDC-E5305 с формулировкой «издание вне компетенции»:
- родитель на эту дату действительно не действовал (ещё не введён либо уже прекращён) — вывод о компетенции, ошибка;
- родитель существовал, но корпус закрепил только ПОЗДНИЕ его редакции — сказать о компетенции нечего, и утверждать ultra vires значит называть неправомерным то, чего проверка не дочитала.
Признак второго: акт принят ПОСЛЕ принятия родителя, но раньше самого
раннего открывающего события §31 всех его закреплённых редакций. Именно
так выглядит корпус, пиннящий действующую консолидацию: у Кодекса о
здоровье adopted @2020-07-07 при in_force с 2026 года.
find_powerfunction#
def find_power(nodes: list[dict], basis: str) -> tuple[dict | None, str | None]Power-норма по id основания: (узел, None) либо (None, причина).
Power распознаётся по payload.kind == "power" (форма §127, как в
T018/T019); modality — подтверждающий признак, не замена payload.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.