Главная почти всегда особенная
Проверялось, жив ли на одном из сайтов сети паразитный скрипт, вставленный чужим шаблоном. На главной — ноль вхождений и ноль сторонних трекеров. Дальше шла выборка из карты сайта, 24 адреса равномерно по разделам: заражена 21 страница.
Почему главная врёт систематически. Её чинят первой и руками, на неё смотрят чаще всего, с неё начинают демонстрацию. Отсюда правило: главная — единственная страница, по которой сайт выглядит здоровее, чем он есть, и потому она не годится ни как выборка, ни как первая проба.
Выборка у нас собирается так: адреса из карты сайта с равным шагом, минимум шесть страниц разных типов. Стоит это одну команду, а разница в выводе — между «дефекта нет» и «дефект на 21 странице из 24 проверенных».
«Файлы совпали» — правда, которая ничего не говорит о работе
Сверка расхождений между репозиторием и боевой площадкой считала нормализованный хеш каждого файла и по восьми сайтам дала «расхождений 0». Утверждение верное: байты совпадают. Живой браузер на той же странице показал другое.
| Вопрос приёмки | Чем меряется | Что показал наш замер |
|---|---|---|
| Файлы доехали? | хеш каждого файла партии | расхождений 0 по восьми сайтам |
| Страница работает? | консоль и сетевой лог браузера, отправка формы живьём | страница раздела тянет собственную главную ~150 КБ как скрипт; десять запросов к шрифтам отдают 404 — на всех сайтах сети |
Причина 404 общая: стили донорского шаблона ссылаются на каталог шрифтов, которого нет ни в одном репозитории. Успешная выкатка и совпавшие хеши спокойно сосуществовали и с этими 404, и с 21 заражённой страницей.
Из того же захода — случай, который выкаткой не лечится: адрес раздела отдаёт 200, хотя страницы в репозитории нет. Осиротевший файл на площадке глушит правило перенаправления, а выкатка файлы не удаляет. Такое снимается только явным удалением.
Множество из формулировки задачи
Роль зоны описывала 9 сайтов. В панели владельца — 16 доменов, и вопрос «почему девять?» задал он сам. Разбор каждого домена запросом, а не памятью:
| Класс | Сколько | Чем отличается при замере |
|---|---|---|
| Ядро сети | 1 | 200, свой контент |
| Известные сателлиты | 9 | 200, свой контент |
| Домены-доноры | 4 | 301 на чужой домен — это перенаправление, а не сайт |
| Живой сайт вне всех реестров | 1 | 200, 38,8 КБ, title 53 символа, своя разметка данных, канонический адрес на себя |
| Не отвечает | 1 | пустой код ответа |
Арифметика реестра: 16 доменов − 1 ядро − 4 донора − 1 мёртвый = 10 живых сателлитов, а не девять. Разница в одну единицу выглядит мелочью ровно до момента, когда выясняется смысл этой единицы.
Сайт вне реестра не смотрит никто — ни приёмка, ни мониторинг, ни автоматические проверки. Здесь нашлась и вторая беда: найденный сайт и один из известных индексируются по одной и той же теме, то есть сеть годами могла конкурировать сама с собой, и никто этой пары не сравнивал.
Вывод для реестра любого вида: заводить его от источника владельца — панели, договора, выгрузки — а не от текста задачи, и класс каждой записи получать замером. Живой объект, перенаправление и мёртвый адрес различаются только так.
Признак, который значит не то, что кажется
Обход 177 рабочих копий репозитория искал незакоммиченную работу и дал 143 копии с изменениями, в лидерах — 8406 изменённых файлов. Коммит такого «спасения» стёр бы эти 8406: там были удаления, 4 374 496 строк — каталоги вычищены, метаданные остались. Второй заход, уже без удалений, дал 115 — и снова неправду: у лидеров рабочее дерево оказалось идентично общей ветке, тысячи «правок» были дрейфом старой ветки.
- Считать изменённые и новые файлы отдельно от удалённых — удаления никогда не признак работы.
- Сверять рабочее дерево с общей веткой: пусто — спасать нечего, сколько бы строк ни показывал статус.
- Смотреть состав глазами: несколько осмысленных новых файлов — да; массовое переписывание сотен страниц — сначала выяснить, чем оно вызвано.
Настоящая работа нашлась ровно там, где файлов было мало и они были осмысленны: пять новых файлов сверки калькулятора, два файла проверок и один файл мониторинга. Ни одного из «8406».
Общая процедура, которую мы из этого собрали
- Сначала определение множества, потом замер. «Все страницы сайта» — это карта сайта, а не главная. «Все наши сайты» — это панель доменов, а не список из задачи.
- Класс каждого элемента получается пробой, а не памятью: живой, перенаправление, мёртвый; работа, дрейф, удаление.
- Два вопроса приёмки разводятся явно: «доехало» и «работает» — разные замеры, и первый ничего не говорит про второй.
Цена ошибки в множестве не растёт постепенно: замер либо про ваш объект, либо про соседний, и промежуточных состояний тут нет.