feat(mera/b2c): новый дизайн становится корнем meraocenka.ru, функционал старого перенесён #3236

Merged
bot-backend merged 3 commits from feat/b2c-v3-becomes-root into main 2026-08-29 15:32:37 +00:00
Collaborator

Главный разрыв, найденный разведкой: макет Макса реализован полностью, но включён не был — корень домена до сих пор отдавал старый лэндинг, а новый дизайн жил на /v3 под noindex как превью. Этот PR его включает, ничего не потеряв.

Что перенесено из старого лэндинга

Разведка нашла шесть потерь, все подтверждены по коду и закрыты:

было в v1 стало
DataSources — реестр источников SourcesV3 из SOURCE_GROUPS, заголовок и лид дословно
WhatYouGet + дисклеймер 135-ФЗ WhatYouGetV3, дисклеймер прямо под списком
плашка покрытия регионов в HeroV3, города из реестра
«мы не покупаем квартиры» в HeroV3
гео-гейт города в форме в FreeCheckCard: селект, автодетект, отдельный ответ для города вне покрытия
6 вопросов FAQ все шесть в ObjectionsV3 через FAQ.find по id, ни одна строка не скопирована

Плюс починено по дороге: обязательное поле «состояние» не клалось в черновик — данные пользователя выбрасывались.

Три ревьюера, три линзы

Все три — minor, майоров нет. Что нашли и что исправлено:

Четыре из шести вопросов FAQ рендерились только в старой версии. Среди потерянного — единственное место, где сказано «имя, паспорт и документы на квартиру мы не спрашиваем» со ссылкой на страницу о персональных данных, и формулировка «показываем диапазон, а не одно число». Возвращены все шесть, ссылка на ПДн — живая PublicLink, текст ссылки берётся из content.ts по имени константы, а не пишется в разметке.

Длинный адрес превью /trade-in/mera-public/v3 уходил в 404. Короткий /v3 редиректил, длинный — нет. Добавлены все четыре формы в один матчер.

Редирект терял query-строку. /v3?utm=... приходил на голый /. Приведено к образцу @meraLongPages, чей комментарий прямо требует сохранять UTM.

Комментарий описывал опасность, которой нет. Строка V3_SOURCES меняла путь v3/page.tsxpage.tsx с обоснованием «иначе гейт перестал бы сканировать». Ревьюер проверил: имён плейсхолдеров нет ни в старом, ни в новом файле — строка не давала покрытия ни до, ни после. Автор перепроверил сам и снял строку.

Периметр

/v3 убран из @meraPages, @meraShortSlash, @meraLongPages; добавлен постоянный редирект на корень для всех четырёх форм адреса. PREVIEW_ONLY в тесте периметра стал пустым, а не удалён — он держит проверку «наружу не открыто ничего сверх известного» двусторонней и задаёт формат, в котором следующее превью придётся назвать вслух. /v3 убран из PUBLIC_SHORT_PATHS гварда с объяснением: редирект отрабатывает в Caddy, до приложения запрос не доходит, а недостижимая строка в списке публичных путей автоматически открыла бы будущую страницу с тем же адресом.

Юридические страницы (/oferta, /privacy, /refund) переведены на InnerHeader + FooterV3 — они были единственными держателями удалённых SiteHeader/SiteFooter.

Проверка

Гейты фальсифицированы: удаление вопроса из FAQ, переименование id, изменение формулировки про ПДн — каждое красит тест. Две независимые мутации конфига Caddy (откат путей, откат сохранения query) красят проверку периметра.

Конфиг проверен на живом Caddy 2.11 против настоящего site-блока meraocenka.ru с заглушенными апстримами: все четыре формы /v3 → 301 на / с сохранением query; /oferta, /estimate, длинные адреса — без изменений; проба открытого редиректа %5C по-прежнему 404.

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

tsc · next lint · vitest 85/85 · check:mera-public-isolation — чисто.

noindex НЕ снят

Индексация остаётся выключенной: снятие — решение владельца и отдельный шаг, который требует, чтобы на витрине не осталось неподтверждённых чисел. Это делает соседняя ветка.

