Перейти к содержанию

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 в другом кейсе, а не в том, из которого оно выведено.