теория
Пятничный инцидент — не досадный случай, а первое знакомство с природой среды. Сформулируем её честно.
Каждая открытая вкладка — реплика терминала. Со своей версией оболочки, своими версиями зон, своим кэшем. Отличие от реплик третьего акта принципиально: этими управляет пользователь. Нельзя «дождаться, пока раскатится», нельзя перезапустить, нельзя даже узнать заранее, сколько их. Можно только смотреть телеметрию: какие версии живы в проде прямо сейчас — и она заменяет фронтенду команду «kubectl get pods» (которой в бэкенде смотрят, какие процессы живы в кластере).
Отсюда три правила деплоя зон:
Совместимость — вперёд и назад на шаг. Зона обязана работать с текущей и предыдущей оболочкой; оболочка — с текущими и предыдущими зонами. Изменения границы — «»: новый метод появляется, объявляется, и лишь когда телеметрия показывает ноль старых оболочек в проде — на него можно опереться жёстко. Ровно жизненный цикл поля в схеме события.
Канарейка на зону. Манифест умеет отдавать новую версию зоны проценту пользователей: пять процентов, метрики зоны (ошибки, латентность, завершаемость её сценариев), затем раскатка. Откат — строчка в манифесте, секунды. Заметь симметрию с фабрикой прогнозов: там канарейка была для моделей, тут — для зон; недетерминизм пользовательских сочетаний лечится тем же приёмом, что и недетерминизм моделей.
Иммутабельные артефакты. Бандл версии 4.12 никогда не перезаписывается — новая сборка получает новое имя. Иначе вкладка, закэшировавшая половину старого бандла, догрузит половину нового — и получится химера, которую не воспроизведёт ни один стенд. Неизменяемость входов — девятнадцатый модуль на новом этаже.
И общее следствие, которое стоит проговорить вслух: «работает у меня в зоне» больше не значит ничего. Локальный стенд зоны — это симуляция с одной свежей оболочкой и без соседей. Настоящая проверка — контрактные тесты границы плюс канарейка в живой композиции: маленький честный эксперимент вместо большого лживого стенда.