tradein/frontend: остаточный слой фикстур — 600 строк выдуманных чисел без потребителей + комментарии, описывающие исчезнувший контракт #2755

Closed
opened 2026-08-06 19:02:38 +00:00 by lekss361 · 5 comments
Owner

Хвост после PR #2747 (фикстуры дизайн-макета перестали быть значением по умолчанию). Рантайм-риска нет, но заряженное ружьё осталось лежать в том же ящике.

Найдено ревью #2747. Все пункты — один и тот же остаточный слой, логично закрыть одним PR.

1. Мёртвые числовые экспорты fixtures.ts

После правки восемнадцать экспортов с выдуманными числами имеют ноль потребителей: report, object, resultCards, ranges, scatterMini, summary, dkpRows, history, adRows, dealRows, marketAds, marketDeals, analytics, cacheRows, cacheKpi и другие. Это примерно 600 строк, и модуль по-прежнему импортируется четырьмя файлами (ради статического UI-конфига — лейблов, версии, опций селектов).

Отдельно fixtures.ts:663-670 — экспорт user («Андрей Петров» / «Брусника» / reports: 128). Он осиротел ещё до #2747: TopNav имеет собственный нейтральный фолбэк «Гость» и намеренно исключает счётчик отчётов. Кандидат №1 на удаление.

Предложение: вынести статический UI-конфиг (navLabels, version, overlayNums, overlayTitles, dropdownOptions) в отдельный модуль, а fixtures.ts удалить целиком.

2. Комментарии описывают контракт, которого больше нет

  • v2/mappers.ts:6-8 — шапка файла утверждает «the fixtures stay as the prop DEFAULT so unwired usage still renders». После #2747 это прямая неправда, причём в том самом файле, который описывает контракт мапперов.
  • v2/mappers.ts:1969-1970 — «Optional so the design fixtures stay valid as the component DEFAULT». Сама опциональность полей нормальна, но её обоснование умерло.

3. Мёртвая ветка с псевдо-ссылкой

v2/SourcesView.tsx:279-301 — ветка r.url === undefined рисует некликабельный элемент, стилизованный под кнопку-ссылку «Росреестр ↗», с комментарием «undefined for the design fixtures».

Проверено: mappers.ts:2082 всегда отдаёт string | null, то есть undefined невозможен и ветка недостижима. Не баг, но ровно тот класс дефекта, против которого делался #2747 — интерфейсный элемент, который выглядит рабочим и не является им.

4. Осиротевший CSS

frontend/src/app/site-finder/analysis/[cad]/ptica/ptica.module.css:911-930 — правила .placeholderPanel, .placeholderPanel .soon, .placeholderPanel p остались от удалённого в #2747 компонента.

Побочно: Storybook в проекте отсутствует полностью

Ревью установило: ни одного файла историй, ни конфигурации. Все комментарии вида «Optional: unwired/storybook usage falls back to the fixture» защищали потребителя, которого никогда не существовало.

Это стоит держать в голове при чтении остальных комментариев в v2/ — там могут быть и другие обоснования, ссылающиеся на несуществующую инфраструктуру.

Две неточности в описании PR #2747 (для истории, не требуют действий)

  • «весь кокпит ПТИЦА (42 файла) не тронут» — каталог ptica/ уменьшился с 42 до 41 файла, удалённый PticaPlaceholderPanel.tsx лежал именно там;
  • «eslint чисто» — в лэйне МЕРЫ есть два предупреждения (scrapers/cian/page.tsx:167, trade-in/OfferCard.tsx:208), оба предсуществующие, задачу не валят.
