ADR-0007 · Выкат внутри окна отчётности#
Статус: принят · 2026-09-22
Метод: D-09 v3.0 · шаблон ADR v1.2
Участники: руководитель ИТ ЦУУ, инфраструктура, дежурный
Учебная запись: часть прогона U-02, система вымышлена. Форма и рассуждение настоящие.
Контекст#
Вход — 00-context.md. Предмет решения — любой выкат в период с 1 по 20 апреля, когда система работает и от неё зависят 4 200 организаций.
Первого выката это решение не касается: до запуска откатываться не к чему. Решается второй и последующие.
Состояние мира на момент выката внутри окна#
| Что | Что там лежит | Кто прочитает при откате |
|---|---|---|
| Схема данных | Подачи, квитанции, начисления | Предыдущая версия |
| Сообщения в очередях | Очередь отложенных проверок подписи (ADR-0006); в инциденте — тысячи записей | Предыдущая версия, через минуты |
| Содержимое кэшей | Справочники в памяти процесса; перечитываются при старте | Никто: теряются при перезапуске |
| Внешние контракты | Выданные квитанции — уже наружу. Спецификация заморожена на 12 месяцев (ADR-0001) | Обязанное лицо. Отозвать нельзя |
| Конфигурация и флаги | Доля 2 %, идущая отложенным путём; срок ожидания акта 90 дней | Предыдущая версия |
| Состояние машины сверки | До 11 760 живых экземпляров в четырёх состояниях (ADR-0005) | Предыдущая версия |
Ответы на остальные вопросы#
| Вопрос | Ответ | Пометка |
|---|---|---|
| Может ли предыдущая версия всё это прочитать? | Зависит от изменения. Именно это и станет условием допуска — см. решение | [диф] |
| Есть ли необратимые действия | Да, и они непрерывны: каждая принятая подача порождает квитанцию | [требования] |
| Чем меряем, что стало хуже, и против какой базовой линии | Доля отказов приёма и время до вердикта. Базовой линии в первом окне нет | [нет данных] |
| Кто решает об откате и по какому числу | Дежурный. Число — из строки выше, и его пока нет | [орг] |
| Сколько живёт окно, когда работают обе версии | Минуты при поэтапном выкате | [расчёт] |
Дисквалификаторы#
| Дисквалификатор | Сработал | Что из этого следует |
|---|---|---|
| Состояние мира несовместимо, а план отката записан | Не сработал пока — станет условием допуска каждого выката | |
| Критерий отката не выражен числом | Да | Базовой линии нет: первое окно. Работа до: нагрузочная репетиция до 1 апреля даёт базовую линию по доле отказов и времени до вердикта |
| Откат ни разу не исполнялся | Да | Гринфилд: откатывать было нечего. Работа до: откат исполняется на репетиции, а не предполагается. Это и даёт пометку [проба] |
| Необратимое действие выполняется раньше, чем выкат признан удачным | Да, и это главное | Квитанция выдаётся непрерывно. Работа до: новая версия не выдаёт квитанций, пока выкат не признан удачным — см. решение |
| Сообщения, написанные новой версией, будут прочитаны старой | Да | Очередь отложенных проверок и состояния машины сверки. Работа до: формат записей обеих совместим в обе стороны; сужающие изменения формата — только вне окна |
Первые два отсекают готовность выкатывать — и отсекли. До проведения репетиции выкатывать внутри окна нельзя вообще: ни критерия, ни исполненного отката.
Рассмотренные варианты#
Матрица раздела 3 снимком. Ось «наблюдаемость отличия версий» вычеркнута: при любой форме версия видна в журнале одинаково, формы по ней не различаются.
| Ось | Что записывать | Двухшаговое + канарейка без квитанций | Фича-флаг | Отказаться от отката | Нулевой: не обеспечивать |
|---|---|---|---|---|---|
| Степень обратимости | По строкам состояния мира; итог — худшая | Полная по всем строкам (таблица ниже) | Полная по поведению, условная по схеме [диф] |
Отсутствует по определению | Неизвестна до инцидента [нет данных] |
| Цена обеспечения | Чем платим заранее | Два выката плюс канареечный период без выдачи квитанций [расчёт] |
Флаг и риск, что он останется [замер] |
Цена способа жить с ошибкой | Ноль до инцидента |
| Длительность отката | От решения до прежнего состояния | Минуты [проба] — после репетиции |
Секунды [проба] |
Отката нет | [нет данных] |
| Окно сосуществования | Сколько времени работают обе версии | Задано сроком между шагами: часы [расчёт] |
Задано стратегией выката: минуты | Не возникает | Минуты |
| Что остаётся необратимым | Что не отменяет ничто | Квитанции, выданные до отката — их не будет, канарейка их не выдаёт | Квитанции, выданные под флагом | Всё | Всё, что успело уехать |
Нулевой вариант проиграл по двум осям сразу — степень неизвестна, необратимое не ограничено — и это ровно тот случай, ради которого колонка обязательна: без неё сравнение шло бы между способами обеспечить обратимость, а вопрос «а надо ли» не задавался бы.
Степень обратимости по строкам состояния мира#
| Строка | Степень | Чем обеспечена |
|---|---|---|
| Схема данных | Полная | Только расширяющие изменения внутри окна |
| Очередь отложенных проверок | Полная | Формат записи совместим в обе стороны |
| Состояние машины сверки | Полная | Новые состояния внутри окна не вводятся |
| Кэши | Полная | Теряются при перезапуске, перечитываются |
| Конфигурация и флаги | Полная | Значения, понятные обеим версиям |
| Внешние контракты (квитанции) | Полная — только потому, что канарейка их не выдаёт | Иначе была бы «отсутствует» |
Итоговая степень — полная, и она равна худшей строке. Худшая строка здесь сделана полной не свойством изменения, а запретом: новая версия не выдаёт квитанций до признания выката удачным.
Решение#
Внутри окна выкатывается только то, что полно обратимо по всем шести строкам состояния мира. Условие допуска проверяется на каждом выкате, а не однажды.
| Правило | Содержание |
|---|---|
| Канарейка без квитанций | Новая версия принимает трафик только на чтение и на проверку; выдачу квитанций ведёт прежняя версия, пока выкат не признан удачным |
| Признание удачным | 30 минут при доле отказов не выше базовой линии плюс два процентных пункта [проба] — число уточняется репетицией |
| Сужающие изменения | Схема, формат очереди, состав состояний машины — только вне окна |
| Критерий отката | Доля отказов приёма выше базовой линии плюс пять процентных пунктов или время до вердикта выше базовой втрое. Применяет дежурный, единолично, без согласования |
| Тяжёлый расчёт | Внутри окна не запускается — правило из ADR-0004 |
| До первого окна | Репетиция с исполненным откатом. Без неё выкаты внутри окна запрещены |
Обоснование#
Решала не форма, а необратимое действие. Квитанция — единственная строка состояния мира, которая после отката остаётся у чужой организации. Всё остальное обратимо дёшево; ради этой одной строки введён канареечный период, и без него итоговая степень была бы «отсутствует» при пяти полных строках из шести — ровно тот случай, ради которого документ требует таблицу по строкам, а не одну степень на изменение.
Базовая линия вместо абсолютного порога. Соблазн записать «доля отказов выше 5 %» велик и ошибочен: в последние 48 часов окна доля отказов растёт сама по себе — лица правят документы и шлют повторно. Порог без базовой линии сработает от нормальной нагрузки.
Последствия#
Что придётся построить: канареечный режим, в котором версия обслуживает всё, кроме выдачи квитанций; репетицию с исполненным откатом; сбор базовой линии; проверку совместимости формата очереди в обе стороны.
Что становится дороже. Любая срочная правка внутри окна едет вдвое дольше: канареечный период плюс признание. Двадцать дней в году система становится медленной в изменениях — и это цена того, что чужой штраф не возникает из нашей ошибки.
Отрицательное последствие. Запрет на сужающие изменения внутри окна означает, что ошибка в схеме, обнаруженная 3 апреля, живёт до 21-го. Обойти это нечем: сужение необратимо по определению.
Чего лишаемся. Возможности исправить дырявую валидацию внутри окна — она же запрещена обещанием из ADR-0001. Два разных документа пришли к одному запрету с разных сторон.
Условия пересмотра#
- Репетиция показала, что откат длится не минуты.
- Появилась строка состояния мира, не перечисленная выше.
- Базовая линия собрана по первому окну — числа уточняются.
- Квитанции перестали быть единственным необратимым действием.
Связанные ADR#
Зависит от ADR-0005 (состояние машины сверки), ADR-0006 (очередь отложенных проверок) и ADR-0001 (квитанции наружу).
Замечание 11 · Матрица D-09 v3.0 применена впервые — автором, и это видно#
Раздел «Матрица оценки» появился в D-09 три дня назад, развилкой Ж4, и написал его тот же, кто ведёт этот прогон. Независимой проверки между написанием и применением не было — то есть повторён ровно тот порядок, который мастер-шаблон запрещает для новых документов и не требует для правок.
Что при применении оказалось не так. В матрице записано: «первый кандидат на вычёркивание — окно сосуществования: оно чаще задаётся стратегией выката извне и у всех форм одинаково». На этом кейсе вычеркнулась другая ось — наблюдаемость отличия версий, — а окно сосуществования как раз различает формы: у двухшагового изменения оно часы, у остальных минуты.
Ошибка безвредная: документ велит вычёркивать ось, показав это на своём изменении, «а не по умолчанию», и это правило спасло. Но догадка автора о том, какая ось лишняя, оказалась неверной на первом же применении.
Замечание 12 · Таблица по строкам состояния мира сработала так, как задумано#
v2.0 ввёл правило: степень назначается по строкам, итог равен худшей. Здесь это правило дало нетривиальный результат: пять строк полные, шестая — квитанции — была бы «отсутствует», и итог был бы «отсутствует» при почти полной обратимости всего остального.
Одна строка из шести определила решение. Одна степень на изменение этого не показала бы: она дала бы «отсутствует» без указания, что именно её обнуляет, — и канареечный период, снимающий ровно эту строку, никто бы не придумал.
Это первое подтверждение правила v2.0 в другом кейсе, а не в том, из которого оно выведено.