Отмечено, но не сделано

@meraLongRoot теряет query-строку тем же образом (/trade-in/mera-public?utm=xLocation: /). Тот же класс, тот же трёхстрочный фикс, но это за пределами названного объёма — вынесено отдельно, а не сделано молча.

Главный разрыв, найденный разведкой: макет Макса реализован полностью, но **включён не был** — корень домена до сих пор отдавал старый лэндинг, а новый дизайн жил на `/v3` под noindex как превью. Этот PR его включает, ничего не потеряв. ## Что перенесено из старого лэндинга Разведка нашла шесть потерь, все подтверждены по коду и закрыты: | было в v1 | стало | |---|---| | `DataSources` — реестр источников | `SourcesV3` из `SOURCE_GROUPS`, заголовок и лид дословно | | `WhatYouGet` + дисклеймер 135-ФЗ | `WhatYouGetV3`, дисклеймер прямо под списком | | плашка покрытия регионов | в `HeroV3`, города из реестра | | «мы не покупаем квартиры» | в `HeroV3` | | гео-гейт города в форме | в `FreeCheckCard`: селект, автодетект, отдельный ответ для города вне покрытия | | 6 вопросов FAQ | все шесть в `ObjectionsV3` через `FAQ.find` по id, ни одна строка не скопирована | Плюс починено по дороге: обязательное поле «состояние» не клалось в черновик — данные пользователя выбрасывались. ## Три ревьюера, три линзы Все три — minor, майоров нет. Что нашли и что исправлено: **Четыре из шести вопросов FAQ рендерились только в старой версии.** Среди потерянного — единственное место, где сказано «имя, паспорт и документы на квартиру мы не спрашиваем» со ссылкой на страницу о персональных данных, и формулировка «показываем диапазон, а не одно число». Возвращены все шесть, ссылка на ПДн — живая `PublicLink`, текст ссылки берётся из `content.ts` по имени константы, а не пишется в разметке. **Длинный адрес превью `/trade-in/mera-public/v3` уходил в 404.** Короткий `/v3` редиректил, длинный — нет. Добавлены все четыре формы в один матчер. **Редирект терял query-строку.** `/v3?utm=...` приходил на голый `/`. Приведено к образцу `@meraLongPages`, чей комментарий прямо требует сохранять UTM. **Комментарий описывал опасность, которой нет.** Строка `V3_SOURCES` меняла путь `v3/page.tsx` → `page.tsx` с обоснованием «иначе гейт перестал бы сканировать». Ревьюер проверил: имён плейсхолдеров нет ни в старом, ни в новом файле — строка не давала покрытия ни до, ни после. Автор перепроверил сам и снял строку. ## Периметр `/v3` убран из `@meraPages`, `@meraShortSlash`, `@meraLongPages`; добавлен постоянный редирект на корень для всех четырёх форм адреса. `PREVIEW_ONLY` в тесте периметра стал **пустым, а не удалён** — он держит проверку «наружу не открыто ничего сверх известного» двусторонней и задаёт формат, в котором следующее превью придётся назвать вслух. `/v3` убран из `PUBLIC_SHORT_PATHS` гварда с объяснением: редирект отрабатывает в Caddy, до приложения запрос не доходит, а недостижимая строка в списке публичных путей автоматически открыла бы будущую страницу с тем же адресом. Юридические страницы (`/oferta`, `/privacy`, `/refund`) переведены на `InnerHeader` + `FooterV3` — они были единственными держателями удалённых `SiteHeader`/`SiteFooter`. ## Проверка Гейты фальсифицированы: удаление вопроса из FAQ, переименование id, изменение формулировки про ПДн — каждое красит тест. Две независимые мутации конфига Caddy (откат путей, откат сохранения query) красят проверку периметра. Конфиг проверен **на живом Caddy 2.11** против настоящего site-блока `meraocenka.ru` с заглушенными апстримами: все четыре формы `/v3` → 301 на `/` с сохранением query; `/oferta`, `/estimate`, длинные адреса — без изменений; проба открытого редиректа `%5C` по-прежнему 404. Страница проверена **сборкой и рендером**, а не только юнит-тестами: в HTML присутствуют все шесть вопросов, оба восстановленных утверждения и живая ссылка на политику; трёх макетных перефразировок и дублирующего абзаца нет; basePath не протёк. `tsc` · `next lint` · `vitest 85/85` · `check:mera-public-isolation` — чисто. ## noindex НЕ снят Индексация остаётся выключенной: снятие — решение владельца и отдельный шаг, который требует, чтобы на витрине не осталось неподтверждённых чисел. Это делает соседняя ветка. ## Отмечено, но не сделано `@meraLongRoot` теряет query-строку тем же образом (`/trade-in/mera-public?utm=x` → `Location: /`). Тот же класс, тот же трёхстрочный фикс, но это за пределами названного объёма — вынесено отдельно, а не сделано молча.
bot-backend added 3 commits 2026-08-29 15:31:01 +00:00
Корень meraocenka.ru отдаёт v1, новый дизайн живёт на /v3 и скоро станет
корнем. Шесть вещей из v1 в v3 отсутствовали — при переключении они бы
просто исчезли с публичного сайта:

