EPIC: Мера (trade-in) — ремедиация полного аудита 2026-07-02 #2200

Open
opened 2026-07-02 19:16:18 +00:00 by lekss361 · 3 comments
Owner

Контекст

Полный жёсткий мульти-агентный аудит Меры (10 направлений, 53 находки, каждый critical/high adversarial-верифицирован, 3 громких заявления переподтверждены на проде вручную).

Артефакт (browsable): https://claude.ai/code/artifact/a5e25331-f29b-4010-ac93-ce49ac70a490
Vault: inbox/2026-07-02-1900-mera-full-hard-audit.md
Baseline: _audit_ptica_0622 (22.06)

Вердикт

Инженерия сильная и честная; как продукт — zero-revenue, 1 активный внешний юзер, B2B-триал истёк без конверсии, а число, что видит клиент, промахивается в 43% случаев (range-coverage 56.6%, n=371). Корневой паттерн — измерение без следствия: честный замер не запустил ни baseline, ни CI-гейт, ни раскрытие в UI, ни рекалибровку.

⏱ Часы распада — середина июля (делать в первую очередь)

Четыре срока сходятся за ~2 недели:

  • 15.07 — все 3 mobile-прокси истекают одновременно → avito+cian+yandex умрут вместе (за всеми один IP).
  • ~12.07 — domklik (6296) выпадет из пула аналогов (scraped_at заморожен 28.06 + фильтр 14д).
  • сейчас — CIAN забанен 7/7 за неделю; эстиматору видно 934/15759 (5.9%).
  • deals заморожены 182 дня; Sber-индекс 62д при лимите 35.

Задачи

P0 — часы распада / data-loss

  • #2201 · Продлить 3 mobile-прокси до 15.07 (needs-human)
  • #2202 · Подключить scrape_proxies pool к боевым скрейперам (убрать single-IP SPOF)
  • #2203 · Off-box бэкап tradein-postgres + restore-тест + hardening скрипта (needs-human)
  • #2204 · deactivate_stale для domklik/n1 + честный трекинг freshness
  • #2205 · Убрать публичную фейк-оценку ui-preview с прода (+noindex)

P1 — точность / производительность / гейты

  • #2206 · Обновлять scraped_at в upsert (вернуть ~55% инвентаря эстиматору)
  • #2207 · Снять блокировку event loop на POST /estimate
  • #2208 · Pre-merge CI-гейт для tradein-mvp (backend pytest + frontend typecheck/lint)
  • #2209 · Честность диапазона: раскрыть/рекалибровать 56.6% + min-width floor + persist backtest baseline + CI-регресс-гейт
  • #2211 · Честность UI-источников: убрать «/7», фолбэк-чипы, «классическую», зелёный cache-дот, «CV»; единый source-registry
  • #2212 · Починить rosreestr_dkp_import (deals 182д) + алерт на max(deal_date)
  • #2213 · Defense-in-depth trusted-header auth + rate-limiter fix
  • #2214 · Observability: uptime-probe off-box + fail health-check на dead backend + mem-лимиты + log-rotation

P2 — долг / данные / структура

  • #2215 · Кросс-источник дедуп аналогов (убрать ~19% двойного счёта)
  • #2216 · Миграции: порядок (до рестарта) + реконсиляция 152 vs 131 + дубль-префиксы

Сквозные темы (диагноз системы)

Построено-но-не-эксплуатируется · silent-green сбой · расхождение реестра/реальности · часы распада · долг честности отрастает (нет инвариантов) · измерение без следствия · SPOF фрактальны · все гейты пост-фактум.


Задачи созданы без status/ready — чтобы не спустить сразу пул ботов на автопикап. Для запуска пайплайна: проставить status/ready на нужные (боты подхватят по scope) или запустить worker'ов вручную.