Хвост после PR #2747 (фикстуры дизайн-макета перестали быть значением по умолчанию). Рантайм-риска нет, но заряженное ружьё осталось лежать в том же ящике. Найдено ревью #2747. Все пункты — один и тот же остаточный слой, логично закрыть одним PR. ## 1. Мёртвые числовые экспорты `fixtures.ts` После правки восемнадцать экспортов с выдуманными числами имеют **ноль потребителей**: `report`, `object`, `resultCards`, `ranges`, `scatterMini`, `summary`, `dkpRows`, `history`, `adRows`, `dealRows`, `marketAds`, `marketDeals`, `analytics`, `cacheRows`, `cacheKpi` и другие. Это примерно 600 строк, и модуль по-прежнему импортируется четырьмя файлами (ради статического UI-конфига — лейблов, версии, опций селектов). Отдельно `fixtures.ts:663-670` — экспорт `user` («Андрей Петров» / «Брусника» / `reports: 128`). Он осиротел **ещё до** #2747: `TopNav` имеет собственный нейтральный фолбэк «Гость» и намеренно исключает счётчик отчётов. Кандидат №1 на удаление. Предложение: вынести статический UI-конфиг (`navLabels`, `version`, `overlayNums`, `overlayTitles`, `dropdownOptions`) в отдельный модуль, а `fixtures.ts` удалить целиком. ## 2. Комментарии описывают контракт, которого больше нет - `v2/mappers.ts:6-8` — шапка файла утверждает «the fixtures stay as the prop DEFAULT so unwired usage still renders». После #2747 это прямая неправда, причём в том самом файле, который описывает контракт мапперов. - `v2/mappers.ts:1969-1970` — «Optional so the design fixtures stay valid as the component DEFAULT». Сама опциональность полей нормальна, но её обоснование умерло. ## 3. Мёртвая ветка с псевдо-ссылкой `v2/SourcesView.tsx:279-301` — ветка `r.url === undefined` рисует **некликабельный** элемент, стилизованный под кнопку-ссылку «Росреестр ↗», с комментарием «undefined for the design fixtures». Проверено: `mappers.ts:2082` всегда отдаёт `string | null`, то есть `undefined` невозможен и ветка недостижима. Не баг, но ровно тот класс дефекта, против которого делался #2747 — интерфейсный элемент, который выглядит рабочим и не является им. ## 4. Осиротевший CSS `frontend/src/app/site-finder/analysis/[cad]/ptica/ptica.module.css:911-930` — правила `.placeholderPanel`, `.placeholderPanel .soon`, `.placeholderPanel p` остались от удалённого в #2747 компонента. ## Побочно: Storybook в проекте отсутствует полностью Ревью установило: ни одного файла историй, ни конфигурации. Все комментарии вида «Optional: unwired/storybook usage falls back to the fixture» защищали потребителя, **которого никогда не существовало**. Это стоит держать в голове при чтении остальных комментариев в `v2/` — там могут быть и другие обоснования, ссылающиеся на несуществующую инфраструктуру. ## Две неточности в описании PR #2747 (для истории, не требуют действий) - «весь кокпит ПТИЦА (42 файла) не тронут» — каталог `ptica/` уменьшился с 42 до 41 файла, удалённый `PticaPlaceholderPanel.tsx` лежал именно там; - «eslint чисто» — в лэйне МЕРЫ есть два предупреждения (`scrapers/cian/page.tsx:167`, `trade-in/OfferCard.tsx:208`), оба предсуществующие, задачу не валят.
Collaborator

НЕ ЗАКРЫТО — остаточный слой на месте целиком. Проверка 2026-08-07 09:0x UTC

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

Поштучно, все четыре пункта:

п.1 — мёртвые числовые экспорты

tradein-mvp/frontend/src/components/trade-in/v2/fixtures.ts — файл на месте, 23 экспорта, 18 465 байт. Экспорт user («Андрей Петров» / «Брусника») жив, строки 663-670 — тот самый кандидат №1 на удаление, осиротевший ещё до #2747.

п.2 — комментарии описывают контракт, которого нет

v2/mappers.ts:6-8, дословно из файла:

the fixtures stay as the prop DEFAULT so unwired usage still renders

После #2747 это неправда, и лежит она в шапке файла, описывающего контракт мапперов. Строка 1969-1970 («Optional so the design fixtures stay valid as the component DEFAULT») тоже на месте.

п.3 — мёртвая ветка с псевдо-ссылкой

v2/SourcesView.tsx:280 — комментарий undefined for the design fixtures (→ "Росреестр ↗" fallback...) и ветка под ним. Недостижима: mappers.ts отдаёт string | null.

п.4 — осиротевший CSS

frontend/src/app/site-finder/analysis/[cad]/ptica/ptica.module.css:911, 921, 928.placeholderPanel, .placeholderPanel .soon, .placeholderPanel p от удалённого компонента.

Отдельно

Побочная находка ревью — Storybook в проекте отсутствует полностью — остаётся в силе и остаётся полезной: все комментарии вида «Optional: unwired/storybook usage falls back to the fixture» защищают потребителя, которого никогда не было. При уборке стоит проверить остальные обоснования в v2/ на ту же ссылку в пустоту.

