← Все релизы EN  RU

Контроль изменений — пятница, 7 августа

v2.1.0

Не в проде — это кандидат на пятницу, и ничего здесь не смотрел никто, кроме автора.

Редирект на чужого производителя закрыт для BRIGGS и ещё 19 кодов поставщиков Vova на dev фикс front#3422

Что это Срочный фикс в прошлую среду перестал уводить покупателя на деталь другого производителя — для тех кодов, которые он умел разбирать. Разбирал он не все: шестибуквенные коды вроде BRIGGS и любой код с подчёркиванием проваливались сквозь ту самую защиту, которую он только что поставил. Теперь она закрыта и для них: неразрешимый брендированный код говорит, что деталь не найдена, вместо того чтобы угадывать.

Как проверяем Заявленный, но неразрешимый брендированный URL отдаёт 404 вместо редиректа на деталь другого производителя; голый номер детали и разрешимый брендированный код не затронуты.

Доказательства Измерено сегодня, тем же методом, что и на прошлой неделе — -A crop-audit, с чтением отданного заголовка страницы, а не только кода ответа.

URLпрод сейчасcrop-dev.app
/parts/CT-HARVEST_TEC-004-650033-SS 308 → CT-NHL-SS → 200 "GENERAL · SS · New Holland" 404 "Part Not Found"
/parts/CT-FIA-5103868 (контроль, унаследованный бренд) 308 → CT-NHL-5103868 308 → CT-NHL-5103868 — без изменений

Масштаб, по вторничному замеру на проде: 1,012 URL по 20 кодам поставщиков — 679 точных коллизий номеров деталей, 333 обрезаются до чужого производителя и чужой детали, как в строке выше. На один BRIGGS приходится 355.

Откат или доводка Доводка. Изменилась только та ветка защиты редиректа, которая раньше пропускала всё; 58 из 58 тестов проходят, четыре независимых человека пытались её сломать и не смогли. Откатить мердж-коммит, если код, который должен разрешаться, начнёт отдавать 404.

Каталог деталей теперь показывает деталь на телефоне без прокрутки Vova на dev фикс front#3405

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

Как проверяем На том самом размере экрана, на котором рендерит мобильный индекс Google (390×844), карточка товара — картинка, цена, Add to Cart — видна без прокрутки.

Доказательства Тот же URL, тот же вьюпорт, до и после:

prod /parts on a phone, no product visible above the fold
До — прод, /parts
dev /parts on a phone, a product card fully visible
После — dev, тот же маршрут

Откат или доводка Откат — только вёрстка, ничего не сохраняется.

Часть деталей поставщиков перестала показывать голый номер как товар, который покупаешь Vova на dev фикс search#858

Что это Для кодов поставщиков, которые поисковый индекс не распознавал (BRIGGS, AGCO и другие), деталь, которую покупатель реально положит в корзину, несла голый номер вместо брендированного — это обратная сторона бага с редиректом выше, только со стороны поиска, а не страницы.

Как проверяем Ищем номер, который пересекается у разных производителей; каждая карточка несёт брендированный номер своего производителя, ни одна не откатывается к голому номеру детали.

Доказательства Подтверждено вживую на dev-бэкенде после деплоя, а не только по зелёному CI — ревизия search-nest-00268-pev, latestReady == latestCreated, 100% трафика, тег образа точно совпадает с мердж-коммитом.

Поиск 5103868прод сейчасcrop-dev.app
Страницы деталей, куда ведут карточки CT-NHL-5103868, CT-FER-5103868, CT-BRIGGS-5103868 CT-NHL-5103868, CT-FER-5103868
Куда ведёт карточка BRIGGS 308 → /parts/CT-NHL-5103868 — деталь другого производителя карточки нет

Откат или доводка Откат — один деплой предыдущей ревизии, данные не менялись.

Глубокие страницы каталога деталей больше не возвращаются пустыми, делая вид, что всё в порядке Vova на dev фикс search#861

Что это В каталоге 1,000 страниц деталей. Примерно после страницы 900 страница иногда возвращалась совершенно пустой — ни деталей, ни сообщения, и при этом она отчитывалась Google как нормальная страница. Так происходило, когда список деталей строился дольше пяти секунд: количество результатов приходило, а сами результаты нет, и заметить это и сказать об этом умела только первая страница. Теперь любая страница на любой глубине, которую не удалось построить, говорит «занято, попробуйте ещё раз» вместо пустой полки, а Google получает указание не запоминать пустую версию.

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

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

URLпрод сейчасcrop-dev.app
/parts?page=960200, 40 карточек товаров200, 40 карточек товаров
/parts?page=40200, 40 карточек товаров200, 40 карточек товаров
глубокая страница загружена 6 раз подряд200, 40 карточек в 6 из 6 — пустое состояние сегодня не воспроизвелось200, 40 карточек в 6 из 6 — пустое состояние сегодня не воспроизвелось
страница далеко за концом каталога400, отказ400, отказ

Откат или доводка Откат — это одна подмена образа на поисковом сервисе, и он возвращает прежнее поведение, то есть пустую страницу. Со стороны фронтенда откатывать нечего.

Счётчики фильтра по бренду теперь совпадают с числом деталей, которое реально получаешь, а фильтр наличия больше не показывает один и тот же вариант дважды Vova на dev фикс search#860

Что это Фильтр по бренду в боковой панели поиска считал детали, которые на сайте не продаются, поэтому число на кнопке обещало намного больше, чем давал клик по ней — на поиске FASTENERS кнопка Ford говорила 22,466, а результатов было 6,268. У фильтра наличия была вторая проблема: несколько внутренних кодов наличия означают для покупателя одно и то же — «нет в наличии», и каждый рисовался отдельной кнопкой, поэтому один и тот же вариант появлялся по нескольку раз. Теперь счётчик по бренду строится из того же набора деталей, что и сетка результатов, а варианты наличия объединены в одну кнопку каждый.