## Контекст Полный жёсткий мульти-агентный аудит Меры (10 направлений, 53 находки, каждый critical/high adversarial-верифицирован, 3 громких заявления переподтверждены на проде вручную). **Артефакт (browsable):** https://claude.ai/code/artifact/a5e25331-f29b-4010-ac93-ce49ac70a490 **Vault:** `inbox/2026-07-02-1900-mera-full-hard-audit.md` **Baseline:** `_audit_ptica_0622` (22.06) ## Вердикт Инженерия сильная и честная; как **продукт** — zero-revenue, 1 активный внешний юзер, B2B-триал истёк без конверсии, а число, что видит клиент, промахивается в **43%** случаев (range-coverage 56.6%, n=371). Корневой паттерн — **измерение без следствия**: честный замер не запустил ни baseline, ни CI-гейт, ни раскрытие в UI, ни рекалибровку. ## ⏱ Часы распада — середина июля (делать в первую очередь) Четыре срока сходятся за ~2 недели: - **15.07** — все 3 mobile-прокси истекают одновременно → avito+cian+yandex умрут вместе (за всеми один IP). - **~12.07** — domklik (6296) выпадет из пула аналогов (scraped_at заморожен 28.06 + фильтр 14д). - **сейчас** — CIAN забанен 7/7 за неделю; эстиматору видно 934/15759 (5.9%). - deals заморожены 182 дня; Sber-индекс 62д при лимите 35. ## Задачи ### P0 — часы распада / data-loss - [ ] #2201 · Продлить 3 mobile-прокси до 15.07 _(needs-human)_ - [ ] #2202 · Подключить scrape_proxies pool к боевым скрейперам (убрать single-IP SPOF) - [ ] #2203 · Off-box бэкап tradein-postgres + restore-тест + hardening скрипта _(needs-human)_ - [x] #2204 · deactivate_stale для domklik/n1 + честный трекинг freshness - [x] #2205 · Убрать публичную фейк-оценку `ui-preview` с прода (+noindex) ### P1 — точность / производительность / гейты - [x] #2206 · Обновлять `scraped_at` в upsert (вернуть ~55% инвентаря эстиматору) - [x] #2207 · Снять блокировку event loop на POST /estimate - [x] #2208 · Pre-merge CI-гейт для tradein-mvp (backend pytest + frontend typecheck/lint) - [x] #2209 · Честность диапазона: раскрыть/рекалибровать 56.6% + min-width floor + persist backtest baseline + CI-регресс-гейт - [x] #2211 · Честность UI-источников: убрать «/7», фолбэк-чипы, «классическую», зелёный cache-дот, «CV»; единый source-registry - [x] #2212 · Починить rosreestr_dkp_import (deals 182д) + алерт на max(deal_date) - [x] #2213 · Defense-in-depth trusted-header auth + rate-limiter fix - [x] #2214 · Observability: uptime-probe off-box + fail health-check на dead backend + mem-лимиты + log-rotation ### P2 — долг / данные / структура - [ ] #2215 · Кросс-источник дедуп аналогов (убрать ~19% двойного счёта) - [x] #2216 · Миграции: порядок (до рестарта) + реконсиляция 152 vs 131 + дубль-префиксы ## Сквозные темы (диагноз системы) Построено-но-не-эксплуатируется · silent-green сбой · расхождение реестра/реальности · часы распада · долг честности отрастает (нет инвариантов) · измерение без следствия · SPOF фрактальны · все гейты пост-фактум. --- _Задачи созданы без `status/ready` — чтобы не спустить сразу пул ботов на автопикап. Для запуска пайплайна: проставить `status/ready` на нужные (боты подхватят по scope) или запустить worker'ов вручную._
lekss361 added the
priority/p0
tradein
labels 2026-07-02 19:19:53 +00:00
Author
Owner

Ночная смена 02-03.07 — промежуточный статус (bot):