## НЕ ЗАКРЫТО — остаточный слой на месте целиком. Проверка 2026-08-07 09:0x UTC PR на эту задачу нет ни одного — ни по API Forgejo, ни в истории коммитов. Ноль имеет причину: **никто не брался**. Поштучно, все четыре пункта: ### п.1 — мёртвые числовые экспорты `tradein-mvp/frontend/src/components/trade-in/v2/fixtures.ts` — файл на месте, **23 экспорта**, 18 465 байт. Экспорт `user` («Андрей Петров» / «Брусника») жив, строки 663-670 — тот самый кандидат №1 на удаление, осиротевший ещё до #2747. ### п.2 — комментарии описывают контракт, которого нет `v2/mappers.ts:6-8`, дословно из файла: > `the fixtures stay as the prop DEFAULT so unwired usage still renders` После #2747 это неправда, и лежит она в шапке файла, описывающего контракт мапперов. Строка 1969-1970 («Optional so the design fixtures stay valid as the component DEFAULT») тоже на месте. ### п.3 — мёртвая ветка с псевдо-ссылкой `v2/SourcesView.tsx:280` — комментарий `undefined for the design fixtures (→ "Росреестр ↗" fallback...)` и ветка под ним. Недостижима: `mappers.ts` отдаёт `string | null`. ### п.4 — осиротевший CSS `frontend/src/app/site-finder/analysis/[cad]/ptica/ptica.module.css:911, 921, 928` — `.placeholderPanel`, `.placeholderPanel .soon`, `.placeholderPanel p` от удалённого компонента. ### Отдельно Побочная находка ревью — Storybook в проекте отсутствует полностью — остаётся в силе и остаётся полезной: все комментарии вида «Optional: unwired/storybook usage falls back to the fixture» защищают потребителя, которого никогда не было. При уборке стоит проверить остальные обоснования в `v2/` на ту же ссылку в пустоту.
Collaborator

Взял в работу, PR #2785 — все четыре пункта в одном.

Диагнозы: п.1 мёртвый (0 потребителей у 18 экспортов, проверены импорты/реэкспорт/строковый доступ/тесты/.design-sync), п.2 комментарии про исчезнувший контракт, п.3 мёртвая ветка (починен корень — опциональность полей в типе, не сама ветка), п.4 мёртвый CSS.

Отдельно, чего в issue не было: та же опциональность породила ещё четыре недостижимые подстановки того же класса — ?? "Avito", ?? "Росреестр", ?? "по улице" и два ?? "—". Ветку без исправления типа чинить бессмысленно: тип продолжал бы разрешать undefined.

Не удалено, потому что живое: sources мёртв, но buildSources в mappers.ts считает то же самое из API. LOCATION_FIXTURE в LocationDrawer оставлен — это не выдуманные числа, а честные прочерки состояния загрузки.

13 проверок #2769 зелёные до и после, и проверено, что они ещё умеют краснеть (поломка mapHistory → 2 падения, SaleShareList → 5, ветки 429 → 1).

Взял в работу, PR #2785 — все четыре пункта в одном. Диагнозы: п.1 мёртвый (0 потребителей у 18 экспортов, проверены импорты/реэкспорт/строковый доступ/тесты/.design-sync), п.2 комментарии про исчезнувший контракт, п.3 мёртвая ветка (починен корень — опциональность полей в типе, не сама ветка), п.4 мёртвый CSS. Отдельно, чего в issue не было: та же опциональность породила ещё четыре недостижимые подстановки того же класса — `?? "Avito"`, `?? "Росреестр"`, `?? "по улице"` и два `?? "—"`. Ветку без исправления типа чинить бессмысленно: тип продолжал бы разрешать `undefined`. Не удалено, потому что живое: `sources` мёртв, но `buildSources` в mappers.ts считает то же самое из API. `LOCATION_FIXTURE` в LocationDrawer оставлен — это не выдуманные числа, а честные прочерки состояния загрузки. 13 проверок #2769 зелёные до и после, и проверено, что они ещё умеют краснеть (поломка mapHistory → 2 падения, SaleShareList → 5, ветки 429 → 1).
Collaborator

PR #2785 смержен (9de690ad). Код В ОБРАЗЕ, но НЕ на проде — деплой заблокирован чужой причиной, фиксирую здесь, чтобы не потерялось.

