test(tradein): гейт «снять noindex можно только вместе с плейсхолдерами» (#2904) #2948
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2948
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "test/2904-noindex-gate"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Гейт из задачи существовал только на словах
Задача требует: до снятия
robots: { index: false }каждая маркетинговая цифра лэндинга либо заменяется вычисляемой, либо снимается со страницы.Модуль
marketing-v3.tsуже есть, и в его шапке честно записано расхождение:Но сам гейт жил в комментарии. Комментарий не участвует в сборке: чтобы выкатить страницу с этими числами, достаточно снять одну строку в
layout.tsx, и ничто не возразит.Здесь он становится механическим.
Что тест делает и чего НЕ делает
Он не запрещает открывать лэндинг. Он требует, чтобы открытие шло вместе с заменой чисел — то есть чтобы это было решением, а не побочным следствием правки метаданных. Когда плейсхолдеры уйдут из компонентов, гейт сам перестанет срабатывать (ранний возврат при пустом списке).
Место выбрано не наугад: в этом же CI уже есть прецедент такого guard'а — «Mera-public isolation guard (#2631)», и
npm testдля этого фронта в пайплайне гоняется.Проверено фальсификацией, а не рассуждением
Снял
robots: { index: false }→ тест краснеет и перечисляет, какие именно величины ещё на странице:Сломал зонд (переименовал пути компонентов) → краснеет второй тест:
Эта вторая проверка существенна. Пустой список плейсхолдеров для первого теста означает «всё заменено, можно открывать» — то есть сломанный зонд сделал бы гейт зелёным навсегда и незаметно. Сторож на сторожа.
Третья проверка держит таблицу расхождений в шапке модуля: потеряется она — и следующий читатель решит, что цифры подтверждены замером.
Оба исходника после фальсификаций восстановлены, дерево чистое.
Прогоны
vitest(tradein-mvp/frontend): 11 файлов, 59 тестов, rc=0type-check: rc=0Оговорка про локальный прогон: сначала
type-checkпадал на.next/typesсо ссылкой на страницуscrapers/cian-cookies, которой в исходниках нет — устаревший артефакт прошлой сборки. Убрал его и перепроверил: rc=0. В CI чекаут чистый, артефакта там не бывает.Refs #2904
Задача владельца требует: до снятия robots:{index:false} каждая маркетинговая цифра лэндинга либо заменяется вычисляемой, либо снимается со страницы — публикация недостоверных характеристик платной услуги подпадает под ст. 5 ФЗ «О рекламе» и ЗоЗПП. Модуль констант marketing-v3.ts уже существует и несёт в шапке таблицу «заявлено против замера»: ошибка 1,8% против 13,2% медианы |%| (бэктест n=277) 83% в диапазон против 81,95% при коридоре шириной 74% от точки ±6 дн по сроку против «сверки срока с фактом НЕ СУЩЕСТВУЕТ» 42 700 проверок за год против 1 084 оценок всего (база живёт 2,5 месяца) 42 города РФ против 6 городов области, полное покрытие — 1 Но САМ ГЕЙТ жил только в комментарии. Правило, записанное словами, не мешает снять одну строку в layout.tsx и выкатить страницу: комментарий не участвует в сборке. Здесь он становится механическим — тест краснеет ровно в момент, когда noindex исчезает, а плейсхолдеры остаются на странице. Тест НЕ запрещает открывать лэндинг. Он требует, чтобы открытие шло вместе с заменой чисел, то есть чтобы это было решением, а не побочным следствием правки метаданных. Когда плейсхолдеры уйдут из компонентов, гейт сам перестанет срабатывать (ранний возврат при пустом списке). Проверено фальсификацией, а не рассуждением: * снял robots:{index:false} → тест краснеет и перечисляет, какие именно величины ещё на странице; * сломал зонд (переименовал пути компонентов) → краснеет ВТОРОЙ тест («ни один плейсхолдер не найден — зонд сломан»). Без него первый проходил бы вхолостую: пустой список плейсхолдеров означает «всё заменено». Оба исходника восстановлены, дерево чистое. Третья проверка держит в шапке модуля таблицу расхождений: потеряется она — и следующий читатель решит, что цифры подтверждены замером. vitest (tradein-mvp/frontend): 11 файлов, 59 тестов, rc=0 type-check: rc=0 (локальный прогон ронял устаревший .next/types со ссылкой на удалённую страницу scrapers/cian-cookies — артефакт старой сборки, в CI чекаут чистый; проверено отдельно)prune -afубиваетcompose pullдеплоя ПТИЦЫ (разные группы concurrency, один докер-демон) #2950