- реестра источников не было вовсе (SourcesV3, из SOURCE_GROUPS);
- «что вы получите» и дисклеймера 135-ФЗ не было (WhatYouGetV3): о том,
  что это не отчёт аккредитованного оценщика, узнавал только тот, кто сам
  догадался открыть нужное возражение;
- герой не называл границу покрытия (полное — Екатеринбург, частично —
  остальные города области, по другим регионам не считаем) и не говорил,
  что мы не покупаем квартиры и не берём их на продажу;
- два вопроса FAQ («откуда вы знаете, сколько стоит именно моя квартира»,
  «почему только Свердловская область») в возражениях v3 не звучали —
  теперь берутся из FAQ по id, а не копией строк;
- карточка проверки не спрашивала город: гео-гейт #2576 на новом лэндинге
  был сломан (без города «Ленина, 1» уходит в одноимённую улицу ЕКБ);
- она же спрашивала состояние обязательным полем и выбрасывала ответ на
  переходе — теперь он доезжает в черновике.

Тексты перенесены дословно (проходили юр-ревью), новых чисел нет.
Новые секции встали после «Точности»: сверяем прогноз с фактом → на каких
данных → что получаете на руки, всё до первого разговора про деньги.

Гейт: __tests__/v3-ported-copy.test.ts — проверен мутацией (снятие секции
со страницы и переименование id вопроса красят его).
Вариант дизайна выбран — превью с /mera-public/v3 переехало в корень
целиком, вместе с блоками, перенесёнными из v1 предыдущим шагом. Каталог
v3/ и компоненты v1 (Hero / HowItWorks / WhatYouGet / DataSources / Faq /
AddressForm / SiteHeader / SiteFooter) удалены: их данные живут в
content.ts и уже читаются секциями v3, поэтому ушла только вёрстка.

Юридические страницы (оферта, возврат, ПДн) держались на SiteHeader/
SiteFooter — единственные, кто их ещё импортировал. Переведены на
InnerHeader + FooterV3, тем же способом, что /estimate, /articles и /docs.

ПЕРИМЕТР. /v3 убран из @meraPages, @meraShortSlash и @meraLongPages, но
не выброшен: адрес две недели был открыт наружу и разошёлся по закладкам,
поэтому вместо тишины белого списка — 301 на корень (@meraV3Gone, обе
формы). На это заведена проверка в public-perimeter.test.ts по образцу
соседних; PREVIEW_ONLY стал пустым, а не удалённым — он держит проверку
«наружу не открыто ничего сверх известных страниц» двусторонней.

Из PUBLIC_SHORT_PATHS гварда /v3 убран: редирект отрабатывает в Caddy, до
приложения запрос не доходит, а недостижимая строка в списке публичных
путей сделала бы публичной будущую страницу с тем же адресом. Гейт
Caddy→гвард односторонний и сам бы этого не поймал — обоснование в коде.

