В 5:37 утра во дворе ещё темно, берёзы стоят чёрными, и единственное, что светится, — телефон экраном вверх на подоконнике. В main приехал PR. Я не стала открывать диф: в такое время читается не код, а текст описания, — и в описании оказалось интереснее, чем в изменениях.

Номер 2130, девятнадцать коммитов, 86 файлов, плюс тысяча девятьсот пятьдесят строк и минус двести двадцать шесть. Название скучное до непроницаемости: восстановление публикации в NodeSmith и состояние оценок и сохранения на канве. За ним — четыре конкретные поломки, каждая из которых выглядит как мелочь ровно до того момента, когда попадает в руки человека.

Четыре поломки, которые не постыдно назвать вслух

NodeSmith мог восстановить устаревший черновик — то есть вернуть не то, что человек правил последним. Мог сообщить о конфликте сразу после собственной публикации, хотя никакого конфликта не было. Мог пометить как изменённую свежеоткрытую форму каталога, к которой никто не прикасался. Канва теряла обратный перетаск, если сохранить первый сдвиг: предмет уезжал и не возвращался на место.

Это те ошибки, за которые не дают медалей и которые стоят дороже падения сборки. Сломанный билд виден всем сразу. Ложный конфликт видит один человек и решает, что инструмент ему врёт — а после третьего раза перестаёт доверять и остальному.

Инфографика: 86 файлов, +1950/−226 строк, четыре платных сценария, сверка счёта $0.75
По описанию PR 2130. Цифры — из отчёта автора изменения, не из моего прогона.

Порядок, который важнее содержимого

В описании PR есть строка, из-за которой я, собственно, и села писать: ручная приёмка на стенде шла до финальных широких проверок. Не после — до. Сначала человек прошёл сценарии руками, потом включились автотесты.

Сценариев было четыре, все платные, все настоящие: текст, изображение с полным набором настроек AUTO, null и лимитом тридцать, видео-референс и смешанный случай. Списано 75 ⚡, резерв AUTO вернул 125 ⚡, а счёт провайдера, который выставляется независимо от нас, совпал по каждой задаче и дал в сумме $0.75. Совпадение до цента — это не про аккуратность бухгалтерии. Это доказательство, что деньги списываются за то же, что реально уехало в генерацию.

На том же стенде прошла публикация Wan 3.0 v6 с тремя активными маршрутами. Отдельно проверялось то, чего в отчётах обычно не пишут: сессия браузера, которая начала публикацию, довела её сама, без выдуманного конфликта, и шесть ревизий с метками остались на месте.

Где сэкономили и где не стали

В том же PR есть правка, которая не про продукт для клиента, а про тех, кто читает код через инструменты. Разбор файла и пяти комментариев по двести тысяч знаков на прежней версии занимал 425 миллисекунд, теперь около двенадцати.

Можно было бы подкрутить порог и объявить победу. Порог не тронули: тест по-прежнему требует уложиться в двести миллисекунд, и искусственно замедленное редактирование секретов его по-прежнему валит. Проверка, которую ослабили, чтобы она прошла, — это не проверка, это отчёт о проверке.

И честная поправка к самой себе. Вчера вечером этот же PR стоял у меня в заметках черновиком: плюс тысяча восемьсот восемнадцать, минус двести двенадцать. К моменту влития в нём девятнадцать коммитов и другие цифры — плюс тысяча девятьсот пятьдесят, минус двести двадцать шесть. Заметка была свежей утром и устарела к ночи; так бывает с любым снимком незакрытой работы, и потому вчерашние числа я не переношу в сегодняшний текст.

Второй стакан на подоконнике рядом с телефоном пустой с вечера. Я его не убрала, потому что убирать — это шум.

Merge здесь не выкатка, и это стоит сказать прямо: авто-деплой на main в 7:21 по Москве завершился со статусом skipped, прод не тронут. Uptime-проверки идут кругами по двадцать минут, и это единственное, что сейчас говорит о production. Открытым висит 2129 — показ доступных функций коннектора и настройка ChatGPT с Hermes, плюс тысяча триста пять строк: работа идёт, но она не влита, и выдавать её за сделанное я не стану.