Что проверено про мой код. docker run --rm ghcr.io/lekss361/gendesign-tradein-frontend:latest (собран 10:04 UTC, через 3 минуты после мержа): BUILD_ID=QpUEc584o76UZX1_Uj4Ac, вхождений «Росреестр ↗» в .next/static3 против 4 в работающем контейнере. Три оставшихся — настоящие ссылки на Росреестр в DealsCard/ListingsCard/StreetDealsCard, их я не трогал. Ушедшее четвёртое — та самая кнопка-обманка. «Андрей Петров»/«Брусника» в бандле не было НИ ДО, ни после: мёртвый экспорт вытряхивался tree-shaking'ом — на экран он не попадал, но лежал в исходниках заряженным.

Почему не на проде. tradein-frontend работает с 09:14 UTC на BUILD_ID=e9Nw4nLyXNOr4n5JHfDH1. Четыре деплоя подряд красные — 6972 (#2784), 6976, 6979 и мой 6988 — все на одном шаге:

→ Applying migration: 250_drop_duplicate_expires_at_index.sql
BEGIN
2026/08/07 10:16:01 Run Command Timeout

250_*.sql делает DROP INDEX trade_in_estimates_expires_at_idx, которому нужен ACCESS EXCLUSIVE. Держит его pid 83256 — CREATE TEMP TABLE tmp_res AS WITH e AS (SELECT id, created_at, room…), возраст 1ч07м, AccessShareLock именно на trade_in_estimates_expires_at_idx (проверено в pg_locks, не догадка). Миграция ждёт до 10-минутного таймаута SSH-шага, job падает ДО docker compose up -d — контейнеры не пересоздаются вообще.

250 в _schema_migrations не значится: транзакция откатывается вместе с контейнером job'а.

Это не дефект #2755 и не дефект самой миграции по существу — это отсутствие lock_timeout/CONCURRENTLY у DDL, который встаёт в очередь за часовым аналитическим запросом. Пока запрос жив, ЛЮБОЙ tradein-деплой будет красным. Заводить отдельный тикет на это — за владельцем #2784/#2752.

Скриншот /trade-in/v2 на проде появится, как только деплой пройдёт: сейчас там ещё старый бандл, и снимок показал бы не то состояние, которое я сдаю.

PR #2785 смержен (9de690ad). Код В ОБРАЗЕ, но НЕ на проде — деплой заблокирован чужой причиной, фиксирую здесь, чтобы не потерялось. **Что проверено про мой код.** `docker run --rm ghcr.io/lekss361/gendesign-tradein-frontend:latest` (собран 10:04 UTC, через 3 минуты после мержа): `BUILD_ID=QpUEc584o76UZX1_Uj4Ac`, вхождений «Росреестр ↗» в `.next/static` — **3** против **4** в работающем контейнере. Три оставшихся — настоящие ссылки на Росреестр в `DealsCard`/`ListingsCard`/`StreetDealsCard`, их я не трогал. Ушедшее четвёртое — та самая кнопка-обманка. «Андрей Петров»/«Брусника» в бандле не было НИ ДО, ни после: мёртвый экспорт вытряхивался tree-shaking'ом — на экран он не попадал, но лежал в исходниках заряженным. **Почему не на проде.** `tradein-frontend` работает с 09:14 UTC на `BUILD_ID=e9Nw4nLyXNOr4n5JHfDH1`. Четыре деплоя подряд красные — 6972 (#2784), 6976, 6979 и мой 6988 — все на одном шаге: ``` → Applying migration: 250_drop_duplicate_expires_at_index.sql BEGIN 2026/08/07 10:16:01 Run Command Timeout ``` `250_*.sql` делает `DROP INDEX trade_in_estimates_expires_at_idx`, которому нужен ACCESS EXCLUSIVE. Держит его pid 83256 — `CREATE TEMP TABLE tmp_res AS WITH e AS (SELECT id, created_at, room…)`, возраст 1ч07м, `AccessShareLock` **именно на `trade_in_estimates_expires_at_idx`** (проверено в `pg_locks`, не догадка). Миграция ждёт до 10-минутного таймаута SSH-шага, job падает ДО `docker compose up -d` — контейнеры не пересоздаются вообще. `250` в `_schema_migrations` не значится: транзакция откатывается вместе с контейнером job'а. Это не дефект #2755 и не дефект самой миграции по существу — это отсутствие `lock_timeout`/`CONCURRENTLY` у DDL, который встаёт в очередь за часовым аналитическим запросом. Пока запрос жив, ЛЮБОЙ tradein-деплой будет красным. Заводить отдельный тикет на это — за владельцем #2784/#2752. Скриншот `/trade-in/v2` на проде появится, как только деплой пройдёт: сейчас там ещё старый бандл, и снимок показал бы не то состояние, которое я сдаю.
Collaborator

Уточнение к блокировке: держатель замка — интерактивная сессия, а не фоновая задача.

pid 83256 | application_name = psql | client_addr = (unix socket) | active | 1ч08м
CREATE TEMP TABLE tmp_res AS WITH e AS (SELECT id, created_at, rooms, area_m2::float area,
  median_price, range_high, ...

Похоже на ручной бэктест эстиматора через docker exec tradein-postgres psql. Я его НЕ снимаю: это чужая работа на боевой базе, и решение о pg_terminate_backend не моё.

Критерий приёмки прод-верификации #2755 (записан ДО факта, 2026-08-07 10:35 UTC):

  1. pid 83256 завершился ИЛИ снят владельцем;
  2. перезапуск deploy-tradein.yml (workflow_dispatch) — зелёный, 250_*.sql применилась;
  3. docker exec tradein-frontend cat .next/BUILD_ID = QpUEc584o76UZX1_Uj4Ac (не e9Nw4nLyXNOr4n5JHfDH1);
  4. grep -ro "Росреестр ↗" .next/static | wc -l в РАБОТАЮЩЕМ контейнере = 3 (сейчас 4);
  5. скриншот /trade-in/v2 после входа — та же вёрстка, что до.

Пока хотя бы один пункт не выполнен, прод-верификация считается не сделанной, а не «сделанной с оговоркой».

Что уже проверено визуально, без прода. Прод-сборкой (next build + next start) отрисован ровно тот компонент, который менялся — SourcesView с данными настоящего mapSources — на коммите до правки и после. Скриншоты побайтово идентичны (cmp совпал на обоих наборах данных: строки со ссылкой и строки без). Различия в DOM — только build-id и имена чанков Next. То есть «показывает то же» доказано на уровне пикселей; открытым остаётся только то, что новый бандл ещё не доехал до контейнера.

Уточнение к блокировке: держатель замка — **интерактивная сессия**, а не фоновая задача. ``` pid 83256 | application_name = psql | client_addr = (unix socket) | active | 1ч08м CREATE TEMP TABLE tmp_res AS WITH e AS (SELECT id, created_at, rooms, area_m2::float area, median_price, range_high, ... ``` Похоже на ручной бэктест эстиматора через `docker exec tradein-postgres psql`. Я его НЕ снимаю: это чужая работа на боевой базе, и решение о `pg_terminate_backend` не моё. **Критерий приёмки прод-верификации #2755 (записан ДО факта, 2026-08-07 10:35 UTC):** 1. `pid 83256` завершился ИЛИ снят владельцем; 2. перезапуск `deploy-tradein.yml` (`workflow_dispatch`) — зелёный, `250_*.sql` применилась; 3. `docker exec tradein-frontend cat .next/BUILD_ID` = `QpUEc584o76UZX1_Uj4Ac` (не `e9Nw4nLyXNOr4n5JHfDH1`); 4. `grep -ro "Росреестр ↗" .next/static | wc -l` в РАБОТАЮЩЕМ контейнере = **3** (сейчас 4); 5. скриншот `/trade-in/v2` после входа — та же вёрстка, что до. Пока хотя бы один пункт не выполнен, прод-верификация считается **не сделанной**, а не «сделанной с оговоркой». **Что уже проверено визуально, без прода.** Прод-сборкой (`next build` + `next start`) отрисован ровно тот компонент, который менялся — `SourcesView` с данными настоящего `mapSources` — на коммите до правки и после. Скриншоты **побайтово идентичны** (`cmp` совпал на обоих наборах данных: строки со ссылкой и строки без). Различия в DOM — только build-id и имена чанков Next. То есть «показывает то же» доказано на уровне пикселей; открытым остаётся только то, что новый бандл ещё не доехал до контейнера.
Collaborator

Прод-верификация 12.08: критерий выполнен по всем пяти пунктам — закрываю

Критерий был записан 07.08 10:35 ДО факта, пока деплой стоял в очереди за чужой psql-сессией. Проверяю построчно.

  1. Блокировка снята. 250_drop_duplicate_expires_at_index.sql применена 2026-08-09 17:15:10 UTC (_schema_migrations) — часовой ручной бэктест кончился, DROP INDEX взял лок. Отдельного вмешательства не понадобилось.
  2. Деплой прошёл. tradein-frontend работает с 2026-08-11 04:27:39 UTC.
  3. Бандл сменился: BUILD_ID = q6ZpeUgUGGQexSmQ7vou5, старого e9Nw4nLyXNOr4n5JHfDH1 больше нет. Дословного QpUEc584o76UZX1_Uj4Ac из критерия там тоже нет и быть не может — с 07.08 в main уехали ещё правки фронта, образ пересобирался. Существенная часть пункта («работает не тот бандл, что был») выполнена.
  4. Псевдо-ссылки нет. В работающем контейнере grep -ro "Росреестр ↗" .next/static | wc -l = 3 (было 4). Три оставшихся — настоящие ссылки в DealsCard / ListingsCard / StreetDealsCard. Дополнительно: файлов с «Андрей Петров» в .next/static0.
  5. Страница жива. GET /trade-in/v2 изнутри сети — HTTP/1.1 200 OK, x-nextjs-prerender: 1, отдаётся документ с <title>МЕРА · Оценка v2</title>.

Оговорка к п.5, чтобы не выдавать за большее: свежего авторизованного скриншота я не делал. Отсутствие визуальной регрессии доказано ДО мержа побайтовым сравнением скриншотов прод-сборки на настоящих данных mapSources (два набора: строки со ссылкой и без), а сегодня подтверждено лишь тем, что задеплоенная страница отвечает 200 и рендерится.

В исходниках origin/main остаточного слоя нет: v2/fixtures.ts отсутствует целиком, вместе с 18 мёртвыми экспортами и user («Андрей Петров» / «Брусника»).

Все четыре пункта задачи закрыты, критерий прод-верификации выполнен. Побочная находка ревью (Storybook в проекте отсутствует, а комментарии «unwired/storybook usage falls back to the fixture» защищали несуществующего потребителя) остаётся полезной при чтении остального v2/ — но своей задачи не требует.

## Прод-верификация 12.08: критерий выполнен по всем пяти пунктам — закрываю Критерий был записан 07.08 10:35 ДО факта, пока деплой стоял в очереди за чужой psql-сессией. Проверяю построчно. 1. **Блокировка снята.** `250_drop_duplicate_expires_at_index.sql` применена 2026-08-09 17:15:10 UTC (`_schema_migrations`) — часовой ручной бэктест кончился, `DROP INDEX` взял лок. Отдельного вмешательства не понадобилось. 2. **Деплой прошёл.** `tradein-frontend` работает с 2026-08-11 04:27:39 UTC. 3. **Бандл сменился**: `BUILD_ID` = `q6ZpeUgUGGQexSmQ7vou5`, старого `e9Nw4nLyXNOr4n5JHfDH1` больше нет. Дословного `QpUEc584o76UZX1_Uj4Ac` из критерия там тоже нет и быть не может — с 07.08 в main уехали ещё правки фронта, образ пересобирался. Существенная часть пункта («работает не тот бандл, что был») выполнена. 4. **Псевдо-ссылки нет.** В **работающем** контейнере `grep -ro "Росреестр ↗" .next/static | wc -l` = **3** (было 4). Три оставшихся — настоящие ссылки в `DealsCard` / `ListingsCard` / `StreetDealsCard`. Дополнительно: файлов с «Андрей Петров» в `.next/static` — **0**. 5. **Страница жива.** `GET /trade-in/v2` изнутри сети — `HTTP/1.1 200 OK`, `x-nextjs-prerender: 1`, отдаётся документ с `<title>МЕРА · Оценка v2</title>`. Оговорка к п.5, чтобы не выдавать за большее: свежего авторизованного скриншота я не делал. Отсутствие визуальной регрессии доказано ДО мержа побайтовым сравнением скриншотов прод-сборки на настоящих данных `mapSources` (два набора: строки со ссылкой и без), а сегодня подтверждено лишь тем, что задеплоенная страница отвечает 200 и рендерится. **В исходниках `origin/main` остаточного слоя нет**: `v2/fixtures.ts` отсутствует целиком, вместе с 18 мёртвыми экспортами и `user` («Андрей Петров» / «Брусника»). Все четыре пункта задачи закрыты, критерий прод-верификации выполнен. Побочная находка ревью (Storybook в проекте отсутствует, а комментарии «unwired/storybook usage falls back to the fixture» защищали несуществующего потребителя) остаётся полезной при чтении остального `v2/` — но своей задачи не требует.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#2755
No description provided.