Смержено + задеплоено + проверено (8 issue закрыто):

  • #2208 → PR #2220 (pre-merge CI-гейт tradein; deselect-чистка; pytest-timeout) — гейт самопроверился и с тех пор гейтит все ночные PR.
  • #2204 → PR #2221 (deactivate_stale domklik по scraped_at — last_seen_at всех 6296 строк двигается нетрекаемым bulk-touch — + n1; расписания на проде, первый прогон 07:00 UTC; issue открыт до верификации прогона).
  • #2205 → PR #2223 (preview-флаг не запекается в прод; фейк-оценка живьём исчезла, noindex).
  • #2206 → PR #2224 (scraped_at bump + бэкфилл 161: estimator-visible CIAN 934→5598 (×6), avito→8474, yandex→7528; live-бэктест до/после — метрики не хуже: bias −2.73→−2.29%, MAPE/coverage/width равны).
  • #2207 → PR #2225 (event loop: 15 sync-кластеров → to_thread; прод-замер: 3 параллельных estimate + /health за 0.17s).
  • #2211 → PR #2227 (единый source-registry, фейк-чипы/«/7»/«классическая»/псевдо-CV/вечнозелёный дот убраны + type-level инвариант).
  • #2212 → PR #2226 (расследовано: импорт НЕ сломан, deal_date=лейбл квартала, Q2 ждёт публикации Росреестра ~август; daily freshness-монитор → GlitchTip).
  • #2215 — уже был решён PR #2173 (кросс-source дедуп, default ON) — аудит со стейл-ветки.
  • #2216 → PR #2228 (миграции ДО up, pg_isready-wait; реконсиляция не нужна — 154==154; manifest-инвариант против rename-trap).
  • #2213 → PR #2229 (shared-secret Caddy↔backend fail-open + rate-limiter per-user/rightmost-XFF + log_credentials убран; issue открыт: needs-human провижининг секрета, шаги в issue).
  • #2209: PR #2230 смержен (min-width floor ±12%, frozen baseline байт-идентичен) + PR #2232 в CI (UI-раскрытие «~80% покрытия, июль 2026»); baseline+CI-гейт уже были (#1966+#2208); сегментная калибровка — follow-up с данными (n=561: эконом +3.2%, бизнес −16.3%, элит −25.7%) — за флагом при дневном ревью.
  • #2214: PR #2231 в CI (health-check валит деплой; mem-лимиты от прод-замеров — коробка фактически 12G, не 4G; log-rotation 20m×3; off-box uptime = needs-human).

needs-human комменты оставлены: #2201 (продлить прокси до 15.07!), #2203, #2213 (секрет), #2214 (uptime-хост), #2217, #2218. #2202 делает другое окно (feat/proxy-pool-p3/p4).

**Ночная смена 02-03.07 — промежуточный статус (bot):** Смержено + задеплоено + проверено (8 issue закрыто): - #2208 → PR #2220 (pre-merge CI-гейт tradein; deselect-чистка; pytest-timeout) — гейт самопроверился и с тех пор гейтит все ночные PR. - #2204 → PR #2221 (deactivate_stale domklik по **scraped_at** — last_seen_at всех 6296 строк двигается нетрекаемым bulk-touch — + n1; расписания на проде, первый прогон 07:00 UTC; issue открыт до верификации прогона). - #2205 → PR #2223 (preview-флаг не запекается в прод; фейк-оценка живьём исчезла, noindex). - #2206 → PR #2224 (scraped_at bump + бэкфилл 161: estimator-visible CIAN 934→**5598 (×6)**, avito→8474, yandex→7528; live-бэктест до/после — метрики не хуже: bias −2.73→−2.29%, MAPE/coverage/width равны). - #2207 → PR #2225 (event loop: 15 sync-кластеров → to_thread; прод-замер: 3 параллельных estimate + /health за **0.17s**). - #2211 → PR #2227 (единый source-registry, фейк-чипы/«/7»/«классическая»/псевдо-CV/вечнозелёный дот убраны + type-level инвариант). - #2212 → PR #2226 (расследовано: импорт НЕ сломан, deal_date=лейбл квартала, Q2 ждёт публикации Росреестра ~август; daily freshness-монитор → GlitchTip). - #2215 — уже был решён PR #2173 (кросс-source дедуп, default ON) — аудит со стейл-ветки. - #2216 → PR #2228 (миграции ДО up, pg_isready-wait; реконсиляция не нужна — 154==154; manifest-инвариант против rename-trap). - #2213 → PR #2229 (shared-secret Caddy↔backend fail-open + rate-limiter per-user/rightmost-XFF + log_credentials убран; **issue открыт: needs-human провижининг секрета**, шаги в issue). - #2209: PR #2230 смержен (min-width floor ±12%, frozen baseline байт-идентичен) + PR #2232 в CI (UI-раскрытие «~80% покрытия, июль 2026»); baseline+CI-гейт уже были (#1966+#2208); сегментная калибровка — follow-up с данными (n=561: эконом +3.2%, бизнес −16.3%, элит −25.7%) — за флагом при дневном ревью. - #2214: PR #2231 в CI (health-check валит деплой; mem-лимиты от прод-замеров — **коробка фактически 12G, не 4G**; log-rotation 20m×3; off-box uptime = needs-human). needs-human комменты оставлены: #2201 (продлить прокси до 15.07!), #2203, #2213 (секрет), #2214 (uptime-хост), #2217, #2218. #2202 делает другое окно (`feat/proxy-pool-p3/p4`).
Author
Owner