Как проверяем Для одного поиска число на кнопке бренда должно равняться числу результатов после клика по ней, и ни один вариант наличия не должен встречаться больше одного раза.

Доказательства Мы запросили у обоих поисковых сервисов панель фильтров и счётчик результатов для одного и того же поиска, FASTENERS, и прочитали числа буквально.

Что считалипрод сейчасcrop-dev.app
Кнопка Ford (FRD), поиск FASTENERS22,4666,268
Результатов реально получаешь по Ford6,2686,268
Кнопка New Holland (NHL)114,89764,057
Кнопка Fiat (FIA)6,4142,386
Сколько раз «нет в наличии» появляется в фильтре наличия5 отдельных кнопок1 кнопка

Откат или доводка Откат — это одна подмена образа на поисковом сервисе, и он возвращает завышенные числа по брендам. Ещё два числа в фильтрах — кнопки категорий и общий итог — по-прежнему завышены, потому что приходят со стороны базы данных, а это отдельная работа, уже заведённая.

Сортировка результатов поиска по лидерам продаж больше не показывает одну и ту же деталь дважды на разных страницах — после того как применят изменение в базе Vova на dev изменение search#854

Что это Когда покупатель сортирует результаты поиска по лидерам продаж, вторая страница может повторить деталь, которая уже была на первой, а какая-то другая деталь не показывается вовсе. Причина в том, что набор деталей, из которого мы выбирали, рос тем больше, чем глубже покупатель листал, поэтому каждая страница была на самом деле другой сортировкой, а не продолжением. Изменение делает этот набор зависимым только от того, что набрали в строке поиска, поэтому все страницы берутся из одной и той же сортировки. Для покупателя пока ничего не меняется: это только половина в коде. Парное изменение в базе применяет Alex, и пока Alex его не применит, сайт ведёт себя ровно так же, как сегодня.

Как проверяем Запросить первую и вторую страницу одного и того же поиска по лидерам продаж и проверить, что ни один номер детали не встречается на обеих.

Доказательства Мы запросили у поискового сервиса живого сайта и у кандидатского первую и вторую страницы по запросу «oil filter» с сортировкой по лидерам продаж и сравнили вернувшиеся номера деталей; сегодня они идентичны, и это и есть доказательство, что для покупателей пока ничего не изменилось.

Что считалипрод сейчасcrop-dev.app
Детали на странице 1, «oil filter», лидеры продаж47943212, 47617638, 51441620, 51575943, 31RF-1055047943212, 47617638, 51441620, 51575943, 31RF-10550
Детали на странице 2, тот же поискD8NNM903EB, 31RF-10550, 84475969, 48145957, 31RF-10050D8NNM903EB, 31RF-10550, 84475969, 48145957, 31RF-10050
Деталей, повторяющихся на обеих страницах1 (31RF-10550)1 (31RF-10550)
Изменение в базе примененоне примененоне применено

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

Все хлебные крошки теперь строятся из одного списка и начинаются с Home Vova на dev фикс front эпик #3407

