Шесть тридцать три по Москве. На телефоне у меня два будильника — 06:30 и 06:45, второй я поставила в воскресенье «на случай» и с тех пор ни разу им не воспользовалась, но и не убрала. В 06:36 в ленте одна новая строка: влито.
Влита правка 2222 — мелкая по описанию и неприятная по смыслу: 148 добавленных строк, 10 удалённых, 11 файлов. Она чинит ошибку, из-за которой с 23 октября нельзя было сохранить ни один снимок двух модельных нод.
Что именно не сохранялось
Сообщение об ошибке выглядело так: `unrecognized_keys ["id"]` — и путь, `document.node.inputsArray[1]` и `inputsRaw[1]`. Владелец увидел его 4 ноября, когда пришёл руками применять правку маршрутизации у Seedance 2.5, и получил отказ вместо сохранения.
Причина в контракте, который появился 23 октября. Схема проверки входов была написана для дескрипторов инбокса — у них поля `id` нет и быть не должно. Потом её же применили к документу авторства, где лежат входы нод, а у пула референсов Seedance `id: 'reference'` есть по делу: у 2.0 его ставит миграция от 11 сентября, у 2.5 он прописан прямо в строке каталога.
Отсюда одиннадцать дней отказа на двух потребителях сразу: чат Нодсмита и сохранение версионируемого редактора. Оба отвечали ошибкой, оба не говорили, что именно нельзя сохранить.
![Цитата на тёмном фоне: так выглядел отказ — unrecognized_keys ["id"] с путём document.node.inputsArray[1]](/assets/covers/2026-11-05-otkaz-molchal.png)
Почему это молчало
Валидатор назвал ключ и путь. Он не назвал схему — а ключ `id` для каталога законный. Значит, сообщение указывало на поле, которое в порядке, и молчало о том, что не в порядке: что проверяют не той схемой.
Это не редкая ошибка и не чья-то небрежность. Строгая схема, написанная для одного потребителя, при переиспользовании превращается в запрет на данные другого — и обнаруживается только тем, кто уже собирался эти данные записать. За одиннадцать дней никто не собирался: правку маршрутизации понесли вручную.
Что нашло перекрёстное ревью
Правку смотрел Codex gpt-6.1-sol: ноль критических, три средних, одно низкое — все закрыты вторым коммитом, второй круг не запускали, потому что критических не было.
Средние замечания важнее самой починки. Идентификатор пула адресовали как имя входа: `setInput({id:'reference', type:'image'})` заменял пул Seedance одной картинкой, `removeInput('reference')` удалял пул целиком. Установка пула стирала его `id`, из-за чего потом срабатывал ложный конфликт ручной правки. Новая семья с пулом проходила проверку и падала уже на публикации; теперь отказ приходит до записи.
Низкое замечание оказалось тем, ради чего всё затевалось. Правка маршрутизации шла через функцию, которая снимала сохранённый `max_count` пула, — а сводка каталога читает это поле сырым. То есть «до 20 референсов» у Seedance 2.5 исчезло бы из интерфейса сразу после той самой правки маршрутизации, с которой началась история. Починили и это.
Ворота и что они стоят
Проверка по описанию правки: `tsc --noEmit` — ноль ошибок, линт — ноль (28 прежних предупреждений), сборка — exit 0, тесты на голове `3f18c762` — 2335 файлов и 39 221 тест, все прошли. На первом коммите был один таймаут харнесса, его перезапускали отдельно: 114 из 114.
Главное в этом абзаце — не числа, а то, как они получены. Все восемь workflow в репозитории выключены вручную с 30 октября, включая CI и авто-деплой: ворота идут в контейнере руками. Поэтому отчёт о прогоне лежит комментарием к правке, а не в ленте Actions, где его никто не увидит.
Тесты на прежнем коде падают — это проверено подменой файла, а не рассуждением; контракт с базой прошёл 36 из 36 на одноразовом PostgreSQL, и на старом файле материализации два новых теста падают. Браузером не проверяли: нужен локальный стек с каталогом Seedance, вход администратора и платный ход модели. Ту же ошибку воспроизводит тест, и это единственное основание считать её закрытой.
Чем день не закончился
Влито — не выкачено. В описании правки прямо стоит: после выкатки владелец повторяет запрос Нодсмиту на правку маршрутизации. Пока этого не случилось, ошибка закрыта в коде и открыта в продукте, и я не буду писать «починили», пока кто-то не прошёл этот путь руками.
В очереди на слияние на утро — 38 открытых правок, из них 19 не черновиков и 18 без конфликтов. Предыдущее слияние до этого было вчера в 16:07 МСК; правка цены, из которой считается маржа, всё ещё открыта с 4 ноября. То есть сегодняшняя строка в ленте — единственная за четырнадцать с половиной часов, и это тоже факт о дне, а не о людях.
Цена этой истории измерима: одиннадцать дней и один человек, который случайно пришёл делать другое. Ошибка была видна только тому, кто уже собирался ею воспользоваться, — а таких за одиннадцать дней нашёлся ровно один.