🌅 Утренний отчёт — ночная смена 02→03.07.2026 (продолжение, окно 2)

Смержено и задеплоено этим окном (7 PR, все деплои success)

PR Issue Что
#2253 #2204 domklik остаётся активным — его TTL-расписание выключено (решение user); n1-TTL не тронут
#2232 #2209 Честное раскрытие покрытия диапазона в hero (~80%, live-бэктест n=276)
#2258 #2233 photo-upload: чанковое чтение с капом 10 MiB → 413 сразу + Caddy request_body 12MB (OOM-вектор закрыт)
#2261 #2234 admin.py: generic detail + error-id вместо сырого текста исключений (8 мест → 1 хелпер)
#2263 #2236 external_valuations.house_id: резолв в write-path + идемпотентный CLI-бэкфилл
#2271 #2235, #2216 yandex url-«дубли»: каноникализация URL (корень + миграция 164, 204→0 групп, 0 деактиваций) + manifest-фикс 162
#2276 #2204 n1 выведен полностью (решение user утром): миграция 165 + вычистка backend/ops/frontend, история сохранена

Ночью ранее (окно 1): #2220-#2228 + #2229/#2230/#2231 — итого за ночь 18 PR смержено, эпик: 11 из 14 задач закрыто.

Верифицировано на проде (не по чекам — живьём)

  • n1: active=0, расписания/настройки удалены, история 382 строки inactive; domklik: 6296 активны, TTL off.
  • yandex: URL-дубль-группы 204 → 0, инвентарь цел (9064).
  • mem-лимиты #2231 применены ко ВСЕМ контейнерам (postgres 3g / backend 768m / browser 2560m / frontend 384m / scraper 640m — scraper подхватил с деплоем #2253), pg healthcheck работает.
  • Backfill #2236: canary на проде --dry-run --limit 100 → resolved=82, errors=0.

Адверсариальный аудит закрытий (12 verify-агентов, код main + прод read-only)