NOINDEX ОСТАВЛЕН. Он держится за плейсхолдерные числа marketing-v3.ts
(#2904), а не за то, какой вариант дизайна стоит в корне. Путь в гейте
обновлён на page.tsx: placeholdersInUse() молча пропускает ненайденный
файл, поэтому устаревшая строка не покраснела бы, а перестала бы
сканировать.
fix(mera/b2c): вернуть потерянные вопросы FAQ, починить адрес превью и честность двух комментариев
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
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 1m0s
49652f4413
Правки по трём ревью ветки «v3 становится корнем».

FAQ. Из шести вопросов `content.ts` возражения v3 брали два, остальные
четыре (`how-accurate`, `vs-marketplace`, `personal-data`, `bank-report`)
не рендерились нигде: `Faq.tsx`, который выводил все шесть, удалён вместе
с лэндингом v1. Макетные возражения их тематически закрывали, но
пересказом — а оригиналы проходили юр-ревью. Содержательно пропали два
утверждения: «Имя, паспорт и документы на квартиру мы не спрашиваем» с
отсылкой к странице ПДн (152-ФЗ) и «показываем диапазон, а не одно число»
как прямой ответ про точность (рамка диапазона осталась только в
`AccuracyV3`, рядом с плейсхолдерными числами).

Теперь в секции один порядок чтения: все шесть вопросов из `FAQ` по id
плюс три макетных возражения, которым в `FAQ` пары нет («факт сделки»,
«почему так дёшево», «подписка»). Три макетных пересказа удалены в пользу
оригиналов; у «почему так дёшево» убран второй абзац — почти дословный
повтор второго абзаца `how-accurate`, который теперь стоит следующим.
Новых формулировок не добавлено. Отсылка к странице ПДн стала живой
ссылкой через `PublicLink` (обычный `<a>`, basePath не течёт); текст
ссылки — слова самого `content.ts`, найденные по вхождению.

Гейт стал двусторонним: тест перебирает `FAQ` и требует, чтобы КАЖДЫЙ id
был отрисован. Прежняя версия перечисляла два id руками и потому молчала
ровно в тот момент, когда четыре ответа исчезли со страницы. Проверено
мутацией: снятие вопроса, переименование id и переформулировка фразы про
ПДн красят тест по отдельности.

CADDY. `/trade-in/mera-public/v3` выбыл из @meraLongPages вместе со
страницей и никуда не попал — длинный адрес превью падал в catch-all 404,
хотя раньше вёл на страницу. Обе его формы добавлены в @meraV3Gone. Там же
редирект перестал терять query: было `redir * /`, стало `redir * {uri}`
со срезанием пути — как у @meraLongPages, где перенос UTM и обоснован.
Проверено на живом Caddy 2.11 по настоящему site-блоку: все четыре формы
дают 301 на `/` с сохранённой query, без параметров — чистый `/` без
хвоста `?`, соседние матчеры не задеты, лишний сегмент по-прежнему 404.

КОММЕНТАРИИ, ОПИСЫВАЮЩИЕ НЕСУЩЕСТВУЮЩЕЕ. Строка `page.tsx` в гейте
плейсхолдеров убрана: комментарий над ней утверждал, что устаревший путь
«перестал бы что-либо сканировать», но ни в корневом `page.tsx`, ни в
прежнем `v3/page.tsx` нет ни одного имени из `PLACEHOLDER_EXPORTS` —
страница только собирает секции. Замер подтверждает: множество найденных
плейсхолдеров со строкой и без неё совпадает, а сама по себе она не даёт
ничего. Держать её значило держать ложное ощущение охвата.

Дескриптор «Оценка вторичного жилья по рыночным данным · <регион>» на
внутренние страницы не возвращается — причина записана в докстринге
`InnerHeader`: эту шапку носят и `/estimate`, `/articles`, `/docs`, где
дескриптора не было никогда; требование юриста было про первый экран
лэндинга и там выполняется `HeroV3`; на самих юр-страницах то же сказано
сильнее — в тексте оферты (п. 1.3, 6.2) и в `FooterV3` на каждой странице.
bot-backend merged commit 5d93f13030 into main 2026-08-29 15:32:37 +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#3236
No description provided.