Что это Аудит по всему сайту в понедельник показал, что хлебные крошки (полоска «Home > Parts > …» и парные к ней данные, которые читает Google) в большинстве мест собирались вручную на каждой странице, поэтому видимая цепочка и то, что видит Google, могли расходиться. Четыре конкретных дефекта, которые он нашёл, исправлены: страница схем сообщала Google о родителе, на которого ни разу не ссылалась; на странице «не найдено» пропадало среднее звено; две разные реализации рендера одной и той же крошки; и страница «Parts» называлась на одной и той же странице по-разному. Вместе с этим едет одно изменение политики: цепочка теперь всегда начинается с «Home». Это отменяет более узкое решение, принятое в июне (issue #1201), которое намеренно убрало Home с шести типов страниц — лучше сказать прямо, чем позволить тому, кто следующим прочитает старое решение, откатить это по ошибке.

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

Доказательства Ниже три дефекта из пяти, каждый перемерен сегодня:

Страницапрод сейчасcrop-dev.app
Карточка техники (например, Workmaster-95)Equipment > New Holland > …Home > Equipment > New Holland > …
Вкладка схем бренда (/parts/brand/mchale/diagrams) schema: Home > Parts Diagrams > McHale > Fixed Chamber Round Balers schema: Home > Brands > McHale
Название страницы Parts«Parts Store» в данных, «Parts» на экране«Parts» и там, и там

Сама проверка зелёная на этой ветке (CI-джоб pr-localhost-crawl).

Откат или доводка Предпочтительна доводка — откат вернёт настоящий, пусть и меньший, дефект (заимствованная цепочка — это реальное нарушение правил Google); чистый откат доступен, если изменение «Home первым» понадобится отменить отдельно.

Неизвестный тип схемы перестал возвращать фальшивое «страница найдена» Denis на dev фикс front#3374

Что это Любое выдуманное слово после /diagrams/type/ на странице бренда открывалось как обычная страница — неограниченное число фальшивых страниц, которые Google мог попытаться проиндексировать.

Как проверяем Несуществующий тип отвечает «не найдено», а не «найдено».

Доказательства

/parts/brand/mchale/diagrams/type/<made-up>продdev
Статус200404

Откат или доводка Откат — один файл маршрута, ничего не сохраняется.

Страницы брендов — 3

Баннер бренда перестаёт менять высоту в зависимости от длины описания Vova на dev фикс front#3419

Что это Высота баннера бренда была такой, каким оказывался вводный абзац, поэтому от бренда к бренду она гуляла до 23 пикселей без причины, которую покупатель мог бы заметить, а вдобавок два компонента, которые его рисуют, расходились в размере заголовка и отступах.

Как проверяем Два бренда с одинаковой вёрсткой дают одинаковую высоту баннера независимо от длины описания.

Доказательства Высота баннера измерена сегодня на обоих сайтах на ширине телефона (390 × 844), считана с отрендеренной страницы:

Высота баннера бренда на 390pxпрод сейчасcrop-dev.app
New Holland Agriculture256px214px
Kress233px214px
Разница между двумя брендами23px0px

Те же два бренда, тот же размер телефона, до (высота ещё гуляет) и после (фикс на dev):

New Holland brand banner, prod
До — New Holland
Kress brand banner, prod
До — Kress
New Holland brand banner, dev
После — New Holland
Kress brand banner, dev
После — Kress

Откат или доводка Откат — только стили, ничего не сохраняется.

Первые картинки на странице брендов теперь грузятся сразу, а логотип сайта сохраняет один и тот же адрес между релизами, поэтому вернувшийся посетитель переиспользует уже скачанную копию Vova на dev фикс front#3421

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

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

Доказательства Мы запросили https://crop.clintontractor.net/brands и https://crop-dev.app/brands 2026-08-06 с нашим аудиторским идентификатором и посчитали пометки в отданной нам странице.

Что считалипрод сейчасcrop-dev.app
Плиток брендов первого экрана с пометкой "может подождать" на /brands2 из 20 из 2
Картинок с пометкой "может подождать" на всей странице2321
Картинок, которые браузеру велено запросить первыми1 (только баннер)3 (баннер плюс две плитки первого ряда)
Адрес логотипа/images/clinton-tractor-logo-sm.webp?dpl=dpl_Gu7sTvVtYeka2mzsoFRZNRFmf6PY/images/clinton-tractor-logo-sm.webp
Страница вернула200200

Откат или доводка Обе части маленькие и независимые, поэтому любую можно вернуть отдельно, не задев остальную страницу. Тексты, цены и ссылки на странице брендов не тронуты, так что откат только снова замедлит первые картинки.

Наши собственные картинки наконец уменьшаются перед отправкой Vova на dev фикс front#3459

Что это На сайте есть шаг, который уменьшает картинку до размера, реально нужного экрану посетителя. Последние 35 дней этот шаг тихо пропускал две целые группы картинок — те, что лежат вместе с самим сайтом, и те, что в наших четырёх бакетах Google Storage, а это большая часть фотографий брендов и техники. Они уходили в полном размере каждому посетителю и на любое устройство. Теперь они проходят через уменьшение, как и всё остальное.

Как проверяем На странице брендов наши собственные картинки запрашиваются через адрес ресайза, а не напрямую из бакета.

Доказательства Измерено сегодня с -A crop-audit на /brands, посчитаны различные адреса картинок в странице, которую отдаёт сервер:

Что считалипрод сейчасcrop-dev.app
Картинок, проходящих через шаг ресайза013
Страница вернула200200

Отчётная запись самого изменения измерила эффект на той же странице как 5.03 MB и 18.5 секунды до главной картинки на проде против 1.61 MB и 9.8 секунды на dev. Это замер скорости страницы, а не код ответа, поэтому он процитирован из изменения, а не перемерен здесь.

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

Удалённые страницы — 1

Два общесайтовых каталога схем удалены, а их адреса теперь сообщают, что страница удалена Vova на dev удаление front#3346

Что это У нас были два общих каталога схем «по всем брендам», живших отдельно от страниц брендов и техники. На живом сайте эти адреса всё ещё открываются, а некоторые из них тихо перенаправляют куда-то ещё. На кандидатском сайте они выведены из обращения: любому, кто откроет такой адрес, прямо сообщают, что страница удалена, и никуда ничего не перенаправляется. Сохранённая или пересланная ссылка на любой из этих адресов теперь говорит, что страница удалена, и не перенаправляет, поэтому посетителю придётся начать заново со страницы бренда или техники. Сами схемы никуда не деваются: они остаются на странице бренда по адресу /parts/brand/{brand}/diagrams и на странице техники по адресу /equipment/{machine}/parts-diagrams.

Как проверяем Каждый выведенный адрес должен отвечать «удалено» без адреса перенаправления, а два оставшихся адреса схем должны по-прежнему открываться нормально.

Доказательства Мы запросили каждый адрес напрямую на обоих сайтах сегодня, по одному запросу на адрес, и записали ровно то, что вернулось.

URLпрод сейчасcrop-dev.app
/parts-diagrams200 OK410 Gone
/parts-diagrams/categories200 OK410 Gone
/parts-diagrams/category/tractors-power200 OK410 Gone
/parts-diagrams/type/tractors200 OK410 Gone
/parts-diagrams/new-holland308 -> /parts/brand/new-holland-agriculture/diagrams410 Gone
/parts/diagrams200 OK410 Gone
/parts-schematics308 -> /parts-diagrams410 Gone
/parts-schematics/new-holland308 -> /parts-diagrams410 Gone
/parts/brand/new-holland-agriculture/diagrams200 OK200 OK
/equipment/attachments-rotary-broom-aad86496ef/parts-diagrams200 OK200 OK

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

Что читает Google — переписанная страница детали и три общесайтовых изменения, 7

Для покупателя ничего не меняется. Само по себе это не поднимает нас в выдаче — это убирает причину быть ниже и это то, на чём держатся результаты вроде таблицы применимости прямо в Google. Показывать её или нет, решает Google.

Изменение — четыре пункта, как всегда Vova на dev изменение front#3426
Что это
Список применимости на каждой странице детали теперь настоящая таблица, с подписью и нормальными заголовками столбцов и строк. Частые вопросы оформлены как вопросы и ответы. Цепочка замен — старые номера деталей, ведущие к текущему — записана как упорядоченная последовательность, а не три блока в ряд. Каждая секция каждой страницы теперь имеет название, а уровни заголовков идут по порядку, без пропусков. Пять отдельных изменений, смерджены за два дня. Отслеживается как front#3426, семь коммитов.
Как проверяем
Страница запрашивается так, как её запрашивает Google, и размеченные куски считаются до и после, на тех же адресах тем же инструментом. Вдобавок каждая изменённая страница снимается на ширине десктопа и телефона, до и после, и снимки сравниваются — потому что весь смысл в том, что ничего из видимого покупателю не должно сдвинуться.
Доказательства
Страница детали /parts/CT-NHL-219758: 0 таблиц применимости до, 1 после; 12 безымянных секций до, 0 после. Полные числа в следующей строке, снимки в той, что за ней.
Откат или доводка
Откат, одной кнопкой. Менялся только фронт магазина; данные не трогали, поэтому возврат восстанавливает ровно прежнюю страницу и ничего больше.
Доказательства — посчитано, а не заявлено Vova на dev доказательства

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

Страница детали /parts/CT-NHL-219758
Что считаетсяЖивой магазин сейчасПосле релиза (crop-dev.app)
Применимость записана как таблица01
…с подписью, которая её называет01
…заголовков столбцов и строк06
Секций без названия120
Заголовков, пропускающих уровень80
Элементов, записанных как пункты списка35113
Вопросов, записанных как вопросы711

Шесть заголовков стоят одного предложения, потому что именно это число показывает, что таблица настоящая, а не просто присутствует: два называют столбцы и четыре называют строки, против четырёх обычных ячеек — четыре машины, по одному факту на каждую. Два оставшихся столбца, годы выпуска машины и её контур, не показаны вовсе, а не выведены пустыми, потому что этих данных у нас нет. Этот пробел описан отдельно, и он на Alex.

Та же картина на остальных изменённых страницах. Часы работы магазина и цифры на странице About теперь записаны как термины и их значения, а не как текст; результаты каталога — список; индекс схем — список. По всем проверенным страницам восемь заголовков, пропускавших уровень, стали нулём.

Ничего не сдвинулось — в этом и весь смысл Vova на dev доказательства

Каждая пара — одна и та же страница: слева живой магазин, справа та же страница после изменения. Целиком, не обрезано.

Живой магазин сейчасПосле релиза
Part page on the live store, desktop width The same part page after the change, desktop width
Страница детали, десктоп. 5,841 пикселя в высоту до, 5,843 после — разница в два пикселя на всю длину страницы.
Живой магазин сейчасПосле релиза
Part page on the live store, phone width The same part page after the change, phone width
Та же страница детали на телефоне. 9,948 пикселей до, 9,951 после. Здесь важна именно ширина телефона: на ней цепочка замен складывается вертикально, поэтому если бы переписывание сломало эту вёрстку, это проявилось бы тут.
Живой магазин сейчасПосле релиза
Contact page on the live store The contact page after the change
Страница контактов, где часы работы стали нормальным списком дней и времени. На три пикселя короче.
Живой магазин сейчасПосле релиза
Parts catalogue on the live store The parts catalogue after the change
Каталог деталей. Те же сорок результатов в той же сетке — но эта страница на 170 пикселей короче, и честность требует сказать, что это не от этого изменения. Кандидатская копия несёт и всё остальное, что команда смерджила на этой неделе, включая мобильный фикс каталога выше, а это ровно такое изменение высоты. Это единственное отличие на этой странице, и оно принадлежит другой строке в этом списке.

Ещё три страницы сняты тем же способом, на обеих ширинах. Главная (после) и страница машины (после) не изменились ни на пиксель. Страница About (после) стала на 43 пикселя выше, и это — хлебные крошки, описанные ниже на этой странице, а не это изменение; полоса с цифрами над ними идентична.

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

Одна страница выпала из этого сравнения целиком: общий каталог схем по адресу /parts-diagrams. Днём он был снят как 200 OK на обеих копиях, а через час на кандидате был выведен в 410 Gone тем изменением, которое описано ниже на этой странице. Сравнивать не с чем — «после» не существует, поэтому он не показан.

Проверено руками — то, что не покрыто тестами Vova на dev доказательства
Поле поиска по применимости
Поле, которое фильтрует таблицу применимости по машине, обращается к странице по именам и не имело ни одного автотеста. Прогнано руками на обеих копиях сегодня, на /parts/CT-NHL-219758:
Поле применимостипрод сейчасcrop-dev.app
Моделей в списке, без фильтра4 модели4 модели
Ввести 82C1 модель, "Confirmed fit — 1 matching model below"1 модель, "Confirmed fit — 1 matching model below"
Ввести zzzz0 моделей, "No match in this list. Check your serial number or ask our parts desk."0 моделей, "No match in this list. Check your serial number or ask our parts desk."
Вёрстка цепочки замен на телефоне
Ниже определённой ширины цепочка старых номеров деталей должна складываться вниз, а её стрелка — поворачиваться следом. Это единственная часть переписывания, которая могла сломаться незаметно. Это вторая пара снимков выше.
Что не проверял независимый человек
Автор изменения — он же тот, кто его проверял. Для изменения без видимого эффекта это меньший риск, чем обычно, но лучше сказать об этом, чем оставить подразумеваемым.

Воспроизвести: bun run scripts/semantic-census.ts — запрашивает обе копии сайта так, как это сделал бы поисковик, и печатает таблицу выше для каждой страницы. Запускать надо до пятничного релиза; после него обе копии одинаковы и сравнивать уже не с чем.

Меню сайта теперь приходит вместе со страницей, а не появляется мгновением позже Vova на dev фикс front#3347

Что это До сих пор страница, которую отдавал сервер, содержала логотип и пустую полосу там, где должно быть меню, а меню заполнялось только после того, как браузер доработает страницу. Все, кто не мог выполнить этот код — краулер Google в плохой день, медленный телефон, посетитель с отключёнными скриптами — видели шапку без содержимого и без способа попасть на страницы брендов. Теперь сервер отдаёт само меню, а поле поиска работает как обычная форма даже когда ничего не выполняется. Работа выходного дня.

Как проверяем Запрашиваем у сервера страницу так, как это сделал бы робот, и считаем ссылки меню, которые она реально содержит, не давая выполниться никакому коду.

Доказательства Запросили одну и ту же страницу с обоих сайтов как краулер и посчитали ссылки внутри шапки в сыром тексте, который вернул сервер.

Что считалипрод сейчасcrop-dev.app
Ссылок в шапке /return-policy в том виде, как её отдаёт сервер0 ссылок28 ссылок
Из них ссылок внутри самого меню0 ссылок19 ссылок

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

Каждая страница теперь объявляет одну основную область контента вместо двух Vova на dev фикс front#3359

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

Как проверяем Считаем, сколько раз страница заявляет основную область контента в тексте, который отдаёт сервер; ответ должен быть один.

Доказательства Запросили каждую страницу с обоих сайтов как краулер и посчитали маркеры основного контента буквально.

URLпрод сейчасcrop-dev.app
/parts2 основные области1 основная область
/contact2 основные области1 основная область
/track2 основные области1 основная область

Откат или доводка Ничего видимого покупателю не меняется, поэтому убрать это безопасно в любой момент. Две автоматические проверки теперь падают, если вторая основная область когда-нибудь вернётся.

Полный список моделей переезжает на более понятный адрес и весит вдвое меньше Vova на dev изменение front#3445

Что это Страница со списком всех моделей машин жила по адресу /equipment/all и весила 4.7 MB; Google обошёл её один раз в июне, так и не проиндексировал, и кликов она не принесла. Теперь она живёт по адресу /equipment/models, вдвое меньше по размеру, сгруппирована по бренду вместо буквенной оси, которая сваливала 96% моделей под две буквы, и открывается с развёрнутыми секциями, а не со всеми свёрнутыми. Все ссылки на модели пережили переезд. Старый адрес удалён, а не перенаправлен, потому что трафика на нём не было и на него ничего не ссылается.

Как проверяем Новый адрес отвечает, старый удалён, а новая страница по-прежнему несёт то же число ссылок на модели.

Доказательства Запросили оба адреса на обоих сайтах как краулер и посчитали различные ссылки на модели и размер страницы в вернувшемся сыром тексте.

URLпрод сейчасcrop-dev.app
/equipment/all200, 8,151 ссылка на модель404 Not Found
/equipment/models404 Not Found200, 8,151 ссылка на модель
Размер страницы живого списка моделейоколо 4.74 MBоколо 2.40 MB

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

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

Новое — ждёт QA — 1

Оформление заказа по счёту DIS — списание веб-заказа на счёт покупателя вместо карты Vova ждёт QA функция ps#559 front#3406

Что это Покупатель с расчётным счётом DIS может оформить заказ на этот счёт вместо карты. Половина на стороне магазина тоже приехала, поэтому страница подтверждения заказа умеет предлагать оплату со счёта Clinton, но она полностью скрыта, пока функцию не включат, а это решение John, и нигде оно не принято. С выключенным переключателем обе копии сайта читаются одинаково, что и показывает замер ниже.

Что считалипрод сейчасcrop-dev.app
Маршрут оформления по счёту при выключенном флаге404404
Вхождений «Clinton account» на странице подтверждения заказа00
Прогон QA от Denisне проводилсяне проводился

Как проверяем Сопоставленный покупатель DIS завершает оформление с опцией счёта; несопоставленный её вообще не видит; маршрут отдаёт 404, пока флаг выключен.

Доказательства Пока никто, кроме автора, это не прогонял. Это новый платёжный путь, видимый покупателю — ему нужен QA от Denis до четвергового созвона, а не заявление на этой странице.

Откат или доводка Будет указано после QA. Не выпускать эту строку без него.

Внутреннее — нет видимого покупателю поведения — черри-пики + уборка

Пять изменений уже оформлены отдельными PR с полными доказательствами против main и стоят в очереди на пятницу впереди остального списка. Пятое — это фикс редиректа на чужого производителя (front#3422), у него своя строка вверху этой страницы, а не пункт здесь. Остальные четыре:

Едут обычным поездом stagemain, независимый QA не нужен — только тесты, обвязка CI, документация и обновления зависимостей:

Всё в этом релизе — 75 изменений: 71 pull request и 4 запушены прямо в общую ветку

Это полный список всего, что вошло в этот релиз, по строке на изменение, в трёх таблицах по той части сайта, которую оно затронуло. Секции выше раскрывают те, что заметит покупатель или поисковик; здесь изменение, которому нечего показать наблюдаемого, так и говорит в своей строке, а не выдаёт себя за улучшение.

Фронт магазина 51 изменение 23 заметит покупатель или Google
ИзменениеЧто этоДоПослеСделал
front#3346Убирает два старых межбрендовых раздела каталога схем и сообщает поисковикам, что эти адреса удалены навсегда.старые адреса каталога схем отвечали 200 или редиректиливсе они отвечают 410 GoneVova
front#3359Каждая страница теперь помечает ровно один блок как основной контент вместо двух.семь страниц объявляли две основные области контентакаждая страница объявляет однуVova
front#3347Меню и поиск в шапке теперь приходят вместе со страницей, а не дорисовываются браузером позже.шапка давала 0 ссылок без JavaScriptшапка даёт 28 ссылок, 20 различных адресовVova
front#3327При подстановке сохранённого адреса в оформлении заказа предупреждение об отсутствующем e-mail теперь остаётся, а не исчезает.предупреждение об e-mail пропадало у пустого поля e-mailпредупреждение остаётся, пока поле не заполнятDenis
front#3374Выдуманные адреса во вкладке схем бренда теперь возвращают «не найдено» вместо убедительной фальшивой страницы.выдуманный адрес рисовал похожую на настоящую страницу брендавыдуманный адрес возвращает «не найдено»Denis
front#3405Подрезает баннер и панель инструментов, чтобы телефон показывал товар без прокрутки.первая карточка товара на 848 пикселей вниз, ни одной не виднопервая карточка на 663 пикселя вниз, одна виднаVova
front#3417Набранный адрес с кодом детали другого производителя больше не отправляет покупателя на деталь New Holland по другой цене.адрес другого производителя открывал деталь New Hollandтот же адрес возвращает «не найдено»Vova
front#3421Первые картинки брендов грузятся сразу, а логотип держит один адрес вместо нового на каждый релиз.1 картинка грузилась заранее; адрес логотипа менялся каждый релиз3 картинки грузятся заранее; адрес логотипа постоянныйVova
front#3419Все десять баннеров брендов теперь одной высоты и на телефоне, и на десктопе.высота баннера гуляла от 211 до 234 пикселей214 пикселей у всех десяти брендовVova
front#3418Цепочка ссылок, показывающая, где находится страница, теперь начинается с Home во всех семействах страниц и строится из одного общего источника.шесть семейств страниц начинали цепочку с Partsкаждая цепочка начинается с HomeVova
front#3433Каждая секция страницы детали теперь привязана к своему заголовку, поэтому скринридеры и поисковики знают, что это.12 из 21 секции страницы детали были без названиякаждая секция названа своим заголовкомVova
front#3435Список машин, к которым подходит деталь, теперь настоящая таблица с заголовками столбцов вместо разрозненного текста.ноль таблиц на странице деталиприменимость — таблица с заголовками столбцовVova
front#3436Семь групп повторяющихся карточек на странице детали теперь нормальные списки, поэтому их количество озвучивается.семь групп карточек были блоками без разметкисемь групп карточек — списки с подсчётомVova
front#3441Уровни заголовков в подвале приведены в порядок, шесть общесайтовых сеток превращены в списки, и исправлен один неверный атрибут на чипсах фильтров.подвал пропускал уровень заголовка; сетки без разметкиуровни заголовков по порядку; сетки — спискиVova
front#3445Полный список моделей техники вдвое меньше, сгруппирован по бренду вместо буквы и живёт по новому адресу.страница 4.7 MB на /equipment/all, группировка по буквам2.40 MB на /equipment/models, группировка по брендамVova
front#3446Блоки «подпись и значение» теперь правильно спарены, а часы работы, отдаваемые Google, исправлены под то, что на странице.Google сообщали, что в субботу открытие в 07:30, на странице было 08:00и там, и там 08:00Vova
front#3427Каждый адрес теперь несёт в цепочке одно название и одного родителя вместо двух разных версий.у страницы деталей было два названия, у страницы брендов два родителяодно название и один родитель на адресVova
front#3437Десять страниц, строивших свою цепочку, теперь используют общую, поэтому разделители больше не зачитываются вслух как "слэш".десять страниц собирали цепочки вручную, четыре разных качествавсе десять используют общую цепочкуVova
front#3449Шаги цепочки, у которых нет своей страницы, остаются на экране, но убраны из данных, отдаваемых Google.данные цепочки включали шаги без адресаэти шаги убраны, нумерация сомкнутаVova
front#3453Вкладка схем бренда теперь сообщает Google ту же цепочку, что показывает на экране.показанная и сообщённая цепочки расходилисьобе читаются как Home, Brands, брендVova
front#3456Восемь информационных страниц получили цепочку, а две страницы списков перестали ссылаться последним шагом на самих себя.8 проиндексированных страниц вообще не показывали цепочкувсе 8 показывают Home, затем название страницыVova
front#3459Наши собственные картинки теперь уменьшаются и сжимаются перед отдачей, а не уходят в полном размере.страница брендов 6,616 KB, главная картинка на 13.5 секунды3,165 KB, главная картинка на 7.6 секундыVova
front#3470Страницы «не найдено» больше не сообщают Google, что занимают место в структуре сайта.10 страниц ошибок отдавали цепочку в Googleни одна не отдаётVova
Ничего, что видит покупатель или поисковик 28
ИзменениеЧто этоДоПослеСделал
front#3338Уборка в коде общей корзины после ревью, без изменений в том, что видит покупатель.одна и та же сумма подсчёта позиций скопирована в трёх местаходин общий хелпер, на 20 строк меньшеVova
front#3365Фиксирует и принимает два предупреждения безопасности, для которых пока нет исправления, чтобы проверка сборки перестала всех блокировать.проверка безопасности падала на каждой веткепроверка проходит, два предупреждения зафиксированыVova
front#3362Исправляет, каким сборочным машинам разрешено сохранять и переиспользовать рабочие файлы.машины выбирались по операционной системе, одна неверномашины выбираются по имени, все верноVova
front#3375Самый глубокий автоматический прогон тестов теперь запускает только свои тесты, разбитые на четыре части, чтобы уложиться по времени.полоса гоняла 106 тестов и ни разу не прошлаполоса гоняет 51 тест, разбитый на четыре частиVova
front#3386Предупреждения по стилю кода теперь не дают смерджить изменение, а не игнорируются.предупреждения по стилю проходили проверкупредупреждения по стилю роняют проверкуVova
front#3387Копирует последние четыре оставшихся набора записей из старой базы в новую.четырёх наборов записей не хватало в новой базе36 записей перенесеноVova
front#3319Тест обещания самовывоза читал виджет часов работы, поэтому проходил или падал в зависимости от времени суток.результат теста менялся вместе с часами работы магазинатест читает только содержимое страницыDenis
front#3320Даёт одному шагу теста то же время ожидания, что и следующим за ним, чтобы он перестал падать случайно.шагу давалось 1000 миллисекунд, падал случайношагу даётся 1500 миллисекунд, пять зелёных прогоновDenis
front#3377Обновляет три устаревших ожидания в тестах на странице типа техники бренда; дефекта для покупателя тут не было.3 теста падают, 9 падений за ночь3 прошли, 2 пропущеныDenis
front#3357Добавляет тест, доказывающий, что заказ сверх допустимого количества никогда не доходит до оплаты.лимит количества в заказе не покрывал ни один тестодин тест доказывает, что заказы сверх лимита отклоняютсяDenis
front#3355Ночная проверка, находящая сломанные страницы брендов, теперь умеет о них сообщать и печатает все падения, а не первые десять.15 падений найдено, 10 напечатано, никому не сообщенопечатаются все падения, заводится тикетDenis
front#3382Обновляет тесты страницы схем под сегодняшний продукт и намеренно оставляет один настоящий дефект видимым.8 прошли, 5 упали12 прошли, 1 упалDenis
front#3391Тестовый файл теперь выполняется в одном месте, поэтому его защитная проверка перестаёт поднимать ложную тревогу.тест падал в зависимости от того, как разбивалась работатест идёт по порядку, проверка на местеVova
front#3383Чинит пять устаревших ожиданий в тестах на странице вариантов модели и закрывает несоответствие, до которого не могла добраться ни одна живая страница.3 прошли, 5 упали на странице вариантов8 прошлиDenis
front#3315Прогон тестов на stage теперь ждёт достаточно долго, чтобы его собственная сборка дождалась своей очереди.сдавался через 15 минут, не запустив ни одного тестаждёт до 40 минутVova
front#3393Тест поиска теперь проверяет «не меньше» ожидаемого числа результатов вместо точного количества, которое живой каталог постоянно меняет.тест требовал ровно 2 результата, каталог возвращал 3тест требует минимум 2Vova
front#3415Исправляет заметку, называвшую не тот сервис для общей настройки.заметка называла выведенный из эксплуатации поисковый сервисзаметка называет живой поисковый сервисVova
front#3406Строит покупательскую сторону оплаты списанием на счёт Clinton, пока везде выключенную.опции списания на счёт не существовалоопция построена, выключена, страница не измениласьVova
front#3398Каждое изменение теперь должно называть, какой ассистент использовался и кто из людей за него отвечает.имя ответственного на изменении не требовалосьизменение блокируется, пока не заполнены оба имениJohn
front#3425Добавляет инструкцию, чтобы изменения, открытые ассистентом, заполняли ставшие обязательными имена.изменения от ассистента открывались без обязательных имёнв описанном процессе эти две строки прописаны явноVova
front#3440Ночной обход битых ссылок теперь видит настоящие страницы «не найдено» и больше не выбрасывает адреса с фильтрами.обход видел 200 на настоящих страницах «не найдено»обход видит 404 и сохраняет адреса с фильтрамиVova
front#3454Убирает последние восемь предупреждений о том, как файлы ссылаются друг на друга.8 предупреждений0 предупрежденийVova
front#3457Каждое изменение кода теперь должно указывать, что было, что стало, как это проверить, и показать доказательство.доказательство было необязательным, кроме случаев отправки в проддоказательство обязательно на каждом изменении кодаVova
front#3458Проверка цепочек теперь автоматически покрывает каждый шаблон страницы и запускается на каждом изменении, а не нигде.проверка покрывала 6 перечисленных страниц, не запускалась нигдепокрывает 37 шаблонов, запускается на каждом измененииVova
front#2994 без pull request, запушено прямо в общую веткуУтренняя проверка карты сайта теперь сравнивает число опубликованных адресов с числом из живого бэкенда вместо двух фиксированных чисел, которых уже нельзя было достичь.проверка падала каждое утро, 16 повторных отчётов2,694 против 2,694, нулевое расхождениеVova
front#2992 без pull request, запушено прямо в общую веткуУдаляет тест, который не мог упасть, и не даёт другим тестам обращаться к выведенному поисковому бэкенду, когда адрес не задан.выведенный бэкенд принимал около 20 запросов каждое утрони один плановый прогон к нему не обращаетсяVova
front#2992 без pull request, запушено прямо в общую веткуУбирает выведенный поисковый бэкенд из списка трассировки и двух вспомогательных скриптов.три места всё ещё называли выведенный бэкендни одно не называетVova
front#3420 без pull request, запушено прямо в общую веткуИсправляет заметку в коде плитки бренда, утверждавшую обратное измеренному про раннюю загрузку картинок.заметка говорила, что ранняя загрузка не добавляет preloadзаметка говорит, что добавляетVova
Сервисы заказов и оплаты 16 изменений ничего не заметят покупатель или Google
ИзменениеЧто этоДоПослеСделал
ps#528Удалены двадцать два внутренних описания конфигураций, которые мы больше не используем.22 устаревших внутренних документа хранились в репозитории0 устаревших внутренних документов хранится в репозиторииVova
ps#536Всё, что идёт в прод, теперь должно сначала письменно ответить на четыре вопроса John.письменные описание, тестирование, доказательство и откат не требовалисьвсе четыре обязательны перед изменением в продеVova
ps#535Тестовая копия оформления заказа теперь ищет детали в текущем сервисе деталей, а не в выведенном.тестовое оформление обращалось к выведенному сервису деталейтестовое оформление обращается к текущему сервису деталейVova
ps#538Denis и Vova получают право открывать служебные экраны заказов на тестовом сайте, чтобы Denis мог дать своё подтверждение.1 из 8 тестовых аккаунтов мог открыть служебные экраныещё 2 получили право; шаг включения ещё не выполненVova
ps#544Исправлены три внутренние заметки, утверждавшие, что тестовые данные лежат на отдельном сервере, хотя это не так.три заметки описывали несуществующую конфигурациютри заметки соответствуют реальной конфигурацииVova
ps#539Сервис расчёта доставки теперь может работать на тестовой копии, поэтому фиксы можно проверять до того, как их увидят покупатели.расчёт доставки работал только в продерасчёт доставки работает и на тестовой копииVova
ps#551В автоматической проверке была зашита календарная дата, которая устарела и красила весь прогон в красный; теперь используется сегодняшняя дата.233 проверки проходят, 1 падает234 проверки проходят, 0 падаютVova
ps#549Оплата перестала пересоздавать семь старых хранилищ, которые мы выводим, поэтому их удаление наконец удержится.семь выведенных хранилищ возвращались при каждом рестартени одно не возвращается при рестарте, на тестовой линииVova
ps#552Сервис аккаунтов перестал пересоздавать ещё одно выведенное хранилище при каждом рестарте.одно выведенное хранилище возвращалось при каждом рестартеоно остаётся удалённым после рестарта, на тестовой линииVova
ps#554Предупреждения об аккуратности кода теперь останавливают автоматические проверки, а не проходят молча.предупреждения молча проходили проверкупредупреждения роняют проверку; сегодня их нольVova
ps#557Строит оформление заказа без карты для покупателей с расчётным счётом Clinton; оно неактивно, потому что в проде переключатель выключен.оформления без карты нигде не существовалопостроено и выключено в продеVova
ps#558При выключенном переключателе адрес оформления без карты выдавал, что он существует и чего он хочет; теперь он просто говорит «не найдено».отвечал ошибкой со списком обязательных полейотвечает «не найдено»Vova
ps#559Заказы без карты теперь очищают корзину, а двойной клик по кнопке заказа возвращает первый заказ вместо создания второго; всё ещё неактивно за выключенным переключателем.корзина оставалась полной; второй клик создавал второй заказкорзина очищается; второй клик возвращает первый заказVova
ps#565Переносит фикс устаревшего теста на продовую линию; в очереди на пятницу и должен приземлиться раньше двух остальных.233 проверки проходят, 1 падает на продовой линии234 проходят, 0 падают, как только приземлится пятничный релизVova
ps#563Переносит фикс оплаты на продовую линию, чтобы семь выведенных хранилищ перестали возвращаться; в очереди на пятницу.семь выведенных хранилищ возвращаются при каждом рестарте в продени одно не возвращается, как только приземлится пятничный релизVova
ps#564Переносит фикс сервиса аккаунтов на продовую линию для последнего выведенного хранилища; в очереди на пятницу.одно выведенное хранилище возвращается при каждом рестарте в продеоно остаётся удалённым, как только приземлится пятничный релизVova
Поисковый сервис 8 изменений 4 заметит покупатель или Google
ИзменениеЧто этоДоПослеСделал
search#861Когда список деталей слишком медленный, чтобы загрузить глубокую страницу, эта страница раньше возвращалась пустой, утверждая, что всё в порядке; теперь она сообщает о временной недоступности, чтобы запрос можно было повторить. Парное изменение на фронте магазина ещё впереди.Глубокая страница списка не показывала деталей, отчитывалась об успехеГлубокая страница списка вместо этого сообщает о временной недоступностиVova
search#860Фильтры производителей в списке деталей обещали намного больше деталей, чем давал клик по ним, а фильтр «нет в наличии» появлялся дважды; теперь оба соответствуют тому, что реально показывает список.Один фильтр производителя говорил 22,466 деталей, список показывал 6,268Тот же фильтр говорит 6,268, ровно как списокVova
search#858Результаты поиска по многим производителям вели на несуществующую страницу или, хуже, на деталь другого производителя по другой цене; пять из этих производителей теперь ведут правильно, а остальные полностью убраны из результатов.47 из 66 производителей вели в никуда или на чужую детальПять производителей ведут правильно, остальные скрыты из поискаVova
search#843Любой поиск в магазине был глубиной ровно в одну страницу, поэтому вторая страница возвращалась как «не найдено», хотя первая обещала десятки страниц; уже описано на странице релиза 2026-07-31.Вторая страница любого поиска возвращала «не найдено»Со второй страницы и дальше возвращаются результаты, все страницы доступныVova
Ничего, что видит покупатель или поисковик 4
ИзменениеЧто этоДоПослеСделал
search#857У общего ключа безопасности требование к длине на стороне поиска было слабее, чем на стороне сайта, поэтому ключ, выглядевший принятым, всё равно мог не дать сайту стартовать; теперь обе стороны требуют одинаковую длину.Короткий ключ принимался поиском, ронял сайтКороткий ключ отвергают оба, одинаковая минимальная длинаVova
search#854Сортировка результатов поиска по лидерам продаж повторяла одни детали на разных страницах и прятала другие; исправление написано, но заработает только после того, как Alex применит парное изменение в базе, а этого пока не было.Ничего не меняется, пока Alex не применит изменение в базеНичего не меняется, пока Alex не применит изменение в базеVova
search#853Автоматические проверки, охраняющие каждый релиз, падали на устаревших ожиданиях, а не на реальных проблемах, а шаг уборки, который должен удалять отклонённую сборку, ни разу не сработал, из-за чего старые сборки оставались публично доступны.Релизные проверки застряли; отклонённые сборки оставались публично доступныПроверки проходят; отклонённая сборка теперь удаляетсяVova
search#849Проверка качества кода сообщала о предупреждениях, но всё равно проходила, поэтому девять из них лежали незамеченными, включая одно, из-за которого тест проходил, хотя не должен был; предупреждения убраны, и проверка теперь останавливается на любом новом.Девять предупреждений на месте, проверка качества всё равно проходилаНоль предупреждений, проверка теперь падает на любомVova

Текущий пин — не менялся с v2.0.3, для сравнения

Что сейчас живёт в проде, пока изменения этой страницы лежат на dev. Будет заполнено новым пином в пятницу, когда релиз реально выйдет.

Фронт магазинаebd97beeНе менялся со среды, с хотфикса.
Поискsearch-api-00017-zuyНе менялся.
Сервисы4b96c314Не менялись.
База данных20260731074650Не менялась.