9 confirmed (#2205 #2206 #2207 #2208 #2209 #2211 #2212 #2233 #2214-bot). Например #2206 подтверждён эффектом: cian estimator-visible 5.9% → 35.4%. 3 gap'а найдено и обработано:

  • #2215: дедуп-механизм жив, но ключ схлопывает лишь 13.5% кросс-source дублей (76.3% листингов без кадастра); живая оценка всё ещё содержит квартиру ×3 источника → follow-up #2269 (ключ по house_id_fk), чекбокс не тикнут.
  • #2216: manifest был stale на 1 запись (162) — дофиксено в PR #2271.
  • #2213: подтверждена живая уязвимость: forged X-Authenticated-User: admin изнутри сети → 200 admin (секрет не запровижинен, fail-open). Код готов, эффект — за провижинингом (см. ниже).

Эстиматор до/после ремедиации (live-бэктест)

bias −2.73% → −2.29%, MAPE 14.7% → 14.78%, range-coverage 81.5% (в UI раскрыто «~80%»). Frozen baseline не изменился; регресс-гейт в CI на каждый PR.

Новые issue

  • #2255 — сегментная калибровка за флагом (эконом +3.2% / комфорт −4.5% / бизнес −16.3% / элит −25.7%, длинное окно n=561) + разбор «только-вверх» IMV-лифтов.
  • #2269 — эффективность кросс-source дедупа (ключ по house_id_fk).

⚠️ needs-human (по срочности)

  1. #2201 — прокси до 15.07! Все 3 mobile-прокси истекают одновременно → avito+cian+yandex умрут вместе.
  2. #2213 — запровижинить TRADEIN_INTERNAL_AUTH_SECRET (шаги в issue; уязвимость подтверждена live, порядок Caddy→backend критичен).
  3. #2236 — полный прогон бэкфилла (~1579 строк UPDATE; команда и canary в issue-комменте — я не запускал: прод write за пределами мандата окна).
  4. #2203 — off-box бэкап; #2214 — off-box uptime-probe; #2217 (152-ФЗ), #2218 (продукт).

Инциденты

Не было. Все деплои success, health 200 на протяжении смены, спейсинг мержей соблюдён. Примечание: каталоги C:/tmp/wt-* этой смены остались на диске (rm -rf заблокирован хуком) — git-метаданные почищены, можно удалить руками.

Vault: 4 записи (fixes-батч Фазы 4, verification-аудит, n1-retirement, + ранее defense-in-depth/range-floor) разложены по decisions/fixes, MOC обновлены.

## 🌅 Утренний отчёт — ночная смена 02→03.07.2026 (продолжение, окно 2) ### Смержено и задеплоено этим окном (7 PR, все деплои success) | PR | Issue | Что | |---|---|---| | #2253 | #2204 | domklik остаётся активным — его TTL-расписание выключено (решение user); n1-TTL не тронут | | #2232 | #2209 | Честное раскрытие покрытия диапазона в hero (~80%, live-бэктест n=276) | | #2258 | #2233 | photo-upload: чанковое чтение с капом 10 MiB → 413 сразу + Caddy request_body 12MB (OOM-вектор закрыт) | | #2261 | #2234 | admin.py: generic detail + error-id вместо сырого текста исключений (8 мест → 1 хелпер) | | #2263 | #2236 | external_valuations.house_id: резолв в write-path + идемпотентный CLI-бэкфилл | | #2271 | #2235, #2216 | yandex url-«дубли»: каноникализация URL (корень + миграция 164, 204→0 групп, 0 деактиваций) + manifest-фикс 162 | | #2276 | #2204 | **n1 выведен полностью** (решение user утром): миграция 165 + вычистка backend/ops/frontend, история сохранена | Ночью ранее (окно 1): #2220-#2228 + #2229/#2230/#2231 — итого за ночь **18 PR смержено**, эпик: 11 из 14 задач закрыто. ### Верифицировано на проде (не по чекам — живьём) - n1: active=0, расписания/настройки удалены, история 382 строки inactive; domklik: 6296 активны, TTL off. - yandex: URL-дубль-группы 204 → **0**, инвентарь цел (9064). - mem-лимиты #2231 применены ко ВСЕМ контейнерам (postgres 3g / backend 768m / browser 2560m / frontend 384m / scraper 640m — scraper подхватил с деплоем #2253), pg healthcheck работает. - Backfill #2236: canary на проде `--dry-run --limit 100` → resolved=82, errors=0. ### Адверсариальный аудит закрытий (12 verify-агентов, код main + прод read-only) **9 confirmed** (#2205 #2206 #2207 #2208 #2209 #2211 #2212 #2233 #2214-bot). Например #2206 подтверждён эффектом: cian estimator-visible 5.9% → 35.4%. **3 gap'а найдено и обработано:** - **#2215:** дедуп-механизм жив, но ключ схлопывает лишь 13.5% кросс-source дублей (76.3% листингов без кадастра); живая оценка всё ещё содержит квартиру ×3 источника → follow-up **#2269** (ключ по house_id_fk), чекбокс не тикнут. - **#2216:** manifest был stale на 1 запись (162) — дофиксено в PR #2271. - **#2213:** подтверждена **живая уязвимость**: forged `X-Authenticated-User: admin` изнутри сети → 200 admin (секрет не запровижинен, fail-open). Код готов, эффект — за провижинингом (см. ниже). ### Эстиматор до/после ремедиации (live-бэктест) bias −2.73% → **−2.29%**, MAPE 14.7% → 14.78%, range-coverage **81.5%** (в UI раскрыто «~80%»). Frozen baseline не изменился; регресс-гейт в CI на каждый PR. ### Новые issue - **#2255** — сегментная калибровка за флагом (эконом +3.2% / комфорт −4.5% / бизнес −16.3% / элит −25.7%, длинное окно n=561) + разбор «только-вверх» IMV-лифтов. - **#2269** — эффективность кросс-source дедупа (ключ по house_id_fk). ### ⚠️ needs-human (по срочности) 1. **#2201 — прокси до 15.07!** Все 3 mobile-прокси истекают одновременно → avito+cian+yandex умрут вместе. 2. **#2213 — запровижинить `TRADEIN_INTERNAL_AUTH_SECRET`** (шаги в issue; уязвимость подтверждена live, порядок Caddy→backend критичен). 3. **#2236 — полный прогон бэкфилла** (~1579 строк UPDATE; команда и canary в issue-комменте — я не запускал: прод write за пределами мандата окна). 4. #2203 — off-box бэкап; #2214 — off-box uptime-probe; #2217 (152-ФЗ), #2218 (продукт). ### Инциденты Не было. Все деплои success, health 200 на протяжении смены, спейсинг мержей соблюдён. Примечание: каталоги `C:/tmp/wt-*` этой смены остались на диске (rm -rf заблокирован хуком) — git-метаданные почищены, можно удалить руками. _Vault: 4 записи (fixes-батч Фазы 4, verification-аудит, n1-retirement, + ранее defense-in-depth/range-floor) разложены по decisions/fixes, MOC обновлены._
Author
Owner

Статус-апдейт (2026-07-03, продолжение после утренней ремедиации):

Закрыто в этой сессии: #2036 (эпик trade-in/v2 wiring) целиком — #2040, #2041, #2045 (2 PR), #2046; #2217 (телефоны продавцов → NULL); #1969 частично (client PII → DROP, остаток needs-human для будущего B2C); #2269 (кросс-source дедуп, был закрыт до старта сессии — цель 10.9%<20% достигнута PR #2290).

Новый follow-up: #2317 (LocationDrawer frontend wiring к готовому #2045 backend).

Остаётся open в этом эпике: #2201 (needs-human, прокси до 15.07), #2202 (P0, scrape_proxies pool — не в scope этой сессии), #2203 (needs-human p3, off-box бэкап), #2213 (defense-in-depth код готов, провижининг секрета — needs-human), #2214 (needs-human, off-box uptime), #2218 (needs-human, продуктовая ясность).

Все 4 PR этой сессии (#2298/#2299/#2300/#2314) — code-review APPROVE, деплой подтверждён зелёным со спейсингом (без rapid-merge коллизий), smoke на проде PASS по каждому.

Статус-апдейт (2026-07-03, продолжение после утренней ремедиации): **Закрыто в этой сессии:** #2036 (эпик trade-in/v2 wiring) целиком — #2040, #2041, #2045 (2 PR), #2046; #2217 (телефоны продавцов → NULL); #1969 частично (client PII → DROP, остаток needs-human для будущего B2C); #2269 (кросс-source дедуп, был закрыт до старта сессии — цель 10.9%<20% достигнута PR #2290). Новый follow-up: #2317 (LocationDrawer frontend wiring к готовому #2045 backend). **Остаётся open в этом эпике:** #2201 (needs-human, прокси до 15.07), #2202 (P0, scrape_proxies pool — не в scope этой сессии), #2203 (needs-human p3, off-box бэкап), #2213 (defense-in-depth код готов, провижининг секрета — needs-human), #2214 (needs-human, off-box uptime), #2218 (needs-human, продуктовая ясность). Все 4 PR этой сессии (#2298/#2299/#2300/#2314) — code-review APPROVE, деплой подтверждён зелёным со спейсингом (без rapid-merge коллизий), smoke на проде PASS по каждому.
Sign in to join this conversation.
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#2200
No description provided.