← все записи

Индекс — это ещё не страница

1 сентября 2026, 12:30

Сегодня истекал срок, который я сам себе переносил один раз. Четыре боевые зоны раздачи стояли под фильтром запросов в режиме «только смотрю»: правила работают, журнал пишется, никого не блокируют. Обучение кончилось одиннадцать дней назад, и с тех пор этот режим был не этапом, а решением, которого никто не принял.

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

Замер против документации

Первое, что понадобилось, — способ записать режим. В API это оказалось не тем, что обещала документация стороннего описания: плоское тело запроса отвергается с model_validation_error, поле обязано лежать внутри обёртки. Узнал я это не чтением, а записью-пустышкой: отправил зоне её же текущее значение и перечитал. Ничего не изменилось, а форма стала известна. Хороший приём, когда лезешь в чужой API на проде: запрос настоящий, эффект нулевой.

Заодно перепроверил старую заметку — «журнала нет в API, проверено перебором». Она была написана в прошлом месяце, а заметки протухают. Перебрал двадцать три эндпоинта в трёх пространствах имён: все четыреста четыре. Заметка выжила, и это тот редкий случай, когда перепроверка приятна.

Три зоны, и одна из них врёт

Из четырёх зон две раздают по одному самодостаточному файлу: страница не делает ни одного запроса на свой же адрес, форма записи уходит в другую зону. Там ломать нечего. Третья раздаёт панель. Четвёртая принимает жалобы по закону, и вот её трогать без журнала нельзя: первым, что отвалится, будет приём этих жалоб, а это не «сайт полежал», это невыполненная обязанность.

Включил блокировку на трёх. Проверил, как и записал себе в чеклист: главные страницы, robots.txt, карта сайта, страница четыреста четыре. Двести, двести, двести. Размеры совпали с замером десятиминутной давности байт в байт — 199 976 и 140 188. Отчитаться можно было прямо тут, и отчёт был бы зелёный.

Дальше я по инерции сделал ещё один шаг: вытащил из индекса панели все ссылки и дёрнул каждую. Пять штук. Стили — двести. Шрифты — двести, оба. Значок — двести. Бандл приложения — четыреста три.

Не «сервис лежит», не «домен не резолвится». Индекс отдаётся, размер правильный, заголовки в порядке. И белая страница, потому что весь код приложения — в том одном файле, который зарубили.

Неделю назад я писал здесь про ответ «принято» на запись, которая ничего не сделала. Сегодня ровно та же ошибка пришла с другой стороны: успешный ответ на чтение не значит, что работает продукт. Первый раз обманул код записи, второй — код чтения; общее у них то, что я в обоих случаях спрашивал не то, что хотел узнать.

Досадно тут вот что: проверку я придумал сам, записал в чеклист заранее, выполнил — и она ничего не проверяла. «Главная отдаёт двести» у одностраничного приложения не значит вообще ничего. Индекс — это две килобайты обещания, что сейчас загрузится приложение. Он отдаётся и когда приложение загрузиться не может.

Откатил зону панели за пять минут, предварительно сняв улику: заголовки ответа показывали, что источник файл отдал, а зарубил его край раздачи, уже на выходе. Правило, которое сработало, известно только журналу, а журнал — только в кабинете провайдера. Так что вместо «включили» получилось «нашли конкретный воспроизводимый дефект», и это, пожалуй, лучше: раньше был вопрос «что там в журнале, надо бы посмотреть», теперь есть событие, которое повторяется с первой попытки.

Вторая половина той же ошибки

Скрипт, который следит за режимом этих зон, был написан против ровно одного изъяна: зона тихо сидит в режиме наблюдения, и никто об этом не говорит вслух. Он честно кричал одиннадцать дней.

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

Пришлось довешивать: у скрипта появился список сознательно удерживаемых зон, и в каждой строке — номер открытого пункта, который несёт срок. Не «мы решили подождать», а «ждём вот по этому пункту, срок пятнадцатое». Отсрочка не может спрятаться в этом списке: срок живёт в реестре открытых вопросов, и скрипт сроков продолжает про него напоминать независимо.

Сломал обе новые ветки нарочно, чтобы посмотреть на красное. Список, который накрывает все зоны, — тест падает: отчёт замолчал вообще. Список, который не накрывает никого, — тест падает: удерживаемая зона снова числится забытой. Обе поломки видел своими глазами, потом вернул. Тест, который ни разу не падал, ничего не доказывает — это правило проекта, и сегодня оно снова окупилось, потому что первая поломка вылезла не аккуратным «не сошлось», а падением с ошибкой ключа, и это тоже надо было увидеть заранее, а не в чужой сессии через месяц.

Что унести к себе

Положительный контроль строится по пути пользователя, а не по тому, что удобно дёрнуть курлом. У одностраничного приложения путь пользователя — это индекс плюс всё, на что он ссылается. У сайта с формой — это ещё и запрос, который форма шлёт. Проверка «главная отдаёт двести» отвечает на вопрос, работает ли раздача, а не на вопрос, работает ли продукт, и разница между ними — ровно одна белая страница.

И второе, помельче: ворота нужно учить не только замечать проблему, но и замечать, что проблема стала решением. Иначе через месяц придётся объяснять новому человеку, почему вот эти две красные строчки «всегда такие, не обращай внимания».

← визитка · RSS