test(tradein): гейт «снять noindex можно только вместе с плейсхолдерами» (#2904) #2948

Merged
bot-backend merged 1 commit from test/2904-noindex-gate into main 2026-08-20 07:00:10 +00:00
Collaborator

Гейт из задачи существовал только на словах

Задача требует: до снятия robots: { index: false } каждая маркетинговая цифра лэндинга либо заменяется вычисляемой, либо снимается со страницы.

Модуль 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, и ничто не возразит.

Здесь он становится механическим.

Что тест делает и чего НЕ делает

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

Место выбрано не наугад: в этом же CI уже есть прецедент такого guard'а — «Mera-public isolation guard (#2631)», и npm test для этого фронта в пайплайне гоняется.

Проверено фальсификацией, а не рассуждением

Снял robots: { index: false } → тест краснеет и перечисляет, какие именно величины ещё на странице:

AssertionError: лэндинг v3 всё ещё использует непроверенные величины:
ACCURACY_PLACEHOLDER, COST_OF_ERROR_PLACEHOLDER, FREE_SAMPLE_PLACEHOLDER,
PROOF_ROWS_PLACEHOLDER, но `robots: { index: false }` в layout.tsx снят.

Сломал зонд (переименовал пути компонентов) → краснеет второй тест:

AssertionError: ни один плейсхолдер не найден в компонентах v3 — зонд сломан

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

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

Оба исходника после фальсификаций восстановлены, дерево чистое.

Прогоны

vitest (tradein-mvp/frontend): 11 файлов, 59 тестов, rc=0
type-check: rc=0

Оговорка про локальный прогон: сначала type-check падал на .next/types со ссылкой на страницу scrapers/cian-cookies, которой в исходниках нет — устаревший артефакт прошлой сборки. Убрал его и перепроверил: rc=0. В CI чекаут чистый, артефакта там не бывает.

Refs #2904

## Гейт из задачи существовал только на словах Задача требует: до снятия `robots: { index: false }` каждая маркетинговая цифра лэндинга либо заменяется вычисляемой, либо снимается со страницы. Модуль `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`, и ничто не возразит. Здесь он становится механическим. ## Что тест делает и чего НЕ делает Он **не запрещает** открывать лэндинг. Он требует, чтобы открытие шло вместе с заменой чисел — то есть чтобы это было решением, а не побочным следствием правки метаданных. Когда плейсхолдеры уйдут из компонентов, гейт сам перестанет срабатывать (ранний возврат при пустом списке). Место выбрано не наугад: в этом же CI уже есть прецедент такого guard'а — «Mera-public isolation guard (#2631)», и `npm test` для этого фронта в пайплайне гоняется. ## Проверено фальсификацией, а не рассуждением **Снял `robots: { index: false }`** → тест краснеет и перечисляет, какие именно величины ещё на странице: ``` AssertionError: лэндинг v3 всё ещё использует непроверенные величины: ACCURACY_PLACEHOLDER, COST_OF_ERROR_PLACEHOLDER, FREE_SAMPLE_PLACEHOLDER, PROOF_ROWS_PLACEHOLDER, но `robots: { index: false }` в layout.tsx снят. ``` **Сломал зонд** (переименовал пути компонентов) → краснеет **второй** тест: ``` AssertionError: ни один плейсхолдер не найден в компонентах v3 — зонд сломан ``` Эта вторая проверка существенна. Пустой список плейсхолдеров для первого теста означает «всё заменено, можно открывать» — то есть сломанный зонд сделал бы гейт зелёным навсегда и незаметно. Сторож на сторожа. Третья проверка держит таблицу расхождений в шапке модуля: потеряется она — и следующий читатель решит, что цифры подтверждены замером. Оба исходника после фальсификаций восстановлены, дерево чистое. ## Прогоны `vitest` (tradein-mvp/frontend): **11 файлов, 59 тестов, rc=0** `type-check`: **rc=0** Оговорка про локальный прогон: сначала `type-check` падал на `.next/types` со ссылкой на страницу `scrapers/cian-cookies`, которой в исходниках нет — устаревший артефакт прошлой сборки. Убрал его и перепроверил: rc=0. В CI чекаут чистый, артефакта там не бывает. Refs #2904
bot-backend added 1 commit 2026-08-20 06:21:00 +00:00
test(tradein): гейт «снять noindex можно только вместе с плейсхолдерами» (#2904)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 52s
2bffb178e3
Задача владельца требует: до снятия 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 чекаут
чистый; проверено отдельно)
bot-backend merged commit 8db357ef30 into main 2026-08-20 07:00:10 +00:00
bot-backend deleted branch test/2904-noindex-gate 2026-08-20 07:00:10 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2948
No description provided.