Матеріал на сайті
Вихідне питання
Як чинна система може змінити власний корінь довіри, зберігши походження повноваження, точність нової редакції та керованість переходу?
Повна дослідницька основа цієї публічної адаптації доступна на Zenodo: «Конституція коду».
Конституційна система ухвалює точну поправку кваліфікованою більшістю, оновлює корінь довіри й окремо проводить технічний перехід
- artifact: Чинна редакція
- artifact: Запропонована поправка
- process: Два шляхи ініціативи
- state: 38 ратифікацій із 50
- state: Новий конституційний root
- process: WARDEN
- process: Технічний перехід
- state: Безпечний стан
- current produces proposal
- proposal produces routes
- routes produces ratification
- ratification produces new-root
- new-root produces warden
- warden produces transition
- transition produces safe
Патч, що спочатку отримує право на встановлення
У першій публікації Америка з’являлася на карті Death Stranding у міру підключення окремих вузлів до UCA. Стаття VII перетворила цей досвід на bootstrap(): тринадцять потенційних учасників, дев’ять ратифікацій і заснування спільної системи між штатами, що погодилися. У другій публікації стаття VI додала rootOfTrust(): канонічну редакцію, наступність зобов’язань, перевірку походження федерального пріоритету та зв’язок публічних ролей із Конституцією.
З часом робоча мережа стикається з новою проблемою. Її основоположний документ потребує зміни, але право змінити документ походить із самого документа. Чинна редакція має дозволити процедуру, здатну створити наступну редакцію й замінити чинний корінь довіри. Звичайний адміністраторський доступ виражає фактичну можливість записати нові байти. Конституційне оновлення потребує доведеного повноваження зробити ці байти частиною верховного порядку.
Ігрові оновлення зазвичай надходять ззовні ігрового світу. Платформа показує розмір завантаження, перелік змін і кнопку встановлення. Гравець може погодитися, відкласти процедуру або виявити, що вибір уже люб’язно зроблено за нього. Республіка висуває до оновлення складнішу вимогу: ніхто всередині чинного порядку не отримує постійної кнопки Deploy Constitution.
Стаття V будує процедуру самозміни без єдиного власника ядра. Вона розділяє пропозицію та ратифікацію, передбачає звичайний і резервний шлях ініціативи, передає Конгресу вибір режиму ратифікації, встановлює підвищені пороги й захищає окремі положення додатковими умовами. У програмній формі цей механізм стає upgradeKernel() — оновленням, що спочатку доводить право на існування, далі змінює офіційний корпус і лише після цього проходить через чинний runtime.
Третя збірка
Зворотний маршрут циклу дістався першої операції, здатної змінити вже створені компоненти.
| Публікація | Конституційна функція | Стан прототипу |
|---|---|---|
| VII | bootstrap() | Редакцію засновано й наділено сферою дії |
| VI | rootOfTrust() | Система розпізнає канонічний корпус і походження похідних рішень |
| V | upgradeKernel() | Нова поправка отримує повноваження, входить до офіційного корпусу й проходить міграцію |
Третя збірка зберігає результати попередніх частин і додає сім об’єктів:
- незмінне джерело — чинний конституційний root;
- точний текст запропонованої поправки;
- запис про належний шлях пропозиції;
- заздалегідь обраний режим ратифікації;
- журнал засвідчених рішень штатів;
- новий корінь довіри з повною лінією походження;
- стан переходу між нормативною редакцією та фактичним runtime.
Такий набір уперше робить модель по-справжньому часовою. Раніше функція відповідала, чи діє документ і чому конкретна норма отримує пріоритет. Тепер система зберігає послідовність редакцій, момент зміни чинної основи, період співіснування та наслідки невдалого розгортання.
Одне речення з чотирма воротами
Стаття V первинної Конституції складається з одного довгого речення. Його центральна формула повідомляє, що поправка стає чинною частиною Конституції «when ratified by … three fourths of the several States». Повний текст збережено в транскрипції Національних архівів США.
У програмному прочитанні речення утворює четверо послідовних воріт:
| Ворота | Конституційний механізм | Програмний обов’язок |
|---|---|---|
| Пропозиція | Дві третини обох палат або конвент, скликаний за заявами легіслатур двох третин штатів | Довести допустиме джерело точного артефакту |
| Режим | Конгрес обирає легіслатури штатів або конвенти штатів | Зафіксувати один тип допустимої ратифікаційної події до початку підрахунку |
| Ратифікація | Згода трьох чвертей штатів | Зібрати унікальні засвідчені рішення щодо однієї редакції |
| Захищені положення | Тимчасова межа до 1808 року та індивідуальна згода штату в разі позбавлення рівного представництва в Сенаті | Перевірити межу кваліфікованої більшості й спеціальну згоду |
Офіційне засвідчення й технічна міграція з’являються після цих воріт. Чинна адміністративна процедура покладає публікацію та сертифікацію результату на Архівіста США. Інженерна модель проєкту додає план переходу, оновлення похідних правил, даних, дозволів і автоматичних обмежень. Ці два шари отримують власні назви й не розчиняються у слові «ухвалено».
Два шляхи пропозиції
Перший шлях проходить через Конгрес. Пропозиція отримує дві третини голосів у Палаті представників і дві третини в Сенаті. У конституційній практиці цей поріг обчислюють за кількістю присутніх членів за наявності кворуму; саме таку форму фіксує Constitution Annotated. За повного складу нинішніх палат тестова модель отримує 290 голосів із 435 і 67 зі 100. Фактичне обчислення залежить від кількості присутніх.
Президент у цьому маршруті не має конституційної ролі. Спільну резолюцію з пропозицією поправки направляють штатам без президентського підписання чи схвалення. Національні архіви прямо відокремлюють процедуру статті V від звичайного ухвалення закону. Код зберігає цю відмінність полем presidentialApproval: "not-part-of-article-v-proposal". Навіть позитивне чи негативне ставлення президента залишається політичним фактом і не стає воротами процедури.
Другий шлях починається із заяв легіслатур двох третин штатів. Після досягнення порога Конгрес скликає конвент для пропозиції поправок. За п’ятдесяти штатів поріг становить тридцять чотири унікальні заяви. Жодну з двадцяти семи чинних поправок цим способом не пропонували; Національні архіви зазначають, що всі вони пройшли через Конгрес.
Резервний шлях виконує важливу архітектурну функцію. Інститут, чиї повноваження планують змінити, може втратити монополію на постановку питання. Дві третини штатів здатні відкрити альтернативний вхід. Водночас стаття V майже не описує внутрішню процедуру самого конвенту: склад, голосування, межі предмета та форму засвідчення пропозиції треба визначати окремими правовими й організаційними рішеннями. Прототип приймає засвідчений результат конвенту як вхід і відкрито повертає unresolvedProtocol. Він зберігає прогалину замість бадьорого генерування відсутньої конституційної процедури.
flowchart TB
A["Чинний конституційний корінь"] --> B{"Шлях пропозиції"}
B --> C["Дві третини Палати представників і Сенату"]
B --> D["Заяви легіслатур двох третин штатів"]
D --> E["Конгрес скликає конвент"]
E --> F["Конвент пропонує точний текст"]
C --> G["Запропонована поправка"]
F --> G
G --> H{"Обраний режим ратифікації"}
H --> I["Легіслатури штатів"]
H --> J["Конвенти штатів"]Поправка надходить від двох третин обох палат Конгресу або від конвенту, скликаного за заявами двох третин штатів; Конгрес заздалегідь обирає один режим ратифікації
- actor: ⅔ обох палат Конгресу
- actor: Заяви ⅔ штатів
- process: Конвент для пропозиції
- artifact: Один точний артефакт
- decision: Конгрес обирає режим
- actor: Легіслатури штатів
- actor: Конвенти штатів
- state: Ратифікація ¾ штатів
- congress produces artifact
- applications produces convention
- convention produces artifact
- artifact requires mode
- mode produces legislatures
- mode produces conventions
- legislatures validates threshold
- conventions validates threshold
Одна редакція й один режим
Штат, що ратифікує, має погодитися з тією самою пропозицією, яка пройшла конституційний шлях ініціативи. Тому програмна модель створює digest із точного тексту, вихідного root, дати пропозиції, заявлених наслідків, режиму ратифікації та плану переходу. Будь-яка змістовна зміна створює інший артефакт і потребує нового підтвердження.
Digest розв’язує обмежене технічне завдання. Він показує збіг серіалізованого об’єкта й підтримує трасування. Криптографічний підпис, автентичність паперового акта, компетенція підписанта та юридична чинність рішення залишаються окремими перевірками. Хеш здатен виявити інший текст; державне повноваження однаково не виростає з привабливого шістнадцяткового рядка.
Конгрес також обирає один із двох режимів ратифікації: рішення легіслатур штатів або рішення спеціально скликаних конвентів штатів. Змішаний підрахунок поточна модель відхиляє. Двадцять перша поправка є історично важливим прикладом другого режиму: вона залишається єдиною поправкою, ратифікованою конвентами штатів, що підтверджує віртуальна експозиція Національних архівів.
| Об’єкт | Що підтверджує | Чого сам собою не підтверджує |
|---|---|---|
proposal.digest | Точний збіг програмного представлення пропозиції | Юридичну автентичність джерела |
authorization | Проходження одного з двох шляхів ініціативи | Майбутню ратифікацію |
ratificationMode | Тип рішень штатів, обраний для конкретної поправки | Зміст кожного рішення |
authenticated: true | Результат зовнішньої перевірки документа, переданий моделі | Повноту правового тлумачення |
| журнал подій | Унікальні згоди, дати, відмови й спірні відкликання | Автоматичне вирішення кожного спору |
У проєктній «Конституції коду» точність пропозиції посилено планом переходу. Він перелічує заторкнуті похідні норми, ролі, дозволи, дані, тести, критерії завершення й безпечний стан. Первинна стаття V прямо не вимагає такого документа. Тут працює інженерний розвиток моделі: учасники можуть оцінити нормативну зміну разом із матеріальною вартістю її виконання.
Тридцять восьмий штат
За п’ятдесяти штатів три чверті становлять тридцять вісім. Тридцять сім засвідчених ратифікацій залишають попередню редакцію чинною. Тридцять восьма переводить пропозицію в статус частини Конституції за умови дотримання спеціальних обмежень статті V.
Національні архіви прямо описують цей момент: запропонована поправка стає частиною Конституції відразу після ратифікації трьома чвертями штатів. Після отримання необхідної кількості належно засвідчених документів Office of the Federal Register готує проголошення, а Архівіст сертифікує результат. 1 U.S.C. § 106b установлює публікацію поправки разом із сертифікатом.
Прототип зберігає послідовність у двох полях. constitutionalStatus: "part-of-constitution" з’являється після досягнення порога. attestationStatus: "pending-official-notice" показує, що офіційна публікаційна процедура ще триває. Функція attestAndIntegrate() створює перевірюваний новий root і запис офіційного повідомлення, причому createsValidity отримує значення false.
stateDiagram-v2
[*] --> Draft
state "Точний проєкт" as Draft
state "Запропоновано належним шляхом" as Proposed
state "Ратифікації штатів" as Ratifying
state "Частина Конституції" as Valid
state "Офіційне засвідчення" as Attested
state "Перехід runtime" as Transition
state "Нова редакція виконується" as Aligned
state "Безпечний стан" as Safe
Draft --> Proposed: досягнуто поріг пропозиції
Proposed --> Ratifying: обрано режим
Ratifying --> Valid: три чверті штатів
Valid --> Attested: перевірка й публікація
Attested --> Transition: початок міграції
Transition --> Aligned: усі кроки завершено
Transition --> Safe: збій переходу
Safe --> Transition: відновленняНормативна сила виникає після ратифікації трьома чвертями штатів, офіційне засвідчення повідомляє про завершений процес, а фактична міграція проходить окремою стадією
- artifact: Точна поправка
- state: Ратифікація ¾ штатів
- state: Нормативна сила
- artifact: Офіційне засвідчення
- process: Матеріальна міграція
- state: Оновлений runtime
- proposal produces ratification
- ratification produces force
- force produces attestation
- attestation produces migration
- migration produces runtime
Двадцять сьома поправка дає цій моделі рідкісний історичний стрес-тест. Конгрес запропонував її 1789 року, а необхідного порога досягнули 1992 року — майже через 203 роки. Національні архіви зберігають обидві дати в історії її сертифікації. Тому прототип не створює невказаного строку придатності. Питання прямо встановленого дедлайну, сучасності згоди й повноваження оцінювати відкликання ратифікації існують в окремій правовій доктрині; автоматична модель реєструє їх як зовнішні умови або спір.
Офіційна практика приймає документи про відхилення та відкликання попередньої ратифікації, проте Архівіст не здійснює змістового вирішення таких спорів. У коді подія rescind переводить рішення штату в requires-review і вилучає його з автоматичного підрахунку до зовнішнього рішення. Консервативна зупинка зберігає спостережуваність і не перетворює спірну дію на прихований плюс чи мінус усередині масиву.
Дві захищені ділянки ядра
Заключна частина статті V встановлює дві спеціальні межі. Перша мала тимчасовий характер: до 1808 року поправка не могла зачіпати перше й четверте положення статті I, розділу 9. Одне з них зберігало до вказаного строку федеральну межу на заборону ввезення поневолених людей, друге стосувалося прямого оподаткування. Конституційна архітектура отримала тимчасовий write lock навколо політичного компромісу, де людські тіла ввійшли до системи як предмет торгівлі. Формальна акуратність тут обслуговувала варварство з якістю обліку, якій позаздрив би відділ експлуатації.
Тимчасова межа спливла з початком 1808 року. WARDEN однаково перевіряє її на історичних датах: пропозиція від 31 грудня 1807 року блокується, а пропозиція від 1 січня 1808 року переходить до подальшої оцінки. Це зберігає семантику первинного тексту й не вдає, ніби давно спливлий захист діє у 2026 році.
Друга межа залишається частиною чинного тексту. Штат не можна позбавити рівного представництва в Сенаті без його згоди. Загального порога трьох чвертей тут недостатньо, якщо заторкнутий штат не погодився. Код збирає спеціальну згоду окремо й також приймає власну ратифікацію заторкнутого штату як форму згоди. Останнє є явним інженерним тлумаченням; реальна кваліфікація конкретної поправки потребує юридичного аналізу її змісту.
flowchart TB
A["Поправка досягла порога ратифікації"] --> B{"Зачіпає захищене положення?"}
B -- "Ні" --> C["Поправка входить до Конституції"]
B -- "Захист до 1808 року" --> D{"Дата раніше 1808 року?"}
D -- "Так" --> E["Зміну заблоковано"]
D -- "Ні" --> C
B -- "Рівне представництво в Сенаті" --> F{"Є згода зачепленого штату?"}
F -- "Так" --> C
F -- "Ні" --> EКваліфікована більшість проходить додаткову перевірку тимчасового обмеження до 1808 року й індивідуальної згоди штату в разі позбавлення рівного представництва в Сенаті
- artifact: Поправка з кваліфікованою більшістю
- decision: Обмеження до 1808 року?
- decision: Позбавлення рівного представництва?
- human-decision: Індивідуальна згода штату
- state: Поправка допускається
- state: Поправку заблоковано
- amendment validates historical
- historical rejects blocked: Так
- historical validates suffrage: Ні
- suffrage validates eligible: Ні
- suffrage requires consent: Так
- consent validates eligible: Згода
- consent rejects blocked: Відмова
Ухвалена норма й незавершений перехід
Стаття V визначає появу чинної поправки. Вона не описує заміну конфігурацій, перероблення законів, навчання посадових осіб, перенесення даних і вимкнення автоматичних механізмів, що спираються на попередню основу. Ці дії належать runtime й отримують форму через розвиток, виконаний у «Конституції коду».
Прототип розрізняє три моменти:
| Момент | Що змінилося | Що ще може залишатися попереднім |
|---|---|---|
| Ратифікація | Поправка стала частиною нормативного корпусу | Офіційне представлення, похідні правила й інфраструктура |
| Інтеграція | Створено новий root, збережено лінію походження й опубліковано засвідчення | Фактична поведінка компонентів |
| Міграція | Похідні норми, ролі, тести й обмеження приведено у відповідність до нової редакції | Історичні дані та сумісні старі представлення |
Після успішного переходу runtimeRevision збігається з новим constitutionalRoot. У разі збою система входить у заздалегідь названий безпечний стан. У прикладі використано режим read-only-compatibility: спірні операції зупиняються, докази зберігаються, а відновлення триває за явним планом.
Технічний відкат здатен повернути попередній бінарний артефакт або конфігурацію. Він не скасовує ратифікованої поправки. Поле silentConstitutionalRollback: false перетворює цю межу на перевірюваний інваріант. Подальша доля нової норми потребує завершення переходу, ухвалення іншої поправки або окремого установчого рішення. Збій розгортання повідомляє про несправність виконання; влади git revert над Конституцією він не отримує.
flowchart LR
A["Стара нормативна редакція"] --> B["Ратифікована поправка"]
B --> C["Новий конституційний корінь"]
C --> D{"Міграція runtime"}
D -- "Успіх" --> E["Норма й виконання узгоджені"]
D -- "Збій" --> F["Безпечний стан"]
F --> G["Відновлення переходу або нова поправка"]
G --> DРатифікована поправка зберігає силу в разі збою runtime; система входить у безпечний стан і продовжує відновлення без прихованого повернення конституційної редакції
- artifact: Ратифікована поправка
- state: Новий root чинний
- process: Технічна міграція
- state: Runtime відповідає root
- state: Збій runtime
- state: Безпечний стан
- process: Відновлення без відкату норми
- ratified produces root
- root requires migration
- migration produces runtime
- migration rejects failure
- failure produces safe
- safe produces recovery
- recovery returns runtime
Виконуваний протокол upgradeKernel()
Третю збірку написано для Node.js у форматі ESM із використанням лише стандартного модуля node:crypto. Код містить повний шлях від точної пропозиції до переходу runtime. На відміну від попередніх частин, одна функція вже не може виразити весь механізм без втрати походження. Протокол поділено на стадії, а upgradeKernel() їх координує.
| Функція | Відповідальність |
|---|---|
createAmendmentProposal() | Створює точний артефакт, digest і план переходу |
authorizeProposal() | Перевіряє шлях пропозиції через Конгрес або конвент |
evaluateRatification() | Підраховує унікальні допустимі рішення й застосовує захищені межі |
attestAndIntegrate() | Публікує засвідчення й створює новий root із лінією походження |
executeTransition() | Узгоджує runtime з новою редакцією або вмикає безпечний стан |
upgradeKernel() | Проводить об’єкт через увесь протокол і зберігає чинний root за кожного результату |
Корінь, створений у другій публікації, уже містить constitutionId, digest і authorityGrants, але ще не мав окремого поля status. Перевірка безпосередньо приймає цей формат, переносить реєстр повноважень у наступну редакцію й відхиляє root, явно позначений як нечинний. Семантична зміна самих повноважень потребуватиме окремої збірки консолідованого корпусу; поточний прототип зберігає їх без змін. Так третя збірка розвиває попередню модель через сумісний контракт замість незаявленого переписування її результату.
<!-- Повний виконуваний модуль; синхронізовано з батареєю WARDEN редакції 0.1. -->
import { createHash } from 'node:crypto';
export const ARTICLE_V = Object.freeze({
id: 'US-CONST:V',
rules: Object.freeze({
proposal: 'US-CONST:V:proposal',
ratification: 'US-CONST:V:ratification',
entrenchment1808: 'US-CONST:V:entrenchment-1808',
equalSuffrage: 'US-CONST:V:equal-suffrage',
transition: 'KC:V.5',
}),
});
const RATIFICATION_MODES = Object.freeze(['state-legislatures', 'state-conventions']);
function deepFreeze(value) {
if (value && typeof value === 'object' && !Object.isFrozen(value)) {
for (const nested of Object.values(value)) {
deepFreeze(nested);
}
Object.freeze(value);
}
return value;
}
function requireNonEmptyString(value, field) {
if (typeof value !== 'string' || value.trim().length === 0) {
throw new TypeError(`${field} must be a non-empty string`);
}
}
function requireUniqueStrings(values, field) {
if (!Array.isArray(values) || values.length === 0) {
throw new TypeError(`${field} must be a non-empty array`);
}
for (const value of values) {
requireNonEmptyString(value, field);
}
if (new Set(values).size !== values.length) {
throw new TypeError(`${field} must contain unique values`);
}
}
function canonicalJson(value) {
if (Array.isArray(value)) {
return `[${value.map((item) => canonicalJson(item)).join(',')}]`;
}
if (value && typeof value === 'object') {
return `{${Object.keys(value)
.sort()
.map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`)
.join(',')}}`;
}
return JSON.stringify(value);
}
export function digest(value) {
return `sha256:${createHash('sha256').update(canonicalJson(value)).digest('hex')}`;
}
export function requiredVotes(total, numerator, denominator) {
if (
!Number.isInteger(total) ||
total < 1 ||
!Number.isInteger(numerator) ||
!Number.isInteger(denominator) ||
numerator < 1 ||
denominator < 1 ||
numerator > denominator
) {
throw new TypeError('Invalid supermajority parameters');
}
return Math.ceil((total * numerator) / denominator);
}
function assertRoot(root) {
requireNonEmptyString(root.constitutionId, 'root.constitutionId');
requireNonEmptyString(root.digest, 'root.digest');
if (root.status !== undefined && root.status !== 'in-force') {
throw new Error('The source constitutional root is not in force');
}
}
function assertTransitionPlan(plan) {
requireNonEmptyString(plan.safeState, 'transitionPlan.safeState');
if (!Array.isArray(plan.steps) || plan.steps.length === 0) {
throw new TypeError('transitionPlan.steps must be a non-empty array');
}
requireUniqueStrings(
plan.steps.map((step) => step.id),
'transitionPlan.steps[].id',
);
}
export function createAmendmentProposal({
id,
exactText,
proposedAt,
sourceRoot,
ratificationMode,
changes,
transitionPlan,
}) {
requireNonEmptyString(id, 'id');
requireNonEmptyString(exactText, 'exactText');
requireNonEmptyString(proposedAt, 'proposedAt');
assertRoot(sourceRoot);
assertTransitionPlan(transitionPlan);
if (!RATIFICATION_MODES.includes(ratificationMode)) {
throw new TypeError('Unsupported ratification mode');
}
if (!Array.isArray(changes)) {
throw new TypeError('changes must be an array');
}
const content = {
id,
exactText,
proposedAt,
sourceRoot: {
constitutionId: sourceRoot.constitutionId,
digest: sourceRoot.digest,
authorityGrants: [...(sourceRoot.authorityGrants ?? [])],
establishedBy: sourceRoot.establishedBy ?? null,
},
ratificationMode,
changes,
transitionPlan,
};
return deepFreeze({
...content,
digest: digest(content),
status: 'draft-proposal',
trace: [ARTICLE_V.rules.proposal, ARTICLE_V.rules.transition],
});
}
function evaluateHouseVote(vote, chamber) {
if (
vote?.quorumMet !== true ||
!Number.isInteger(vote.present) ||
!Number.isInteger(vote.yes) ||
vote.present < 1 ||
vote.yes < 0 ||
vote.yes > vote.present
) {
return deepFreeze({
chamber,
accepted: false,
reason: 'invalid-vote-or-no-quorum',
});
}
const threshold = requiredVotes(vote.present, 2, 3);
return deepFreeze({
chamber,
accepted: vote.yes >= threshold,
yes: vote.yes,
present: vote.present,
threshold,
reason: vote.yes >= threshold ? 'two-thirds-of-members-present' : 'two-thirds-not-reached',
});
}
function countConventionApplications(applications, federation) {
const knownStates = new Set(federation.states);
const accepted = new Set();
for (const application of applications) {
if (
knownStates.has(application.state) &&
application.source === 'state-legislature' &&
application.authenticated === true &&
application.requests === 'article-v-convention'
) {
accepted.add(application.state);
}
}
return accepted;
}
export function authorizeProposal({ proposal, route, federation }) {
requireUniqueStrings(federation.states, 'federation.states');
if (route.kind === 'congress') {
const house = evaluateHouseVote(route.house, 'House');
const senate = evaluateHouseVote(route.senate, 'Senate');
const ratificationModeVerified =
route.ratificationModeSelectedByCongress === proposal.ratificationMode;
const authorized = house.accepted && senate.accepted && ratificationModeVerified;
return deepFreeze({
proposalDigest: proposal.digest,
route: 'congress',
authorized,
house,
senate,
ratificationModeVerified,
presidentialApproval: 'not-part-of-article-v-proposal',
reason: !ratificationModeVerified
? 'ratification-mode-not-selected-by-congress'
: authorized
? 'two-thirds-in-both-houses'
: 'congressional-threshold-not-reached',
trace: [ARTICLE_V.rules.proposal],
});
}
if (route.kind === 'convention') {
const applications = countConventionApplications(route.applications ?? [], federation);
const threshold = requiredVotes(federation.states.length, 2, 3);
const applicationThresholdMet = applications.size >= threshold;
const conventionProposalVerified =
route.convention?.calledByCongress === true &&
route.convention?.proposalCertified === true &&
route.convention?.proposalDigest === proposal.digest;
const ratificationModeVerified =
route.ratificationModeSelectedByCongress === proposal.ratificationMode;
const authorized =
applicationThresholdMet && conventionProposalVerified && ratificationModeVerified;
return deepFreeze({
proposalDigest: proposal.digest,
route: 'convention',
authorized,
applicationsBy: [...applications],
applicationThreshold: threshold,
conventionProposalVerified,
ratificationModeVerified,
reason: !ratificationModeVerified
? 'ratification-mode-not-selected-by-congress'
: authorized
? 'two-thirds-applications-and-certified-convention-proposal'
: 'convention-route-incomplete',
unresolvedProtocol: 'article-v-does-not-specify-the-convention-internal-procedure',
trace: [ARTICLE_V.rules.proposal],
});
}
throw new TypeError('Unsupported proposal route');
}
function amendmentYear(proposal) {
const year = Number.parseInt(proposal.proposedAt.slice(0, 4), 10);
if (!Number.isInteger(year)) {
throw new TypeError('proposedAt must begin with a four-digit year');
}
return year;
}
function checkEntrenchment({ proposal, ratifiedBy, individualConsents, knownStates }) {
const temporaryTargets = new Set(['I.9.1', 'I.9.4']);
const affectsTemporaryTarget = proposal.changes.some(
(change) => temporaryTargets.has(change.target) && change.effect === 'affect',
);
if (amendmentYear(proposal) < 1808 && affectsTemporaryTarget) {
return deepFreeze({
accepted: false,
reason: 'pre-1808-protected-subject',
missingConsentFrom: [],
trace: [ARTICLE_V.rules.entrenchment1808],
});
}
const speciallyConsentingStates = new Set(ratifiedBy);
for (const consent of individualConsents) {
if (
knownStates.has(consent.state) &&
consent.authenticated === true &&
consent.proposalDigest === proposal.digest &&
consent.consent === true
) {
speciallyConsentingStates.add(consent.state);
}
}
const affectedStates = new Set(
proposal.changes
.filter((change) => change.target === 'senate.equal-suffrage' && change.effect === 'deprive')
.flatMap((change) => change.affectedStates ?? []),
);
const missingConsentFrom = [...affectedStates].filter(
(state) => !speciallyConsentingStates.has(state),
);
return deepFreeze({
accepted: missingConsentFrom.length === 0,
reason:
missingConsentFrom.length === 0
? 'entrenchment-check-passed'
: 'equal-suffrage-consent-missing',
missingConsentFrom,
trace: [ARTICLE_V.rules.equalSuffrage],
});
}
export function evaluateRatification({
proposal,
authorization,
federation,
actions,
individualConsents = [],
}) {
requireUniqueStrings(federation.states, 'federation.states');
if (authorization.authorized !== true || authorization.proposalDigest !== proposal.digest) {
throw new Error('The proposal has not been validly authorized');
}
const knownStates = new Set(federation.states);
const ratified = new Map();
const rejected = new Set();
const disputed = new Set();
const ignored = [];
const orderedActions = [...actions].sort((left, right) =>
String(left.receivedAt).localeCompare(String(right.receivedAt)),
);
for (const action of orderedActions) {
if (
!knownStates.has(action.state) ||
action.authenticated !== true ||
action.proposalDigest !== proposal.digest ||
action.mode !== proposal.ratificationMode
) {
ignored.push({ state: action.state, reason: 'ineligible-action' });
continue;
}
if (action.decision === 'rescind') {
ratified.delete(action.state);
disputed.add(action.state);
continue;
}
if (disputed.has(action.state)) {
ignored.push({
state: action.state,
reason: 'rescission-requires-review',
});
continue;
}
if (action.decision === 'ratify') {
if (!ratified.has(action.state)) {
ratified.set(action.state, action.receivedAt);
}
rejected.delete(action.state);
continue;
}
if (action.decision === 'reject') {
rejected.add(action.state);
continue;
}
ignored.push({ state: action.state, reason: 'unsupported-decision' });
}
const threshold = requiredVotes(federation.states.length, 3, 4);
const ratifiedBy = [...ratified.keys()];
const thresholdMet = ratifiedBy.length >= threshold;
const entrenchment = checkEntrenchment({
proposal,
ratifiedBy,
individualConsents,
knownStates,
});
const adopted = thresholdMet && entrenchment.accepted;
const thresholdDates = [...ratified.values()].sort();
return deepFreeze({
proposalDigest: proposal.digest,
status: adopted
? 'ratified'
: thresholdMet
? 'blocked-by-entrenchment'
: disputed.size > 0
? 'requires-review'
: 'proposed',
constitutionalStatus: adopted ? 'part-of-constitution' : 'previous-revision-remains-in-force',
ratifiedBy,
rejectedBy: [...rejected],
disputedStates: [...disputed],
ignored,
threshold,
thresholdMet,
ratifiedAt: adopted ? thresholdDates[threshold - 1] : null,
entrenchment,
attestationStatus: adopted ? 'pending-official-notice' : 'not-available',
trace: [ARTICLE_V.rules.ratification, ...entrenchment.trace],
});
}
export function attestAndIntegrate({ proposal, ratification, attestor, attestedAt }) {
requireNonEmptyString(attestor, 'attestor');
requireNonEmptyString(attestedAt, 'attestedAt');
if (ratification.status !== 'ratified' || ratification.proposalDigest !== proposal.digest) {
throw new Error('Only a ratified amendment can be attested');
}
const rootContent = {
constitutionId: `${proposal.sourceRoot.constitutionId}+${proposal.id}`,
parentDigest: proposal.sourceRoot.digest,
amendmentDigest: proposal.digest,
ratifiedAt: ratification.ratifiedAt,
authorityGrants: proposal.sourceRoot.authorityGrants,
establishedBy: 'article-v-ratification',
};
return deepFreeze({
attestation: {
attestor,
attestedAt,
status: 'official-notice-of-completed-ratification',
createsValidity: false,
ratifiedBy: ratification.ratifiedBy,
},
constitutionalRoot: {
...rootContent,
digest: digest(rootContent),
status: 'in-force',
lineage: [proposal.sourceRoot.digest, proposal.digest, digest(rootContent)],
},
trace: [ARTICLE_V.rules.ratification],
});
}
export function executeTransition({ proposal, integration, stepResults }) {
const expectedSteps = new Set(proposal.transitionPlan.steps.map((step) => step.id));
const received = new Map(stepResults.map((result) => [result.id, result.status]));
const failed = [...expectedSteps].filter((id) => received.get(id) !== 'passed');
if (failed.length === 0) {
return deepFreeze({
normativeRoot: integration.constitutionalRoot,
runtimeStatus: 'aligned',
runtimeRevision: integration.constitutionalRoot.constitutionId,
failedSteps: [],
requiredAction: 'observe',
trace: [ARTICLE_V.rules.transition],
});
}
return deepFreeze({
normativeRoot: integration.constitutionalRoot,
runtimeStatus: 'safe-state',
runtimeRevision: proposal.sourceRoot.constitutionId,
safeState: proposal.transitionPlan.safeState,
failedSteps: failed,
requiredAction: 'restore-transition-or-adopt-another-amendment',
silentConstitutionalRollback: false,
trace: [ARTICLE_V.rules.transition],
});
}
export function upgradeKernel({
proposal,
route,
federation,
ratificationActions,
individualConsents,
attestation,
stepResults,
}) {
const authorization = authorizeProposal({ proposal, route, federation });
if (!authorization.authorized) {
return deepFreeze({
phase: 'proposal-rejected',
authorization,
normativeRoot: proposal.sourceRoot,
});
}
const ratification = evaluateRatification({
proposal,
authorization,
federation,
actions: ratificationActions,
individualConsents,
});
if (ratification.status !== 'ratified') {
return deepFreeze({
phase: ratification.status,
authorization,
ratification,
normativeRoot: proposal.sourceRoot,
});
}
const integration = attestAndIntegrate({
proposal,
ratification,
...attestation,
});
const transition = executeTransition({
proposal,
integration,
stepResults,
});
return deepFreeze({
phase: transition.runtimeStatus === 'aligned' ? 'upgrade-complete' : 'upgrade-in-recovery',
authorization,
ratification,
integration,
transition,
normativeRoot: integration.constitutionalRoot,
});
}У модулі навмисно присутні поля, значення яких надходять із зовнішньої перевірки. authenticated означає, що окремий процес підтвердив форму документа й підпис. proposalCertified повідомляє про засвідчений результат конвенту. changes містить уже виконану класифікацію заторкнутих положень. Програма застосовує наслідки цих тверджень і зберігає їхнє походження; юридичного тлумачення вона не підміняє.
Функція canonicalJson() сортує ключі перед обчисленням SHA-256, тому однаковий об’єкт отримує стійкий digest за однакового вмісту. Такий механізм придатний для прототипу й трасування. Виробнича система потребуватиме специфікації канонічної серіалізації, справжніх підписів, довіреного часу, реєстру повноважень і захищеного журналу.
WARDEN: двадцять три способи пережити оновлення
WARDEN перевіряє третю збірку на чотирьох рівнях: пропозиція, ратифікація, захищені положення й перехід. Кожен тест оголошує джерело інваріанта. Прямі правила статті V відокремлено від адміністративної практики Національних архівів і від інженерних норм «Конституції коду».
flowchart TB
A["Текст статті V"] --> D["Інваріанти пропозиції та ратифікації"]
B["Офіційна процедура засвідчення"] --> E["Інваріанти публікації"]
C["Конституція коду"] --> F["Інваріанти переходу"]
D --> G["WARDEN: 23 сценарії"]
E --> G
F --> G
G --> H{"Корінь, текст і стан узгоджені?"}
H -- "Так" --> I["Збірку допущено до статті IV"]
H -- "Ні" --> J["Перегляд коду, даних або тлумачення"]WARDEN окремо перевіряє буквальні правила статті V, офіційне засвідчення й інженерний перехід, а далі зіставляє новий root із фактичним станом runtime
- source: Буквальні правила статті V
- source: Офіційне засвідчення
- source: Інженерний перехід
- process: WARDEN
- decision: Новий root = фактичний runtime?
- state: Перехід підтверджено
- human-decision: Потрібне людське рев’ю
- article references warden
- attestation references warden
- engineering references warden
- warden validates comparison
- comparison validates pass
- comparison returns review
Повна батарея запускається командою node --test і містить двадцять три сценарії:
| Група | Перевірювані сценарії | Джерело |
|---|---|---|
| Наступність збірки | Корінь із моделі статті VI приймається без штучної зміни формату | Зв’язок статей VI і V; зворотна сумісність прототипу |
| Кваліфікована більшість | Округлення порогів; дві третини кожної палати; недобір у Сенаті | Стаття V; практика підрахунку присутніх за наявності кворуму |
| Процедура пропозиції | Відсутність президентського presentment; обов’язковий вибір режиму Конгресом; 33 заяви штатів; 34 заяви й засвідчений результат конвенту | Стаття V; офіційна процедура |
| Ратифікація | 37 і 38 штатів; дублікат; неправильний режим; інший digest; конвентний режим; відсутність автоматичного строку | Стаття V; історичні приклади XXI і XXVII поправок |
| Захищені положення | Блокування 1807 року; припинення тимчасової межі 1808 року; згода заторкнутого штату | Заключні формули статті V |
| Спір | Відкликання ратифікації передається на зовнішній розгляд | Межа адміністративної та юридичної перевірки |
| Інтеграція | Засвідчення не створює сили; новий root зберігає повну lineage | Офіційна процедура; інженерна атестація |
| Перехід | Успішне вирівнювання; безпечний стан у разі збою; upgradeKernel() зберігає нову норму в recovery | «Конституція коду», стаття V.5 |
Нижче наведено компактний фрагмент батареї. Він показує найважливіші негативні випадки: недостатній поріг, невідповідну редакцію, спеціальну згоду та збій міграції.
wardenTest(
'тридцять сім штатів залишають попередню редакцію чинною',
[ARTICLE_V.rules.ratification],
() => {
const proposal = makeProposal();
const result = ratify(proposal, 37);
assert.equal(result.status, 'proposed');
assert.equal(result.threshold, 38);
assert.equal(result.constitutionalStatus, 'previous-revision-remains-in-force');
},
);
wardenTest(
'згода зі зміненим текстом не ратифікує вихідну пропозицію',
[ARTICLE_V.rules.ratification],
() => {
const proposal = makeProposal();
const actions = ratificationActions(proposal, 38);
actions[37] = { ...actions[37], proposalDigest: 'sha256:other-text' };
const result = ratify(proposal, 0, { actions });
assert.equal(result.ratifiedBy.length, 37);
assert.equal(result.status, 'proposed');
},
);
wardenTest(
'штат зберігає рівне представництво без власної згоди',
[ARTICLE_V.rules.equalSuffrage],
() => {
const proposal = makeProposal({
id: 'amendment:senate-suffrage',
changes: [
{
target: 'senate.equal-suffrage',
effect: 'deprive',
affectedStates: [states[49]],
},
],
});
const result = ratify(proposal, 38);
assert.equal(result.status, 'blocked-by-entrenchment');
assert.deepEqual(result.entrenchment.missingConsentFrom, [states[49]]);
},
);
wardenTest(
'збій міграції вмикає безпечний стан без скасування поправки',
[ARTICLE_V.rules.transition],
() => {
const proposal = makeProposal();
const ratification = ratify(proposal, 38);
const integration = attestAndIntegrate({
proposal,
ratification,
attestor: 'Archivist of the United States',
attestedAt: '2026-08-03',
});
const transition = executeTransition({
proposal,
integration,
stepResults: [
{ id: 'publish-canonical-corpus', status: 'passed' },
{ id: 'update-derived-legislation', status: 'failed' },
],
});
assert.equal(transition.runtimeStatus, 'safe-state');
assert.equal(transition.normativeRoot.status, 'in-force');
assert.equal(transition.silentConstitutionalRollback, false);
},
);Усі двадцять три сценарії проходять. Найзмістовнішим виявився тест технічного відкату. Попередній runtime справді може тимчасово повернутися в обмеженому режимі, однак normativeRoot залишається новим. Так WARDEN відокремлює відновлення працездатності від скасування норми й не дозволяє аварійному скрипту випадково отримати установчу владу.
Що стаття V дає програмній архітектурі
Третя публікація залишає сім практичних висновків.
Самозміна отримує окреме повноваження. Архітектурний рівень змінюється через процедуру, відмінну від звичайного налаштування та похідного правила. Технічний доступ до репозиторію чи інфраструктури не замінює установчого мандата.
Резервний шлях захищає систему від захопленого ініціатора. Орган, зацікавлений у збереженні власних повноважень, втрачає монополію на розгляд зміни. Альтернативний вхід зберігає ті самі вимоги до точності, доказів і ратифікації.
Учасники підтверджують один артефакт. Точний текст, digest, вихідний root і обраний режим утворюють предмет згоди. Редакційна правка з новим змістом створює нову редакцію пропозиції.
Ухвалення, засвідчення й міграція є різними подіями. Нормативна сила, офіційна публікація та фактичне виконання отримують окремі стани, дати й відповідальних суб’єктів.
Кваліфікована більшість зустрічає індивідуальні межі. Захищене положення може вимагати згоди конкретно заторкнутого учасника. Так розподілена система розрізняє колективне рішення й гарантовану позицію вузла.
Збій переходу запускає відновлення. Безпечний стан, сумісність і спостереження підтримують нову норму під час ремонту. Технічна зворотність не створює нормативного скасування.
Кожна редакція зберігає походження. Новий root містить digest батьківської редакції, digest поправки, момент ратифікації та власний digest. Історія перетворюється на перевірювану лінію, а попередній ідентифікатор залишається доступним для аудиту й сумісності.
Ці властивості застосовні до проєктів із кількома власниками, протоколів сумісності, керування високоризиковими схемами даних, ланцюгів постачання й систем, де архітектурна зміна зачіпає автономні команди. Стаття V особливо добре показує ціну фрази «просто оновимо»: простота зазвичай живе в презентації, а розподілені наслідки вже готують окремий бюджет.
Де закінчується третій експеримент
Стаття V має високу процедурну визначеність і водночас залишає великі прогалини. Машина впевнено обчислює пороги, усуває дублікати, зіставляє digest, перевіряє обраний режим і зберігає лінію версій. Значення конкретної поправки, чинність ратифікаційного акта й класифікація позбавлення рівного представництва потребують правового рішення.
Конвентний шлях залишається особливо неповним. Вихідний текст зобов’язує Конгрес скликати конвент після необхідної кількості заяв, але не розкриває внутрішньої архітектури конвенту. Повноцінна реалізація потребуватиме правил агрегації заяв, предметної сумісності, складу делегацій, голосування, засвідчення й вирішення спору. Поточний модуль зберігає цей результат як зовнішньо підтверджений факт і позначає прогалину.
Строки ратифікації, попереднє відхилення й відкликання згоди також належать розвиненій доктрині та політичній практиці. Приклад XXVII поправки забороняє вводити універсальний таймаут заради зручності розробника. Прототип реєструє спірну подію й чекає на компетентне рішення.
Технічний захист прототипу має лабораторний масштаб. Object.freeze() перешкоджає звичайній мутації об’єкта всередині процесу, але не захищає сховище. SHA-256 підтверджує збіг представлення, а не засвідчує автора. Рядок дати не створює довіреного часу. Виробнича версія потребуватиме підписаних подій, append-only журналу, формальної схеми, відтворюваної збірки корпусу й розділеної атестації.
WARDEN підтверджує відповідність коду обраним інваріантам. Він не підтверджує, що самі інваріанти вичерпують право статті V. Що сильнішою стає програма, то важливіше це розмежування: швидкий і безпомилковий алгоритм здатен зі зразковою ефективністю виконати неправильно класифіковану поправку.
Третій результат помітно посилює загальну гіпотезу. Стаття V переноситься в програмну архітектуру як реальний протокол версіонування, багатосторонньої згоди, захищених обмежень і безпечного переходу. Повнота виконання далі залежить від людського тлумачення й інституційного факту, а програмна форма вже здатна зберігати цю залежність замість її маскування.
Орел пережив оновлення ядра. Його нова версія отримала походження, lineage і recovery plan — три властивості, які державна символіка зазвичай вважає зайвою бюрократією до першого падіння production.
Висновок
Стаття VII дала Конституції момент заснування. Стаття VI створила корінь довіри й навчила похідні рішення доводити своє походження. Стаття V надає чинній системі спосіб змінити сам корінь через два шляхи пропозиції, один заздалегідь обраний режим ратифікації, згоду трьох чвертей штатів і спеціальні межі для захищених положень.
У коді цей порядок перетворюється на точний артефакт, стійкий digest, дві процедури авторизації, журнал ратифікацій, новий root і окремий перехід runtime. Засвідчення повідомляє про досягнуту силу, міграція реалізує її матеріально, а збій умикає безпечний стан без прихованого скасування поправки.
Програмна інтерпретація витримує третю перевірку й стає змістовнішою. Вона вже описує архітектуру, здатну засновуватися, довіряти й змінювати власну основу в часі. Наступна публікація перейде до статті IV. Оновленому ядру доведеться працювати серед автономних штатів, визнавати їхні акти, підтримувати переміщення між юрисдикціями й приймати нові вузли федерації.
Продовжити дослідження з ШІ
Сайт формує цей розділ із незалежного набору питань constitution-runtime.article-v.upgrade-kernel, що зберігається в супровідному каталозі constitution-runtime-03-article-v-questions.yaml. Кожен запит самостійно називає проблему статті V, програмний об’єкт і межу тлумачення, тому його можна відкрити поза цією статтею без втрати предмета.
Рекомендований маршрут: чинний root → пропозиція → точний артефакт → ратифікація → захищені положення → засвідчення → міграція → WARDEN → межі. Двомовний каталог містить контракт відповіді ШІ, 53 самостійні запити, умови відкриття гілок, посилання на код і графіку та навігацію повернення.
Маршрут розмови про статтю V від чинного конституційного кореня до меж безпечного самооновлення
- artifact: Стаття V
- state: Чинний корінь
- state: Пропозиція
- state: Точний артефакт
- state: Ратифікація
- state: Захищені положення
- state: Засвідчення
- state: Міграція
- state: WARDEN
- human-decision: Межі
- root produces current
- current produces proposal
- proposal produces artifact
- artifact produces ratification
- ratification produces protected
- protected produces attestation
- attestation produces migration
- migration produces warden
- warden produces limits
Відомості про публікацію
Автори: Sam Starling, Oksana Dubinetska
Контекст проєкту: Zhovten Games / IRONCREED
Повне джерело дослідження: «Конституція коду» — DOI 10.5281/zenodo.21894242
Репозиторій дослідження: FOP-Oksana-Dubinetska/code-constitution
Історичні й технічні матеріали: текст Конституції США; офіційна процедура внесення поправок; огляд статті V; пропозиція поправок Конгресом; конвентний шлях; роль президента; ратифікація; режим ратифікації; строки ратифікації; відхилення й відкликання ратифікації; захищені положення; 1 U.S.C. § 106b; матеріали Національних архівів про XXI і XXVII поправки
Пов’язані публікації: «Підключити Америку: як стаття VII запускає республіку»; «Чому довіряє Америка: як стаття VI збирає верховний порядок»
Наступна публікація: стаття IV — у розробці
Редакція публікації: 0.2 · 13 серпня 2026 року