2025-07-15 - 2026-07-15
Overview
1495 pull requests merged by 6 users
Merged
#2525 fix(tradein/scraper): per-city SERP location for oblast city-sweep (#12)
Merged
#2524 feat(tradein/ui): admin links to audit + analytics in UserMenu
Merged
#2523 fix(tradein/avito): route sidecar timeout/transport errors as transient, not crash
Merged
#2522 fix(tradein/audit): exclude /api/v1/admin/* from api_request events
Merged
#2521 feat(tradein/admin): audit + activity dashboards (Feature 2/3 UI)
Merged
#2520 feat(tradein/admin): audit + analytics read API over user_events
Merged
#2518 fix(tradein/estimator): analogs cards match n_analogs, no cross-source dups
Merged
#2516 fix(tradein/auth): honest 401/error screens in RouteGuard instead of misleading text
Merged
#2517 fix(tradein/quota): per-user quota override + no burn on empty result
Merged
#2519 feat(tradein/audit): request-audit middleware + estimate_request logging → user_events
Merged
#2515 feat(tradein/db): user_events table — unified login/IP audit + behavior event log
Merged
#2514 feat(tradein/ui): Telegram feedback button in Topbar (env-gated)
Merged
#2513 fix(tradein/pdf): МЕРА branding + 4-page report (no empty pages)
Merged
#2512 fix(tradein/auth): restore brusnika (user2) pilot access
Merged
#2511 feat(tradein/lead): persist 152-ФЗ proof-of-consent (LOW audit R2 #9)
Merged
#2510 fix(tradein/scheduler): re-enable deactivate_stale_domklik now that domclick sweeps run (LOW audit R2 #10)
Merged
#2509 fix(tradein/location-coef): re-center coefficient band so a strong central location ~= 1.0 (LOW audit R2 #7a)
Merged
#2508 fix(tradein/v2): location coefficient informational + price-history clarity (LOW audit R2 #7c/#8)
Merged
#2507 fix(tradein/scrapers): clamp implausible listing/publish dates (LOW audit R2 #6)
Merged
#2506 fix(tradein/pdf): scale offer-page rent by room count (LOW audit R2 #5)
Merged
#2505 fix(tradein/estimator): honest repair-note + ratio_basis label; doc EKB-calibrated constants (LOW audit R2 #1-4)
Merged
#2504 fix(tradein/geocoder): gate EKB-local tiers for non-EKB oblast addresses (#11)
Merged
#2502 fix(tradein/matching): Tier-2a city-guard для non-ЕКБ coord-less (п.2, defense-in-depth)
Merged
#2503 feat(tradein): sber-index freshness monitor (п.1 observability)
Merged
#2501 refactor(tradein): консолидировать corridor/street-deals city-scope на _resolve_target_city (п.3)
Merged
#2500 fix(tradein): oblast avito-sweep city-slug + Tier-2b geo-guard (R2, latent)
Merged
#2499 fix(tradein/v2): honesty + a11y — histogram outlier-guard, scatter-релейбл, mobile-notice, keyboard-nav (R2)
Merged
#2498 fix(tradein/rbac): энфорсить roles.yaml scope на всех non-admin путях (R2 H3 security)
Merged
#2497 fix(tradein/lead): phone digit-guard, убрать dead landing-литерал, 152-ФЗ audit (R2)
Merged
#2496 fix(tradein): ingest/scheduler integrity — year sanity, propagate geo-guard, dkp_import counters + DO UPDATE (R2)
Merged
#2495 fix(tradein): image_sanitizer — reject decompression-bomb до декода (R2 security)
Merged
#2494 fix(tradein/pdf): честность отчёта — убрать фейк-сроки, хардкод EKБ, противоречивый дисконт (R2)
Merged
#2493 fix(tradein/estimator): СберИндекс только вторичка + confidence dispersion-ceiling (R2 H1+H2)
Merged
#2492 fix(tradein/estimator): non-EKB headline из deals + geo-bound Tier-S analog leak
Merged
#2491 feat(tradein/backtest): --city per-city валидация точности + corridor city-parity
Merged
#2490 fix(tradein/estimator): резолвить target-город коридора из payload.address (C2 hotfix)
Merged
#2488 fix(tradein/estimator): city-scope ДКП-коридора + oblast city-tokens/bbox
Merged
#2489 fix(tradein): city-scope ДКП-запросы — убрать oblast-контаминацию (C1+C2)
Merged
#2487 feat(tradein/scraper): per-city sweep capability для 5 городов области (schedules disabled)
Merged
#2486 fix(tradein/dadata): suggest-fallback для house_fias_id когда CLEAN выключен
Merged
#2485 fix(tradein/estimator): per-city ценовой band ДКП-сделок для всей Свердловской обл. (66)
Merged
#2484 fix(tradein/geocoder): раз-хардкод геокодера/DaData на всю Свердловскую обл. (region 66)
Merged
#2483 fix(tradein/v2): аналитика — выровнять два графика в равную высоту
Merged
#2482 fix(tradein/ingest): раз-хардкод rosreestr DKP импорта на всю Свердловскую обл. (region 66)
Merged
#2481 fix(tradein/v2): честность+консистентность — реконсиляция счётчика аналогов, убрать фейк-donut/линейку, outlier-guard, created_at, дисклеймеры
Merged
#2480 fix(tradein/v2): аналитика — 2 графика в ряд, чтобы Цена×срок влезала на экран
Merged
#2479 fix(tradein/v2): polish АНАЛИТИКА — растянуть scatter, клэмп оси к 0, честные легенды/бакеты, убрать фейк-тренд
Merged
#2478 feat(tradein/v2): карта вторички — сделки Росреестра + объявления по источникам (SourcesView)
Merged
#2477 fix(tradein): repoint rosreestr_poll to /data-sets/ + verify Content-Type (СДЕЛКИ dataset moved off /opendata)
Merged
#2476 feat(tradein): fill houses.year_built/material_walls from ДОМ.РФ КР1.1/1.2 + zhkh_year, propagate to listings (#2013)
Merged
#2475 tech-debt(tradein/estimator): collapse won estimate_* flags into defaults (#1970)
Merged
#2473 test(rbac): user2 expected role expired after brusnika trial cutoff
Merged
#2472 fix(tradein/auth): expire brusnika (user2) trial access
Merged
#2471 fix(honesty): true competitors/neighbors totals + permits truncation disclosure (#2464 cluster B)
Merged
#2470 fix(analytics): de-inflate domrf_kn snapshot counts (8.49×) + backfill UPSERT columns (#2464)
Merged
#2469 fix(site_finder): SAVEPOINT supply/market + convert 2 bare rollbacks (#2464 Wave 2)
Merged
#2468 fix(site_finder): SAVEPOINT-isolate gate-lookup db.execute swallows (#2464 Wave 2)
Merged
#2467 fix(site_finder): SAVEPOINT-isolate quarter-dump lookup db.execute (#2464 Wave 2)
Merged
#2466 fix(forecasting): SAVEPOINT-isolate §22 db.execute failures + close RELEASE-trap (#2464)
Merged
#2465 fix(site_finder): SAVEPOINT-isolate DB errors across cluster A (#2464)
Merged
#2463 fix(concept): §7 massing-сцена осознаёт весь MultiPolygon (соседи уезжали до 1.6км) (#2180)
Merged
#2461 fix(scrapers): rate-limit/backoff/circuit-breaker для ОКН EGRKN-скрапера (#2445-D3)
Merged
#2460 fix(workers): izyatie per-doc isolation + newbuilding-crossload breadcrumb (#2445-D5/D6)
Merged
#2459 fix(scrapers): WAF-guard эндпоинтов + throttled catalog BrowserSession (#2445-D1/D2)
Merged
#2458 fix(backend): reservation_ingest пейсинг + короткоживущая DB-сессия (#2445-D4)
Merged
#2456 fix(export): недостающая §13.7 «Уверенность» в PDF-экспортёре отчёта (#2445-C2)
Merged
#2455 fix(generative): устаревший VAT/office caveat в concept PDF (#2445-C1)
Merged
#2454 fix(site-finder): remount analysis-дерева при смене cad (#2445-B4)
Merged
#2451 fix(frontend): нейтральный fallback для gate/velocity enum-lookup (#2445-B2/B3)
Merged
#2453 fix(generative): отклонять спроецированные координаты до pyproj CRSError → 422 (#2445-B1)
Merged
#2450 fix(site-finder): true-counts вместо молча-усечённых len(list) в connection-points/utility (#2445-A1/A2)
Merged
#2448 fix(site-finder): раскрыть proxy-fraction в EKB-median velocity-бенчмарке (#2445-A4)
Merged
#2447 fix(site-finder): competitors avg-price по per-object снапшоту, не глобальному (#2445-A5)
Merged
#2446 fix(site-finder): L2 hidden-supply не обнуляет неизвестный flat_count (#2445-A3)
Merged
#2444 feat(scrapers): wire per-flat DOM.РФ catalog scraper + propagate catalog_url_hash (#2442)
Merged
#2441 feat(scrapers): extract + download DOM.РФ flat plan images (#2440)
Merged
#2439 fix(devops): переносим deploy-obsidian.yml в .forgejo/workflows/ (#2416)
Merged
#2438 fix(tradein/cian): extract_all_states — discover new .concat() format, not just legacy .push()
Merged
#2437 fix(tradein/cian): персист bti_data/valuation house_info в houses + дедуп УК (#2435)
Merged
#2436 feat(tradein/domclick): production Layer B detail-backfill orchestrator (#2000)
Merged
#2434 feat(tradein/pdf): редизайн отчёта в реальном языке МЕРА (v2 HUD)
Merged
#2433 feat(tradein/domclick): cookie-injection MVP для обхода QRATOR-блока (#2000)
Merged
#2432 fix(tradein/estimator): восстановить и канонизировать корпус дома в дедупе (регрессия #2429)
Merged
#2430 fix(tradein/domclick): органический заход через SERP перед card-fetch (anti-QRATOR)
Merged
#2429 fix(tradein/estimator): дом «2» вместо «15» при глухом названии станции метро в avito-адресе
Merged
#2428 fix(tradein/v2): гонка при клике по строке «Предыдущие оценки» — отчёт не загружался
Merged
#2427 fix(tradein/pdf): честный embedded-шрифт (PT Sans/PT Serif) + matplotlib-график вместо div
Merged
#2426 chore(tradein/proxy-pool): добавить domclick в provider_affinity CHECK (residential ASocks для #2000)
Merged
#2424 feat(tradein/v2): кликабельные строки + параметры в оверлее «Предыдущие оценки»
Merged
#2421 feat(exporters): зеркалим permits_nearby (ГИСОГД 500м) в DOCX §6
Merged
#2419 chore(tradein/scrapers): удалить весь legacy scrapers/ каталог — final E (#2397, #2277)
Merged
#2420 feat(tradein/history): вернуть все параметры оценки в GET /history
Merged
#2418 fix(devops): cleanup-merged-worktrees.sh — 3 бага, найденные вживую на 69 забытых worktree
Merged
#2417 fix(tradein/estimator): устранить остаточные кросс-сорс дубли (#2291)
Merged
#2412 refactor(tradein/tasks): yandex_newbuilding_sweep на kit + config= (#2397 Part D5)
Merged
#2414 refactor(tradein/admin): debug newbuilding endpoints на kit + config=, fix stray await (#2397 Part D4)
Merged
#2415 refactor(tradein/tasks): newbuilding_enrich_backfill на kit cian.newbuilding + config= (#2397 Part D3)
Merged
#2411 refactor(tradein/tasks): cian_history_backfill valuation+newbuilding на kit + config= (#2397 Part D2)
Merged
#2410 refactor(tradein/tasks): avito_detail_backfill build_warmed_session на kit + config= (#2397 Part D1, #2330)
Merged
#2413 fix(devops): couchdb healthcheck ложный 401 — auth /_up кредами
Merged
#2407 refactor(tradein/scrapers): удалить 6 осиротевших legacy scraper-модулей + тест-хирургия (#2397 Part E2)
Merged
#2405 refactor(tradein/scrapers): удалить legacy scrape_pipeline.py + тест-хирургия (#2397 Part E1)
Merged
#2404 fix(tradein/scraper-kit): клампить diff_percent перед INSERT offer_price_history
Merged
#2403 feat(site-finder): PermitsNearbyBlock — разрешения на строительство в §6 (#2367 PR-2, frontend-half)
Merged
#2402 refactor(tradein/scheduler): удалить legacy scheduler_loop, kit единственный путь (#2397 Part C)
Merged
#2401 feat(gisogd66): permits_nearby — точный радиус-запрос РНС/РВЭ (#2367 PR-2, backend-half)
Merged
#2400 refactor(tradein/admin): debug sweep endpoints на kit orchestration (#2397 slice A)
Merged
#2399 refactor(tradein/avito): avito_detail_backfill off scrape_pipeline helpers (#2397 slice B)
Merged
#2398 fix(tradein/v2): смонтировать форму лида (#2377) в живое v2-дерево (#2395)
Merged
#2396 fix(tradein/estimator): kitchen_area_m2/ceiling_height_m/is_apartments comp-scoring (#2012)
Merged
#2393 feat(tradein/v2): replace mailto lead CTA with real form (#2377)
Merged
#2392 fix(tradein/v2): audit #2081 residual — 404 short-circuit, disabled-tab tooltips, stale hex token, ДКП decode
Merged
#2394 chore(tradein/scraper-kit): удалить 5 orphaned legacy-модулей (#2277 финальный шаг, частичный)
Merged
#2391 fix(tradein/estimator): rebase ground-floor hedonic term onto current main (#2002, #2382)
Merged
#2390 feat(tradein/lead): POST /api/v1/trade-in/lead — persist contact leads (#2376)
Merged
#2389 fix(tradein/v2): mobile layout — remove overflow floor + honest stacked mobile block (#2275)
Merged
#2383 fix(gisogd66): CAST(:geojson AS text) — AmbiguousParameter ронял каждый upsert
Merged
#2388 fix(tradein/deploy): atomic recreate + graceful scraper drain + startup-reap (#1951)
Merged
#2387 fix(tradein/estimator): lock honest asking_to_sold_ratio invariant + disambiguate torg bases (#2087 M2/M3)
Merged
#2384 refactor(tradein/scraper-kit): yandex providers on shared _base.py (#2363)
Merged
#2375 refactor(tradein/scraper-kit): avito providers on shared _base.py (#2361)
Merged
#2374 refactor(tradein/scraper-kit): cian providers on shared _base.py (#2362)
Merged
#2372 refactor(tradein/scraper-kit): domclick providers on shared _base.py (#2364)
Merged
#2371 fix(gisogd66): битый 500-сегмент портала — no-retry карточек, circuit breaker, периодический commit
Merged
#2370 feat(scrapers): реестр РНС/РВЭ ГИСОГД-СО из открытого API — миграция + лоадер (#2367 PR-1)
Merged
#2368 feat(forecast-ui): confidence band на ForecastChart — качественный интервал уверенности (#1926)
Merged
#2366 feat(chat): tool get_parcel_info — курируемый градрегламент/ЗОУИТ/ЕГРН в контекст чата
Merged
#2365 fix(landing): Trade-In nav как внешний <a> на /trade-in/v2 (ChunkLoadError)
Merged
#2360 feat(tradein/scraper-kit): shared base/utils для providers/* (#2358, Foundation)
Merged
#2359 fix(tradein/houses): персистить house_class из avito «Класс жилья» и yandex parse (#2003)
Merged
#2357 fix(report-pdf): best-effort inline §22-форсайт на холодном участке — отчёт самодостаточен
Merged
#2356 fix(tradein/scraper-kit): проброс endpoint= в yandex/cian newbuilding BrowserFetcher (#2322)
Merged
#2355 fix(tradein/estimator): честная маркировка quarter-precision дат ДКП + insufficient_data флаг для sell-time-sensitivity (#1995)
Merged
#2354 fix(tradein/scraper-kit): проброс config= в avito build_warmed_session (#2330)
Merged
#2353 fix(report-ui): ретрай docx-preflight против 502-гонки сразу после ready
Merged
#2348 feat(tradein/estimator): switch core valuation call sites to scraper_kit (#2337)
Merged
#2347 fix(report): дата сборки в POST-ответе на fast-path из кэша (последний хвост R2 #2259)
Merged
#2346 fix(tradein/scrapers): подключить geoportal coords backfill в scheduler (#1967)
Merged
#2343 fix(reports): HEAD-поддержка на /report/download — qa поймал 405, DOCX не скачивался из UI
Merged
#2345 test(tradein/scraper-kit): prove yandex_valuation kit path safe for #2337 (#2336)
Merged
#2344 test(tradein/scraper-kit): golden-parity + config-footgun proof for avito_imv (#2334)
Merged
#2342 test(tradein/scraper-kit): prove cian_valuation kit path safe for #2337 (#2335)
Merged
#2341 fix(tradein/v2): подключить реальные данные location-coef в LocationDrawer + HeroBar (#2317)
Merged
#2340 fix(tradein/avito): консолидировать house_type normalizer + актуализировать docstring (#2009)
Merged
#2339 fix(tradein/scrapers): cian_city_sweep честный статус при defensive abort (#1949)
Merged
#2338 feat(ptica/reports): DOCX-скачивание полного отчёта в UI (#2259 R2)
Merged
#2333 feat(tradein/scraper-kit): migrate backfill/enrichment tasks to kit (#2310)
Merged
#2331 perf(sql): покрывающий индекс под offer-trend §4.3 — 6.8с → 1.1с (миграция 186)
Merged
#2329 fix(market-metrics): offer-trend таймаут — warning вместо exception (ложные GlitchTip-события)
Merged
#2332 fix(tradein/v2): гейтить PDF-кнопку на hasEstimate (#2081 M4)
Merged
#2328 fix(tradein/scrapers): wire proxy_pool into Avito legacy pipeline, rotate on ban (#2202)
Merged
#2325 fix(freshness): пороги nspd_geo под on-demand каденцию (убирает еженедельный ложный stale)
Merged
#2327 fix(tradein/pdf): sold-price consistency + актуальные допущения + свой дизайн отчёта
Merged
#2326 feat(tradein/scraper-kit): migrate admin debug endpoints + domclick ingest to kit (#2305)
Merged
#2319 fix(generative): честные типы в dxf-экспортёре — strict mypy проходит (#2316)
Merged
#2324 feat(tradein/scraper-kit): migrate cian/yandex price-history & session to kit (#2306)
Merged
#2321 fix(tradein/v2): пометка «В ОФФЕР» + сузить реестровую карточку (#1991)
Merged
#2318 feat(tradein/scraper-kit): port domclick_detail + ekb_geoportal_client to kit (#2307)
Merged
#2315 fix(generative): MultiPolygon-участки — крупнейший контур в _parse_polygon (#2295)
Merged
#2314 feat(tradein): location-coef MVP через FDW-мост к OSM POI Птицы (#2045 PR-B)
Merged
#2313 test(tradein): reusable legacy/scraper_kit parity harness (#2304)
Merged
#2312 fix(tradein/v2): визуальный аудит — иерархия/честность/микрокопи (#2266)
Merged
#2311 fix(tradein/estimator): дедуп кросс-source дублей в anchor-пути (#2265 follow-up)
Merged
#2303 fix(tradein/pii): удалить телефоны продавцов (NULL) + PII клиента (DROP) (#2217, #1969)
Merged
#2301 feat(exporters): DOCX-вариант полного отчёта ПТИЦА (#2259 R2)
Merged
#2300 feat(tradein/v2): реальный display-профиль в TopNav через /me (#2046)
Merged
#2299 feat(site-finder): view v_tradein_osm_poi_ekb для FDW-моста trade-in location-coef (#2045 PR-A)
Merged
#2302 chore(claude): явный CI-gate перед merge (false-green trap) + анти-rubber-stamp формат verdict'а
Merged
#2298 fix(tradein/v2): реальный cv + единый source-registry в overlay-мапперах (#2040, #2041)
Merged
#2297 fix(full-report): generic-маркеры областных админ-единиц в ЕКБ-фильтре тепла
Merged
#2296 fix(full-report): §7 на MultiPolygon + чистка печатного шума §3/§4 (вычитка живого отчёта)
Merged
#2293 feat(tradein/estimator): сегментная поправка headline+выкуп по ценовому бэнду за флагом (#2255)
Merged
#2292 chore(claude): token-diet — worker-агенты на sonnet (opus только deep-code-reviewer)
Merged
#2290 fix(tradein/estimator): парсер адресов — имя-перед-типом, glued-суффикс, микрорайоны (#2269)
Merged
#2289 fix(site-finder): «Скачать отчёт» без пустых скобок на fast-path из кэша
Merged
#2288 feat(site-finder): кнопка «Полный отчёт (PDF)» (#2259 PR-E, финал эпика)
Merged
#2287 feat(reports): Celery-джоба полного PDF-отчёта + кэш + 3 endpoint'а (#2259 PR-D)
Merged
#2286 feat(exporters): серверный статик-рендер карт для PDF-отчёта (#2259 PR-C Maps)
Merged
#2285 feat(exporters): PURE HTML §4–§7 полного PDF-отчёта (#2259 PR-B Sections)
Merged
#2284 feat(exporters): PURE HTML-агрегатор §1–§3 + альтернативы (#2259 PR-A Foundation)
Merged
#2283 fix(site-finder): SET LOCAL литералом — bind-параметр ломал nearby_network_zones
Merged
#2282 feat(site-finder): блок «Сети рядом с участком» в §3 (Фаза C2-UI)
Merged
#2281 feat(site-finder): позитив-разрез сетевых ЗОУИТ «сеть рядом с участком» (Фаза C2/C3)
Merged
#2280 feat(site-finder): теплотрассы из OSM в слой инженерной инфраструктуры (Фаза C1)
Merged
#2278 feat: ревью-инструмент авто-маппингов Объектив↔ДОМ.РФ (/admin/mapping-review)
Merged
#2273 fix(tradein/estimator): кросс-source дедуп street+house union-find + savepoint вокруг ratio-lookup (#2265)
Merged
#2279 fix(tradein/v2/a11y): немодальный SectionOverlay + контраст токенов + headings — a11y round 3 (#2264)
Merged
#2274 chore(design-sync): durable-инпуты DS-панели tradein — 6 floor-card превью, шрифты Manrope/Plex, source-kit fork-фикс (#2267)
Merged
#2276 chore(tradein): полное выключение источника n1 — миграция 165 + вычистка backend/ops/frontend (#2204)
Merged
#2272 fix(tradein/scraper-kit): scale cian anchor watchdog for proxy-pool browser fetches (#2160)
Merged
#2270 feat(eias-heat): +6 тепло-организаций ЕКБ — ненулевые резервы ×10 (#2119)
Merged
#2271 fix(tradein/data): yandex url-«дубли» — каноникализация URL (скрейпер + миграция 164) + manifest 162 (#2235, #2216)
Merged
#2263 fix(tradein/data): external_valuations.house_id — резолв в write-path + идемпотентный бэкфилл (#2236)
Merged
#2260 feat(exporters): §4.2 supply-only блок в ТЗ-PDF (#2177)
Merged
#2268 fix(tradein/scraper-kit): wire browser proxy-pool into yandex/cian SERP + persist activation flags (#2160)
Merged
#2257 fix(site-finder): три честности-фикса — B1 ГРС «выход №N» + околонуль + Росреестр-квартал
Merged
#2261 fix(tradein/security): admin.py — generic detail + error-id вместо сырого текста исключений (#2234)
Merged
#2258 fix(tradein/security): photo-upload — чанковое чтение с капом 10MB + Caddy request_body 12MB (#2233)
Merged
#2256 feat(site-finder): «Пересчитать §7 с этой программой» из блока альтернатив (#2181 хвост)
Merged
#2232 feat(tradein/ui): честное раскрытие покрытия диапазона в hero (#2209)
Merged
#2253 fix(tradein): оставить domklik активным — отключить его TTL-деактивацию (#2204)
Merged
#2252 feat(site-finder): OSM-геокод городских ТП/РП ЕКБ (#2119 B2, финальный хвост)
Merged
#2251 feat(site-finder): Celery + §3 точки выхода газосети (#2119 B2, PR-4/4 — финал формы-6)
Merged
#2250 fix(dadata): фолбэк на suggest/address при отключённой фиче CLEAN
Merged
#2249 feat(ekgas): геокод точек выхода через DaData (#2119 B2, PR-3/4)
Merged
#2248 fix(ekgas): label-детект сетки формы 6 — живой файл сдвинут (#2119 B2)
Merged
#2247 feat(site-finder): лоадер точек выхода ГРС «Екатеринбурггаз» — форма 6 (#2119 B2, PR-2/4)
Merged
#2246 feat(db): схема gas_grs_outlet_points — форма 6 Екатеринбурггаза (#2119 B2, PR-1/4)
Merged
#2245 fix(etl): гео-проход — префикс «г Екатеринбург» адресам без города (#2177 остаток)
Merged
#2244 feat(etl): гео-проход auto_core_geo_v6 для tier_b/ambiguous mapping (#2177 остаток)
Merged
#2243 perf(db): physflat-covering индекс v2 с price_per_m2_rub в INCLUDE (#2177 follow-up)
Merged
#2242 fix(report): авторетрай §7 с densify — «не вместила ни одной секции» больше не 422 при загрузке
Merged
#2241 fix(best-layouts): lots-проекты в пуле core-матчинга — supply-only реально наполняется (#2177)
Merged
#2240 feat(site-finder): supply-only fallback в §4.2 — предложение без темпа продаж (#2177 шаг 3)
Merged
#2239 feat(best-layouts): атрибуция velocity по ядру комплекса (#2177 шаг 2b)
Merged
#2238 fix(vodokanal): column-aligned парсинг DOCX — реальные резервы вместо № п/п (#2119/#2126)
Merged
#2237 feat(etl): auto_core_dev_v5 — core-name+dev backfill mapping'а (#2177 шаг 2)
Merged
#2231 fix(tradein/ops): health-check валит деплой + mem-лимиты + log-rotation (#2214)
Merged
#2230 fix(tradein/estimator): min-width floor ±12% на ценовой диапазон (#2209)
Merged
#2229 fix(tradein/security): defense-in-depth trusted-header auth + rate-limiter fix (#2213)
Merged
#2228 fix(tradein/deploy): миграции ДО подъёма app-контейнеров + manifest-инвариант (#2216)
Merged
#2227 fix(tradein/ui): единый source-registry + честные знаменатели/лейблы источников (#2211)
Merged
#2222 feat(site-finder): оптимизатор программ — «Как участок сходится» при отрицательном вердикте (#2181)
Merged
#2226 feat(tradein/monitor): алерт на staleness данных deals по max(deal_date) (#2212)
Merged
#2225 perf(tradein): снять блокировку event loop на POST /estimate (#2207)
Merged
#2224 fix(tradein/scrapers): bump scraped_at при ре-подтверждении живым + бэкфилл (#2206)
Merged
#2223 fix(tradein): не запекать preview-флаг в прод-образ + noindex/баннер (#2205)
Merged
#2221 fix(tradein): deactivate_stale для domklik/n1 + честная freshness по scraped_at (#2204)
Merged
#2220 ci(tradein): pre-merge гейт — backend pytest + frontend type-check/lint (#2208)
Merged
#2198 fix(best-layouts): покрытие §4.2 в комплексах, не в сырых obj_id (#2177, шаг 1/3)
Merged
#2210 feat(concept): 3D-макет окружения — соседние здания из кадастра в §7 (#2180)
Merged
#2219 feat(proxy-pool): P4 — browser dynamic pool-proxy (acquire→/fetch→relaunch) + orchestration wiring, ship-dark (#2164)
Merged
#2199 fix(tradein/deploy): scraper+backend paths-filter — matching/dedup/scraper-kit trigger rebuilds (#2188)
Merged
#2197 feat(proxy-pool): P3 — kit curl-paths acquire/release from pool behind USE_PROXY_POOL_CURL, ship-dark (#2163)
Merged
#2195 fix(tradein/dedup): drop geo-guard in fias-pass — same-fias identity outranks proximity (#2187)
Merged
#2194 fix(tradein/matching): P1 extended — never create a house from a numberless address (no cadastral)
Merged
#2196 feat(rewire): scheduler_main → kit-scheduler behind USE_KIT_SCHEDULER flag, ship-dark (#2192)
Merged
#2193 fix(tradein/v2): keep top nav active over overlays, stronger «К оценке» button, backdrop-close
Merged
#2191 fix(eias-heat): не терять резерв при одинаковых именах систем (#2119 B2)
Merged
#2190 feat(site-finder): §4.3 тренд из цен предложения Объектива при устаревших сделках (#2178)
Merged
#2186 feat(tradein/frontend): pass suggest fias_id as target_fias_id in estimate request
Merged
#2173 feat(tradein/estimator): кросс-source физдедуп аналогов за флагом (#2087 H4)
Merged
#2185 fix(tradein/dedup): fias-key clustering + cross-fias merge guard + identity carry-over (#1772 follow-up)
Merged
#2184 feat(tradein/matching): fias_exact tier + estimate fias persist + suggest fias_id contract
Merged
#2176 fix(eias-heat): column-aligned парсинг листа ТП по реальной сетке (#2119 B2)
Merged
#2183 feat(report): §7 открыт по умолчанию + выделение участка на подложке + шире карта (#2179)
Merged
#2182 feat(scraper-kit): copy scheduler with registry-dispatch (25+ trigger_* → dict), strangler (#2136)
Merged
#2175 fix(tradein/estimator): не отравлять asking→sold ratio-кэш транзиентной ошибкой
Merged
#2174 feat(scraper-kit): copy remaining sweep orchestrators (yandex/cian/domclick/full-load), strangler (#2135 F2)
Merged
#2172 fix(eias-heat): ссылка TemplatePrinter из onclick + период «N кв. YYYY» (#2119 B2)
Merged
#2171 feat(scraper-kit): copy sweep pipeline orchestration (avito) with protocol injection, strangler (#2135)
Merged
#2170 fix(scraper-kit): sync RealScraperConfig adapter with ScraperConfig protocol (cookie_encryption_key)
Merged
#2165 feat(site-finder): ЕЭСК-резервы городских ПС/ТП + тепло из ФГИС ФАС (#2119 B2)
Merged
#2169 feat(proxy-pool): pool service (acquire/release/health) + healthcheck scheduler task (#2162)
Merged
#2168 refactor(scraper-kit): unify price bisection engine across providers + dedup (#2134)
Merged
#2166 fix(tradein/frontend): redirect legacy /trade-in root to canonical /v2
Merged
#2167 feat(proxy-pool): scrape_proxies table + admin bulk-load/list endpoints (#2161)
Merged
#2159 fix(tradein/v2): честная подача интервала оценки — одна цифра-герой + честный разброс
Merged
#2158 feat(scraper-kit): copy yandex providers with protocol injection, strangler (#2133 yandex)
Merged
#2157 feat(scraper-kit): copy cian providers with protocol injection, strangler (#2133 cian)
Merged
#2156 feat(scraper-kit): copy domclick provider with protocol injection, strangler (#2133 domclick)
Merged
#2155 feat(scraper-kit): copy avito providers with protocol injection, strangler (#2133 avito)
Merged
#2154 docs(claude): delegation.md — routing-таблица, effort-правила, экономика пачек
Merged
#2153 feat(scraper-kit): copy core layer (base/save_listings/transport) with protocol injection, strangler (#2132)
Merged
#2152 fix(tradein/estimator): честный asking_to_sold_ratio — бейдж «−N% к рынку» больше не врёт
Merged
#2146 chore(claude): актуализация .claude-конфигов — политика 2026-06-27, delegation-лимиты, stale refs
Merged
#2151 feat(scraper-kit): protocol boundaries (matcher/config/session/jobs) + backend adapters (#2131)
Merged
#2150 chore(claude): security hardening — dangerous-commands hook, settings в git, restricted DB, throttle
Merged
#2149 feat(market): revoke gendesign_reader direct SELECT on raw tables (#2138 step 3/3)
Merged
#2148 feat(etl): read tradein data via market.v_* contract views (#2138 step 2/3)
Merged
#2147 feat(market): grant gendesign_reader SELECT on contract views (#2138 step 1/3)
Merged
#2145 fix(site-finder): ГРС-парсер переписан под реальную структуру таблицы ГТЕ
Merged
#2144 fix(tradein/v2): канонический sources_used — стабильный счётчик «ИСТОЧНИКОВ X/7» (#2087 M1)
Merged
#2143 chore(scraper-kit): docker-context wiring + restore backend workspace dep (#2137)
Merged
#2139 chore(scraper-kit): scaffold internal package + uv workspace (#2128)
Merged
#2142 fix(scrapers/avito): unify _unix_to_date timezone across serp/houses/imv (#2129)
Merged
#2141 feat(market): contract views market.v_* over producer tables (#2130)
Merged
#2140 feat(tradein): #2043 BE-1 (cv/source_counts/created_at + history/cache-KPI) + #2044 BE-2 (radius_m query-params)
Merged
#2125 fix(site-finder): ГРС-лоадер — HARICA-интермедиат в CA-бандл (неполная цепочка Газпрома)
Merged
#2124 fix(site-finder): ГРС-лоадер — Russian Trusted CA для домена Газпрома
Merged
#2123 feat(site-finder): газ — свободная мощность ГРС + пометка ЕЭСК в §3 (#2119 Фаза B1)
Merged
#2122 fix(site-finder): секции отчёта изначально раскрыты («Свернуть» для компакта)
Merged
#2121 fix(site-finder): Россети-раскрытие — URL-энкоженные href, ссылки на xlsx не находились
Merged
#2120 feat(site-finder): резервы мощности для ТП — электро+вода на карте §3 (#2119 Фаза A)
Merged
#2118 fix(site-finder): §4.3 график «По кварталам» — бары вылезали за край карточки
Merged
#2117 fix(site-finder): §4.3 — укомпановать 3 колонки в единообразные карточки
Merged
#2115 fix(site-finder): §4.3 подпись — убрать сырое имя поля planned_commissioning
Merged
#2116 feat(site-finder): прогрессивное раскрытие секций отчёта §1–§6 («Раскрыть всё»)
Merged
#2114 fix(site-finder): попап конкурента — NUMERIC-поля приходят строкой (цена/площадь не рендерились)
Merged
#2113 feat(site-finder): max-info попапы — конкурент / §3-таблица / польз.точка / соседи (#2111)
Merged
#2112 feat(site-finder): §3 «Сети и точки подключения» — попапы показывают характеристики (#2111)
Merged
#2110 feat(site-finder): §1 POI-точки карты показывают максимум информации
Merged
#2109 feat(concept): 3D-масса корпусов на карте с тенями (§7) (#1953)
Merged
#2107 feat(networks): человеко-язык типов §3 + реальные имена НСПД-точек (#1953)
Merged
#2108 fix(report): §4.3 выравнивание колонок (уплыло) + двойная точка в вердикте (#1953)
Merged
#2106 fix(report): sticky-сайдбар навигации — overflow-x: clip вместо hidden (#958)
Merged
#2105 fix(report): instant nav jump + scroll-position scrollspy (#958)
Merged
#2104 feat(report): nav scrollspy + offset-jump, чат в плавающее окно справа (#958)
Merged
#2103 fix(concept): step="any" — stepMismatch блокировал submit «Рассчитать концепцию» (#1953)
Merged
#2102 feat(section7): editable section footprint + корпус plural/program hint (#1953)
Merged
#2101 feat(section7): unify «Концепция» into one engine driven by building_program (#1953)
Merged
#2100 fix(site-finder): §4.2 «Качество данных» — inline-стили (Tailwind flex/gap не применяется) (#1953)
Merged
#2099 fix(site-finder): §4.2 «Качество данных» — воздух вокруг разделителя (#1953)
Merged
#2098 feat(site-finder): §7 «Концепция» — методики + синхронизация подписей (#1953, batch D)
Merged
#2097 fix(site-finder): unify §3 «Сети» table↔map source + enrich popups (#1953, batch C)
Merged
#2096 fix(forecast): §6 honesty layer — pegged deficit, non-residential caveat, segment/pipeline note (#1953)
Merged
#2095 fix(site-finder): report microcopy batch A — gate titles, breadcrumb area, §4.2/4.3 (#1953)
Merged
#2094 fix(site-finder): invest-score advisory flag + velocity data-honesty + h1 a11y (#1926)
Merged
#2093 fix(tradein/v2): убрать средний скаттер «ЦЕНА × СРОК ПРОДАЖИ» из результата
Merged
#2092 feat(tradein/sale-share): тумблер «Сейчас / За 45 дней» + фильтр «мин. объявлений»
Merged
#2091 fix(tradein/v2): источники N1+Restate вон, Домклик в текст; disabled-палитра до AA (#2081 follow-up)
Merged
#2089 fix(tradein/avito-detail): живой прогрев сессии + батч-на-сессию — снимает 403 на curl-backfill (#1551)
Merged
#2090 fix(tradein): cadastre ЖКХ-fallback + COALESCE merge-key + median-floors guard
Merged
#2088 feat(tradein/sale-share): standalone «Поиск домов» — de-Mera + gendsgn.ru/sale-share
Merged
#2086 fix(tradein/v2): UI/UX аудит round 2 — AA-контраст, честность чисел, a11y (#2081)
Merged
#2085 fix(tradein/dedup): canon cluster-key + geo/digit guard в house-merge (P4c)
Merged
#2084 fix(tradein/sale-share): гард по этажности — отсечь near-neighbor mis-match
Merged
#2083 fix(tradein/sale-share): дедуп карточки листингов + чистка голых алиасов (#4 + P4a)
Merged
#2082 fix(tradein/matching): не сваливать листинги в чужой дом (P1-P3 хардненинг матчера)
Merged
#2080 fix(tradein/sale-share): гео-фильтр числителя ≤300м — отсечь mis-bucketed листинги
Merged
#2079 fix(tradein/v2): a11y contrast — source badges ≥AA в оверлеях (#2062)
Merged
#2078 fix(tradein/v2): a11y P3b — клавиатурная форма 01 (#2062)
Merged
#2077 feat(tradein/zhkh): ЖКХ-приоритет знаменателя «квартир в доме» + loader
Merged
#2076 fix(tradein/v2): a11y P3a — нативные контролы + модальный диалог + aria-live (#2062)
Merged
#2075 fix(tradein): дедуп объявлений по квартире + over_100 NULL-фикс (500 на списке) (148)
Merged
#2074 feat(tradein/scheduler): cooperative drain coverage for sweeps/full-loads (phase 3a)
Merged
#2073 fix(tradein): канон срезает гео-префиксы (Россия/Екатеринбург/мкр/пр-т) + REINDEX — покрытие 38%→~70% (147)
Merged
#2072 fix(tradein/v2): UI/UX-аудит P2 — контент/честность/иерархия (#2062)
Merged
#2071 feat(tradein): второй % «за 45 дней» + zhkh-знаменатель slot (146)
Merged
#2067 perf(objective_lots): inline DISTINCT ON for 3 view-fullscan consumers + cache landing stats (#1953)
Merged
#2070 feat(tradein/scheduler): cooperative SIGTERM-drain — in-flight scrape unit commits before exit (phase 2)
Merged
#2069 fix(tradein/v2): a11y follow-up — «скоро» pill contrast + drawer aria-hidden (#2062)
Merged
#2068 feat(sitefinder): rosreestr cadastral-value loader + 0.7x denoise of quarter price index
Merged
#2065 chore(tradein/deploy): scraper deploy-decouple phase 0+1 — no recreate on infra-only deploys + 120s graceful stop
Merged
#2066 fix(tradein/v2): UI/UX-аудит P1 quick-wins (#2062)
Merged
#2064 fix(tradein): guard ГАР-undercount знаменателя в v_building_sale_share (145)
Merged
#2063 feat(tradein): канонический матч ГАР↔houses (0%→41% yield) + tradein_canon_addr + --match-only
Merged
#2061 fix(tradein): гарантировать lxml в backend-образе — bust кэша uv sync + assert import
Merged
#2060 fix(tradein/v2): wire РАДИУС (backend radius_m) + map +/− zoom + building image + deglue word+word
Merged
#2059 feat(tradein): ГАР-loader знаменателя — apartments-per-house → gar_house_flats + match к houses
Merged
#2058 feat(tradein): страница «доля квартир дома в продаже» — % слайдер, адреса, карта
Merged
#2056 perf(objective_lots): drop 3 dead indexes (status/rooms_area/bank) — write-amp (#1953)
Merged
#2057 fix(tradein/v2): audit findings — de-fabricate location drawer, real map markers, validation, hero image, real user
Merged
#2055 feat(tradein): API домов «доли квартир в продаже» — /buildings/sale-share (+ listings, summary)
Merged
#2054 perf(objective_lots): inline-pushdown competitors._SOLD_COUNT_SQL + covering physflat index (#1953)
Merged
#2053 feat(tradein): схема «доли квартир дома в продаже» — gar_house_flats + houses.gar_* + v_building_sale_share (143)
Merged
#2052 feat(tradein/v2): CacheView history + PDF + quota + address autocomplete (FE-5)
Merged
#2050 fix(scrapers): разблокировать domrf_kn flats — изоляция flats от poison-extras + throttle (#1945)
Merged
#2051 feat(tradein/v2): wire overlays History/Analytics/Sources to real API (FE-2/3/4)
Merged
#2049 fix(tradein/v2): address parse (Cyrillic \b bug) + scatter from listing_date
Merged
#2048 feat(tradein/v2) [FE-1]: wire main dashboard to real API (mappers + page shell)
Merged
#2047 fix(tradein/avito): reap dead 404 listings in detail backfill (don't trip block breaker)
Merged
#2037 refactor(tradein/v2): перенос HUD v2 в tradein-mvp (прод-app) → /trade-in/v2
Merged
#2035 feat(tradein/v2): HUD-редизайн страницы оценки (Макс) → /trade-in/v2
Merged
#2034 fix(tradein/avito): detect HTTP-200 soft-block → rotate (vs silent failed) + coords-priority backfill ordering
Merged
#2033 feat(tradein/domclick): local-runner + ingest tooling (mergeable split from #2005)
Merged
#2032 fix(objective): physflat-dedup objective_lots — view + inline (request-path) + n_sold window-fix (#1964)
Merged
#2031 fix: audit follow-up мелочи — индекс domrf_kn_flats + max_height_m coercion + hide empty reg-date (#1953)
Merged
#2030 feat(concept): picker «выбери дом» + каталог-эндпоинт — Stage 3b, финал #1965
Merged
#2029 feat(concept): каталог типовых домов + program-placement (#1965 Stage 3a)
Merged
#2028 fix(tradein/avito): hard-timeout on detail-backfill fetch — prevent zombie-hang (#1950)
Merged
#2027 feat(tradein/estimator): elite-segment manual_review trigger by asking ppm² (#2002)
Merged
#2026 feat(concept): живой 3D-massing → пересчёт финмодели в «7. Концепция» (#1965 Stage 2b)
Merged
#2024 feat(generative): POST /concepts/recompute — live финрасчёт по massing-program (#1965 Stage 2a)
Merged
#2025 chore(tradein/backtest): --resolve-house-id flag to measure Tier-S + IMV anchor (#2002)
Merged
#2023 feat(site-finder): «7. Концепция» в light-отчёте — Stage 1 #1965
Merged
#2022 feat(tradein/ui): manual-review banner + premium-building badge on estimate (#2002)
Merged
#2020 fix(best-layouts): per-object latest snapshot для supply → срок продажи/% продано (#1956)
Merged
#2021 feat(tradein): AI-curated premium-building overlay — class + false-positive demotion (#2002)
Merged
#2018 fix(forecast): segment + dedup demand/supply → индекс дефицита больше не −1.00 везде (#1959)
Merged
#2019 feat(tradein/estimator): manual_review recommendation flag (#2002)
Merged
#2017 feat(tradein/cian): promote kitchen/mortgage/apartments + normalize house_type (#2008)
Merged
#2016 feat(tradein/yandex): normalize house_type + promote kitchen/ceiling to columns (#2007)
Merged
#2015 fix(tradein/estimator): remove dead tier-aware-ratio path — truncation artifact + footgun (#2002)
Merged
#2014 fix(tradein/avito): persist house_type + house_catalog_url in save_detail_enrichment (#2009)
Merged
#2006 feat(tradein): premium_houses MV + premium_building flag (#2002)
Merged
#2004 feat(tradein/estimator): hedonic year+area correction on expected_sold (#2002)
Merged
#2001 feat(tradein/estimator): calibrated 80% prediction interval for expected_sold range (#1966)
Merged
#1999 feat(tradein/domclick): обогащение Layer A поиска — description, repair-инференс, minhash, seller
Merged
#1998 fix(site-finder): сети и точки подключения на карте Раздела 3 (#1961)
Merged
#1988 fix(report): человеческий язык в Разделе 6 — дефицит/затоварка, 6.2/6.3/6.5 (#1963)
Merged
#1997 feat(tradein/backtest): hermetic estimator regression gate — frozen fixture + baseline (#1966 PR 3/3)
Merged
#1987 fix(report): вывести ПЗЗ-градрегламент НСПД в Раздел 1 + coerceFloat КСИТ (#1962)
Merged
#1986 fix(tradein/auth): always-available logout button on NoAccessScreen
Merged
#1985 fix(site-finder): фронт light-отчёта — encumbrance/obj_class/ЗОУИТ display + forecast axis & flat-state (#1954 #1955 #1957 #1958)
Merged
#1984 chore(design-sync): sync inputs for claude.ai/design trade-in DS
Merged
#1978 fix(report): newbuild-consistent медиана + obj_class/Comfort dedup + recommend_mix regression (#1955 #1960)
Merged
#1981 fix(ci): pin prettier 3.9.0 (codegen-check + pre-commit) + regenerate stale api-types.ts
Merged
#1983 feat(tradein/backtest): full-spine prediction + range-coverage/calibration/segment metrics (#1966 PR 2/3)
Merged
#1980 fix(tradein/ux): honest source list — drop dead domklik/restate, remove fake per-source median (#1968)
Merged
#1979 fix(tradein/domclick): рекан скрейпера на BFF JSON API + честный статус (#1846, #1968)
Merged
#1977 feat(tradein/auth): expire praktika trial access + trial-ended screen (contact Artem)
Merged
#1976 refactor(tradein/estimator): extract deterministic pricing into pure _price_from_inputs (#1966 foundation)
Merged
#1975 chore(claude-config): secret-read + psycopg2 hooks, tradein.md rule, tradein-mvp globs
Merged
#1974 chore(claude-config): self-merge policy (Mera/Ptica) + config-audit fixes
Merged
#1973 fix(report): EGRN площадь/обновлено + forecast-confidence dedup + ЗОУИТ типизация (#1954 #1958 #1957)
Merged
#1952 fix(scrapers): cian full_load anti-zombie + avito changeip-resilience & честный статус (#1949 #1950)
Merged
#1948 fix(freshness): output-floor on cycle-SUM over fresh_days window (#1945, #1947)
Merged
#1947 feat(freshness): zero-output check + kn_flats source — catch "ran but produced nothing" (#1945)
Merged
#1946 perf(estimate): trigram expr index for same-building anchor Tier A (~94x)
Merged
#1944 fix(site_finder): correct best-layouts supply fan-out (~8.5x) + objects-first perf
Merged
#1943 fix(perf): move migration 171 to repo-root data/sql/ so deploy applies it
Merged
#1942 perf(analyze): partial index on objective_corpus_room_month (~3.8x on hot velocity baseline)
Merged
#1941 fix(backend): emit app.* INFO logs to stdout on the API process (#1926)
Merged
#1939 fix(estimator): deterministic comp tie-breaker + n_analogs counts priced analogs
Merged
#1938 fix(tradein-browser): in-page fetch retry + settle tuning for /fetch-json (#1917)
Merged
#1937 test(tradein): cover avito/cian + mark_failed total_seen persistence (#1926)
Merged
#1936 fix(tradein): backfill house_id_fk via source-identity path (#1781)
Merged
#1935 feat(analyze): per-category OSRM routing — foot vs driving (#39 A3)
Merged
#1934 feat(site-finder): OSM инж.сети на карту analyze (#1746)
Merged
#1933 feat(tradein): recurring house-dedup merge (schedule dormant) (#1772)
Merged
#1932 feat(site-finder): OSRM road-distance in /analyze behind flag (#39 A2)
Merged
#1931 fix(site-finder): Overpass retry-backoff + mirror fallback for utility loader (#1746)
Merged
#1930 feat(site-finder): OSM engineering-networks loader + endpoint (#1746)
Merged
#1929 feat(devops): self-hosted OSRM routing engine for site-finder (#39)
Merged
#1927 fix(site-finder): align competitor flats_sold to objective_lots.contract_date (#1926)
Merged
#1928 fix(tradein): persist scrape_runs.total_seen/new_count from sweep counters (#1926)
Merged
#1925 fix(test): test_849 expects 3 begin_nested/lot after #1921 upsert-reconcile SAVEPOINT — unblock red main gate
Merged
#1924 perf(tradein): GIST index on (geom::geography) for estimator radius filter (#1189)
Merged
#1922 fix(trade-in/ui): расшифровка ДКП/IMV/CV + графики на --viz токены + убрать emoji (#1871)
Merged
#1921 fix(scrapers): avito_full_load краш (source_id-reconcile) + cian/yandex ban-ротация
Merged
#1919 fix(estimator): флаг + тесты для ghost-anchor guard и radius-dedup (#1871)
Merged
#1920 fix(estimator): ghost-anchor — confidence='low' when radius analogs empty (#1871)
Merged
#1916 feat(tradein-imv): route IMV backfill через BrowserFetcher.fetch_json за dormant-флагом (#915 Stage 3)
Merged
#1915 feat(tradein-browser): additive POST /fetch-json + BrowserFetcher.fetch_json (#915 Stage 2)
Merged
#1914 fix(migration-133): dedup via cascade-delete, not child re-point (prod hotfix)
Merged
#1912 fix(cian): recover new-build house via cadastral anchor + listings (source,source_id) dedup (#1773)
Merged
#1910 feat(scheduler): wire house_imv_backfill as scheduled source (#854)
Merged
#1913 fix(scrapers): named BrowserSession concurrency const, fix Semaphore(3) doc drift (#1347)
Merged
#1911 feat(etl): housing-class normalization fallback via yandex_realty trigram match (#38)
Merged
#1909 fix(avito): post-merge polish — unify fetch_mode guard + empty-render guard (#1811)
Merged
#1908 fix(freshness): repoint nspd source to live nspd_quarter_dumps (data-table mode)
Merged
#1907 fix(freshness): calibrate kn staleness thresholds to weekly cadence
Merged
#1906 feat(financial/dcf): dormant separate-index inflation capability (default OFF)
Merged
#1905 feat(financial): ground-floor нежилое (office/commercial) tranche
Merged
#1904 feat(workers): data-freshness monitor (Celery beat → GlitchTip)
Merged
#1902 fix(site-finder): isolate zone-regulation cache write off the request session (#1850 item 4)
Merged
#1903 chore(mocks): regenerate parcel-analyze financial_estimate (consistent with current backend)
Merged
#1901 fix(site-finder): optimize zone-regulation resolve in /analyze (#1850)
Merged
#1900 feat(financial): levered (equity) IRR — capstone финмодели #1881
Merged
#1899 feat(site-finder): geo-radius market-price calibration in /analyze (#1881 follow-up)
Merged
#1898 fix(generative/financial): VAT only on parking, residential ДДУ exempt (ст. 149 НК)
Merged
#1897 chore(agents): bump all worker + analyst agents to opus 4.8
Merged
#1896 fix(avito): graceful sidecar HTTP 500/503 in browser SERP fetch (#1790)
Merged
#1895 feat(financial): LTC 70%/equity 30% норматив МКД РФ в модели финансирования
Merged
#1894 feat(cockpit): поверхностить financial_estimate в Development Scan / Investment Clearance (#1881 rank-5)
Merged
#1893 fix(financial): парковка price/cost по классу — econom наземная, business=Excel (#1881)
Merged
#1892 fix(gate): area-gate ЗОУИТ utility-easement blocker (sub-17) — снять over-block can_build (#1881)
Merged
#1891 fix(site-finder): разгейтить geoportal зон-резолвер от gappy NSPD-дампа — починить видимость финмодели (#1881)
Merged
#1890 feat(financial): DCF-график продаж по реальному темпу поглощения (rank 1, #1881)
Merged
#1889 feat(site-finder): backfill ЕКБ зон-регламента — разблокировать видимость финмодели (#1881)
Merged
#1888 chore(mocks): add financial_estimate to parcel-analyze mock for local preview (#1881)
Merged
#1887 fix(estimator): enable split-home disclosure at validated threshold 1.2 (audit #1871)
Merged
#1886 feat(finmodel): financing overlay (кредит 15%) поверх unlevered DCF (epic #1881 PR-5)
Merged
#1885 feat(site-finder): bridge финмодели (DCF) в кокпит Investment Clearance (epic #1881 PR-4)
Merged
#1884 feat(finmodel): monthly DCF — real NPV/IRR/PBP, replace IRR-proxy (epic #1881 PR-3)
Merged
#1883 feat(generative): calibrate finmodel sale price from Objective market (epic #1881 PR-2)
Merged
#1882 feat(generative): full static developer financial cascade (epic #1881 PR-1)
Merged
#1880 fix(estimator): radius (source,source_id) dedup + split-house corridor disclosure (audit #1871 P2)
Merged
#1879 fix(tradein): drop non-EKB avito detail coords on ingest (audit #1871 P2)
Merged
#1878 fix(site-finder): P3 a11y/UI batch from audit #1871
Merged
#1877 fix(site-finder): honest POI-score label + drop duplicate MOI column (audit #1871 P2)
Merged
#1876 fix(site-finder): velocity fallback 4500→750, coverage/proxy disclosure, market_trend staleness honesty (audit #1871 P2)
Merged
#1875 fix(ptica): honest isReal flags — placeholder stubs no longer marked real (audit #1871 P1.3)
Merged
#1874 fix(tradein/estimator): ghost-anchor invariant guard — n_analogs=0 forces low (audit #1871 P1.2)
Merged
#1873 fix(forecasting): honest scenarios collapse when β rate-sensitivity gate fails (audit #1871 P1)
Merged
#1872 revert: remove Site Finder v2 cockpit (PR #1866/#1868/#1870)
Merged
#1870 fix(site-finder/v2): remove resource legend overlay (dup of ИНЖЕНЕРИЯ card + POI overlap)
Merged
#1869 fix(site-finder/v2): move resource legend to bottom-left (no overlap with POI legend)
Merged
#1868 feat(site-finder/v2): resource legend + light theme polish
Merged
#1867 revert(site-finder): откат тёмной /site-finder обратно на светлую
Merged
#1866 feat(site-finder): Site Finder v2 cockpit route (ПТИЦА v2)
Merged
#1865 revert(ptica): старый Section1-6 дизайн как дефолтный роут
Merged
#1864 feat(ptica): Сценарии 6.6 + Отчёты «Параметры» (tab prototype-parity)
Merged
#1863 fix(estimator): low-findings аудита «Мера» — cian sanity, deal floor-edge, price_trend dedup, DEAL_MAX verify
Merged
#1859 fix(estimator): robustness — ratio-tier по финалу, radius-floor, yandex area, expected_sold ≤ asking
Merged
#1862 feat(ptica): ВРИ row in Градостроительство (real ЕГРН)
Merged
#1861 feat(ptica): map glyph pins + compass, equal-height grids, full-height rail; dark Site Finder
Merged
#1860 feat(ptica): live 3D massing in Инсоляция card + honest Recommended Product verdict
Merged
#1858 fix(ptica): button font-size — :where() so component classes win over reset
Merged
#1857 fix(ptica): populate scan cards with real /analyze data + product tabs + map zoom
Merged
#1856 feat(ptica): slow turntable rotation on insolation preview cube
Merged
#1855 fix(ptica): load Inter, surface map legend, drop flag, honest product chart, home link
Merged
#1854 fix(ptica): visual parity 1:1 with prototype (ОКС stretch + restored elements)
Merged
#1853 fix(ptica): left-rail — 7 icon+label items + working nav (match reference)
Merged
#1852 feat(ptica): complete cockpit — lower-grid + bottom-grid (Potential/Product/Clearance/Verdict)
Merged
#1851 feat(ptica): rich dark map (POI/connections/competitors/satellite) + ПТИЦА as default analysis route
Merged
#1849 feat(ptica): wire real КСИТ/height/zone/density into cockpit (frontend of #1843)
Merged
#1848 fix(scrapers): avito ban-triggered IP rotation (#1790) разблокирует houses-enrichment (#1789) + rating_score
Merged
#1847 feat(analyze): real ПЗЗ КСИТ/height into nspd_zoning (ПТИЦА оживление, #1843 Route 2)
Merged
#1842 fix(ptica): drawer modal a11y (focus-trap + restore) + polish
Merged
#1844 fix(site_finder): read real NSPD territorial-zone keys (nspd_zoning.zone_code was always null)
Merged
#1845 fix(tradein/yandex): инкрементальный per-combo save + bounded gate-timeout (анти-зомби city_sweep)
Merged
#1841 feat(tradein): бэкфилл координат листингов из ekb_geoportal_buildings (street+house match)
Merged
#1840 feat(tradein/avito): per-card ЕКБ гео-фильтр (отсечь padding по России)
Merged
#1839 fix(ci): deploy-tradein paths-filter base = last deployed SHA (накопленный diff, fail-safe build-all)
Merged
#1838 feat(tradein/scrapers): detail_backfill через curl_cffi+backconnect вместо браузера/auv (развязка прокси)
Merged
#1835 feat(ptica): 3D building-massing module (Three.js) [PR#5]
Merged
#1834 feat(ptica): detail drawer system + 17 drawers [PR#4]
Merged
#1833 feat(ptica): Отчёты + Сравнение cockpit tabs [PR#3]
Merged
#1832 feat(ptica): Сценарии tab (§22 forecast) + real hero invest-score [PR#2]
Merged
#1831 feat(site-finder): ПТИЦА dark cockpit — increment 1 (shell + hero + Development Scan)
Merged
#1830 feat(scrapers/ui): backfill+full-load триггеры, source-фильтр, pacing-слайдер, coverage-таблица
Merged
#1829 feat(scrapers): live pacing-регулятор + data-quality coverage API
Merged
#1837 feat(trade-in/ui): transparency «Мера» — analog_tier, address_precision, expected_sold бар, ratio_basis
Merged
#1836 fix(estimator): топ-5 фиксов аудита «Мера» (anchor gate, analog_tier, freshness, MAD-order, data-age)
Merged
#1828 feat(tradein/scrapers): full_load пропускает листинги обновлённые сегодня при повторном прогоне
Merged
#1826 feat(tradein-browser): per-provider page-interval override (#1812 follow-up)
Merged
#1827 fix(tradein/db): widen offer_price_history.diff_percent (5,2)→(8,2) + clamp в триггере (краш full_load)
Merged
#1824 fix(scrapers/ui): дедуп queryKey cian test-auth + a11y (Phase-1 polish)
Merged
#1825 fix(scrapers/backend): socks5 health-probe + status Literal + #1820 ext_id=0 dedup
Merged
#1823 feat(tradein/ui): две равноправные hero-цены (выставить/получить) + компактный ряд бенчмарков
Merged
#1822 fix(scrapers): avito pipeline — новостройки house graceful + AvitoBlockedError per-item не крашит прогон (#1820)
Merged
#1821 fix(tradein/ui): убрать debug cache-key, гейт тонких графиков, разграничить динамику цен
Merged
#1819 feat(tradein-frontend): единая scrapers-страница — табы, proxy-health+rotate, runs-история (scrapers UI Phase 1)
Merged
#1818 feat(admin): unified scrape/runs + scraper/health + rotate-ip API (scrapers UI Phase 1)
Merged
#1817 fix(tradein/estimator): расширить corridor-clamp slack 0.25→0.40 для премиума без own-листингов
Merged
#1815 fix(scrapers): avito_detail_backfill — снапшот ЕКБ+active, detail browser-only без curl-fallback на бан (#1814)
Merged
#1813 feat(browser): per-provider page pacing + resource-block tuning — снизить proxy fan-out (#1812)
Merged
#1809 feat(scrapers): avito SERP дефолт на BrowserFetcher (camoufox), curl_cffi fallback (#1805)
Merged
#1810 feat(scrapers): cian SERP на BrowserFetcher (camoufox), снят code-side rotate (#1806)
Merged
#1808 fix(tradein-frontend): Мера estimate — hydration #418 + photos 422 (#1803 #1804)
Merged
#1807 fix(tradein/estimator): clamp premium headline к коридору сделок + робастный anchor (#1795)
Merged
#1802 test(browser): удалить устаревшие pool-routing тесты (CI red после #1793)
Merged
#1800 fix(scrapers): cian_detail — ceiling из offer.building.ceilingHeight, repair из decoration (#1791)
Merged
#1799 fix(scrapers): yandex_detail — area/ceiling/kitchen из INITIAL_STATE, покрытие area 63%→~95% (#1792)
Merged
#1798 fix(tradein-browser): camoufox hardening — block_images/webrtc + форс МСК tz (#1796)
Merged
#1797 fix(scrapers): avito_houses — отзывы/история/тип ЖК долетают (виджет-payload вложен глубже) (#1789)
Merged
#1794 feat(browser): per-provider concurrency — параллель между поставщиками, ≤1 коннект на поставщика (#1793)
Merged
#1788 fix(tradein): verify=False для WFS геопортала ЕКБ (российский CA-серт)
Merged
#1787 fix(tradein): чинит main-red — патч _geoportal_house_match в cadastral-тесте (хвост #1786)
Merged
#1784 fix(db): #1781 backfill listings.house_id_fk from house_sources (cian novostroyki)
Merged
#1786 feat(tradein): ингест зданий из геопортала ЕКБ + tier в геокодере (полный кадастр города)
Merged
#1783 feat(tradein): фронт передаёт координаты выбранной подсказки в /estimate (Variant A, frontend)
Merged
#1782 feat(tradein): /estimate принимает координаты от автокомплита, минует geocode (Variant A, backend)
Merged
#1780 fix(tradein): чинит кадастр-матчер геокодера — резолв адресов из своей базы (~60% упавших)
Merged
#1779 fix(tradein): удалить white-label бренд «Практика» целиком (БД + маппинг + ассеты)
Merged
#1777 fix(tradein): budget Cian valuation call to stop 25s estimate stalls («не считает»)
Merged
#1778 fix(tradein): убрать хардкод «Практика» из offer-баннера
Merged
#1776 fix(estimator): #1774 Tier A admits same-building novostroyki resales (secondary-dominant gate)
Merged
#1775 fix(avito): de-glue house number from district in _clean_address (#1773 part)
Merged
#1771 fix(avito): reconnect-retry on detail 429 under backconnect proxy
Merged
#1770 feat(avito): incremental daily + exhaustive weekly schedule split (+ scheduler interval_days)
Merged
#1769 fix(avito): tolerate 429 per-bucket instead of banning whole sweep
Merged
#1768 fix(avito): reconnect-retry on detail 403/firewall under backconnect proxy
Merged
#1766 feat(avito): incremental SERP pagination with date early-stop (param-gated, default off)
Merged
#1767 feat(listings): card_hash column + snapshot-dedup on unchanged cards
Merged
#1765 fix(avito): gate 403 reconnect-retry on proxy presence only (was dead code in prod)
Merged
#1764 fix(avito): reconnect-retry on SERP 403/firewall under backconnect proxy
Merged
#1763 fix(tradein): avito _extract_total_count returns 0 on no-results page — stop empty-bracket split/rotate waste
Merged
#1762 feat(tradein): avito curl_cffi 429 short-retry — enables backconnect curl SERP (×50 faster than browser)
Merged
#1761 perf(browser): block image/media/font resources in camoufox fetch (~10x smaller pages, faster via proxy)
Merged
#1760 perf(tradein): shared EKB seed price-brackets across avito/cian/yandex (city-dict ready for multi-city)
Merged
#1759 perf(tradein): avito seed price-brackets with open top bucket (≤2k blocks, no price ceiling)
Merged
#1758 fix(tradein): praktika brand only under praktika account — drop kopylov mapping (brand leak)
Merged
#1757 fix(tradein): avito full-load probe resilience — browser 500/timeout splits/skips instead of crashing run
Merged
#1756 feat(site-finder): snapshot.pdf exclude_dev param — hide competitor by developer name
Merged
#1754 feat(tradein): populate offer_price_history for yandex from gate price.previous/trend
Merged
#1755 fix(tradein): avito sweep page-level retry — transient page error no longer aborts run
Merged
#1753 feat(tradein): avito exhaustive full-load (room×price bisection) — mirror cian
Merged
#1752 feat(tradein): schedule cian_full_load (exhaustive secondary) + anchor sweep NB-only
Merged
#1750 feat(cadastral): geo-nearest building matcher via local cad mirror
Merged
#1751 feat(site-finder): карта точек подключения (НСПД) в секции «Сети» (#1746 part)
Merged
#1749 feat(site-finder): продуктовые решения по фидбеку analyze (#1741-1745)
Merged
#1748 fix(site-finder): 5 дефектов из фидбека analyze (#1736-1740)
Merged
#1747 feat(avito): dedicated newbuilding (novostroyka) citywide sweep
Merged
#1735 feat(browser): per-source proxy pool behind FEATURE_BROWSER_POOL_ENABLED (Phase 1)
Merged
#1734 fix(yandex): read predicted price from entity.predictions.predictedPrice (#1725)
Merged
#1733 feat(browser): concurrent page pool (BROWSER_CONCURRENCY, default 4) + raise mem_limit to 5g
Merged
#1732 fix(backfill): drop nonexistent kadastr_num column from listings SELECT
Merged
#1731 fix(avito): proactive IP rotate at sweep start + raise max_rotations 2→4 (Datadome ban recovery)
Merged
#1730 feat(domclick): wire DomClick citywide sweep into pipeline+scheduler (seeded disabled)
Merged
#1729 feat(avito): capture newbuilding ЖК id/url from SERP card
Merged
#1728 docs(readme): refresh to Jun 2026 — Trade-In/Мера + Site Finder v2 + structure + remove debug.log
Merged
#1727 fix(scrapers): write resolved house_id to listings.house_id_fk in realtime link hook
Merged
#1725 feat(yandex): map rich entity fields (predictedPrice, seller, listing_date, trend, metro)
Merged
#1726 fix(sql): ALTER TABLE IF EXISTS in migration 162 (deploy red — district_economics absent)
Merged
#1724 fix(tradein): correct SberIndex hedonic/asking dataset filter dims + 404 warning (#902)
Merged
#1712 feat(site-finder): РИАСУРТ Свердл 14-layer harvest client+schema+task for ЕКБ agglomeration (#108)
Merged
#1722 fix(matching): conflict_resolution picks freshest (last_seen_at) value, deterministic (#1539)
Merged
#1719 feat(objective): diff-gated objective_lots_history writer trigger (#307 OBJ-6)
Merged
#1711 feat(sql): sales-tracker velocity + absorption MVs for Site Finder (#61)
Merged
#1720 fix(site-finder): gate velocity on confidence of objective_complex_mapping (#307 OBJ-2)
Merged
#1718 fix(cian): persist detail rich fields (description) + stamp detail_enriched_at
Merged
#1721 test(etl): fix stale assert in objective_backfill dry_run test (#1709 systemic CI red)
Merged
#1710 feat(tradein): segment=vtorichka|novostroyki|all on listings search (#1188)
Merged
#1715 feat(yandex): ingest novostroyki via gate-API newFlat=YES
Merged
#1716 fix(avito): classify novostroyki by item-development-name marker; map переуступка sale_type
Merged
#1714 fix(frontend): regen api-types.ts — POI-score fields (#1709 systemic CI red)
Merged
#1717 ci: cache uv + skip dev deps to speed up gate jobs (#1709)
Merged
#1713 ci: drop push-on-feature-branch trigger to kill duplicate CI runs (#1709)
Merged
#1706 fix(sql): EMISS PK includes period_type so yearly+Q1 coexist (#1606 follow-up)
Merged
#1707 fix(leads): replace ::interval cast with make_interval (psycopg v3 trap) (#1383 follow-up)
Merged
#1708 docs(estimator): DKP corridor described as P10/P90 not min/max in schema+TS (#1520 follow-up)
Merged
#1701 fix(admin-scrape): ge=1 on /failures limit + enforce LLM finish_reason
Merged
#1703 fix(llm): word-boundary INN match, tighten edge cases (#1640 follow-up)
Merged
#1702 fix(exporters): annotate scenario deficit horizon in excel too (#1590 follow-up)
Merged
#1700 fix(weather): wind_d returns None when no valid samples, not fabricated 0.0°
Merged
#1704 fix(scrapers): narrow domrf Level-1 status badge-class regex (#1609 follow-up)
Merged
#1705 test(site-finder): cover is_residential_zone raw_props/subcategory branch (#1353 follow-up)
Merged
#1699 feat(yandex): route gate-API fetch through camoufox (sustainable, no proxy burn)
Merged
#1698 fix(site-finder): remove dead sat_factor (computed+written, never applied) (#1509)
Merged
#1697 fix(site-finder): NO_ENGINEERING_NEARBY is a warning, not a verdict blocker (#1617)
Merged
#1696 fix(forecasting): thread room_bucket velocity into format ranking (#1593)
Merged
#1694 fix(leads): window revenue_total/deals_total to leads_window (#1383)
Merged
#1691 fix(site-finder): apply 12mo cutoff to n_lots/sold_pct/price in enrich economics (#1513)
Merged
#1695 fix(estimator): DKP corridor uses P10/P90 not min/max (#1520)
Merged
#1693 fix(sql): restore partial WHERE is_active predicate on listings indexes (#1398)
Merged
#1692 fix(site-finder): smart_suggestions filter parcels above documented score threshold (#1503)
Merged
#1690 fix(site-finder): volume-weighted median_price_m2 (#1511) + consistent-period MTS (#1512)
Merged
#1684 fix(forecasting): deal_count confidence note carries «за N мес» window (#1637)
Merged
#1686 fix(scrapers): scope+stem domrf status classification (#1609)
Merged
#1689 fix(scrapers): cian _walk_price_range stop silently truncating tail (#1393)
Merged
#1688 fix(sql): v_supply_layers_latest keep dev_group_name in DISTINCT ON key (#1650)
Merged
#1687 fix(scrapers): disambiguate EMISS yearly vs Q1 in dedup key (#1606)
Merged
#1685 fix(forecasting): correct _geo_weight unknown floor so far projects rank low (#1633)
Merged
#1683 fix(forecasting): count non-zero observations in normalize guard (#1638)
Merged
#1682 fix(llm): INN redaction requires context anchor, stop eating large numbers (#1640)
Merged
#1681 fix(site-finder): robust is_residential_zone detection for NSPD zone codes (#1353)
Merged
#1680 fix(parcels): _score_label honor «хорошо»=25→«отлично» boundary (#1357)
Merged
#1674 fix(site-finder): normalize POI weighted score to 0..100 on backend (#1486)
Merged
#1678 fix(sql): dedup deals-to-district assignment in ekb districts median refresh (#1352)
Merged
#1673 fix(cadastre): cad_territorial_zones MULTIPOLYGON typmod + ST_Multi coercion (#1344)
Merged
#1679 fix(forecasting): cap trend_ratio by v_rec magnitude when v_prior==0 (#1508)
Merged
#1677 fix(site-finder): non-overlapping L2/L3 ready_dt windows, stop double-count of 13-24mo supply (#1355)
Merged
#1676 fix(tradein): trade-in PDF cover uses estimate.expires_at, not hardcoded +30d (#1530)
Merged
#1675 fix(analytics): align portfolio series to area buckets in quartirography (#1406)
Merged
#1672 fix(analytics): drop false market verdict from per-object Sold % KpiCard (#1407)
Merged
#1662 fix(week-review): дожим — 4 фикса (#1569, #1590, #1642, #801)
Merged
#1660 fix(week-review): backend-аудит v2 — 82 фиксов
Merged
#1670 fix(site-finder): nearest_top3 metro from osm_poi_ekb (#1667)
Merged
#1671 docs(site-finder): analyze confidence by-design distinct from §15 (#1668)
Merged
#1669 fix(workers): schedule mv_layout_velocity refresh (#1666)
Merged
#1663 feat(scripts): Potrace floor-plan vectorization spike (#299)
Merged
#1665 feat(yandex): switch SERP scraping to JSON gate-API (bypasses bandwidth tarpit)
Merged
#1664 fix(yandex): rotate proxy IP + retry on tarpit-timeout/captcha in combos sweep
Merged
#1661 fix(avito): scale per-anchor timeout for detail-enrich + durable SERP counters
Merged
#1659 fix(tradein): yandex combos watchdog timeout (P0) + deploy scraper filter gap
Merged
#1658 feat(tradein): yandex city sweep — EKB-center rooms×price combos (replaces 5-anchor shallow)
Merged
#1657 feat(cian): collect price history via BrowserFetcher (fixes silent no-op backfill)
Merged
#1568 feat(scrapers): enable cian_city_sweep (proxy alive, sweep is cookieless)
Merged
#1559 feat(tradein/db): derived price-history trigger (avito/yandex) + last_seen_at deactivate index
Merged
#1558 feat(scrapers): segment-aware generic deactivate_stale for yandex/cian
Merged
#1557 fix(scrapers): deactivate pre-#753 ghost duplicate listings (dedup correctness)
Merged
#1556 chore(scrapers): убрать устаревший n1-скраппер (n1.ru → cian), сохранить историч. данные
Merged
#1555 fix(scrapers): cian detail — извлечение kitchen_area_m2 (part of #1553)
Merged
#1554 feat(scrapers): yandex detail-enrichment — save + ночной backfill через прокси (part of #1553)
Merged
#1552 feat(scrapers): ночной avito detail-enrichment backfill для legacy listings (Closes #1551)
Merged
#1549 fix(scrapers): geocode-missing listings nightly scheduler — listings geom coverage backfill (all sources)
Merged
#1550 fix(scrapers): avito detail parser — захват Жилая площадь / Высота потолков / Отделка
Merged
#1548 fix(tradein): починить 3 теста-регрессии из #1543 — разблокировать deploy gate
Merged
#1547 fix(tradein): hotfix миграции 108 — deploy red (typo + collision-safe репойнт)
Merged
#1543 fix(week-review): аудит код-ревью — 181 фиксов (label week ревью 1)
Merged
#1546 fix(tradein): avito houses dedup через match_or_create_house + merge-миграция дублей (108)
Merged
#1545 fix(tradein): yandex newbuilding rating drift — «4.3из 5» без пробела (#974)
Merged
#1544 fix(tradein): cian newbuilding MFE/reliability drift — initialState extraction (#972)
Merged
#1296 feat(tradein): scheduler-источник cian_city_sweep (newbuilding Phase 4), seed dormant (#973)
Merged
#1542 fix(tradein): обновить test_scraper_proxy под BrowserFetcher-транспорт fetch_newbuilding
Merged
#1540 fix(tradein): cian fetch_newbuilding через BrowserFetcher (camoufox) — initialState под анти-ботом (#972)
Merged
#1541 feat(tradein): yandex_newbuilding sweep-entrypoint + market-схема enrichment, seed dormant (#974)
Merged
#1335 perf(site-finder): pushdown obj_pricing CTE to nearby competitors (#70/#307)
Merged
#1333 feat(sql): corroborated trgm backfill objective_complex_mapping +17 (#307 OBJ-2 r2)
Merged
#1334 perf(sql): geography GIST + covering index для analyze-пути Site Finder (157)
Merged
#1332 feat(site-finder): additive objective_lots price fallback for competitors (#307 OBJ-3)
Merged
#1331 feat(sql): conservative trgm backfill objective_complex_mapping +23 (#307 OBJ-2)
Merged
#1330 fix(tradein-browser): non-fatal launch + background proxy retry (crash-loop 3141x)
Merged
#1329 feat(site-finder): POI saturation per capita по районам ЕКБ (#42)
Merged
#1328 feat(site-finder): сетевые обременения из ЗОУИТ (#1070, Refs #103)
Merged
#1327 feat(site-finder): domrf→cad geom-match + parking_ratio конкурентов (#96)
Merged
#1326 feat(site-finder): ЕГРН помещения/машино-места + parking_ratio MVP (#96)
Merged
#1325 perf(db): objective_lots district-price index (#70) + PII/perf audit (#79)
Merged
#1324 docs(infra): secrets rotation policy (#78)
Merged
#1321 ci(infra): coverage-gate (#68) + codegen-assert (#69) + uptime (#75)
Merged
#1322 feat(admin): freshness endpoint (#73) + README Forgejo (#83) + migrations doc (#72)
Merged
#1323 feat(frontend): mobile responsiveness (#66) + data-sources (#80)
Merged
#1320 feat(site-finder): ЗОУИТ visual layer на Leaflet карте (#255)
Merged
#1319 feat(site_finder): routing POI decay (#41) + OSM utilities (#44) + ЗОУИТ geom (#255bk)
Merged
#1318 feat(site-finder): multi-cad сравнение (#50) + analytics поиск (#65)
Merged
#1317 feat(analytics): velocity-anomaly alerts (#17) + ARN ДДУ indicator (#99)
Merged
#1316 feat(concept): Concept UI Stage 1d (#57)
Merged
#1315 feat(generative): движок концепций застройки Stage 1a/1b/1c (#54 #55 #56)
Merged
#1314 feat(site-finder): НСПД verify deep-links + landing GenDesign vs НСПД (#97 #100)
Merged
#1313 fix(cadastre): NSPD 500-retry + disable dead pzz-beat + geom backfill (#252 #259 #200)
Merged
#1312 fix(analytics): mortgage rate sort + recommend last_updated + drop dead route (#236 #237 #251)
Merged
#1311 fix(ops): repair broken main-DB backup + harden auth (#71 #427 #429 #428)
Merged
#1310 chore(objective): fuzzy backfill objective_complex_mapping +115 (#307 OBJ-2)
Merged
#1309 fix(analytics): ObjectSaleChart выровнять серии по union месяцев (#1246)
Merged
#1308 perf(site-finder): honour AbortSignal в poll-цикле useParcelAnalyzeQuery (#1248)
Merged
#1307 fix(backend): Excel formula-injection (#1244) + chat read off event loop (#1245)
Merged
#1306 feat(forecast): расширить горизонт прогноза до 24 мес (ТЗ §12.1, Q1)
Merged
#1305 chore(tradein-db): drop duplicate listings_geom_active_idx (#730)
Merged
#1304 fix(tradein-frontend): остановить retry-storm на 401 (#800)
Merged
#1303 feat(tradein-scheduler): nightly newbuilding-enrichment schedule (#973)
Merged
#1302 feat(site-finder): детерминированная атрибуция застройщика в analyze (#1088)
Merged
#1301 fix(p3-batch): восстановление 13 Fable 5 P3-fixes из lost branches
Merged
#1299 fix(sf): ekb_ppt_tep post-фильтры + врезка в analyze (#1136)
Merged
#1294 fix(admin-jobs): UPSERT в PUT /admin/jobs/settings (#1223)
Merged
#1288 fix(workers): cadastre permanent-fail counter + beat cleanup (#1236)
Merged
#1290 fix(scoring): correct price_feasibility reason — market rate (#1225)
Merged
#1289 fix(admin): persist JSON extra_config при свёрнутой textarea (#1239)
Merged
#1287 fix(workers): re-raise SoftTimeLimitExceeded в nspd_geo (#1235)
Merged
#1274 fix(custom-pois): invalidate canonical parcel-analyze + parcel-poi-score keys (#1241)
Merged
#1277 fix(forecasting): _price_overlap zero-width discontinuity (#1224)
Merged
#1275 fix(analytics): ObjectSaleChart tooltip полный ₽/м², не /1000 (#1238)
Merged
#1273 fix(beat): rewrite 4 cron entries in MSK to match conf.timezone (#1233)
Merged
#1272 fix(scrapers): commit outer tx в domrf_catalog scrape_catalog_batch (#1227)
Merged
#1271 fix(site-analysis): per-call AbortController вместо shared cancelledRef (#1242)
Merged
#1270 fix(site-finder): склеить разорванный regex в _PLANNING_NO_MATCH_SQL (#1230)
Merged
#1267 fix(workers): count lots_pf failure correctly, no silent done (#1220)
Merged
#1266 fix(forecasting): resolve admin district to micros в _query_artificial_demand (#1205)
Merged
#1265 fix(analytics): rolling 6mo/6mo окна в _district_velocity_trend (#1203)
Merged
#1264 fix(competitors): _AVG_PRICE_SQL — фильтр latest snapshot (#1210)
Merged
#1263 fix(db): dedupe domrf_kn_documents + UNIQUE NULLS NOT DISTINCT (#1206)
Merged
#1262 fix(domrf_kn): детерминированный sha256-fallback для flat_id (#1208)
Merged
#1261 fix(llm): cap серверного Retry-After через _MAX_BACKOFF_S=30s (#1209)
Merged
#1259 fix(market-metrics): resolve admin→micros for _price_sensitivity (#1211)
Merged
#1260 fix(site-finder): MiniMap не клипает layer-controls — рыночные слои доступны (#1218)
Merged
#1258 fix(market_metrics): disambiguate ROLLUP grand-total via GROUPING() (#1214)
Merged
#1257 fix(competitors): _ACTIVE_STATUSES = русские значения как у домрф (#1213)
Merged
#1256 fix(supply_layers): L3 future-supply берёт ПОСЛЕДНИЙ снапшот → потом фильтр (#1212)
Merged
#1255 fix(scrape_kn): Redis-lock owner-token + resume retry on lock_held (#1216)
Merged
#1254 fix(nspd_geo): split zombie thresholds running=6m / paused=30m (#1215)
Merged
#1253 fix(site-finder): adapt backend egrn_block → frontend ParcelEgrn (#1217)
Merged
#1252 fix(audit): run_in_threadpool для write_audit_row в async middleware (#1202)
Merged
#1251 fix(parcels): guard NULL geom + None lat/lon в isochrones/poi-score (#1201)
Merged
#1250 fix(schemas): expose per-bucket elasticity + velocity_source в RecommendBucket (#1204)
Merged
#1249 fix(api): handle 204 No Content в apiFetch (#1219)
Merged
#1243 fix(llm): close §19 redaction regex gaps for bare phone / CAPS name / bare SNILS (#1207)
Merged
#1200 test(parcels): integration EXPLAIN-gate для analyze hot-path SQL (#1198)
Merged
#1199 fix(forecasting): нормализовать dict-district в build_site_finder_report (#1130 follow-up)
Merged
#1197 fix(parcels): rename CTE overlaps → overlap_rows (#1196 hotfix)
Merged
#1195 perf(site-finder): air-quality TTL-кэш + neighbors_summary 2→1 SQL (#1130 Phase B)
Merged
#1194 perf(site-finder): TTL-кэш Open-Meteo в analyze hot-path (#1130 Phase A)
Merged
#1192 fix(tradein): guard listing_segment во всех оценочных читателях listings — novostroyki вне comps (#1186)
Merged
#1193 feat(market): GRANT listings + offer_price_history → gendesign_reader (#1191)
Merged
#1185 feat(sf): cross-load ETL tradein→gendesign newbuilding_listings — вариант A (#976)
Merged
#1183 feat(tradein): отдельный scraper-контейнер — scheduler вне API-процесса
Merged
#1181 chore(deploy): wire OWN_DEVELOPER_IDS for §25.3 own-portfolio (#1169)
Merged
#1180 feat(forecasting): §25.3 cannibalization unit-mix axis (4/4), gated (#1169)
Merged
#1179 fix(chat): clean квартирография rendering in chat prompt v2 (#957)
Merged
#1178 chore(deploy): wire OPENAI_API_KEY + LLM_ENABLED for LLM chat activation (#960)
Merged
#1177 feat(site-finder): opportunity-ЗУ + red-line map layers (§12.1-13, #958)
Merged
#1176 feat(forecasting): activate §25.3 cannibalization timing axis (#1169)
Merged
#1175 feat(macro): construction price index (СМР) via open Rosstat xlsx (#946)
Merged
#1174 feat(site-finder): grounded parcel-chat panel UI (#958)
Merged
#1173 feat(chat): LLM tool-loop + §19 redaction for parcel chat (#957 Step2+3)
Merged
#1172 feat(chat): deterministic §22 chat foundation /api/v1/chat/ask (#957 Step1)
Merged
#1171 feat(forecasting): §25.3 TRUE own-portfolio cannibalization overlap (#1169 PR2)
Merged
#1170 feat(site-finder): own-portfolio data source for §25.3 cannibalization (#1169 PR1)
Merged
#1168 feat(llm): foundational LLM infra package + §19 redaction (#960)
Merged
#1167 fix(site_finder): make Location demand_index city-relative (#948)
Merged
#1166 feat(location): district Location entity + indices (#948 part B)
Merged
#1164 feat(insights): manual-entry Insight entity CRUD + §19 audit (#948 part A)
Merged
#1163 feat(rbac): analyst role + §19 audit-log middleware (#962)
Merged
#1162 feat(macro): CBR inflation (ИПЦ) + activate §9.5 inflation channel (#946)
Merged
#1161 fix(tradein): working cian ЖК-url resolver → unblock #972 backfill
Merged
#1160 perf(forecast): per-request memoization cache — §22 cold build (#1129)
Merged
#1158 feat(sf): врезка pat_subzones в analyze ИРД-блок (#1151)
Merged
#1157 fix(sf): ST_MakeValid genplan geom + backfill 881 invalid polygons (#1156)
Merged
#1155 fix(sf): робастный путь к koltsovo JSON в pat-loader (#1150)
Merged
#1153 feat(sf): OCR pipeline izjatie EKB Tesseract rus land_reservation 1062
Merged
#1154 feat(sf): граддокументация (статус+ПАГЕ-реквизиты) из planning_projects в analyze (#1061)
Merged
#1152 feat(sf): ????? ???-??????? ? ???-???? analyze
Merged
#1150 feat(sf): подзоны ПАТ Кольцово → pat_subzones (#1065)
Merged
#1149 fix(sf): pravo.gov66 law_type числовой код =1 Постановление (#1062)
Merged
#1147 fix(sf): корректное urlencode form-data в okn_egrkn_client (#1066)
Merged
#1148 feat(tradein): cian newbuilding enrichment backfill task + live-data fix (#972)
Merged
#1146 fix(sf): User-Agent header for okn-mk searchMap (bypass 403) (#1066)
Merged
#1145 feat(sf): enumerate изъятия/резервирования с pravo.gov66 → land_reservation (#1062)
Merged
#1144 feat(macro): ЕМИСС income_per_capita → macro_indicator (#946 pt2)
Merged
#1143 feat(macro): Росстат open-data scraper → macro_indicator (#946, partial)
Merged
#1141 feat(sf): ingest ОКН-объектов ЕКБ из АИС ЕГРКН (точки+категория) → okn_objects (#1066)
Merged
#1140 feat(sf): вшить функц.зоны генплана (ekb_genplan_functional_zone) в analyze (#1058)
Merged
#1139 perf(sf): КРТ-геометрия в БД, _krt_at из БД вместо живого WFS (#1130)
Merged
#1137 feat(sf): ingest функц.зон генплана ЕКБ-2045 из ГИСОГД-СО WFS → ekb_genplan_functional_zone (#1058)
Merged
#1133 feat(sf): ППТ/ПМТ ТЭП-парсер (Табл.11/12/13) → ekb_ppt_tep MVP (#1085)
Merged
#1135 ci(frontend): vitest job in Forgejo Actions gate
Merged
#1131 feat(sf): КРТ-реквизиты (ekb_krt_sites) в ИРД-блок analyze (#1060)
Merged
#1132 chore(frontend): vitest runner + WKT parser unit tests (#999)
Merged
#1126 feat(sf): scraper реестра КРТ-площадок ЕКБ → ekb_krt_sites (#1060)
Merged
#1124 feat(sf): geocode geom для ekburg_construction_permits из МСК-66 (#1088)
Merged
#1127 feat(sf): вшить parcel_reservations в ИРД-блок analyze (#1062, #1091)
Merged
#1128 feat(forecast): forecast compute-date/horizons/schema meta footer (#958)
Merged
#1125 feat(sf): in-app future-supply pressure + pipeline competitors (6.6) (#958)
Merged
#1123 perf(sf): concurrent geoportal-вызовы в ИРД-блоке analyze (#1102)
Merged
#1118 feat(sf): ПАГЕ-парсер изъятия/резервирования → land_reservation (#1091, #1062)
Merged
#1121 feat(forecast): expose DOCX & PPTX export buttons (#958)
Merged
#1120 feat(forecast): in-app scoring transparency (subsection 6.5) (#958)
Merged
#1115 feat(sf): включить enable_ird_analyze + latency-hardening (#1102, #1067)
Merged
#1117 feat(forecast): in-app product_tz recommendation (subsection 6.4) (#958)
Merged
#1114 feat(sf): gknspecial_zone ИРД-harvest → ird_overlays (#1063/#1064/#1065/#1066)
Merged
#1113 feat(site-finder): toggleable market map layers (#999, 3/4)
Merged
#1112 feat(site-finder): forecast deficit/scenario chart in Section 6
Merged
#1111 feat(export): PPTX export — completes EPIC #959
Merged
#1110 feat(export): DOCX export of §22 forecast report — slice #959
Merged
#1109 feat(site-finder): forecast export buttons in Section 6 (UI for #959)
Merged
#1108 feat(sf): newbuilding_listings house-grain таблица для future-ЖК слоя (#975)
Merged
#1107 fix(sf): per-quarter commit в ird/opportunity harvest — не терять прогресс при краше (#1067)
Merged
#1106 feat(sf): прогрев zone_regulation_cache по терзонам ЕКБ (#1059/C8b)
Merged
#1105 feat(sf): wire ППТ/ПМТ planning_projects в analyze ird-блок (#1085)
Merged
#1104 feat(sf): ППТ/ПМТ WFS ingest → planning_projects (future-supply, #1085 part 1)
Merged
#1103 fix(sf): ekb_geoportal_client verify=False — росс-гос-CA не в trust-store контейнера (#1067)
Merged
#1101 feat(sf): wire ИРД-слой в analyze за флагом enable_ird_analyze (#1067 D9b)
Merged
#1100 feat(sf): opportunity-ЗУ harvest → ird_overlays (future-supply, #1086)
Merged
#1099 feat(sf): zone_regulation_cache — ПЗЗ-регламент по zone_index + числовой экстракт (#1067 C8b)
Merged
#1098 test(tradein): quality-gate anti-regression тесты на 5 P0-фиксов (#781)
Merged
#1097 fix(tradein): white-label без logo не показывает «Мера»-глиф (#1081)
Merged
#1096 fix(tradein): enable deactivate_stale_avito schedule on prod (#759)
Merged
#1094 feat(sf): EKB geoportal urbanCard — ПЗЗ-регламент content (#1067 C8)
Merged
#1092 feat(sf): parcel_ird_overlaps read-side для analyze (#1067 D9a)
Merged
#1093 feat(export): Telegram summary format (tg) for §22 forecast — slice #959
Merged
#1090 feat(sf): ИРД-harvest Celery task → ird_overlays (#1067 B5)
Merged
#1089 feat(export): Markdown + JSON download of §22 report — slice of #959
Merged
#1083 feat(sf): EKB geoportal WFS client (#1067 C7)
Merged
#1080 feat(nspd): get_feature_info FEATURE_COUNT=10 — multi-feature per point (#1067)
Merged
#1082 feat(parcels): typed AnalyzeResponse + run-history endpoints — EPIC #961 (#992,#994)
Merged
#1079 feat(tradein): rebrand default product «Trade-In» → «Мера» + new mark
Merged
#1078 feat(sql): ird_overlays durable overlay store for ИРД geometry (#1067)
Merged
#1077 fix(nspd): list_layers parse flat layers[] response, not children-tree
Merged
#1076 feat(site_finder): velocity coverage gap-fill (spatial+name) — #968 949-A
Merged
#1075 fix(frontend): bind Next to 0.0.0.0 so healthcheck passes (unhealthy fix)
Merged
#1032 ci(forgejo): pytest gate for backend suite (CI-rehab 3/3)
Merged
#1074 feat(analyze): competitor + pipeline lat/lon для слоёв карты (#999 Step 1)
Merged
#1073 fix(site-finder): обработка 202 (on-demand геометрия) + error boundaries — починка входа (#1001)
Merged
#1072 feat(site-finder): horizon-селектор 6/12/18 на экране анализа (#996)
Merged
#1071 feat(site-finder): forecast Section 6 (прогноз/сценарии/confidence) на экране анализа (#998)
Merged
#1069 feat(parcels): §22 forecast in analyze endpoint — horizon+enqueue+GET (Step 3b-ii)
Merged
#1068 feat(forecast): forecast Celery task + persist §22 «1.0» (Step 3b-i)
Merged
#1056 feat(forecasting): §9.x→§22 orchestrator (3a) + supply-side district resolution fix
Merged
#1055 feat(forecasting): months-of-inventory (MOI) — discriminating §9.8 metric
Merged
#1054 feat(forecast): wire admin→micro district resolver into §9.x filters — Step 2
Merged
#1053 feat(sql): ekb_district_alias micro→admin vocab bridge (131) — forecast wiring Step 1
Merged
#1052 fix(affordability): calibrate key_rate→market mortgage spread to 4.5pp
Merged
#1051 fix(backtest): binomial significance gate on §9.6 verdict (rebased)
Merged
#1049 feat(forecasting): wire validated Almon-ADL into §9.6 consumers (#978)
Merged
#1048 feat(backtest): validate #978 Almon-ADL + #979 seasonal as OOS variants
Merged
#1047 fix(competitors): size-weight avg velocity by flats_total (#949 B)
Merged
#1046 fix(forecasting): USP di>0 gate + unit-explicit coverage
Merged
#1045 fix(nspd-geo): MultiPolygon coercion + wide building schema (on-demand ingest)
Merged
#1044 feat(site-finder): clickable parcel markers open analysis
Merged
#1043 fix(db): default cad_parcels.source in trigger (on-demand ingest)
Merged
#1042 fix(db): auto-derive quarter_cad_number trigger (on-demand ingest 500)
Merged
#1041 fix(#945): indicator-aware macro region + debt data-quality doc
Merged
#1040 fix(#978): train-only detrend + Almon distributed-lag regression
Merged
#1039 feat(forecasting): seasonal demand normalization module (#979)
Merged
#1038 fix(forecasting): deficit_index +1 (#980) + MAI key-rate (#981)
Merged
#1037 fix(exporters): real SiteFinderReport keys in PDF/Excel (#989 #991)
Merged
#1036 fix(market-metrics): window sales by contract_date (#949 CRITICAL)
Merged
#1035 fix(supply-layers): dev_group_name in L3 upsert key (#970 CRITICAL)
Merged
#1034 fix(analyze): cad_exists_in_db requires non-NULL geometry
Merged
#1033 fix(analyze): 500 on NULL-geometry parcels (random-parcel crash)
Merged
#1031 test(suite): re-align drifted tests → green (CI-rehab 2/3)
Merged
#1030 test(rbac): test-mode bypass to revive api/v1 suite (CI-rehab 1/3)
Merged
#1029 fix(analyze): district KeyError 500 (#994) + revive by-bbox tests
Merged
#1028 feat(parcels): persist analysis runs + real last_analysis_date (#994)
Merged
#1027 feat(db): analysis_runs versioned store + latest-view §22 (#993)
Merged
#1026 feat(db): Dom.РФ housing/escrow macro §7.10 (#946 partial)
Merged
#1025 feat(#978b): Source A + detrend in rate-sensitivity backtest
Merged
#1024 feat(forecasting): read-only OOS backtest of §9.6 rate-sensitivity (#978)
Merged
#1023 feat(exporters): Site Finder report PDF exporter (#989, 955-A3)
Merged
#1022 feat(exporters): Excel exporter for SiteFinderReport (#991, 955-A5)
Merged
#1021 feat(forecasting): §13 report assembler (#988, 955-A2)
Merged
#1020 feat(forecasting): §15 confidence engine v2 (#990, 955-A4)
Merged
#1019 feat(forecasting): §13 SiteFinderReport object (#987, 955-A1)
Merged
#1018 feat(forecasting): §25 six special indices (#986, 954-C)
Merged
#1017 feat(forecasting): §14.2 product scoring card (#985, 954-B)
Merged
#1016 feat(forecasting): §11 macro-scenarios (#984, 954-A)
Merged
#1015 feat(forecasting): class/commercial/USP §10.2/10.4/10.5 + §16 (#983, 953-B)
Merged
#1014 feat(recommend): horizon-aware recommend_mix opt-in overlay (#982, 953-A)
Merged
#1013 feat(forecasting): what-to-build ranker + MAI proxy (#981, 952-B)
Merged
#1012 feat(forecasting): demand-supply forecast engine (#980, 952-A)
Merged
#1011 feat(forecasting): §9.4 demand-normalization coefficient (#951f, advisory)
Merged
#1010 feat(forecasting): §9.5 macro coefficient (#951e, advisory)
Merged
#1009 feat(forecasting): §9.6 key-rate sensitivity module (#951d, advisory)
Merged
#1008 feat(forecasting): monthly sales series builder for §9.6 (#951c)
Merged
#1007 feat(forecasting): monthly macro series + regime classifier (#951b)
Merged
#1006 feat(site_finder): future-supply-pressure index (#950 Step 6)
Merged
#1005 feat(workers): supply-layers refresh task + weekly beat (#950 Step 5)
Merged
#1004 feat(site-finder): supply_layers v2 compute service (#950 EPIC6 step3+4)
Merged
#1003 feat(db): supply_layers store + latest view (#950 PR B)
Merged
#1002 feat(domrf): persist domrf_kn_objects.free_flats (#950 PR A)
Merged
#1000 feat(site-finder): per-competitor relevance_weight (#949 PR B)
Merged
#997 feat(site_finder): market-metrics service (#949 PR A, §9.2)
Merged
#964 feat(site-finder): live CBR key-rate scraper → macro_indicator (#945 PR B)
Merged
#963 feat(site-finder): macro_indicator table + backfill + reader (#945 PR A)
Merged
#943 fix(tradein): collapse CRM block + density so input form fits laptops
Merged
#942 fix(tradein): praktika wordmark logo + form button cutoff on short viewports
Merged
#940 fix(tradein): system-curl subprocess transport for Yandex SERP over SOCKS5
Merged
#939 feat(trade-in): OfferCard — убрать редактируемую цену + ползунок торга, разбивка на дефолтах
Merged
#938 feat(tradein): cian full-load secondary-only — drop novostroyki at parse
Merged
#937 feat(tradein): checkpoint/resume for yandex full-load — survive restart (#930)
Merged
#935 fix(tradein): exclude novostroyki from radius-median comp pool
Merged
#934 feat(tradein): ppm²-tier segmentation of asking→sold ratio (#928, flag OFF)
Merged
#932 feat(tradein): checkpoint/resume for cian full-load — survive restart (#930)
Merged
#931 feat(tradein): exhaustive Yandex realty load — adaptive room×price + concurrency
Merged
#929 perf(tradein): cian full-load incremental save + concurrent pagination
Merged
#927 fix(browser): pageError.location needs valid defaults, not just optional chaining (#918 follow-up)
Merged
#926 feat(tradein): exhaustive Cian EKB secondary load — room×price partitioning
Merged
#925 fix(tradein): add cian_proxy_url to test _mock_settings — unblock deploy (#923)
Merged
#924 fix(tradein): skip TLS verify for sberindex.ru pull — server omits LE intermediate (#922)
Merged
#923 feat(tradein): dedicated Cian mobile proxy — separate egress from Avito
Merged
#921 test(tradein): fix #794 test regressions on main (broken by #919 early squash-merge)
Merged
#919 feat(tradein): СберИндекс time-adjust for frozen Rosreestr ДКП + per-dashboard filter fix (#794)
Merged
#918 fix(browser): null-guard pageError.location in playwright bundle (#915)
Merged
#917 feat(tradein): Cian browser auto-login — POST /admin/scrape/cian/auto-login (#639)
Merged
#916 feat(tradein): route avito pipeline SERP+detail+houses through BrowserFetcher (#915)
Merged
#914 feat(tradein): systemd timer scheduler — trigger script + units + SCHEDULER_ENABLE flag (#581)
Merged
#913 feat(tradein): avito SERP via BrowserFetcher behind scraper_fetch_mode (#901)
Merged
#912 fix(browser): bump fetch wait 2500→6000ms so avito listings hydrate (#905) — migration proven
Merged
#911 fix(browser): camoufox reads AVITO_PROXY_URL → real avito data not soft-block stub (#905)
Merged
#910 chore(tradein): browser-smoke.sh — verify tradein-browser /health + /fetch (#905)
Merged
#909 fix(browser): local camoufox + HTTP wrapper, drop broken playwright WS server (#905)
Merged
#908 fix(browser): run camoufox fetch as root so geoip mmdb write succeeds — RED build-browser (#905)
Merged
#907 feat(browser): split camoufox into a separate tradein-browser container (Phase 0.5, #905)
Merged
#904 feat(tradein): DomClick вторичка scraper via BrowserFetcher (#796)
Merged
#906 chore(agents): reviewer back to Opus (revert model-part of aa3d012)
Merged
#903 fix(tradein): 095 drop v_data_quality before dropping sale_type_text — RED deploy (#731)
Merged
#900 feat(tradein): add EKB/MSK REF_AREA codes to sber_price_index pull (#794)
Merged
#899 fix(tradein): camoufox fetch under app-user so runtime finds Firefox (#884)
Merged
#898 chore(agents): bot harness tuning — per-role model, forgejo MCP deferral, vault capture, #893 curl hardening
Merged
#897 perf(tradein): index hygiene — drop dup/redundant + de-partial is_active (#730)
Merged
#896 fix(tradein): RouteGuard prod 401 → session-expired screen, stop re-subscribe storm (#800)
Merged
#894 feat(tradein): scheduled monthly Rosreestr new-quarter poll → ingest alert (#888)
Merged
#893 refactor(tradein): drop dead schema — sale_type_text column + audit_log (#731)
Merged
#892 feat(tradein): BrowserFetcher camoufox wrapper + Docker/config infra (Phase 0, #884)
Merged
#891 refactor(tradein): unify kadastr_num → cadastral_number (#732)
Merged
#890 feat(tradein): СберИндекс monthly city-level price index pull (#887, data-layer)
Merged
#889 chore(agents): usage-opt (Sonnet + throttle) + консервативный рефактор промтов
Merged
#882 feat(tradein-fe): уведомление при global_fallback asking→sold ratio (тонкий сегмент)
Merged
#881 feat(tradein): per-anchor watchdog timeout in city sweeps (#880)
Merged
#877 feat(tradein): same-building anchor safe-guard (#755)
Merged
#878 feat(tradein): unify scraper admin pages (avito/cian/yandex) + /scrapers hub
Merged
#875 fix(tradein): yandex address-enrich — city-agnostic title regex (спутники ЕКБ)
Merged
#876 test(tradein): fix sweep-endpoint тесты после single-run guard (#874 follow-up)
Merged
#874 fix(tradein): single-run guard на avito-city-sweep admin-endpoint
Merged
#873 fix(tradein): avito house-link из detail SSR — SERP-карточка JS-only (#871)
Merged
#872 fix(tradein-fe): scraper-страница падала — scraper-settings {settings:[]} + string delay
Merged
#870 fix(matching): Tier 2b alias sync + collapse double SAVEPOINT (#849)
Merged
#869 fix(tradein): money-screen contrast AA (#834 fixup)
Merged
#868 fix(tradein): cian sweep houses-phase — JOIN house_sources + graceful (не fatal)
Merged
#867 feat(tradein): yandex city-sweep — один прогон SERP+address-enrich
Merged
#866 feat(tradein): schedule yandex address backfill task (#855)
Merged
#864 feat(tradein): cian city-sweep — один прогон SERP+detail(+price-history)+houses
Merged
#863 fix(estimator): sanity-clamp quarter-index factor (#859)
Merged
#862 feat(tradein): nightly task to deactivate stale avito listings (#759)
Merged
#861 feat(tradein): avito city-sweep — IMV-фаза (один прогон = SERP+detail+houses+IMV)
Merged
#860 fix(tradein): route yandex/valuation/imv/newbuilding scrapers через scraper_proxy_url
Merged
#858 feat(tradein): per-cadastral-quarter price index in estimator (#764)
Merged
#857 fix(bots): подключить postgres-tradein MCP в analyst/backend bot-окна
Merged
#856 feat(tradein): admin backfill endpoints — cian price-history (T8a) + yandex address (T10) + house IMV (T7)
Merged
#852 chore(agents): analyst inbound queue (status/needs-analysis) + tradein DB access
Merged
#851 test(tradein): align yandex history tests с batch-executemany (unblock deploy)
Merged
#848 feat(tradein): avito citywide + byrooms sweep mode (T6)
Merged
#847 feat(tradein): yandex SERP curl_cffi+cookies transport + rooms×price combos (T4+T5)
Merged
#846 fix(tradein): cian SERP warm-up GET для seed cookies (_CIAN_GK/_yasc) (T2)
Merged
#845 fix(tradein): a11y follow-up — sr-only th-текст + heading-order (#835)
Merged
#844 fix(tradein): recharts a11y — aria-hidden чарты, h1, aria-label th (#835)
Merged
#842 fix(tradein): контраст AA follow-up — muted-on-tint, rating, sold-delta (#834)
Merged
#841 fix(tradein): aria-label на input[type=file] в PhotoUpload — a11y critical (#839)
Merged
#840 fix(scrapers): normalize cian descriptionMinhash list[int]→str + silent-0 guard (Refs #836)
Merged
#838 fix(tradein): контраст muted/teal токенов до WCAG AA (#834)
Merged
#837 fix(tradein): gas leaflet map в ui-preview для CI-аудита (#801)
Merged
#833 feat(observability): sentry alert on N consecutive scraper failures (Refs #827)
Merged
#832 perf(estimator): executemany batch insert in _save_yandex_history_items (Refs #826)
Merged
#831 fix(tradein): seed sales-vs-listings → StreetDeals в preview (1:1) (#801)
Merged
#830 fix(scrapers): avito per-card parse_failures counter + logging (Refs #823)
Merged
#829 fix(scrapers): COALESCE-backfill listing_date/area_m2 in save_listings ON CONFLICT (Refs #821)
Merged
#828 feat(tradein): ui-preview/estimate — все 17 секций на оффлайн-фикстуре (#801)
Merged
#825 fix(tradein): error/not-found/loading UI при restore по ?id= (#822)
Merged
#820 fix(tradein): import trade-in.css в ui-preview (#801)
Merged
#818 feat(scrapers): route cian sessions through mobile proxy (Refs #806)
Merged
#819 fix(tradein): cian _cianConfig concat-формат + auth из header-frontend (#639)
Merged
#817 hotfix(caddy): @uipreview named matcher (fix prod-down crash-loop)
Merged
#816 fix(caddy): exempt /trade-in/_next/static/* (ui-preview CSS) (#801)
Merged
#813 chore(tradein): enable /ui-preview on prod (NEXT_PUBLIC_ENABLE_PREVIEW) (#801)
Merged
#810 chore(caddy): exempt /trade-in/ui-preview/* from basic_auth (#801)
Merged
#811 feat(estimator): exclude city-centroid listings from radius analogs (Refs #769 Part E)
Merged
#809 fix(frontend): pilot-only юзер → auto-redirect на /trade-in/ вместо «Доступа нет» (#799)
Merged
#807 chore(auth): regenerate praktika pilot password
Merged
#805 fix(tradein): sweep shared-session (SERP+detail) через mobile proxy (#623)
Merged
#804 fix(tradein): data-layer tail A2+B+C — trgm index, FDW options, matview refresh (Refs #769)
Merged
#803 feat(tradein): dev/CI preview route for a11y+lighthouse (#801)
Merged
#802 feat(scrapers/n1): извлекать floor/total_floors из ведущего N/M-токена (Refs #795)
Merged
#798 fix(tradein): word-boundary street match + cian unescape robustness (Refs #769 A1+D)
Merged
#797 feat(db): quarter_price_index FDW foreign table + monthly refresh (Refs #762)
Merged
#793 fix(tradein): resilience-хвост аудита #770 (findings #25-33)
Merged
#792 feat(db): mv_quarter_price_index — quarter price-index из ДКП (Refs #760)
Merged
#791 fix(tradein): санитизация brand.logo_url + валидация brand-цветов (#766)
Merged
#790 fix(ratio): ppm² потолок asking→sold в конфиг, default 1.2M (Refs #767)
Merged
#789 fix(pdf): brand-spoof + median=0 empty-state + SSRF + дисклеймер + sources (Refs #772)
Merged
#788 feat(tradein): Avito mobile proxy egress + firewall detect + MSK date (#623, #726)
Merged
#787 fix(tradein): MapCard клик по пину + честная ДКП-легенда (#786)
Merged
#785 fix(cian): verify_session на curl_cffi impersonate — ban != cookies expired (Refs #768)
Merged
#784 fix(estimator): expected_sold guard listings_clean → median_price>0 (Refs #773)
Merged
#783 fix(scrapers): yandex area из embedded-state JSON (Refs #775)
Merged
#782 fix(tradein): MapPicker через portal в document.body — z-index конфликт с SourcesProgress (#771)
Merged
#780 fix(tradein): account-бренд приоритетен над ?brand= — cross-brand leak (#765)
Merged
#779 fix(tradein): avito content-block (HTTP-200) не маскируется под end-of-pagination (Refs #754)
Merged
#778 fix(tradein): SSRF host-allowlist на admin scrape + удалён dead ADMIN_TOKEN (Refs #756)
Merged
#777 fix(tradein): /sales-vs-listings street_only не house_linked (Refs #757)
Merged
#776 fix(tradein): cron-scrape.sh log to writable path + graceful tee (Refs #758)
Merged
#761 fix(scrapers): stable dedup_hash — drop price_rub + strip URL query (Refs #753)
Merged
#752 fix(scheduler): atomic _claim_run via advisory xact lock (Refs #750)
Merged
#751 fix(tradein): gate «0,00 млн ₽» в не-headline секциях при insufficient_data (#748)
Merged
#749 fix(tradein): atomic conditional quota increment — close TOCTOU (#747)
Merged
#746 fix(tradein): confidence «средняя» → amber + FIXME для compsTier (#742)
Merged
#745 feat(scrapers): wire N1.ru city sweep — pipeline + scheduler + admin endpoint (#575)
Merged
#744 fix(tradein): guard деления на median=0 в ListingsCard/DealsCard (#741)
Merged
#743 feat(tradein): HeroSummary empty-state при insufficient_data (#740)
Merged
#739 fix(tradein): sync n_analogs to anchor count when anchor drives headline (#695)
Merged
#738 fix(tradein): confidence_explanation no longer contradicts counters (#695)
Merged
#737 docs(tradein): clarify n_analogs vs analogs[] top-10 cap (#698)
Merged
#735 chore(agents): auto-resolver human-proxy persona для needs-human
Merged
#734 feat(tradein): insufficient_data flag on AggregatedEstimate (#697)
Merged
#733 fix(tradein): sanitize ДКП deal outliers (floor / ppm²) (#699)
Merged
#729 fix(scrapers): avito listing_date from sortTimeStamp JSON (#726)
Merged
#725 feat(tradein): street_only disclaimer in StreetDealsCard (#722)
Merged
#723 feat(tradein): add data_quality flag to /sales-vs-listings (#721)
Merged
#720 fix(tradein): coarse-geo downgrade no longer shielded by Tier C anchor (#693)
Merged
#719 feat(health): expose app version in GET /health (#717)
Merged
#718 fix(tradein): coarse-geo downgrade works without DaData on prod (#693)
Merged
#716 docs(main): add module docstring to backend/app/main.py
Merged
#715 docs(bots): label IDs table (goern add_issue_labels требует id)
Merged
#713 feat(qa): tester заводит bug-issue на новые баги
Merged
#712 fix(bots): qa-close bug (Closes→Refs) + minor-verdict → follow-up task
Merged
#710 fix(tradein): rehydrate POST-only fields on GET /estimate/{id} (#696)
Merged
#711 fix(claude): quote agent descriptions — YAML frontmatter parse break
Merged
#709 test(tradein): fix /houses test broken by IDOR guard — unblock deploy (#690)
Merged
#708 fix(tradein): surface same-building comps as analogs when anchor fires (#694)
Merged
#707 fix(tradein): flag coarse-geo estimates as low-confidence (#693)
Merged
#702 fix(tradein): scope GET /estimate/{id} + /pdf to owner, close IDOR (#690)
Merged
#705 fix(tradein-ui): eliminate mobile horizontal overflow on estimate result (#692)
Merged
#706 chore(bots): тугие /loop каденции под подписку (убрать cost-backoff)
Merged
#704 fix(tradein): run same-building anchor without radius analogs (#691)
Merged
#703 fix(tradein): dedupe last_scraped_at — fix frontend build/deploy
Merged
#701 chore(analyst): issue = исполняемый work-prompt без разночтений
Merged
#689 feat(tradein): trust + actions (how-calculated, freshness, PDF, lead CTA) in result header
Merged
#700 chore(bots): per-window MCP isolation (--strict-mcp-config per role)
Merged
#687 chore(bots): per-role launcher scripts + bot pipeline on forgejo MCP
Merged
#688 feat(tradein): web-native analytics cards on estimate result (map, distribution, trend, exposure)
Merged
#686 feat(tradein): «Что-если» interactive recompute on estimate result
Merged
#685 feat(tradein): enrich /estimate response for web map, distribution, exposure & trend
Merged
#684 feat(tradein): interactive benefit calculator in OfferCard (Брусника секция 4)
Merged
#683 feat(tradein): brand-by-account + result IA redesign (distinct asking/sale prices)
Merged
#682 fix(tradein): distinct asking median vs expected-sold price (no double-discount)
Merged
#681 feat(tradein): refine same-building anchor for within-building heterogeneity
Merged
#680 fix(tradein): feed raw payload.address to same-building anchor (geocode-independent)
Merged
#679 fix(tradein): harden same-building anchor address normalizer for prod formats (#677)
Merged
#678 fix(ci): drop --frozen in tradein test job (uv.lock is gitignored)
Merged
#677 feat(tradein): same-building anchor estimator (#651/#652 v2) behind flag
Merged
#676 fix(ci): install uv via official installer in tradein test job (PEP 668)
Merged
#675 chore(tradein): close pre-commit ruff gap + add CI pytest gate (#666)
Merged
#674 feat(tradein): blend Avito IMV anchor into estimate + ДКП corridor advisory (#651, #652)
Merged
#673 fix(tradein): time-budget estimate enrichment + observable errors to stop opaque 502 (#654)
Merged
#672 feat(tradein): white-label branded page for client «Практика» (#657)
Merged
#671 feat(tradein): configurable estimate quota + new exhausted-quota copy (#658)
Merged
#670 fix(tradein): scope GET /history to caller, close cross-pilot data leak (#656)
Merged
#669 fix(tradein): bypass rate-limit for authenticated pilots + configurable limit (#655)
Merged
#634 feat(backend): add /api/v1/ping liveness endpoint
Merged
#668 chore(claude): self-extending tripwire extension + pause-bots guard
Merged
#665 feat(tradein): expected-sold price in estimate PDF (#648 S5b — final)
Merged
#664 feat(tradein): dual-display asking vs expected-sold in HeroSummary (#648 S5a)
Merged
#663 feat(tradein): daily asking→sold ratio refresh (#648 S4)
Merged
#662 chore(claude): harden autonomous multi-agent prompts (Path B)
Merged
#661 feat(tradein): estimator additive expected_sold price (#648 S3)
Merged
#660 feat(tradein): asking_to_sold_ratios table + derivation (#648 S2)
Merged
#650 feat(backtest): per-rooms asking→sold correction block (#648 S1)
Merged
#649 feat(backtest): read-only estimator-vs-ДКП accuracy harness (#648)
Merged
#646 feat(tradein): per-source listing price history — schema + daily snapshot (#570)
Merged
#645 fix(glitchtip): healthcheck via python3 /_health/ — image has no wget (#644)
Merged
#643 feat(tradein): enrich GlitchTip SDK init — integrations + PII scrub (#396)
Merged
#642 feat(scheduler): dormant Yandex Realty city-sweep (#561)
Merged
#641 chore(tradein): drop uvicorn --reload in prod (WatchFiles overhead)
Merged
#640 test(tradein): estimator pure-helper unit tests + fix None crash in _filter_outliers (#580)
Merged
#638 fix(tradein): plain natural-key dedup_hash for rosreestr deals (#576)
Merged
#637 fix(deploy-tradein): track SQL migrations with _schema_migrations + baseline
Merged
#635 feat(tradein): аккаунт praktika + лимит 15 оценок/мес, чистка PRINZIP в UI
Merged
#632 feat(tradein): infer repair_state from listing description text (#622)
Merged
#631 fix(tradein): per-bucket velocity formula + realistic срок продажи (#574)
Merged
#630 feat(tradein): автоматизация cian-backfill + rosreestr-import через scheduler (#560 #563)
Merged
#629 refactor(tradein): normalize repair_state raw→enum at ingest (#621)
Merged
#628 fix(tradein): backfill kn obj_class (parser + 3-pass) (#572)
Merged
#627 feat(tradein): houses.cian_zhk_url column + backfill (#568)
Merged
#625 fix(tradein): backfill kn price_per_m2 via sale_graph + peer median (#573)
Merged
#626 chore(mv): regression test + sql rule for weighted AVG (#295)
Merged
#624 fix(tradein): implement listings_snapshots + offer_price_history writers (#567)
Merged
#620 fix(tradein-imv): harden Avito IMV anti-bot path + offline contract tests (#565)
Merged
#619 feat(tradein): калибровка repair-коэффициентов с base 1.0 (#7)
Merged
#618 fix(tradein): decode Avito houses URL-encoded __preloadedState__ (#566)
Merged
#617 feat(tradein): бейдж точности адреса (qc_geo) на карточке оценки (accuracy #1)
Merged
#616 feat(tradein): приоритизировать DaData house-backfill на дома с листингами (accuracy #2)
Merged
#615 feat(tradein): geocode leftover deals via Nominatim (#569 Step 3)
Merged
#614 feat(tradein): backfill deals.lat/lon из house street-центроидов (#569 Step 2)
Merged
#613 feat(tradein): same-building матчинг аналогов по house_id (#6)
Merged
#612 fix(stale-claims): avoid SIGPIPE 141 — pass file path не pipe
Merged
#611 chore(workflow): diagnostic для stale-claims.yml
Merged
#610 feat(claude): env-vars refactor + stale-claim cron (Phase 2 final)
Merged
#609 feat(claude): Phase 2 — slash-commands + pre-flight + Forgejo labels
Merged
#608 feat(claude): auto-* agent stubs для autonomous multi-window workflow (DRAFT)
Merged
#607 fix(tradein): DaData backfill — Екатеринбург city context (#606 hotfix)
Merged
#606 feat(tradein): DaData /clean/address backfill для houses (PR Q3)
Merged
#605 feat(tradein): DaData /suggest tier в /suggest endpoint (PR Q2)
Merged
#604 feat(tradein): DaData on-demand enrichment в estimate flow (PR Q1)
Merged
#603 feat(tradein): tier badge на DealsCard rows
Merged
#602 fix(tradein): Yandex listing_date — keyword + absolute-no-year
Merged
#601 fix(tradein): Avito listing_date extraction (3 формата)
Merged
#600 feat(tradein): estimator deals tier (PR M, #564 Phase 3)
Merged
#599 feat(tradein): StreetDealsCard с paired listings (PR L, #564 Phase 2)
Merged
#598 chore(tradein): drop spurious v_street_sales_vs_listings
Merged
#597 feat(tradein): sales-vs-listings endpoint (PR K, foundation #564)
Merged
#596 feat(tradein): backfill 18k existing listings (PR J)
Merged
#595 feat(tradein): hook matching в save_listings — fill listing_sources (PR I)
Merged
#594 feat(tradein): MapPicker snap marker — Phase 5 of #582
Merged
#593 fix(tradein): yandex_realty captures house number + parse_rub strips NBSP
Merged
#592 feat(tradein): persistent infra для backfill scripts (PR F)
Merged
#591 feat(tradein): Phase 2-3 of #582 — Yandex backfill + canonical audit
Merged
#590 feat(auth): UserMenu — личный кабинет top-right (PR D)
Merged
#589 fix(auth): scripts/auth/*.sh — правильный SNIPPET path
Merged
#588 chore(security): sync admin hash в users.caddy.snippet
Merged
#587 feat(rbac): pilot scope → только /trade-in/**
Merged
#586 feat(rbac): frontend route-guard + nav filter (PR B — frontend)
Merged
#585 feat(rbac): role-based access control via X-Authenticated-User middleware (PR A — backend + Caddy)
Merged
#583 feat(tradein): Phase 1 of #582 — address mismatch audit (200-house Yandex baseline)
Merged
#584 fix(tradein): убрать «PRINZIP» wordmark из шапки
Merged
#558 feat(tradein): этаж/этажность optional + best test presets по deal count
Merged
#557 fix(tradein): extract_street_name handles Nominatim reverse format
Merged
#556 feat(tradein): «По вашей улице» — StreetDealsCard на real ДКП-сделки Росреестра
Merged
#555 feat(tradein): GET /street-deals — ДКП-сделки Росреестра по улице target адреса
Merged
#553 feat(tradein/scripts): local Playwright runners для Cian backfill (bypass server-IP anti-bot)
Merged
#554 feat(tradein): yandex address backfill — street → full address
Merged
#551 feat(tradein-scripts): scrapers + probes + Phase C improvements
Merged
#552 fix(yandex-valuation): off-by-one cell index in _parse_row_cells
Merged
#548 feat(tradein): sell-time sensitivity (4 цены × срок продажи)
Merged
#549 fix(tradein): filter ДКП-only in rosreestr importer + re-enable deals
Merged
#550 feat(tradein): «Росреестр» button — copy address + open EGRN request form
Merged
#547 feat(tradein): cian price-change badges + split chart Avito/Yandex
Merged
#546 feat(tradein): house analytics section (chart + KPI + sold list)
Merged
#545 fix(yandex-valuation): curl_cffi chrome120 — Yandex gates SSR on Chrome TLS
Merged
#544 refactor(yandex-valuation): DOM-based parser via .OffersArchiveSearchOffers__row
Merged
#543 fix(tradein/devops): wire COOKIE_ENCRYPTION_KEY env to tradein-backend
Merged
#542 fix(yandex-valuation): relax area regex lookbehind (2-комн regression)
Merged
#540 fix(tradein-phase-c): prepend region prefix for IMV geocoder
Merged
#541 fix(yandex-valuation): tighten area regex + chronological date ordering
Merged
#539 feat(tradein/cian): valuation backfill + runner script для prod
Merged
#538 fix(yandex-valuation): cap area_m2 sanity (drop >10000 or ≤0)
Merged
#537 fix(tradein-phase-c): house_type 'monolith'→'monolithic' + log 400 body
Merged
#536 feat(tradein-sweep): --require-house-number filter (default on)
Merged
#535 feat(tradein/cian): batch backfill task для offer_price_history + houses_price_dynamics
Merged
#534 feat(tradein): Phase C — Avito IMV per-house backfill (SQL + script)
Merged
#533 feat(tradein): bulk sweep CLI for Yandex valuation house-history (EKB)
Merged
#532 fix(tradein-api): PlacementHistoryEntry schema + None checks (PR #528 follow-up)
Merged
#530 feat(tradein/cian): surface valuation chart + rent + change-pct on /trade-in
Merged
#531 feat(yandex-valuation): link history rows to houses via match_or_create_house
Merged
#528 feat(tradein-api): surface backfilled houses + placement history
Merged
#529 feat(tradein-ui): placement history card
Merged
#527 feat(tradein-sql): bootstrap houses + link 98.8% of listings (Phase A+B)
Merged
#526 fix(yandex-valuation): parse removed_date, fix total_floors regex, normalize NBSP
Merged
#525 feat(tradein/cian): admin endpoints + UI for detail+newbuilding history scrape
Merged
#524 fix(tradein-imv): adapt to Avito 3-step API contract (2026-05+)
Merged
#523 fix(tradein/cian): sanitize valuation cache writes (047 UNIQUE + 026/044 cols)
Merged
#522 fix(tradein-estimator): extend cohort filter to Tier S + Tier H, fix late_soviet overlap
Merged
#520 fix(beat): distinguish DB-unreachable from intentional-empty schedule
Merged
#521 chore(tradein): remove dead mock-fallback code from trade_in.py
Merged
#519 feat(tradein-estimator): cohort filter + Tier 0 for analog selection quality
Merged
#517 feat(tradein-ui): mock-disclaimer + progressive enrichment + UX polish
Merged
#507 feat(tradein-estimator): tiered house-match S→H→W
Merged
#518 fix(tradein-estimator): restore CAST in IS NOT NULL predicates (revert audit #9, prod fix)
Merged
#516 fix(scrapers): disable catalog-object SSR beat-cron — DOM.РФ WAF cooldown
Merged
#515 fix(tradein-sql): remove duplicate CREATE INDEX from 050 (regression from PR #500)
Merged
#514 fix(tradein-frontend): MapPicker focus trap + Leaflet SRI, PhotoUpload size check
Merged
#513 feat(tradein-estimator): unique-address-based confidence threshold
Merged
#512 fix(tradein-frontend): safeUrl validator, apiFetch dedup, ListingsCard a11y, error boundary
Merged
#511 fix(tradein-photos): sanitize uploaded images via Pillow re-encode
Merged
#510 fix(deploy): tradein_fdw_reader password — psql var interpolation in DO block
Merged
#506 chore(rules): drop blocked-scope list from git-pr.md
Merged
#509 fix(tradein-estimator): atomic IMV link, batched yandex history, drop redundant CAST
Merged
#508 feat(tradein-scrapers): parse listing_date from Avito + Yandex
Merged
#505 feat(tradein-imv): retry with cleaned address + categorize errors
Merged
#503 fix(scrapers): DOM.РФ KN extras — bypass WAF + update renamed endpoints
Merged
#504 feat(tradein-estimator): exclude rosreestr deals from output
Merged
#502 fix(tradein-avito): strip Emotion CSS from listings.address
Merged
#501 fix(tradein-matching): pg_advisory_xact_lock to prevent duplicate house INSERTs
Merged
#500 fix(tradein-sql): rename dup 030, add trade_in_estimates geom, drop dup indexes
Merged
#499 fix(deploy): resolve FDW bootstrap race + extract bootstrap DO block to .sql file
Merged
#498 chore(claude): aggressive worktree cleanup via Forgejo PR API
Merged
#497 chore(claude): agents view readiness — cleanup, .worktreeinclude, workflow
Merged
#496 chore(claude-rules): promote 3 deferred feedback rules from memory
Merged
#493 feat(tradein): postgres_fdw live read of gendesign.cad_buildings (replaces snapshot)
Merged
#495 chore(claude-config): align with 2026 best practices
Merged
#492 feat(tradein): cadastral reverse geocode via main backend cad_buildings
Merged
#491 feat(tradein): source-quota in estimator analogs (fix Cian/Yandex starvation)
Merged
#487 fix(tradein/avito): anti-bot hardening — sleep + abort + shared session
Merged
#488 feat(tradein-ui): Yandex admin scraper page — mirror Avito + global delay control
Merged
#490 fix(tradein): geocode backfill + remove Avito exclusion from estimator
Merged
#489 fix(tradein-ui): double /trade-in/ prefix in Cian page Link (PR #486 follow-up)
Merged
#485 feat(tradein): global scraper delay setting (applies across all scrapers)
Merged
#486 feat(tradein-ui): Cian scraper admin page + global request delay control
Merged
#484 feat(tradein): scraper_settings live-config + Yandex admin trigger endpoints
Merged
#481 feat(tradein-ui): Cian cookies upload admin page
Merged
#483 feat(tradein): /scrapers/avito — 6-я секция Расписание (in-app scheduler UI)
Merged
#482 feat(tradein): in-app scheduler — UI-managed schedule (replaces SSH crontab)
Merged
#480 fix(tradein): CIAN_REQUIRED_COOKIES — add real auth cookies (DMIR_AUTH + Cian session)
Merged
#479 feat(tradein): Phase 3.2 — /api/v1/search endpoint + Redis cache
Merged
#478 feat(tradein): /scrapers/avito — 5-я секция City sweep (auto + cancel + runs list)
Merged
#477 feat(tradein): city sweep — auto ЕКБ pipeline (anchors × pages + enrichment + cancel)
Merged
#476 feat(tradein): estimator — Cian Valuation as on-demand evaluation source (Stage 9)
Merged
#475 feat(tradein): Phase 1.3 backfill scripts — fingerprints + house/listing_sources
Merged
#474 fix(tradein): убрать require_admin полностью — Caddy basic_auth достаточен
Merged
#473 feat(tradein): estimator — Yandex Valuation as on-demand 6th source
Merged
#470 feat(tradein): cross-source matching service (3-tier: cadastr / fingerprint / geo / composite)
Merged
#472 feat(tradein): Stage 4c — scrapers admin pages (Avito real + Cian/Yandex stubs)
Merged
#471 feat(tradein): conflict_resolution — register Yandex sources in priority dicts
Merged
#469 feat(tradein): search matview + indexes (Phase 3.1)
Merged
#467 feat(tradein): yandex_newbuilding.py — ЖК landing parser (149 selectors + NLP)
Merged
#468 feat(tradein): yandex_valuation.py — anonymous house-history scraper
Merged
#466 feat(tradein): yandex_detail.py — Product JSON-LD + DOM detail parser
Merged
#465 feat(tradein): cian_valuation.py — auth-required Calculator scraper + 24h cache
Merged
#460 feat(tradein): Stage 4a — API endpoints for Avito enrichment + IMV benchmark UI
Merged
#462 feat(tradein): yandex_realty.py — DOM SERP refactor (vtorichka, 23 cards/page)
Merged
#464 feat(tradein): SQL 040-046 — matching schema delta (Phase 1.1)
Merged
#461 feat(tradein): Stage 4b — IMV benchmark badge + house info card on estimate result
Merged
#459 feat(tradein): cian_newbuilding.py — ЖК catalog scraper (chart + reliability + offers, Wave 4 Worker C)
Merged
#457 feat(tradein): cian_session cookies management + admin endpoints (Wave 4 Worker A)
Merged
#456 feat(tradein): yandex_helpers.py — JSON-LD + regex + date + NLP + money helpers
Merged
#452 feat(tradein): integrate Avito IMV as 5th evaluation source (on-demand cached)
Merged
#455 feat(tradein): extend base.py save_listings to persist Cian-specific columns (PR #450 follow-up)
Merged
#454 fix(tradein): 030 — UNIQUE constraint on avito_imv_evaluations.cache_key (unblocks PR #452)
Merged
#453 feat(tradein): SQL migrations 030-032 — Yandex schema (listings/houses/history)
Merged
#451 feat(tradein): scrape_pipeline.py — Avito full orchestrator (search → houses → detail)
Merged
#450 feat(tradein): cian.py SERP refactor — state-based extraction (137 fields, no jitter)
Merged
#449 feat(tradein): avito_houses.py — Houses Catalog parser (state + reviews + history + recs)
Merged
#448 feat(tradein): SQL migration 029 — extend matching/valuation/dynamics tables (PR #445 follow-up)
Merged
#447 feat(tradein): cian_state_parser shared utility + ScrapedLot Cian fields
Merged
#445 feat(tradein): SQL migrations 019-028 — Cian schema + matching + cookies
Merged
#443 feat(tradein): avito_detail.py — detail page parser (30+ fields incl. domoteka)
Merged
#444 feat(tradein): avito_imv.py — Avito IMV evaluation API client (2 requests)
Merged
#442 refactor(security): убрать UI ввода admin token (backend не требует с PR #437)
Merged
#441 refactor(tradein): avito search — remove jitter (C-5) + mobile API dead code + parse houseLinks
Merged
#440 feat(tradein): SQL migrations 009-018 — houses + listings extension + IMV cache
Merged
#439 fix(ui): использовать <Link> вместо <a> для internal routes (build error)
Merged
#438 feat(ui): добавить Trade-In / Концепция / Админ в landing nav
Merged
#437 refactor(security): убрать X-Admin-Token (Caddy basic_auth достаточен)
Merged
#436 fix(security): log_credentials + auth_audit.log → username из 401
Merged
#435 fix(tradein): security hotfix — C-3 config default + C-4 empty estimate persist + C-6 PDF URL allowlist
Merged
#434 fix(security): caddy/** в deploy paths + username из 401 попытки
Merged
#433 feat(security): добавить юзера kopylov в basic_auth gate
Merged
#432 fix(security): forwarder PermissionError — убрать USER nobody (read /var/log/caddy)
Merged
#430 feat(security): GlitchTip forwarder для basic_auth 401 events (Phase 2 PR #426)
Merged
#426 feat(security): закрыть gendsgn.ru basic_auth gate (multi-user, 11 users)
Merged
#425 fix(tradein): PDF — рабочая ссылка на отчёт + «Есть/Нет» для балкона
Merged
#424 fix(tradein): восстановленная оценка показывает этаж/площадь, не 0/0
Merged
#423 fix(tradein): фото аналога в Сводке больше не скрыто плейсхолдером
Merged
#422 fix(tradein): бюджет по времени в geocode-missing — cron не таймаутит
Merged
#421 fix(tradein): оценка исключает Avito из радиусного поиска аналогов
Merged
#420 fix(tradein): N1.ru — честный статус источника вместо хардкод-timeout
Merged
#419 fix(tradein): Avito-парсер тащит фото и реальный адрес из DOM
Merged
#418 fix(tradein): map-picker подставляет уличный адрес, а не название POI
Merged
#417 fix(tradein): GET /estimate/{id} возвращает полный набор полей
Merged
#416 feat(tradein): выбор адреса на карте ЕКБ (#415)
Merged
#414 fix(tradein): фото аналога в Сводке + честный статус источников
Merged
#413 feat(tradein): рабочие страницы История и Кэш (#399)
Merged
#412 feat(tradein): бэкап tradein-postgres по cron (#397)
Merged
#410 feat(tradein): мониторинг ошибок через GlitchTip (#396)
Merged
#409 feat(tradein): CRM-поля в форме оценки (#395)
Merged
#408 feat(tradein): фронтенд загрузки фото квартиры (#394)
Merged
#407 feat(tradein): backend загрузки фото квартиры (#394)
Merged
#406 feat(tradein): кадастр зданий как источник house_metadata (#393)
Merged
#405 feat(tradein): обогащение house_metadata через OSM Overpass (#392)
Merged
#404 chore(security): убрать sshkey.txt из репозитория (#391)
Merged
#403 fix(tradein): cron-scrape подхватывает .env.runtime (#390)
Merged
#389 fix(tradein): estimate 500 — AmbiguousParameter на NULL-параметрах
Merged
#388 fix(tradein): estimate 500 — алиас distance_m в ORDER BY
Merged
#387 feat(tradein): прогноз срока продажи + rate-limit (#9,#16)
Merged
#386 feat(tradein): geocode-missing для deals (#4)
Merged
#385 feat(tradein): house-match аналогов + поправка на ремонт (#6,#7)
Merged
#384 feat(tradein): импорт реальных сделок Росреестра (#4)
Merged
#383 feat(tradein): auth на admin-эндпоинтах (#2)
Merged
#382 fix(tradein): чанковый геокодинг — cron не таймаутится (#1)
Merged
#381 feat(tradein): пагинация Циан/N1 3→8 страниц
Merged
#380 fix(tradein): убрать TRUNCATE из seed — деплой больше не wipe-ит данные
Merged
#379 fix(tradein): реальные координаты Cian/N1 через геокодинг
Merged
#378 feat(tradein): радиус 1000м + пагинация Циан/N1
Merged
#377 feat(tradein): N1.ru scraper + cron для 4 источников
Merged
#376 fix(tradein): HOSTNAME=0.0.0.0 + NEXT_PUBLIC_API_BASE_URL build-arg
Merged
#375 fix(tradein): PDF-ссылка через API_BASE_URL (basePath)
Merged
#374 fix(tradein): Caddy strip только /trade-in для API
Merged
#373 fix(tradein): префиксить API_BASE_URL через basePath
Merged
#372 fix(tradein): Caddy matcher для /trade-in без trailing slash
Merged
#371 fix(tradein): убрать basePath redirect-loop в frontend
Merged
#370 fix(tradein): commit empty frontend/public via .gitkeep
Merged
#369 feat: add tradein-mvp subproject (Trade-In Estimator под /trade-in)
Merged
#368 chore(glitchtip): temporarily enable user registration
Merged
#367 feat(sf-fe-a12): Landing redesign + PilotCTA с real B3/B4 data (v2 rebased)
Merged
#365 fix(sf-legacy): фильтр стейл competitors (>1 года Сданные → не конкурент) — Maxim spec
Merged
#363 feat(sf-legacy): EGRN + utilities блоки в Обзор tab (показать новые B5 поля)
Merged
#362 fix(sf-legacy): velocity=0 → '—' в MarketTab (consistency со «Срок продаж»)
Merged
#361 feat(sf-fe-a11): Section 5 «Атмосфера / воздух»
Merged
#359 fix(sf-fe): decode cad in Server Component (B5 400 regression after #356)
Merged
#360 feat(frontend): expose legacy Site Finder at /legacy/site-finder
Merged
#358 feat(sf-fe-a10): Section 4 «Оценка участка»
Merged
#357 feat(sf-fe-a8): Section 3.2 Планировки + 3.3 Остатки/Velocity + CompetitorTable drawer pattern
Merged
#356 feat(sf-fe-a7): Section 3.1 «Настройки выборки» + Server/Client split (rebased)
Merged
#354 feat(sf-fe-a6): Section 2 «Сети и точки подключения» — real B5 utilities data
Merged
#353 fix(sf-fe): poi-score TypeError + drawer non-overlay + CSS design tokens
Merged
#352 feat(22d): admin UI buttons (skip/force) + reduce catalog jitter 800→300ms
Merged
#351 fix(sf-fe): decode cad param (B5 400) + hide entry sidebar when drawer open
Merged
#349 fix(sf-fe): /site-finder — adapt B1 response shape (markers invisible) + restore CadInput
Merged
#348 feat(22d): catalog scraper — skip-today filter + force flag
Merged
#347 fix(api): /parcels/by-bbox 500 — area via ST_Area, drop missing land_category
Merged
#346 feat(sf-fe-a5): Section 1 Инфо об участке — HeadlineBar + KPI + EGRN + POI + Export
Merged
#345 fix(frontend): sync package-lock.json with lucide-react (P0 deploy fail)
Merged
#344 feat(sf-fe-a4): analysis sidebar (scrollspy) + breadcrumb + user avatar
Merged
#343 feat(sf-fe-a2): /site-finder entry — EntryMap + filters + drawer + recent
Merged
#342 fix(22d): commit outer transaction in scrape_catalog_objects orchestrator
Merged
#341 feat(sf-fe-a3): UI primitives — HeadlineBar + Badge + Drawer
Merged
#340 feat(sf-fe-a1): routes shell — entry / analysis + _legacy/ backup + mock toggle
Merged
#339 fix(22d): register scrape_kn_catalog_objects in celery include list
Merged
#331 feat(sf-b4): GET /landing/stats — 5 KPI + paradox for landing page hero
Merged
#338 feat(22d): admin endpoint POST /admin/scrape/kn-catalog-objects
Merged
#337 fix(pilot): drop pydantic EmailStr — email-validator dep missing → backend startup crash
Merged
#335 feat(22d): domrf_catalog_object scraper — fill ~25 NULL kn_objects cols from SSR __NEXT_DATA__
Merged
#336 feat(sf-b1): GET /parcels/by-bbox — map entry endpoint + parcel_user_status table
Merged
#330 feat(sf-b3): POST /pilot/request — lead gen + pilot_requests table (Telegram TODO)
Merged
#333 feat(sf-b6): GET /parcels/{cad}/poi-score — weighted top-7
Merged
#332 feat(sf-b5): extend /parcels/{cad}/analyze with 15 fields (EGRN/encumbrance/red_lines/risks/district prices)
Merged
#334 feat(sf-b7): GET /parcels/{cad}/snapshot.pdf — 1-page WeasyPrint export
Merged
#329 feat(sf-b2): GET /users/me/recent-parcels — stub endpoint (auth TODO)
Merged
#328 fix(sf): exclude NULL competitors from aggregate calculations (velocity, market_avg, top_sellers)
Merged
#327 feat(obj-2): mapping backfill via pre-materialized temp tables (migration 117)
Merged
#326 fix(obj-2): trim migration 116 to GIST index only — INSERT CTE timed out in deploy
Merged
#325 fix(scrape-kn): real documents endpoints (5x) + skip obj_checks + sem 3→8
Merged
#324 feat(obj-3): SF backend migrate to objective_lots ground truth (price 0.3% → 81%)
Merged
#323 feat(obj-2): multi-feature mapping backfill (name+dev+district) — 142 → 200+
Merged
#322 feat(scrape-kn): parallel Phase B/C + wire obj_checks + documents + is_ekb auto-derive
Merged
#321 fix(objective parser): use_float=True in ijson + default=str in json.dumps
Merged
#320 fix(deploy): trigger workflow on all data/sql/** changes, not only .sql
Merged
#318 fix(objective parser): wrap bytes-iter in file-like reader for ijson
Merged
#319 feat(trade-in): TI-2 PDF export 4-page + frontend enable button
Merged
#317 feat(trade-in): TI-3 frontend /trade-in page + 5 components + hooks
Merged
#316 feat(trade-in): TI-1 mock /trade-in/estimate endpoint + Pydantic + SQL migration
Merged
#315 fix(scrape-objective): stream-parse lots_pf via ijson to avoid OOM
Merged
#313 fix(scrape-objective): drop redundant self arg in sync_all_groups loop
Merged
#312 fix(22k): quartirography — use f.flat_type not f.type (column doesn't exist)
Merged
#311 feat(deploy): inject OBJECTIVE_API_KEY into backend/.env.runtime
Merged
#310 feat(22k): object page — full exposure 9 blocks (sales/quartirography/metro/photos/docs/specs/checks)
Merged
#309 feat(22d): domrf_catalog.py scraper for per-flat price/status from SSR HTML
Merged
#308 feat(22c): domrf_kn_flat_plans new table + parser stub
Merged
#306 feat(22begh): schema extension — flats+6 / objects+30 / developers+4 / metro_top3
Merged
#305 feat(22i): domrf_kn_documents new table + parser
Merged
#304 fix(22j): DEDUP domrf_kn_infrastructure + ON CONFLICT (issue #297)
Merged
#303 feat(22f): domrf_obj_checks table — 6 "Проверено на наш.дом.рф" checks
Merged
#302 fix(bug-22a): map missing kn-API fields (flat_number/living_area/wall_type/energy_eff) + backfill
Merged
#298 fix(sf-16): derive price_per_m2 from price_rub in _norm_flat + backfill SQL
Merged
#293 fix(sf-15): extract obj_class from aiDescription (DOM.РФ list API never returns objClass)
Merged
#296 refactor(sf-19): BestLayouts inline hex → Tailwind tokens
Merged
#294 fix(sf-13): MarketTab above-the-fold headline + 3 KPI cards
Merged
#292 feat(sf-18): is_sales_started flag для domrf_kn_objects
Merged
#290 fix(sf-21): mv_layout_velocity weighted AVG (P0 data corruption)
Merged
#291 fix(sf-21b): _INLINE_VELOCITY_SQL weighted AVG (P0 follow-up)
Merged
#289 fix(sf-17): rosreestr velocity fallback via cad_quarter (~100% EKB coverage)
Merged
#288 fix(sf-20): adaptive district threshold 30→15 with data_confidence flag
Merged
#286 feat: fuzzy matcher v2 — Objective mapping coverage 8.5%→20%
Merged
#287 fix(sf-12): MarketTrend — adaptive n<30/n<100 confidence warnings
Merged
#285 fix(sf-11): Top layouts — sales period column + drill-in expand
Merged
#284 fix(sf-10): velocity LEFT JOIN + velocity_data_available flag
Merged
#283 chore: refresh preview pages + add tradein landing
Merged
#282 fix(sf-09): MAX_BUCKET_SHARE 35% cap + frontend warning banner
Merged
#281 fix(sf-08): room_bucket euro-1/euro-2 classification
Merged
#280 fix(sf-07): median_12m alias + UI 12mo hint
Merged
#279 chore: add landing.html static page
Merged
#278 fix(sf-03): CompetitorTable Status column + filter tabs
Merged
#277 fix(sf-04b): bulk seed mappings для всех ЖК (audit extension PR #273)
Merged
#276 fix(sf-02): добавить site_status/ready_dt в /analyze competitors + sort строящиеся first
Merged
#275 fix(sf-01): time_window honest velocity — inline SQL с реальным фильтром report_month
Merged
#274 fix(sf-05): clamp sold_pct_of_supply на 100% + is_oversold flag
Merged
#273 fix(sf-04): seed PRINZIP project mappings в objective_complex_mapping (Малевич + Ньютон парк)
Merged
#272 fix(sf-06): MarketTab reorder — Competitors → BestLayouts → Velocity первыми
Merged
#270 chore(preview): remove basic auth от /preview/*
Merged
#269 fix(deploy): force-recreate caddy для подхвата новых compose mounts
Merged
#268 feat(preview): static HTML mockups на /preview/* (basic auth)
Merged
#267 fix(#231): re-enable nspd-harvest-stale-quarters beat schedule (Sub-PR D)
Merged
#265 feat(#263 sub-A): cad_* overlay schemas + cadastre territorial_zones (ПЗЗ)
Merged
#266 fix(#264): apiFetch — global X-Session-Id header (custom POI scoring в UI)
Merged
#262 fix(#261): custom_pois — regression tests для db.commit() в create/update/delete (P0 persistence)
Merged
#260 fix(#231): switch search_by_quarter area layers to grid-walk (Sub-PR B)
Merged
#258 feat(#254,#114): custom POI UI (Leaflet click-to-add) + score breakdown stacked-bar
Merged
#257 feat(#254): user_custom_pois — backend schema + CRUD + scoring integration
Merged
#250 fix(#234): NSPD harvest ETA badge + SETNX dedupe (Sub-PR C)
Merged
#248 fix(#243): cad_zouit fallback срабатывает когда nspd dump полностью отсутствует
Merged
#249 fix(#242): ekburg_permits SSL — verify=False для CA Минцифры РФ (clean re-roll PR #245)
Merged
#247 feat(#126): Sub-PR A — NSPDClient.get_features_in_bbox_grid + engineering classifier
Merged
#246 fix(#244): harvest_quarter — CAST CASE WHEN params (psycopg3 AmbiguousParameter)
Merged
#241 fix(#233): add pzz_sync to beat schedule (monthly)
Merged
#240 feat(#29,#232): wire cad_parcels.permitted_use в analyze + cad_zouit fallback (G2+G3)
Merged
#239 feat(#104): admin endpoint POST /admin/scrape/ekburg-permits для manual trigger
Merged
#230 feat(#115): Leaflet layer toggle для connection points (Макс KILLER)
Merged
#228 fix(#112): competitors avg_price_per_m2 всегда None — убран WHERE status='sold'
Merged
#226 fix(beat): use /tmp/celerybeat-schedule (workdir /app not writable by app user)
Merged
#225 fix(infra): wire GlitchTip DSNs (build-arg + env_file) + reject sentry.io promote
Merged
#224 fix(sql): escape apostrophe in migration 99 COMMENT (deploy hotfix)
Merged
#222 feat(nspd): denorm nspd_parcels + nspd_buildings (#94 PR3 of 4)
Merged
#223 fix(infra): GlitchTip EMAIL_URL dummy:// → consolemail:// (crashes Django on start)
Merged
#220 feat(nspd): TIER 4 opportunity + red lines (#94 PR2 of 4)
Merged
#221 fix(infra): restore git.gendsgn.ru block in Caddyfile
Merged
#218 fix(recommend): cad_buildings.floors is INTEGER not TEXT (HOTFIX)
Merged
#219 fix(infra): bootstrap_glitchtip — \gexec instead of DO block (psql var trap)
Merged
#208 feat(frontend): @sentry/nextjs init для GlitchTip (#204 frontend)
Merged
#207 feat(backend): sentry-sdk init для FastAPI + Celery (#204 backend)
Merged
#205 feat(infra): GlitchTip self-hosted error tracking (#204 devops)
Merged
#217 feat(nspd): TIER 3 risk zones (#94 PR1 of 4)
Merged
#216 test(infra): integration phantom column gate (#197)
Merged
#215 feat(site-finder): debounce weight re-analyze (#201 Phase 2)
Merged
#214 feat(etl): objective_complex_mapping backfill via pg_trgm (#203)
Merged
#213 feat(permits): Celery beat monthly + analyze recent_permits (#105 Phase 4+5)
Merged
#212 feat(site-finder): NSPD frontend integration в LandTab (#202)
Merged
#211 feat(permits): ЕКБ РНС/РВЭ xlsx parser + schema + ETL (#105 PR A)
Merged
#210 feat(analyze): add market_price из mv_quarter_price_per_m2 (#33 PR B)
Merged
#209 feat(analytics): mv_quarter_price_per_m2 MV + refresh helper (#33 D1 PR A)
Merged
#206 feat(site-finder): inline POI weights pass-through в /analyze (#201 Phase 1)
Merged
#199 feat(layouts): PDF ТЗ endpoint + BestLayoutsBlock UI (#113 PR D)
Merged
#196 feat(parcels): best-layouts endpoint + service (#113 PR C)
Merged
#194 feat(analytics): mv_layout_velocity MV + refresh helper (#113 PR B)
Merged
#195 chore(ci): run CI on push to feature branches
Merged
#193 feat(parcels): layout signature schemas + extractor (#113 PR A)
Merged
#190 feat(parcels): connection-points endpoint (Forgejo #115 Phase 1 backend)
Merged
#192 fix(ci): switch deploy to .forgejo/workflows + shell GHCR login
Merged
#191 feat(parcels): competitors endpoint (Forgejo #112 Phase 1 backend)
Merged
#189 test(deploy): validate Forgejo Actions end-to-end flow
Merged
#188 refactor(claude): split CLAUDE.md 700 → 97 lines + .claude/rules/
Merged
#187 perf(cadastre): freshness skip + grid-walk heartbeat + log noise reduction
Merged
#186 fix(cadastre,nspd_sync): batch SQL syntax bugs from ekb_full v2 logs
Merged
#185 fix(cadastre): cad_parcels.geom Polygon → MultiPolygon (migration 93)
Merged
#184 fix(cadastre): filter Point/LineString geometry in upsert_parcel/zouit (worker crash root cause)
Merged
#183 fix(cadastre): remove shared phase_state early-exit (race condition root-cause)
Merged
#182 fix(cadastre): count snapshot+per-cat requests in cadastre_jobs.requests_count
Merged
#181 fix(cadastre): auto-heal cad_quarters_geom from CAT_QUARTER_STATS
Merged
#180 feat(cadastre): per-category NSPD snapshot — Phase 1.5 (ZOUIT/ENK)
Merged
#179 fix(cadastre): skip grid-walk for broken quarter geometries (#168)
Merged
#178 fix(cadastre): CAST :geom AS text — psycopg ambig param (#168)
Merged
#177 fix(cadastre): NSPD response parse — properties.category + top-level meta (#168)
Merged
#176 fix(parcels): _parse_floors handle int (post-migration #169)
Merged
#175 fix(cadastre): NSPDBulkClient verify=False for NSPD self-signed CA chain (#168)
Merged
#174 fix(db): retire all legacy cad_buildings indexes — hotfix2 (#168)
Merged
#173 fix(db): retire legacy cad_buildings_pkey — fix migration 92 hotfix (#168)
Merged
#172 feat(admin): cadastre bulk harvest UI (#168 PR4/5)
Merged
#171 feat(cadastre): bulk_harvest worker + grid-walker + admin API (#168 PR3/5)
Merged
#169 feat(db): bulk cadastre schema — 7 tables + cadastre_jobs (#168 PR1/5)
Merged
#170 feat(cadastre): NSPDBulkClient + schemas (#168 PR2/5)
Merged
#167 fix(site-finder): visible by-quarter pipeline bars
Merged
#166 feat(site-finder): per-room bucket breakdown в VelocityBlock
Merged
#163 feat(velocity): per-room-bucket breakdown in VelocityResult
Merged
#165 fix(pipeline): enrich obj_class via objective_lots (fix 'Не указан: 4075')
Merged
#160 fix(velocity): :window_interval::interval cast syntax (same bug as PR #152)
Merged
#158 feat(velocity): migrate D2 sales source → objective_corpus_room_month
Merged
#155 fix(site-finder): cascade InFailedSqlTransaction — velocity internal rollback
Merged
#154 fix(parcels): SAVEPOINT around velocity → не abort outer tx (analyze 500 fix)
Merged
#153 fix(deploy): source root .env (где POSTGRES_USER) не backend/.env
Merged
#152 fix(site-finder): SQLAlchemy syntax error :weights::jsonb → CAST(:weights AS jsonb)
Merged
#151 feat(infra): auto-apply data/sql/*.sql migrations in deploy pipeline (#150)
Merged
#149 fix(frontend): apiFetchWithStatus body stream double-read crash
Merged
#147 feat(site-finder): VelocityBlock в MarketTab (#34 sub-PR 2/2 FINAL)
Merged
#146 feat(site-finder): D2 velocity-score (#34 sub-PR 1/2)
Merged
#143 feat(site-finder): G5 gate verdict banner (#32 sub-PR 2/2 FINAL)
Merged
#142 feat(site-finder): gate verdict aggregator (#32 G5 sub-PR 1/2)
Merged
#139 feat(site-finder): weight profile panel + analyze options (#114 sub-PR 4/4 FINAL)
Merged
#138 feat(site-finder): weight profiles endpoints + analyze integration (#114 sub-PR 3/4)
Merged
#137 feat(site-finder): weight profiles service — Pydantic + CRUD (#114 sub-PR 2/4)
Merged
#136 feat(db): schema user_weight_profiles (#114 sub-PR 1/4 — foundation)
Merged
#135 refactor(workers): split celery_app.py god-object into 3 modules
Merged
#132 refactor(frontend): extract SectionLabel + EmptyState + adminStyles shared
Merged
#133 refactor(admin): extract _check_token into shared AdminTokenAuth dep
Merged
#131 fix(docs): block javascript: URLs in renderMarkdown href (XSS guard)
Merged
#125 fix(sql): wrap 73_complexes_master.sql in BEGIN/COMMIT
Merged
#124 fix(pzz_loader): SAVEPOINT pattern + outer error handler (transaction correctness)
Merged
#123 fix(nspd-geo): replace f-string bulk INSERT with parametrized execute (SQL injection fix)
Merged
#122 fix(db): DROP dead BRIN index rosreestr_deals_period_brin
Merged
#121 fix(celery): disable nspd-harvest beat (Bug post-mortem #1, time-sensitive)
Merged
#120 chore(infra): correct frontend healthcheck (re-apply #117 safely)
Merged
#119 revert: PR #117 healthcheck (HOTFIX — prod down)
Merged
#118 fix(sql): renumber engineering_networks 85→87 + dedup classid + add SRID 4326
Merged
#117 chore(infra): frontend healthcheck + service_healthy depends_on + pin rosreestr2coord>=5
Merged
#116 feat(site-finder): integrate nspd_quarter_dumps cache в analyze_parcel (#94 Sprint 1.1 FINAL)
Merged
#111 feat(nspd): harvest_quarter Celery task + beat + admin endpoint (#94 pt.4 part A)
Merged
#110 feat(db): nspd_quarter_dumps table for PKK harvest persistence (#94 pt.3/4)
Merged
#109 feat(scrapers): search_by_quarter + QuarterDump (#94 pt.2/4)
Merged
#98 feat(scrapers): NSPD client foundation (#94) — search + WMS + layers
Merged
#95 feat(site-finder): auto-fetch cadastre geometry on-demand (#93)
Merged
#90 feat(site-finder): D4 pipeline 24mo — future competition (#36)
Merged
#92 feat(site-finder): X1 score breakdown + verbal explain (#47)
Merged
#89 feat(site-finder): P1 geometry suitability score (#45)
Merged
#91 feat(site-finder): P2 cad_buildings соседи + overlap check (#46)
Merged
#88 feat(site-finder): X2 confidence indicator + caveats (#48)
Merged
#85 docs(claude): formalize Auto-review passed as approval signal
Merged
#86 feat(site-finder): deep-link tabs via ?tab= URL param
Merged
#84 docs(claude): mandate branch+PR workflow, ban direct push to main
926 issues closed from 8 users
Closed
#2445 EPIC: аудит кода ПТИЦЫ (мульти-агентный code review 2026-07-05) — 18 подтверждённых находок
Closed
#2416 [needs-human][devops] deploy-obsidian.yml: живо ли GitHub-зеркало, или workflow мёртв с 16.05?
Closed
#2000 DomClick Layer B (deep detail-backfill) заблокирован QRATOR — нужен dedicated residential RU proxy
Closed
#2309 [tradein] scraper_kit migration — Group F: широкий рефактор структуры providers/*
Closed
#2352 [tradein] scraper_kit Group F4: shared base classes + consistent naming/layout providers/*
Closed
#2431 [tradein] dedup regression: PR #2429 сломал сравнение корпуса дома между avito/cian («NкM») и domklik («N/M»)
Closed
#2423 [tradein] dedup: avito house-no regex хватает цифры из приклеенного названия метро вместо реального номера дома
Closed
#1846 DomClick scraper мёртв: VPS-IP заблокирован QRATOR + редизайн сайта (нужен прокси + rewrite на новый API)
Closed
#2323 [tradein] admin.py: scrape_cian_newbuilding awaits sync save_newbuilding_enrichment — TypeError at runtime
Closed
#2397 [tradein] scraper_kit: decommission legacy orchestration (scrape_pipeline.py / scheduler.py) — enable full legacy deletion
Closed
#1746 (site-finder) [feature/data] все инженерные сети на карту + единый источник (191-ФЗ engineering_networks не используется)
Closed
#2367 [site-finder] ИСОГД Свердл: реестр РНС как ранний сигнал future-supply (§6) — наследник Потока 2 из #103
Closed
#2213 [P1] Defense-in-depth для trusted-header auth + rate-limiter fix
Closed
#2218 [needs-human] Продуктовая ясность: мот vs бесплатных оценок + конверсионный слой + README
Closed
#2377 frontend: заменить mailto-CTA на форму лида в HeroTransparency (parent #1971)
Closed
#2395 [tradein][v2] Форма лида (#2377) невидима на проде — смонтирована в мёртвом legacy-дереве, не в v2
Closed
#2363 [tradein] scraper_kit Group F4c: миграция yandex/* на shared base (_base.py)
Closed
#2361 [tradein] scraper_kit Group F4a: миграция avito/* на shared base (_base.py)
Closed
#2362 [tradein] scraper_kit Group F4b: миграция cian/* на shared base (_base.py)
Closed
#2364 [tradein] scraper_kit Group F4d: миграция domclick/* на shared base (_base.py)
Closed
#2217 [needs-human] 152-ФЗ позиция (17342 телефона) + права на переопубликование скрейпленных данных
Closed
#1926 [AUDIT #1871 остаток] invest_score advisory flag + units_sold align + yandex total_seen obs + frontend polish
Closed
#103 Engineering networks: Hybrid plan (ФГИС ТП XSD + ИСОГД + Водоканал ЕКБ) — альтернативные источники
Closed
#2358 [tradein] scraper_kit Group F4-Foundation: shared base/utils для providers/*
Closed
#2003 [tradein][tech-debt] houses.house_class never populated — dead merge engine + Avito «Класс жилья» not extracted
Closed
#2322 [tradein] scraper_kit bug: yandex/cian newbuilding providers — BrowserFetcher без endpoint= ломает любого caller'а
Closed
#1995 [UX-аудит #06b] Данные сделок-заглушки: все даты 01.01.26 + немонотонный sell-time (backend/data)
Closed
#2330 [tradein] scraper_kit: avito build_warmed_session() не выставляет config= — тихо теряет sticky-proxy на prod-default пути
Closed
#2351 [tradein] scraper_kit Group F3: системный аудит config-footgun паттерна во всех providers/*
Closed
#2337 [tradein] scraper_kit Group E4: финальное переключение estimator.py на kit (#2308 завершение)
Closed
#2308 [tradein] scraper_kit migration — Group E: core valuation (estimator.py) — МАКСИМАЛЬНЫЙ РИСК
Closed
#1967 [tradein][data] avito 54% NULL lat → невидим PostGIS-радиусу: geo-backfill + dedup на ингесте (рычаг точности массы оценок)
Closed
#2336 [tradein] scraper_kit Group E3: yandex_valuation → kit (estimator.py dependency, часть #2308)
Closed
#2334 [tradein] scraper_kit Group E1: avito_imv → kit (estimator.py dependency, часть #2308)
Closed
#2011 [tradein] Аудит покрытия полей скрапперов avito/cian/yandex — сводка + прод-замер (2026-06-27)
Closed
#1950 [tradein][scrapers] avito: changeip-recovery одношотный (30s timeout роняет run) + статус 'banned' завышен когда SERP отработал
Closed
#2335 [tradein] scraper_kit Group E2: cian_valuation → kit (estimator.py dependency, часть #2308)
Closed
#2317 trade-in/v2: подключить LocationDrawer к GET /location-coef (frontend wiring, follow-up #2045)
Closed
#2009 [tradein][avito] detail: дописать house_type + house_catalog_url (+5 house-level полей) в save_detail_enrichment
Closed
#2010 [tradein][avito] IMV: персист comparables + searchSimilarUrl (сейчас полностью выбрасываются)
Closed
#2008 [tradein][cian] SERP: промоут полей из raw_payload в колонки — kitchen_area_m2, mortgage_available (+ новые is_apartments, is_rosreestr_checked)
Closed
#2007 [tradein][yandex] SERP _entity_to_lot: писать ceiling_height + kitchen_area_m2 в колонки + нормализовать house_type
Closed
#1949 [tradein][scrapers] cian: full_load зомбится ~43% + city_sweep self-inflicted watchdog-бан → 86% инвентаря stale
Closed
#2310 [tradein] scraper_kit migration — Group C: backfill/enrichment tasks
Closed
#2202 [P0] Подключить scrape_proxies pool к боевым скрейперам — убрать single-IP SPOF
Closed
#2062 trade-in/v2: UI/UX-полировка по аудиту (доступность, доверие к числам, иерархия, копирайт)
Closed
#1996 [UX-аудит #07] Иерархия «ответ → доказательство → тех-детали» на странице результата
Closed
#1993 [UX-аудит #05] Убрать сырые внутренние подписи с витрины (start_price, benchmark, yandex_valuation, asking…)
Closed
#1994 [UX-аудит #06a] Прятать пустые блоки + единый формат сумм (frontend)
Closed
#1992 [UX-аудит #04] Один источник вводных + один инструмент «что-если» (сейчас три места пересчёта)
Closed
#1990 [UX-аудит #02] Дедуп чисел на странице результата — одни и те же суммы повторяются 3–4 раза
Closed
#1989 [UX-аудит #01] Закрепить итог (выкупная стоимость + «Скачать PDF») вверху страницы результата
Closed
#1972 [tradein][ux] Редизайн результата «Тихая уверенность»: одна цифра-герой (expected_sold) + confidence-driven типографика + снять тройное дублирование цен
Closed
#1991 [UX-аудит #03] Свести четыре цены к двум + явная пометка «эта идёт в оффер»
Closed
#2305 [tradein] scraper_kit migration — Group A: admin/scripts debug (низкий риск)
Closed
#2316 [P4] mypy strict: 3 пред-существующие ошибки в generative/exporters/dxf.py
Closed
#2306 [tradein] scraper_kit migration — Group B: cian/yandex price-history & session
Closed
#1966 [tradein][analytics] Accuracy-loop → CI-гейт: point-in-time backtest на ПОЛНОМ движке (per-rooms MAPE + range-coverage SLA)
Closed
#2295 [P3] POST /concepts отдаёт 422 на многоконтурных участках (MultiPolygon)
Closed
#2307 [tradein] scraper_kit migration — Group D: порт orphan-модулей (domclick_detail, ekb_geoportal_client)
Closed
#2036 trade-in/v2: подключить боевые ручки к новому UI (/trade-in/v2)
Closed
#2045 trade-in/v2 [BE-3]: Коэффициент локации + POI-разложение (LocationDrawer) — DEFER / решение
Closed
#2304 [tradein] scraper_kit migration — Stage 0: общий parity-test harness
Closed
#2262 [tradein][v2] Жёсткий аудит нового дизайна «Мера» v2 (пост honest-interval + design-sync) — ЭПИК
Closed
#2266 [tradein][v2] Визуальный аудит — иерархия 3 цен, CTA, микрокопи, консистентность после honest-hero (эпик #2262)
Closed
#2265 [tradein][v2] Живой аудит честности чисел на проде — resolved ли жалоба оценщика + остаток #2087 (эпик #2262)
Closed
#2046 trade-in/v2 [BE-4]: профиль пользователя (name/org/email) для TopNav — DEFER
Closed
#2041 trade-in/v2 [FE-4]: overlay «РЫНОК / Аналогичные объявления» (SourcesView)
Closed
#2040 trade-in/v2 [FE-3]: overlay «Аналитика дома» (AnalyticsView)
Closed
#2264 [tradein][v2][a11y] Жёсткий аудит доступности — клавиатура/SR end-to-end + aria-modal оверлеев (эпик #2262)
Closed
#2255 [P3] Эстиматор: сегментная калибровка по классу жилья — за фичефлагом (follow-up #2209)
Closed
#2269 [P2] Кросс-source дедуп: ключ схлопывает лишь 13.5% дублей — канонизация по house_id_fk (follow-up #2215)
Closed
#2259 Полный PDF/DOCX-экспорт ПТИЦА-отчёта (/analyze): §1-§7 + альтернативы
Closed
#2119 Точки подключения с характеристиками: 51 источник, 27 верифицированы (research 2026-07-02)
Closed
#2201 [P0] Продлить 3 mobile-прокси до 15.07 (иначе avito+cian+yandex умрут вместе)
Closed
#2267 [tradein][v2][design-sync] Аудит DS-панели claude.ai/design + авторинг 6 floor-card v2-компонентов (эпик #2262)
Closed
#2160 [EPIC] proxy-pool — хранилище прокси в БД + автовыбор свободного/рабочего
Closed
#2126 [EPIC] scraper-kit — внутренний код-пакет монорепо (консолидация скрапперов)
Closed
#2204 [P0] deactivate_stale для domklik/n1 + честный трекинг freshness domklik
Closed
#2235 [P2] yandex: 204 активных URL-дубля — дедуп + уникальность source_url
Closed
#2236 [P2] external_valuations.house_id всегда NULL (1579/1579) — привязать к houses
Closed
#2234 [P2] admin.py: текст исключений утекает в HTTP-ответы (8 мест detail=f"...: {e}")
Closed
#2233 [P1] photo-upload буферизует всё тело в RAM до проверки лимита (OOM-риск при mem_limit 768m)
Closed
#2209 [P1] Честность диапазона оценки: раскрыть/рекалибровать 56.6% + min-width floor + backtest baseline + CI-гейт
Closed
#2177 §4.2 «Анализ планировок»: покрытие 17% при 100% данных в Объективе — дедуп ЖК + расширение mapping + lots-fallback
Closed
#2215 [P2] Кросс-источник дедуп аналогов (house+floor+area) — убрать ~19% двойного счёта
Closed
#2216 [P2] Миграции tradein: порядок (до рестарта) + реконсиляция 152 vs 131 + дубль-префиксы
Closed
#2181 Альтернативы при отрицательном вердикте: оптимизатор программы (класс × этажность × mix) в конце отчёта
Closed
#2211 [P1] Честность UI-источников: убрать «/7», фолбэк-чипы, «классическую», зелёный cache-дот, «CV»
Closed
#2212 [P1] Починить rosreestr_dkp_import (deals заморожены 182д) + алерт на max(deal_date)
Closed
#2207 [P1] Снять блокировку event loop на POST /estimate (asyncio.to_thread)
Closed
#2206 [P1] Обновлять scraped_at в upsert (base.py) — вернуть ~55% инвентаря эстиматору
Closed
#2205 [P0] Убрать публичную фейк-оценку /trade-in/ui-preview с прода + noindex
Closed
#2208 [P1] Pre-merge CI-гейт для tradein-mvp (backend pytest + frontend typecheck/lint)
Closed
#2178 §4.3 «Тренд рынка»: считать динамику цен из objective_lots_history вместо устаревшего Росреестра
Closed
#2180 3D-макет окружения в «Размещении застройки»: соседние здания из cad_buildings
Closed
#2179 §7 отчёта: раскрыт по умолчанию + участок выделен на 3D-подложке + больший кусок карты
Closed
#2164 proxy-pool P4: динамический browser server (acquire + relaunch + release)
Closed
#2188 tradein/deploy: tradein-scraper не пересоздаётся при изменении matching/dedup-кода — DORMANT-дедуп запустил бы старый код
Closed
#2163 proxy-pool P3: интеграция curl-путей на пул (acquire/release)
Closed
#2187 tradein/dedup: ослабить geo-guard в fias-pass — 130 same-fias групп не смержены (NULL geom / >250 м)
Closed
#2192 rewire: scheduler_main на kit-scheduler за флагом USE_KIT_SCHEDULER (ship-dark)
Closed
#2136 scraper-kit G: scheduler + registry-dispatch (25+ trigger_* → dict-реестр)
Closed
#2135 scraper-kit F: перенос pipeline (scrape_pipeline) в пакет
Closed
#2162 proxy-pool P2: сервис proxy_pool (acquire/release/health) + health-checker
Closed
#2134 scraper-kit E: консолидация бисекции цены (4 копии → pricing/bisection.py)
Closed
#2161 proxy-pool P1: таблица scrape_proxies + admin bulk-load + seed env
Closed
#2133 scraper-kit D: перенос провайдеров (avito/cian/yandex/domclick)
Closed
#2132 scraper-kit C: перенос core-слоя в пакет
Closed
#2131 scraper-kit B: Protocol-границы (matcher/config/session/jobs) + adapters
Closed
#2127 [EPIC] market — контракт данных скрапперов для внешних потребителей
Closed
#2138 market J: перенацелить gendesign_reader на market.v_* + обновить ETL #976
Closed
#2137 scraper-kit H: Docker/build wiring для пакета
Closed
#2130 market I: contract-view market.v_* поверх producer-таблиц
Closed
#2129 scrapers K: fix _unix_to_date TZ-inconsistency (3 копии MSK/UTC/naive)
Closed
#2128 scraper-kit A: скаффолд пакета + workspace-подключение
Closed
#2044 trade-in/v2 [BE-2]: optional radius_m param (estimate / house-analytics / sell-time-sensitivity)
Closed
#2043 trade-in/v2 [BE-1]: estimate +cv +source_counts +created_at; /history +sources_used; cache-KPI
Closed
#2111 «Все точки показывают максимум информации» — карты-попапы недоливают данные (verified audit)
Closed
#1953 [EPIC] ПТИЦА analysis report — UX + data-honesty аудит (на примере 66:41:0205010:287)
Closed
#1961 P1 Сети/точки подключения не на карте (нет слоя источника + радиус 500м vs 2км + полигоны без центроида) (эпик #1953)
Closed
#1960 P1 «Медиана рынка» 64k — квартальная n=1 ДКП-медиана вместо новостроечного базиса (эпик #1953)
Closed
#1958 P0 График дефицита: оси налезают + плоское/пустое состояние; фактор «Прогноз спрос/предложение» ×4 дубль (эпик #1953)
Closed
#1957 P0 ЗОУИТ: сырой «cad_zouit», дубли, пустые «Охраняемые зоны» + СЗЗ-смысл и баннер «жильё ограничено» (эпик #1953)
Closed
#1955 P0 «Что хорошо продаётся» — дубли бакетов (obj_class не проброшен) + фантом Comfort/Комфорт (эпик #1953)
Closed
#1954 P0 Объект-карточка: площадь «—», обременения «—», «обновлено» — читаются мёртвые колонки (эпик #1953)
Closed
#2042 trade-in/v2 [FE-5]: «Предыдущие оценки» (CacheView) + PDF-ссылка + quota + автокомплит адреса
Closed
#1945 [site-finder][scrapers] domrf_kn FLATS loader сломан с ~17.05 (DOM.РФ WAF): flats 376k→~0, best-layouts supply пустой 5 недель
Closed
#2039 trade-in/v2 [FE-2]: overlay «История / Продажи в доме» (HistoryView)
Closed
#2038 trade-in/v2 [FE-1]: data shell + main dashboard wiring (page.tsx + mappers + ParamsPanel/ResultPanel/ObjectSummary/Hero/Footer)
Closed
#1964 P2 Data-quality: objective_lots раздут (1.75M), n_sold=99110 аномалия, registration_date разрежен (эпик #1953)
Closed
#1965 [feat] Консолидация фин-модели/Концепции в отчёт + интерактив house-picker → 3D → пересчёт (эпик #1953)
Closed
#1956 P0 4.2 Планировки: «срок продажи 0 мес» / «% продано —» — per-object snapshot (регрессия #1944) (эпик #1953)
Closed
#1959 P0 Индекс дефицита −1.00 ВЕЗДЕ — basis mismatch (спрос сегмент vs предложение район) + honesty-guard (эпик #1953)
Closed
#1963 P2 Человеческий язык / микрокопия отчёта (6.2/6.3/6.5 + легенды дефицита/затоварки) (эпик #1953)
Closed
#1962 P1 Градрегламент НСПД (тер.зона/КСИТ/высота/этажность) — вывести в Раздел 1 (эпик #1953)
Closed
#1968 [tradein][ux] Honesty-fix вывода: «7 источников»→честные 4, убрать фейковую per-source медиану, выпилить domclick из sources
Closed
#1723 [tradein][data] Objective bank_name/registration_number не отдаётся на текущем тарифе (ЕГРН-поля)
Closed
#39 Access A1: OSRM-докер + osm.pbf Свердл (routing-engine infra)
Closed
#1917 [tradein][scrapers] /fetch-json: тюнинг settle после навигации (транзиентный NetworkError на первом XHR)
Closed
#815 [EPIC/tracking][tradein] Launch readiness всех скрейперов — подготовить к регулярному сбору
Closed
#883 [EPIC][tradein][scrapers] Миграция fetch-слоя на camoufox (real browser anti-bot)
Closed
#886 [tradein][scrapers] Phase 2 — cian/n1/yandex на camoufox + снять анти-бот костыли (#883)
Closed
#446 epic(infra): Pilot infra status 2026-05-23 — после security pivot
Closed
#972 [SF-v2 #950] 950-E1: Backfill enrichment-таблиц newbuilding (3 пустые)
Closed
#559 [EPIC][tradein] Полная автоматизация scrapers с persistence через redeploy
Closed
#1871 [AUDIT 2026-06-22] ПТИЦА deep-audit: реестр дефектов (цифры/логика/минусы/дизайн)
Closed
#1189 [tradein] D: QA полной загрузки сегментов на проде — counts, стабильность estimator, EXPLAIN → решение об индексе
Closed
#974 [SF-v2 #950] 950-E3: Активировать yandex_newbuilding (0 строк сегодня)
Closed
#1918 [tradein] yandex browser-proxy мёртв (za.mobileproxy.space:62011) → yandex detail/newbuilding/address enrichment в 503
Closed
#1184 [tradein] tradein-browser в crash-loop: camoufox InvalidProxy mproxy.site:16928 (прокси недоступен/истёк)
Closed
#402 feat(tradein): #13 — Yandex Geocoder API-ключ
Closed
#562 [tradein][scrapers] Avito IMV + Houses batch enrichment после city sweep
Closed
#915 [tradein][scrapers] Завершить browser-миграцию avito: пайплайн SERP+detail+houses+IMV (#883)
Closed
#736 [P1][tradein][qa] Pre-demo consolidated acceptance: milestone-6 estimator/data-quality фиксы вместе на проде
Closed
#888 [tradein][backend][devops] Scheduled poll Росреестра на новый квартал → авто-ingest ДКП (deferred из #727)
Closed
#905 [tradein][scrapers][devops] Phase 0.5 — вынести camoufox в отдельный tradein-browser сервис (server/connect) (#883)
Closed
#930 feat(tradein): checkpoint/resume для *-full-load скраперов — переживать рестарт/деплой
Closed
#1347 (medium) BrowserSession Semaphore = 8 вместо задокументированных 3 — ~3x риск WAF-блокировки на DOM.РФ sweep
Closed
#1773 [tradein] Адреса убивают same-building anchor: cian-новостройка без номера дома, avito «29р-н» слип, дубль-листинги
Closed
#38 Demand D6: Класс жилья normalization через yandex_realty (fallback obj_class)
Closed
#854 [tradein][backend][db] IMV bulk backfill → in-app scheduler task (наполнение house_imv_evaluations)
Closed
#1811 [tradein][scrapers] Post-merge polish PR #1809 (avito SERP browser) — косметические минор'ы из ревью
Closed
#60 B2-1: Sales Tracker v1 — шахматки 3-5 застройщиков ЕКБ
Closed
#933 [tradein][scrapers] Верифицировать Yandex totalItems extraction после 1-го prod-прогона full-load (#931 follow-up)
Closed
#941 [tradein][devops] Persistent volume-mount для yandex_cookies.json — переживёт git-reset deploy (#940 follow-up)
Closed
#1187 [tradein] B: Полная загрузка всех сегментов — secondary_only=False (cian/yandex), верификация avito
Closed
#1190 [tradein] E (backlog): N1 — режим первички (отдельный URL-паттерн)
Closed
#884 [tradein][scrapers] Phase 0 — BrowserFetcher (camoufox) abstraction + Docker (#883)
Closed
#885 [tradein][scrapers] Phase 1 — avito на camoufox BrowserFetcher (#883)
Closed
#1774 [tradein] Эстиматор: same-building anchor хрупок (один house_id, exclude avito) — резолвить через фрагменты/кадастр + same-house avito
Closed
#1795 tradein/estimator: завышение оценки в бизнес/премиум — кламп к коридору сделок + робастный anchor
Closed
#1843 [site-finder][ПТИЦА][data] Оживить КСИТ/высоту/зону в /analyze — crosswalk reg_numb_border → zone_index (+ латентный null zone_code)
Closed
#1790 [tradein][scrapers] Avito прокси-ротация выключена на проде (AVITO_PROXY_MAX_ROTATIONS=0) → avito_full_load банится мгновенно
Closed
#1881 [epic] Настоящая финмодель проекта (DCF/NPV/IRR/PBP) — объединить геометрию ПТИЦА + полноту девелоперской БДДС
Closed
#1850 [site-finder][perf] Оптимизировать zone-regulation резолв в /analyze (мемоизация zone_index_at, двойной резолв, timeout)
Closed
#1796 tradein: Avito-баны режут покрытие аналогов и кросс-валидацию оценки
Closed
#1820 [tradein][scrapers] avito pipeline: новостройки house-страница (housePage widget missing) + AvitoBlockedError крашит весь прогон
Closed
#1785 Кадастр: bulk NSPD grid-walk структурно теряет дома (покрытие МКД ~25-30%) — нужен анализ + денсер-сетка
Closed
#1816 tradein: HTTP POST /estimate отдаёт инвариантный центрально-схлопнутый результат и не персистит (estimate_quality напрямую — корректен)
Closed
#1814 [tradein][scrapers] avito_detail_backfill: browser-fetch падает → curl-fallback → анти-бот 429 (+ снапшот тащит legacy не-ЕКБ листинги)
Closed
#1812 [tradein][scrapers] tradein-browser: снизить per-page fan-out — within-provider rate-cap прокси (~12% fetch-fail при бэкфиле)
Closed
#1805 [tradein][scrapers] #883 Phase 2: avito.py SERP — дефолт на BrowserFetcher (camoufox)
Closed
#1806 [tradein][scrapers] #883 Phase 2: cian.py SERP — миграция на BrowserFetcher (camoufox)
Closed
#1803 [tradein][frontend] Мера estimate — React hydration error #418 (SSR≠client mismatch)
Closed
#1804 [tradein][frontend] Мера estimate — секция «Фото квартиры» 422 на preview-UUID (0/12 фото)
Closed
#1801 [tradein][scrapers] Cian прокси деградировали — CIAN_PROXY_URL (socks5) таймаут + BROWSER_PROXY_CIAN 503 → detail-покрытие cian ≤3%
Closed
#1791 [tradein][scrapers] Cian detail-обогащение: kitchen 3% / ceiling 0% / описание 3% не долетают; отзывы ЖК не садятся
Closed
#1792 [tradein][scrapers] Yandex покрытие полей: area 63%, ceiling 0, описание 50%, kitchen 0; отзывы/рейтинг ЖК не садятся
Closed
#1789 [tradein][scrapers] Avito ЖК-enrichment не долетает в БД — отзывы/тип/история по дому пусты (house_reviews=0, avito_validated_at=0)
Closed
#1793 [tradein][scrapers] tradein-browser: per-provider concurrency — параллель между поставщиками, ≤1 коннект на поставщика
Closed
#1709 CI-шторм 2026-06-17 ~18:30 UTC — очередь раннеров забита, tradein-деплой #1699 застрял на ~17+ мин
Closed
#1745 (site-finder) [feature] прогноз продаж по ВСЕМ типам квартир (студии/1-5к) для игры ассортиментом
Closed
#1744 (site-finder) прогноз и горизонты неясны: переключатель без подсказки + голые числа без единиц
Closed
#1743 (site-finder) отчёт «Остатки и скорость» непонятен (3 разнородных понятия, англицизм Velocity-score)
Closed
#1742 (site-finder) объяснимость: «затоваренность» = 2 разных смысла; не ясно почему класс рекомендации
Closed
#1741 (site-finder) порядок блоков analyze: характеристики участка и стройки вперемешку
Closed
#1740 (site-finder) противоречие: gate «МКД нельзя», но рекомендация советует квартирографию
Closed
#1739 (site-finder) PDF analyze не скачивается — 500 (snapshot_pdf глотает причину) + forecast/export?format=pdf→422
Closed
#1738 (site-finder) future-supply/pipeline считает СУБЪЕКТ анализа как будущего конкурента (self-count) + уже строящиеся как «будущее»
Closed
#1737 (site-finder) confidence: сырой ярлык «Компонент · вкладывающий сервис: high» — теряется имя сервиса
Closed
#1736 (site-finder) точки подключения ресурсов не отображаются на карте analyze (рендеринг-баг)
Closed
#902 [tradein][backend] СберИндекс pull: hedonic + asking слаги 404 на /api/sowa — тянется только real_estate_deals
Closed
#814 [tradein][backend][ops] Включить avito_city_sweep schedule + verify полного проксированного свипа
Closed
#108 РИАСУРТ Свердл: 14 ключевых layerIds для агломерации ЕКБ (multi-city scaling)
Closed
#1539 (low) conflict_resolution.py/_resolve: строковые правила игнорируют приоритет источников (порядок dict)
Closed
#61 B2-2: Velocity MV для Site Finder + Generative (на данных B2-1)
Closed
#307 feat(objective): активировать data goldmine — 303k lots, 81% цен, mapping backfill (P0)
Closed
#850 [P1][tradein][backend][вторичка] #774-3 Estimator Tier A → house_id/cadastre-join вместо regex-address (CLIENT-VISIBLE, backtest-gated)
Closed
#774 [needs-human][P2][tradein][backend] Matching-subsystem мёртв для оценки — estimator на regex-address, не house_id/cad-join (архитектура)
Closed
#1188 [tradein] C: API-параметр segment=vtorichka|novostroyki|all в выдаче listings
Closed
#920 [tradein][estimator] Backtest gate для СберИндекс time-adjust перед активацией (#794 follow-up)
Closed
#1509 (low) 10_score_v2.py/main: sat_factor вычисляется и пишется, но не применяется к скорости (мёртвая логика vs комментарий)
Closed
#1617 gate_verdict: warning NO_ENGINEERING_NEARBY при ОТСУТСТВИИ инж.сетей форсирует «С ограничениями» вместо «Можно» — чистый вердикт недостижим для жилого учас…
Closed
#1593 demand_only overlay: deficit_index ранжирует форматы по rate-крутизне (§9.5 segment_steepness), а не по силе спроса — §9.2/§9.4-компоненты сокращаются
Closed
#1383 [low] leads/stats: revenue/deals считаются за всё время под контрактом «за последние N месяцев»
Closed
#1513 (low) 08_enrich_economics.py/main: real_n_lots/sold_pct/price считаются по всем лотам, но отчёт подписывает их как период (12 мес/90 дней)
Closed
#1520 (low) estimator.py/_fetch_dkp_corridor: low/high_ppm2 = чистые min/max выборки, а не P10/P90 — advisory-текст по одиночному выбросу
Closed
#1398 (low) De-partиализация 5 listings-индексов в 097 на ложной посылке «is_active = 100% true», которую 104 подтверждает устаревшей
Closed
#1503 (low) server.py/smart_suggestions: нет фильтра 'score выше точки', обещанного в докстринге
Closed
#1512 (low) 06_match_economics.py/main: months_to_sellout смешивает сток разных месяцев окна со sold за всё окно
Closed
#1511 (low) 06_match_economics.py/main: median_price_m2 считается по равновзвешенным строкам room×month, а не по объёму сделок
Closed
#1637 [Fable 5][P3] §15 confidence: нота deal_count теряет окно «за N мес» — расходится с контракт-примером модуля
Closed
#1609 domrf_catalog status: классификация по первому ключевому слову во всём HTML + 'продано'≠'продана' → sold помечается free
Closed
#1393 (low) Cian _walk_price_range: force-paginate ветка молча теряет хвост ценового бакета (задокументированная потеря в hot path)
Closed
#1650 v_supply_layers_latest (м.125) схлопывает все L3 dev_group'ы района в 1 строку — DISTINCT ON без dev_group_name заново вносит #970 на read-слое future_supply
Closed
#1606 EMISS-парсер: годовой агрегат (PERIOD='год') и I квартал коллидируют по obs_date=date(year,1,1) — последний Series молча затирает первый
Closed
#1633 [Fable 5][P4] §25.3 _geo_weight: подтверждённо-далёкий проект (>6.9 км) получает вес ниже floor для проекта без координат — инверсия против комментария
Closed
#1638 normalize.py: 0-заполненная сетка SalesSeries.units сводит guard _count_full_years к диапазону дат, а не к числу реальных наблюдений (латентно, до подключения #979)
Closed
#1640 INN-regex затирает легитимные слитные 10/12-значные числа (крупные суммы в рублях) в text/строковых fields перед отправкой в LLM
Closed
#1353 [medium] is_residential_zone: prefix-проверка мертва для NSPD zone_code, детект жилой зоны держится на хрупкой подстроке 'жил' без negative-list
Closed
#1357 [medium] _score_label игнорирует порог 'хорошо'=25 — участки со score 15..25 помечены 'хорошо' вместо 'средне'
Closed
#1486 (high) site-finder-api.ts/useParcelPoiScoreQuery: poi_weighted_score из weight в неверной шкале — клиент видит абсурдный «~10/100»
Closed
#1352 (medium) refresh_ekb_districts_median: ST_Intersects двойного-счёта сделок на пограничных кварталах искажает медиану/среднюю цену района
Closed
#1344 (high) cad_territorial_zones.geom объявлена GEOGRAPHY(POLYGON) — MultiPolygon ПЗЗ-зоны молча отбрасываются при harvest
Closed
#1508 (medium) 09_macro_and_trend.py/main: trend_ratio=2.0 при v_prior==0 даёт максимальный буст районам без истории продаж
Closed
#1355 [medium] supply_layers: один domrf-объект может учитываться И в Layer2 (hidden) И в Layer3 (future) — двойной счёт предложения на горизонтах 18/24 мес
Closed
#1530 (medium) trade_in_pdf._build_cover: «Срок действия данных» захардкожен today+30д, игнорирует estimate.expires_at (=now+24ч)
Closed
#1406 (high) QuartirographyChart.tsx/portfolioMap: портфель по числу комнат наложен на ось площади (м²) — сравнение в разных единицах
Closed
#1407 (high) page.tsx / KpiCard «Sold % (квартиры)»: вердикт «выше/ниже среднего рынка» считается по собственному sold% объекта без рыночных данных
Closed
#775 [P2][tradein][backend][scrapers] Парсить из embedded-state JSON: Yandex 82% NULL area + Cian buildingCadastralNumber не персистится
Closed
#1575 cian offer_price_history frozen since 2026-05-24 — server backfill is a silent no-op; needs local Playwright runner
Closed
#1405 (high) QuartirographyChart.tsx/portfolioMap: бар «Студии» в портфеле всегда 0 — график противоречит вердикту «52% — студии и однушки»
Closed
#1668 (site-finder) analyze inline confidence — stub, не дотянут до §15 confidence_engine (форсайт)
Closed
#1667 (site-finder) analyze: metro_block — заглушка nearest_top3=None (скрапер метро не подключён)
Closed
#1666 (site-finder) mv_layout_velocity не рефрешится по расписанию → best_layouts молча устаревают в проде
Closed
#1635 commercial: sell_through_pct (темп распродажи нежилого) мислейблится как «доля коммерции» (commercial_share_pct)
Closed
#299 feat(plans): vectorize DOM.РФ floor plans — Phase 1 Potrace spike (P0)
Closed
#801 [tradein][frontend][infra] Mock-render/MSW для прогона a11y+lighthouse (UI без бэкенда = белый экран)
Closed
#1642 make_thumbnail: пропуск по факту существования → устаревшая миниатюра после перекачки оригинала
Closed
#1590 Экспортёры report_*: подпись «Индекс дефицита (12 мес)» лжёт при отсутствии 12-мес прогноза — fallback берёт дефицит чужого горизонта
Closed
#1569 alembic/env.py регистрирует только Parcel — JobSetting и ~50 реальных таблиц невидимы для drift-detection, autogenerate сгенерировал бы фантомный CREATE TABLE parcels
Closed
#1656 [backend][celery] Beat-таски refresh_quarter_price_index_chain и etl_newbuilding_crossload не зарегистрированы на воркере (отсутствуют в include) — молча никогда не выполняются
Closed
#1655 nspd_geo: jobs, застрявшие в 'queued' (потерянное брокер-сообщение), никогда не ре-reap'ятся — cleanup_zombies и worker_ready матчат только 'running'/'paused'
Closed
#1654 scrape_cadastre: enqueue_cadastre_harvest freshness-skip не идемпотентен — на resume targets_total сжимается ниже targets_done → преждевременный 'done' + раздутый targets_skipped
Closed
#1653 ppt_tep OR-JOIN (doc_ref=source_key ИЛИ doc_full_name ILIKE) может вернуть один ППТ-документ несколько раз → дубли ТЭП в ИРД-блоке
Closed
#1652 Fallback REFRESH MV CONCURRENTLY: проверка подстроки 'cannot refresh materialized view' не матчит реальное сообщение PostgreSQL → recovery-ветка мёртвый код
Closed
#1651 zone_regulation._RE_FLOORS требует литерал 'этаж' после числа → документированная форма 'предельное количество этажей – N' (голое число) не извлекаетс…
Closed
#1649 extract_obj_checks фабрикует passed=False для отсутствующих в payload проверок → UNKNOWN трактуется как FAILED (латентно, endpoint отключён)
Closed
#1648 fetch_via_rosreestr2coord глотает все исключения → None: WAF-блоки не детектируются, цель помечается 'done' с 0 features, run-статус лжёт
Closed
#1646 [ekburg_permits] parse_xlsx не закрывает read_only workbook (wb.close()) — утечка дескриптора/буфера
Closed
#1647 stealth: BrowserSession.download_binary обходит семафор concurrency (в отличие от get_json)
Closed
#1645 [domrf_catalog] price_rub regex ловит цену за м² раньше полной цены → price_rub=NULL при наличии цены на странице
Closed
#1644 _norm_flat: деривация price_per_m2 падает с TypeError при строковом totalArea — необработанное исключение роняет весь run
Closed
#1643 Сбой загрузки квартир глотается молча — провал /portal/table не пишется в kn_scrape_failures, run рапортует ложную полноту
Closed
#1641 Форматированный 10-значный мобильный без кода страны (922 123 45 67 / 922-123-45-67) проходит redaction нетронутым
Closed
#1639 affordability.py:339-342: payment_at_scenario считает аннуитет по rate_path[h] без спреда, хотя rate_path в стеке = key_rate ЦБ → занижен и на иной базе, чем monthly_payment_rub (латент…
Closed
#1636 §9.6 Almon-адаптер хардкодит confounded=False → §15 шок-фактор (#1222) частично мёртв в production
Closed
#1634 market_now.summary: district-wide счёт ЖК-выборки (obj_count) выдаётся за «N ЖК-конкурентов рядом»
Closed
#1632 report_md._md_kv_lines: многострочное значение (напр. product_tz.summary «Резюме») ломает Markdown-буллет — нет свёртки переводов строк
Closed
#1631 trade_in_pdf._analog_rows: floor==0 (или total_floors==0) у аналога рендерится как «—» из-за truthiness вместо is not None
Closed
#1630 intents.py: _render_why_forecast объявляет future_market источником provenance даже когда из него не выведено ни строки
Closed
#1629 grid_geometry.py:59-61 — sanity-check сравнивает искажённые единицы EPSG:3857 с порогами, заданными как наземные метры → валидные крупные/вытянутые квартал…
Closed
#1628 date_cr минует _parse_nspd_date → CAST(:date_cr AS date) роняет upsert_quarter_stats и весь harvest_quarter квартала (нет savepoint)
Closed
#1627 wms_feature_info (nspd_bulk_client.py:418-420): отсутствует isinstance(data, dict)-guard — non-dict JSON-ответ роняет ячейку grid-walk через AttributeError, потеря без сигнала
Closed
#1626 search_by_quarter (nspd_bulk_client.py:305-316): подстрочная классификация 404/400 по тексту исключения с подмешанным body_preview проглатывает 5xx и валидный 400 как «кв…
Closed
#1625 Parcel.geometry объявлена как POLYGON — реинтродукция класса крашей на многоконтурных (MultiPolygon) участках, который чинила миграция 93 (латентно: модел…
Closed
#1624 [opportunity_harvest] n_features инкрементится до per-quarter commit — отчёт завышает число persisted фич при сбое commit
Closed
#1623 [objective_etl] import_anton_objective: FileNotFoundError возвращает dict без raise — Celery-таск SUCCESS при проваленном ETL
Closed
#1622 [scrape_kn_catalog_objects] force=True «Загрузить все» молча ограничивается LIMIT 300 — каталог недогружается
Closed
#1621 process_nspd_geo_job (nspd_geo.py:374-408, 82-97) не имеет атомарного claim → дублирующие task-сообщения для одного job_id могут идти параллельно (двойные WAF-хиты + зат…
Closed
#1620 worker_ready (lifecycle.py:160-171) немедленно ре-enqueue'ит WAF-paused nspd_geo jobs, обходя 30-минутный WAF-cooldown из cleanup_zombies
Closed
#1619 ppt_tep JOIN: slug-fallback ILIKE перевёрнут (doc_ref ILIKE '%doc_full_name%') — никогда не матчит + LIKE-метасимволы не экранированы
Closed
#1618 granddoc is_active: регистрозависимое сравнение == "Действующий" расходится с документированным lowercase doc_status_name → флаг и сортировка ломаются
Closed
#1616 premises_lookup: KNN ближайшего здания ранжирует в ГРАДУСАХ (LIMIT 1) — на широте ЕКБ выбирает не ближайшее по метрам, parking_ratio чужого дома / потеря вали…
Closed
#1615 competitors.py:491-502 — ценовой fallback покрывает только objective_complex_mapping, игнорируя nearest_cx gap-fill: конкурент с velocity>0 из спатиального матча получает avg_price=None
Closed
#1614 nspd_lite.fetch_geoportal / nspd_client._http_get_json: json.loads на HTTP 200 не обёрнут → WAF-челлендж со статусом 200 даёт JSONDecodeError мимо autoretry harvest_quarter
Closed
#1613 obj_checks.extract_obj_checks: bool() на строковом флаге → 'false'/'0'/'нет' трактуется как пройдено
Closed
#1612 obj_checks.extract_obj_checks: or-коалесинг passed-значения (list-ветка) теряет boolean False → проваленная проверка пишется как пройденная
Closed
#1611 nspd_denorm.denorm_dump: штатный пропуск feature без cad_num считается ошибкой → завышенный error-счётчик в метрике прогона
Closed
#1610 domrf_catalog scrape_one_flat: success=True даже при updated=False / 0 извлечённых полей — ложь в статистике батча
Closed
#1608 domrf_catalog _TextCollector: void-теги (<br>/<img>/<input>) рассинхронизируют стек/буфер — текст блоков теряется
Closed
#1607 ekburg_permits: _COORD_FIRST_RE требует дробную часть — целочисленные координаты МСК-66 теряют геопривязку молча
Closed
#1605 Phase A не пагинирует и молча теряет хвост объектов при limit=999999, run всё равно 'done'
Closed
#1603 make_thumbnail: неатомарная запись WebP (thumbs.py:53) — усечённый thumb навсегда кэшируется и отдаётся как валидный
Closed
#1604 Lazy-загрузка фото: при провале make_thumbnail оригинал записан на диск, но local_path не сохранён в БД (photos.py:113-125) — вечный re-fetch + осиротевший файл
Closed
#1602 LLMResult.from_provider теряет finish_reason — content_filter/length-обрезка возвращаются как ok=True
Closed
#1601 _parse_openai_response: int() на нечисловых usage-токенах бросает ValueError/TypeError мимо fallback-гарантии complete
Closed
#1600 Подписи секций в DXF привязаны по левому-нижнему углу к центроиду, а не отцентрованы на нём
Closed
#1599 DXF-экспорт теряет внутренние кольца (отверстия) участка/пятна застройки — вырезы зарисовываются сплошняком
Closed
#1597 place_strategy не отбраковывает стратегию с нулевым размещением: пустой концепт (revenue=0, margin=-land, IRR=-33%) выдаётся как валидный вариант
Closed
#1598 ConceptInput.land_cost_rub без ge=0: отрицательная стоимость земли молча завышает маржу и IRR-proxy
Closed
#1596 [Fable 5][P3] §15 confidence_engine: advisory-cap сообщение дублируется в rationale при all-high (самый частый advisory-случай)
Closed
#1595 _score_future_competition: count = len(всех конкурентов), а mean_weight — только по не-None весам → возможное завышение плотности при частичных данных
Closed
#1594 demand_only: rate_future=0.0 placeholder при отсутствии будущей ставки даёт максимальный аплифт §9.4 (clamp 1.2), а не нейтраль — комментарий ложный
Closed
#1592 [Fable 5][P2] §25 compute_special_indices: итоговый confidence считается по ВСЕМ 6 индексам (включая unavailable→'low'), а не «MIN по доступным» — карточка систематически …
Closed
#1591 Snapshot-PDF: блок «Конкуренты (топ 5)» отбирает крупнейшие ЖК по flat_count, а не ближайшие — расходится с комментарием кода
Closed
#1589 trade_in_pdf.py:256 — бейдж достоверности печатает n_analogs=объявления+сделки, завышая «N аналогов» и противореча заголовку стр.2
Closed
#1588 objective_distinct не фильтрует group_name, но objective_group хардкодится 'Екатеринбург' — латентный кросс-город mislabel при расширении датасета (#307)
Closed
#1587 dry_run objective-backfill возвращает auto_accepted=0 вместо числа потенциальных auto-accept — preview вводит в заблуждение
Closed
#1586 intents.py: при наличии headline подавляется честная пометка о пустом разделе product_tz (what_to_build)
Closed
#1585 intents.py: _fmt_number отдаёт английские 'nan'/'inf' в RU-прозу детерминированного chat-ответа при NaN/Inf-числах
Closed
#1584 Grid-walk discovered-счётчик завышается на skipped/чужекатегорийные features и misattribution parcels/buildings
Closed
#1583 Phase 2.5 ПЗЗ собирается ДО auto-heal геометрии квартала — broken-geom кварталы молча остаются без территориальных зон при первом harvest
Closed
#1582 ddu_price_indicator: missing MV даёт ProgrammingError, а ловится только OperationalError — диагностический except мёртв для своего же кейса
Closed
#1581 velocity_alerts: prior_n использует COUNT(*) вместо COUNT(realised) — NULL-строки засчитываются в гейт значимости z-score
Closed
#1580 _jsonb_param: json.dumps без allow_nan=False — NaN/Infinity ломают jsonb-INSERT, ран теряется молча
Closed
#1579 objective_etl.get_sqlite_info: утечка SQLite-соединения/fd на error-path (close() не в finally)
Closed
#1578 weather_cache._fetch_seasonal_remote: ZeroDivisionError/ValueError при пустых t_min/precip и непустом t_max (раздельные None-guard'ы)
Closed
#1577 weather_cache._fetch_weather_remote: агрегаты min/max/sum по daily-массивам падают на None-днях -> весь 7-day forecast молча теряется
Closed
#1576 recommend_mix: weighted_avg_price_per_m2 не пересчитывается после success-boost share_pct → средневзвешенная цена рассогласована с долями бакетов (пробел в фиксе #1359)
Closed
#1574 Голый int(cat_id)/int(total) в парсинге meta search_by_quarter падает на нечисловом NSPD-ответе и валит Phase 1 квартала
Closed
#1573 get_features_in_bbox_grid молча глотает WAF-403 и server-error для ПЗЗ-grid-walk → ложный tz_count=0, без layer_failed
Closed
#1572 ChatAskRequest.history: max_length=20 даёт hard-422 на длинном диалоге вместо задокументированного усечения (контракт-vs-поведение)
Closed
#1571 JobSetting.updated_at — NOT NULL без Python/server default: ORM-вставка строки даст IntegrityError (латентная ловушка)
Closed
#1570 ORM-модель Parcel мапится на несуществующую таблицу 'parcels' с устаревшими колонками — мёртвый и вводящий в заблуждение код
Closed
#1567 Sentry/GlitchTip scrub-хук навешен только на transaction-события (before_send_transaction), error-события не редактятся — apiKey из URL/spans/breadcrumbs утекает в трекер
Closed
#1566 DDU-индикатор: нет валидации формата/порядка periodFrom/periodTo — мусорный или инвертированный period тихо отдаёт пустой/усечённый ряд
Closed
#1565 DDU-индикатор: area_ranges целиком вне диапазона 1..6 молча возвращает ВСЕ площади вместо пустого/422
Closed
#1564 estimate_pdf (trade_in.py:347): TTL-проверка через .replace(tzinfo=UTC) перепривязывает, а не конвертирует timestamptz — при не-UTC session TZ просроченные оценки отдаются ка…
Closed
#1563 Отрицательный query-param limit на 7 GET-эндпоинтах admin_scrape → 'LIMIT -N' → необработанный 500 вместо 422
Closed
#1562 bulk_enqueue_geo (/geo/bulk): невалидный thematic_id в середине списка → 400 при уже запущенных geo-jobs (partial execution, нет atomicity/idempotency)
Closed
#1561 persist_analysis_run коммитит result ДО дописывания forecast/ird/developer_attribution — сохранённый ран расходится с live-ответом
Closed
#1560 Три async-хендлера competitors / best-layouts / best-layouts-pdf блокируют event loop sync DB-IO (и WeasyPrint write_pdf)
Closed
#1553 Yandex detail-enrichment не реализован: нет save + detail не fetch'ится в свипе (area_m2 23%, repair 1%)
Closed
#1551 Avito detail-enrichment backfill для legacy listings (detail_enriched_at IS NULL) — прокси уже есть
Closed
#1538 (low) houses.py/_upsert_house_source: ON CONFLICT не обновляет matched_method/matched_at — провенанс врёт
Closed
#1537 (medium) houses.py/match_or_create_house Tier 0: cadastr_exact не регистрирует alias -> риск дубля при бескадастровом скрейпе
Closed
#1536 (low) conflict_resolution.py/_resolve cross_validate: молча возвращает медиану, не сигнализирует расхождение цен
Closed
#1535 (medium) normalize.py/normalize_address: инициалы 'К.'/'Д.' в названии улицы раскрываются в 'корпус'/'дом'
Closed
#1534 (high) normalize.py/normalize_address: асимметричное раскрытие ' д '->' дом ' даёт разные ключи для одного дома
Closed
#1533 (low) trade_in_pdf._examples_rows: days_on_market==0 рендерится как «—» из-за or вместо is not None
Closed
#1532 (low) trade_in_pdf._build_deals_page: house_label не содержит monolith_brick/other — рассинхрон «Тип дома» между стр.2 и стр.3
Closed
#1531 (low) trade_in_pdf._build_listings_page: строка «(с учётом ремонта)» дублирует тот же n_total, фильтрации по ремонту нет
Closed
#1529 (low) dadata._classify_kind: fias_level 65 (planning) и 75 (plot) ошибочно попадают в kind='house'
Closed
#1528 (low) cian_price_history.backfill: saved считает len(price_changes), а не реально вставленные строки
Closed
#1527 (medium) admin.test_cian_auth: 403-бан Cian отдаётся как authenticated=True (VERIFY_BAN_SENTINEL не различается)
Closed
#1526 (medium) image_sanitizer.sanitize_image: EXIF orientation срезается без поворота пикселей → фото клиента лежат на боку
Closed
#1525 (low) scheduler.py/import_rosreestr_dkp: substring(floor FROM '[0-9]+') теряет минус — этаж '-1' импортируется как 1
Closed
#1524 (medium) house_imv_backfill.py/_process_one_house: IMV вернул price=0 → дом помечается imv_status='ok' и больше не переоценивается
Closed
#1523 (low) house_imv_backfill.py/pick_lot_params: нет инварианта floor<=floor_at_home → при total_floors=NULL везде floor_at_home падает на 9
Closed
#1522 (medium) scheduler.py/trigger_cian_backfill_run: при протухших cookies next_run_at не сдвигается → verify_session бьёт по Cian каждые 60с
Closed
#1521 (medium) scrape_pipeline.run_avito_city_sweep: IMV-фаза отравляет сессию → update_heartbeat без rollback переводит успешный sweep в 'failed'
Closed
#1519 (low) estimator.py/estimate_quality: freshness/last_scraped_at/days_on_market считаются по listings_clean, а не по показанным anchor_comps_used
Closed
#1518 (medium) estimator.py/estimate_quality SB-anchor: границы диапазона из RAW comp_ppm2 без repair_coef рассинхронизированы с центром
Closed
#1517 (low) search.py/_validate_geo_pair: cross-field min>max через truthiness — граничный 0 обходит проверку
Closed
#1516 (low) schemas/search.py _validate_geo_pair: нет проверки инвертированных вилок floor/year_built/floors_total (min>max)
Closed
#1515 (medium) search.py/search(): cache_hit всегда false даже при отдаче из кэша — поле врёт
Closed
#1514 (high) search.py/search_query.py: кадастровый номер всегда NULL в выдаче поиска — рассинхрон имён cadastral_number vs kadastr_num
Closed
#1510 (medium) 12_more_pois.py/main: bbox padding ±0.005° меньше радиуса привязки 2 км — POI у границ теряются
Closed
#1507 (medium) 04_report.py/build_html: селектор .r.r красит все числовые ячейки в красный и перебивает зелёный
Closed
#1506 (medium) 04_report.py/build_html: заголовок «последние 90 дней» не соответствует реальным периодам real_* (12 мес / всё время)
Closed
#1505 (high) 04_report.py/build_html: HTML-подпись весов противоречит JSON weights_used в том же отчёте
Closed
#1504 (high) 04_report.py/main: JSON weights_used не соответствует реальным весам скоринга и не содержит economic
Closed
#1502 (low) server.py/price_distribution: квантиль int(p*n) завышает p25/p50/p75 на малых выборках
Closed
#1501 (low) server.py/district_time_machine: AVG(price) выдаётся под ключом median_price_kr
Closed
#1500 (medium) server.py/jk_full: import psycopg2 в проде (psycopg v3 only) → photos/sale_graph всегда пустые
Closed
#1499 (low) server.py/developer_track_record: двойной учёт лотов при N сайтах на один Objective-проект
Closed
#1498 (low) check-no-print.py/main: matcher только Edit|Write — print через MultiEdit не блокируется
Closed
#1497 (low) check-no-print.py/PRINT_RE: ловит закомментированный print, строковые литералы и method-call .print() — ложные блокировки
Closed
#1496 (low) check-no-print.py/normalize_path: rfind берёт последнее 'backend/' — ломает allow-prefix для вложенных backend-каталогов
Closed
#1495 (low) check-no-print.py/normalize_path: rfind('backend/') матчит подстроку, а не сегмент пути
Closed
#1494 (medium) cleanup_ghosts.py main: _all_docs limit=10000 без пагинации — при росте vault живые chunks ошибочно удаляются как orphan
Closed
#1493 (low) cleanup-worktrees-aggressive.py fetch_all_prs: жёсткий лимит 30 страниц (1500 PR) может пометить ветку с PR за пределом как stale и удалить worktree
Closed
#1492 (medium) migrate_kg_to_obsidian.py _moc_for_subdir/sort_key: хроносортировка MOC вырождается в обратно-алфавитную из-за None от extract_date
Closed
#1491 (high) migrate_kg_to_obsidian.py extract_date/_DATE_PATTERNS: ведущий \b перед месяцем срывает извлечение даты у entity с разделителем '_'
Closed
#1490 (low) weightProfiles.ts/useDeleteProfile: JSDoc 'Returns true if deleted' не соответствует поведению (хук возвращает undefined)
Closed
#1489 (low) weightProfiles.ts/useWeightProfiles: admin-токен лишний в queryKey React Query
Closed
#1488 (medium) download.ts/triggerDownload: синхронный revokeObjectURL в том же тике после a.click() — гонка, срывающая скачивание в Firefox/Safari
Closed
#1485 (low) useSiteAnalysis poll-loop: неизвестный FetchStatus молча поллится до 2-мин таймаута вместо явной ошибки
Closed
#1484 (low) useCustomPois/customPoisKey: session_id отсутствует в queryKey — кэш может переиспользоваться между сессиями
Closed
#1483 (low) Drawer.tsx/Drawer: восстановление фокуса на close может не сработать для размонтированного триггера
Closed
#1482 (low) Drawer.tsx/Drawer: prop width молча игнорируется для side='bottom'
Closed
#1481 (low) Drawer.tsx/Drawer: slide-out анимация при закрытии не проигрывается (ветка !open рендерит новый пустой узел)
Closed
#1479 (medium) AnalogsTable.tsx сортировка по 'Дней': days_on_market=null трактуется как 0, пустые всплывают как самые свежие
Closed
#1478 (medium) EstimateResult.tsx hero-бейдж: 'N аналогов' = listings+deals, не совпадает с таблицей аналогов
Closed
#1477 (low) site-finder: визит пишется только из map-попапа — переход из ParcelDrawer/CadInput/RecentParcels не попадает в «Недавние»
Closed
#1476 (medium) site-finder/useRecentParcels: «Недавние» не обновляются до 60с после визита (нет инвалидации кэша)
Closed
#1475 (high) site-finder-api/applyFilters: фильтры «Район» и «ВРИ» в prod дают пустую карту (клиентская фильтрация по плейсхолдерам)
Closed
#1474 (high) EntryMap/ParcelDrawer: deselect-overlay z399 перекрывает карточку участка (z20) — drawer некликабелен
Closed
#1473 (low) CompareTable.tsx строка velocity: velocity_score рендерится как «N / 100», канонический VelocityBlock — как «N%» → рассинхрон единицы метрики
Closed
#1472 (medium) compare/page.tsx handleResult: дедуп по подмножеству полей теряет обновления district/цены/scoreLabel/errorMsg → стейл-данные в таблице сравнения
Closed
#1471 (low) EgrnPropertyTable/formatDate: невалидная дата ЕГРН рендерится как «Invalid Date» — мёртвый try/catch
Closed
#1470 (medium) PoiList2Gis/site-finder-api: «{totalScore}/100» может превышать 100 и в fallback показывает не POI-метрику
Closed
#1469 (medium) ScenariosBlock/ScenarioCard: индекс дефицита берётся с самого длинного горизонта, но подписывается целевым — рассинхрон числа и подписи
Closed
#1468 (low) AnalysisSidebar.tsx — мёртвый компонент с неверными подписями секций (4. Инфраструктура / 5. Свежесть) и без section-6
Closed
#1467 (low) Section1ParcelInfo headlineSubtitle: захардкоженный «Score +12 vs район» в fallback-подзаголовке
Closed
#1466 (medium) Section1ParcelInfo POI-fallback: инвест-балл участка показывается как POI-score «X / 100» с фейковыми weight/score_contribution
Closed
#1465 (low) Section2NetworksUtilities.buildSubtitle: расстояния в подзаголовке без ru-группировки ('1234 м' vs '1 234 м' в таблице)
Closed
#1463 (high) Section2NetworksUtilities.getUtilityConfig: реальные subtype сетей не маппятся → сырые англ. ключи в таблице
Closed
#1464 (high) Section2NetworksUtilities.buildSubtitle: газ/водопровод теряются в подзаголовке (неверные subtype-ключи)
Closed
#1462 (medium) NspdEngineeringNearbyBlock.tsx: дедуп label+round(distance) пропускает дубли — расстояния меряются до разных опорных точек
Closed
#1461 (medium) NspdEngineeringNearbyBlock.tsx: смешение радиусов 200 м (analyze) и 500 м (connection-points) под подписью «200 м»
Closed
#1460 (medium) MarketTrendBlock.tsx/LABEL_COLORS: бейдж тренда всегда серый — ключи карты не совпадают с label из бэкенда
Closed
#1459 (low) CpLayerControlPanel.tsx/CpLayerControlPanel: «Показать все» рассинхронизируется при наличии пустых категорий
Closed
#1458 (medium) VelocityBlock.tsx/VelocityBlock: «Топ продавцов» показывает «Продано 0 м²» при отсутствии данных velocity
Closed
#1457 (medium) MarketTab.tsx/MarketTab: подпись «строящихся» не соответствует activeCount (включает сданные ≤1 года)
Closed
#1456 (high) VelocityBlock.tsx/VelocityBlock: рассинхрон bucket-ключей — 4-комн. и 5+ сделки молча выпадают из «По комнатности» и «Топ продавцов»
Closed
#1455 (high) ZouitLayer.tsx/ZouitLayer: хеш-сегмент React-key константен для Polygon — старая геометрия ЗОУИТ остаётся на карте
Closed
#1454 (low) ScoreBreakdownStackedBar.tsx / легенда показывает категории с contribution===0, отсутствующие в обеих полосах
Closed
#1453 (medium) Pipeline24moBlock.tsx / fmtMonth: new Date(ISO-date) даёт UTC-полночь — месяц «Сдача» уезжает на предыдущий в отрицательных TZ
Closed
#1452 (low) WeightProfilePanel.tsx / handleSliderChange: дебаунс-таймер дублирует немедленный setDraft и не чистится при unmount
Closed
#1451 (medium) ScoreBreakdownStackedBar.tsx / source-view barWidth: знаменатель = макс. знаковый вклад, а не макс. модуль — шкала ломается при отрицательном лидере
Closed
#1450 (low) EnvironmentTab/WeatherBlock: футер жёстко пишет «7 дн.» при динамическом forecast_days
Closed
#1449 (medium) BestLayoutsBlock/TopLayoutsTable: тултип >100% жёстко пишет «за 24 мес» вместо выбранного time_window
Closed
#1448 (medium) BestLayoutsBlock/handleDownloadPdf: PDF собирается из живого состояния контролов, а не из показанного расчёта
Closed
#1447 (low) PilotRequestModal/deriveTrackingId: показанный лиду «Номер заявки GD-XXXXXXXX» не хранится в БД и не находится поддержкой
Closed
#1446 (low) ConceptDrawMap: нарисованный полигон отрисовывается дважды (FeatureGroup-слой + внешний GeoJSON по prop)
Closed
#1445 (low) ConceptVariantsResult: IRR-proxy движка подаётся в UI как полноценная «Внутренняя норма доходности»
Closed
#1444 (low) ConceptVariantsResult/VariantPanel: нулевая валовая прибыль подписывается как «Положительная маржа»
Closed
#1443 (low) ConceptExportButtons: error/serverLoading не сбрасываются при смене variant — стейл-сообщение/disabled под чужой вкладкой
Closed
#1442 (low) ConceptResultMap/FitBounds: нестабильная зависимость bounds перезапускает fitBounds на каждом ре-рендере, сбрасывая ручной zoom/pan
Closed
#1441 (medium) ConceptVariantsResult/VariantPanel: FAR (безразмерный) подписан единицей «м²/га» — неверная единица и рассинхрон с PDF движка
Closed
#1440 (low) UserMenu.tsx/UserMenu: роль вне TS-union даёт пустой role-badge (нет рантайм-валидации /me)
Closed
#1439 (medium) RouteGuard.tsx/RouteGuard: analyst на запрещённом /admin/* молча редиректится в /trade-in/ вместо NoAccessScreen
Closed
#1438 (low) RecommendRevenueChart.tsx: при total=0 подписи «0.0 млн» показываются на всех нулевых сегментах
Closed
#1437 (low) PrinzipGapBar.tsx: единая безымянная value-ось X смешивает м² и % — несопоставимые длины баров между строками
Closed
#1435 (medium) QuartirographyChart.tsx/portfolioMap: бар «строится · Студии» всегда 0% — рассинхрон с подписью «52% портфеля — студии»
Closed
#1434 (low) ObjectInfraMap: счётчик «Найдено N POI» и чипы категорий считаются по уже отфильтрованным бэкендом данным
Closed
#1433 (low) DeveloperLeaderboard COLS: pct_three_plus/avg_area_sqm/sverdl_sqm_th со значением 0 рендерятся как «—» (falsy-zero)
Closed
#1432 (medium) RecommendVelocityPanel footnote: текст «темп = базовый × pf^elasticity» не совпадает с фактическим Темпом продаж
Closed
#1431 (medium) RecommendVelocityPanel vs RecommendLiquidityChart: KPI ликвидности на per-bucket эластичности, график «24 мес = liquidity» — на единой scope-эластичности
Closed
#1430 (low) JobSettingsPanel/handleSave: очистка max_concurrency/max_retries молча шлёт 0 → 422
Closed
#1429 (low) JobSettingsPanel/isPendingFor: одна общая updateMutation — спиннер/opacity рассинхронизируются при параллельных Save
Closed
#1428 (medium) BulkGeoPanel/handleSubmit: очистка поля Parallelism шлёт parallelism=0 → 422, запуск молча проваливается
Closed
#1427 (low) trade-in/page.tsx: freshResult навсегда перекрывает URL id — переход по другой shared-ссылке в той же сессии показывает устаревший результат
Closed
#1426 (medium) trade-in/page.tsx: протухшая/битая shared-ссылка молча показывает EmptyState «Введите параметры», ошибка GET /estimate/{id} не отображается
Closed
#1425 (medium) trade-in/page.tsx useEstimateId: чтение window.location.search вместо useSearchParams → SSR hydration mismatch и нереактивность к смене URL
Closed
#1424 (high) trade-in/page.tsx restoredEstimate: восстановленный по shared-ссылке отчёт показывает выдуманные параметры объекта (0 м², «Студия», «0 из 0», чужой адрес)
Closed
#1423 (low) compare/page.tsx handleResult: dedup-гард сравнивает не все отображаемые поля → возможен стейл медианной цены/района/подписей
Closed
#1422 (medium) CompareTable velocity-строка + winnersFor: velocity_score=0 ('нет данных') рендерится как факт и выигрывает зелёную подсветку 'лучшее'
Closed
#1421 (low) site-finder-api.ts by-bbox адаптер: parcel с area_m2 === null приземляется в area_ha=0 → «0.00 га» как факт и тихое попадание в площадные фильтры
Closed
#1420 (low) site-finder/page.tsx FilterBarBridge: matchCount и totalCount из двух независимых запросов → транзиентный рассинхрон (matchCount может временно > totalCount)
Closed
#1419 (medium) site-finder/page.tsx FilterBarBridge: счётчик показывает «0 / 0 участков» во время загрузки/смены bbox вместо состояния загрузки
Closed
#1418 (low) page.tsx/handleWeightsChange: смена весов во время первичного analyze (data ещё null) молча теряется
Closed
#1417 (low) page.tsx/noiseValue: число и цвет KPI шума считаются от разных значений (round vs raw)
Closed
#1416 (low) page.tsx/noiseColor: цвет KPI шума противоречит метке level на интервалах [45,50) и [60,65)
Closed
#1415 (low) page.tsx/trendColor: цвет KPI тренда рассинхронизирован с текстовой меткой backend (порог 5% vs 8%)
Closed
#1414 (high) page.tsx/districtLabel: KPI «X км от центра» показывает дистанцию до границы района, а не до центра ЕКБ
Closed
#1413 (low) data-sources/page.tsx · SOURCES «Объектив»: неверный домен атрибуции (objced.ru вместо objctv.ru)
Closed
#1412 (low) ConceptVariantsResult: IRR-proxy подписан как 'IRR / Внутренняя норма доходности' — переобещание метрики
Closed
#1411 (medium) concept/page.tsx: устаревший результат концепции против перерисованного полигона (стейл-стейт)
Closed
#1409 (low) prinzip/page.tsx KpiCard «Средний метраж»: двойной минус при avg≥49 и ложный «-0» при null
Closed
#1410 (high) ConceptVariantsResult: плотность (FAR) подписана как 'м²/га' — неверная единица и занижение в ~10000×
Closed
#1408 (medium) page.tsx / KpiCard «Нежилые» и «Машино-места»: hint гейтит на perc, но печатает realised → возможна строка «null продано»
Closed
#1404 (low) scrape/all/page.tsx isStale: UI-порог 5 мин расходится с backend-zombie 10 мин — ложный статус «stale» у живого kn-прогона
Closed
#1403 (low) scrape/all/page.tsx summary: плитки считают по top-30 и не покрывают статусы skipped/paused/queued — сумма плиток ≠ числу строк
Closed
#1402 (medium) scrape/all/page.tsx: смена filter не сбрасывает logsRunId — стейл-стейт показывает логи чужого прогона
Closed
#1401 (medium) scrape/all/page.tsx logs: при filter=all кнопка «логи» не задаёт scraper_type — смешивает логи разных скраперов по совпадающему run_id
Closed
#1400 (low) 55_schema_scrape_resume.sql: partial-index на heartbeat_at мёртв — reaper фильтрует по COALESCE(heartbeat_at, started_at)
Closed
#1399 (low) decode_to_file.py: f.write(decoded) падает TypeError, если JSON декодируется в list/dict
Closed
#1396 (low) _fmt_number падает на NaN/Inf-float (ValueError в детерминированном fallback-пути chat)
Closed
#1397 (low) Классификация таймаута LLM по имени класса вместо isinstance (хрупко)
Closed
#1395 (low) queue_status: broker-failure except-блоки без логирования (silent swallow в UI hot-path)
Closed
#1394 (low) POST /geo/bulk игнорирует rate_ms — все bulk-джобы создаются с дефолтом 600ms без контроля оператора
Closed
#1392 (low) own_portfolio: слабый regex-guard '^[0-9]+' позволяет non-numeric префиксу dev_id уронить весь current-portfolio запрос
Closed
#1391 (low) Fan-out по objective_complex_mapping завышает SUM-метрики в _INLINE_VELOCITY_SQL (best_layouts)
Closed
#1390 [low] izyatie_client: мёртвый fallback a_tag.get('title', href) недостижим (title уже непуст)
Closed
#1389 [low] TradeInEstimateInput допускает floor > total_floors (нет cross-field валидации)
Closed
#1388 [low] Cian has_furniture: реальное False теряется через or-коалесинг двух boolean-полей
Closed
#1387 [low] Avito relative-date parser возвращает None для бесцифровых форм ('час назад', 'неделю назад', 'день назад')
Closed
#1386 [low] Avito detail abort: транзиентная не-block ошибка сбрасывает consecutive_blocks, маскируя продолжающийся IP-блок
Closed
#1385 [low] Guard-2 same_quarter_ratio: знаменатель включает аналоги без кадастрового номера — занижение ratio, over-correction
Closed
#1384 [low] quartirography (deals): хардкод period_start_date >= '2025-07-01' — окно неограниченно растёт со временем
Closed
#1382 [low] velocity: знаменатель score использует число MAPPED конкурентов (включая с нулевыми продажами) — систематическое занижение velocity_score
Closed
#1381 (low) street-deals: period_from считается 30-дневными месяцами, а фильтр — календарными — отображаемое окно не совпадает с запросом
Closed
#1380 (low) Cadastre jobs: React-key на внутреннем <tr> вместо mapped Fragment — нестабильная reconciliation / key-warning
Closed
#1379 (low) SeasonalWeatherBlock: строка экстремумов мин/макс подписана как «макс» (только максимум)
Closed
#1378 (low) ForecastConfidenceBlock: coverage=1.0 (100%) рендерится как «1» вместо «100%» из-за строгого < 1
Closed
#1377 (low) Air quality берёт hourly[0] (00:00 forecast-дня), а не текущий час — docstring обещает «текущий час»
Closed
#1376 (low) scenarios.py: module-docstring численно противоречит реализации _horizon_widen_factor
Closed
#1375 (low) recommend_mix: comparables/competitors матчат obj_class = :cls точно, has_class_data проверяет лишь NOT NULL — молчаливо пустой результат при разном словаре (RU vs EN)
Closed
#1374 (low) trigger_kn_sweep: queued_at всегда null — берётся date_done (время завершения) только что поставленной задачи
Closed
#1373 (low) Несогласованный вывод quarter_cad для 3-сегментного кад. номера: REGEXP_REPLACE vs _quarter_cad
Closed
#1372 (low) _classify зависит от порядка вставки в OSM_CATEGORIES — вторая категория multi-tag элемента молча теряется
Closed
#1371 (low) get_connection_points игнорирует harvest_error/staleness — error-only дамп отдаётся как dump_available=true
Closed
#1370 (low) Глобальный per-cache Lock удерживается на время сетевого вызова Open-Meteo — сериализация всех analyze-запросов одного cache-типа
Closed
#1369 (medium) corp_sum: сбой парсера оставляет run помеченным 'done' (silent failure) — асимметрия с фиксом lots_pf #1220
Closed
#1368 (medium) Avito enrichment: пойманная ошибка оставляет общий Session в aborted-state → каскад на все оставшиеся строки
Closed
#1367 (medium) Не-idempotent миграции (110 ADD CONSTRAINT, 74 DROP TABLE→VIEW) при ложном заявлении об идемпотентности ломают DR-restore
Closed
#1366 (medium) trade_in_pdf: страница «Сделки» рисует выдуманные дни экспозиции (4–118) для rosreestr ДКП-сделок
Closed
#1365 (medium) 062 address cleaner: regex 'Площадь \\d' усекает легитимные адреса ЕКБ ('Площадь 1905 года')
Closed
#1364 (medium) asking→sold ratio: в asking-медиану попадают новостройки (нет listing_segment guard в seed-миграциях 080/098)
Closed
#1363 (medium) reap_zombies может пометить живой sweep 'zombie' → терминальные mark_done/mark_failed молча no-op, риск дубль-sweep
Closed
#1362 (medium) OwnPlannedProjectUpdate без price-range валидатора → PUT может сохранить инвертированную вилку (min > max)
Closed
#1361 (medium) pzz_loader: rosreestr_id может быть NULL → дубли строк, ON CONFLICT не срабатывает при повторном sync
Closed
#1360 (medium) gate_verdict: blocker subcategory=17 сравнивается через isinstance(int) — строковый subcategory из nspd-dump молча деградирует до warning
Closed
#1359 (medium) recommend_mix: success-boost меняет share_pct, но не пересчитывает units/revenue/velocity → внутренне противоречивый ответ
Closed
#1358 [medium] object_flats_quartirography: бакет 'Нежилые' дробится на дубли, когда у нежилого юнита rooms не NULL
Closed
#1356 [medium] fetch_status: завершённый/paused job с непустым target-статусом проваливается в неверный ответ 'not_in_nspd'
Closed
#1354 [medium] velocity: monthly_velocity делит суммарный объём конкурентов на MAX месяцев одного конкурента — занижение при разнородных окнах
Closed
#1351 (medium) PDF-отчёт Trade-In печатает period_months=24, тогда как данные за 12 месяцев — неверное окно в клиентском документе
Closed
#1350 (medium) Аэродромы запрашиваются из OSM только как node — авиашум молча теряется в скоринге
Closed
#1349 (medium) Geocode cache get/put делает блокирующий DB-IO на event loop, хотя тот же файл использует to_thread для других DB-вызовов
Closed
#1348 (medium) Sber pull выполняет блокирующий DB/CPU на event loop (async-таск без run_in_executor)
Closed
#1346 (medium) Блокирующий синхронный psycopg-IO в async-хендлере get_parcel_connection_points
Closed
#1345 (high) Sber pull: пойманный сбой UPSERT отравляет Session — нет db.rollback(), все оставшиеся серии каскадно падают
Closed
#1343 (high) poi_loader.sync_poi_to_db: UPSERT-цикл без per-row SAVEPOINT — одна битая строка валит весь weekly POI-sync
Closed
#1342 (high) parcels.analyze: optional DB-блоки без begin_nested() — один сбойный query отравляет всю tx, молча теряет данные и срывает persist рана
Closed
#1341 [high] СЗЗ с упоминанием газ/электр ошибочно эскалируется в hard-blocker — вердикт «Нельзя» вместо «С ограничениями»
Closed
#1340 [high] obj_class_filter (англ.) сравнивается с русским obj_class в БД — фильтр класса всегда даёт 0 конкурентов (competitors + best_layouts)
Closed
#1339 (high) useSiteAnalysis: re-POST на 'ready' использует apiFetch без проверки статуса — 202-гонка возвращает stub и крашит render tree
Closed
#1338 (high) Синхронный CPU-bound генеративный пайплайн geometry.generate блокирует event loop в create_concept
Closed
#1337 (high) async-хендлер get_poi_score(decay=routing) делает синхронный блокирующий ORS-вызов на 12с в event loop
Closed
#1336 (critical) SRID: геометрия кварталов и зданий из rosreestr2coord (WGS84) ошибочно ST_Transform'ится из 3857 → коллапс к Null Island
Closed
#956 [site-finder] EPIC 12: Извлечение факт/гипотеза/уверенность из граддок (NLP §7.4)
Closed
#1487 (medium) site-finder-api.ts/applyFilters: фильтры district/vri в prod обнуляют карту (все участки district='—', vri='other')
Closed
#1436 (medium) QuartirographyChart.tsx/portfolioMap: portfolio по числу комнат сопоставлен с deals по площади под общими площадными ярлыками
Closed
#1480 (high) trade-in/page.tsx восстановление по ?id=: параметры объекта синтезируются нулями → EstimateResult показывает '0 м²', 'Студия', 'Этаж 0 из 0' и чужой адрес
Closed
#936 [tradein][estimator] Gate перед flip tier_aware_ratio_enabled ON — backtest + golden-regression (#928/#934 follow-up)
Closed
#42 Infra I1: POI saturation per capita (Росстат демография по районам)
Closed
#1186 [tradein] A: Query-side guard вторички — estimator/asking_to_sold/matview не должны читать novostroyki из listings
Closed
#1070 [ИРД][сети] ООО «Брик» — техприсоединение, образоват. объект ул. Железнодорожников 3 (66:41:0702048:26/:27)
Closed
#96 Demand: Помещения ЕГРН (38489) + Машино-места (38490) — per-flat cross-check + parking ratio
Closed
#107 ekburg.ru/isogd direct scraper: РНС/ППТ/ГПЗУ для ЕКБ-city
Closed
#79 B7-1: 152-ФЗ — аудит кода на PII в logs / Sentry / БД
Closed
#70 B4-3: Performance аудит — Sentry Tracing + EXPLAIN slow queries
Closed
#76 B6-2: VPS resources аудит — capacity headroom для пилотов
Closed
#78 B6-4: Secrets rotation policy + procedure documentation
Closed
#263 epic(infra): NSPD unify — Вариант B consolidation (cadastre as single scraper)
Closed
#28 Gate G1: Импорт ПЗЗ ЕКБ shape → pzz_zones_ekb
Closed
#68 B4-1: Test coverage — критичные пути (recommend / analyze / concepts)
Closed
#69 B4-2: OpenAPI / TS codegen — добавить в CI assert
Closed
#77 B6-3: Frontend build cache — npm + Turborepo remote
Closed
#75 B6-1: Uptime monitoring — Uptime Kuma / healthcheck.io
Closed
#72 B5-2: Alembic vs raw SQL — синхронизация состояния схемы
Closed
#83 B9-1: README — обновить под актуальное состояние + quick start
Closed
#73 B5-3: Data freshness monitoring — dashboard + alerts
Closed
#66 B3-3: Mobile responsiveness — Leaflet + ECharts на планшете
Closed
#80 B7-2: License / ToS audit — OSM ODbL, Объектив, DOM.РФ, Open-Meteo
Closed
#255 feat(#232): ЗОУИТ visual layer на Leaflet карте — схематичные полигоны охранных зон (требование Макса)
Closed
#44 Infra I3: Инженерные сети из OSM (вода/канал/электр/газ) — utility distance
Closed
#41 Access A3: Per-category routing-radius decay (closes Limit_POI_Factor_Tiny)
Closed
#50 UX X4: Multi-cad сравнение (2-5 участков side-by-side)
Closed
#65 B3-2: Analytics dashboard — поиск + drill-down + cross-links
Closed
#99 Demand: «Индикатор цен ДДУ» — применить ARN-framework НСПД к нашим первичным данным
Closed
#17 Analytics: velocity-anomaly detection — алерт на ЖК с сильным провалом продаж
Closed
#57 B1-4: Concept UI — фронт от полигона до вариантов и экспортов
Closed
#54 B1-1: Generative Stage 1a — Shapely-парсер + placement grid
Closed
#56 B1-3: Generative Stage 1c — TEAP + финмодель + PDF/Excel/DXF
Closed
#55 B1-2: Generative Stage 1b — Greedy алгоритм + STRtree коллизии
Closed
#97 UX: Deep-links на сервисы НСПД из Site Finder (Open on ПКК, верификация)
Closed
#100 UX: Differentiation от НСПД (сравнительная таблица + deep-links + footers)
Closed
#200 cadastre: докачать geom для 932 участков (371 квартал) из job 20
Closed
#252 bug(scrapers): NspdLiteError HTTP 500 на nspd.gov.ru WMS — нужна retry policy для transient ошибок
Closed
#259 bug(#233): pzz_sync — pkk.rosreestr.ru PKK6 deprecated, мигрировать на NSPD WMS (territorial_zones)
Closed
#106 ФГИС ТП Минэк: Функциональные зоны (846615) federal Генплан — bbox tiling для ЕКБ
Closed
#237 [QA] analytics/recommend: нет индикатора актуальности данных (last_updated)
Closed
#236 [QA] analytics/recommend: ипотечная ставка показывает "Январь 2026" — данные 4+ месяца назад
Closed
#251 bug(backend): GET /api/v1/parcels/{cad} возвращает 501 "Not implemented yet" — удалить или реализовать
Closed
#428 [low] docs/PILOT_ACCESS.md: заменить claudestars@proton.me на role-mailbox
Closed
#429 [low] basic_auth: list_users.sh fragile regex (может матчить комментарии)
Closed
#427 [low] basic_auth: расширить username regex под john.doe / jane_smith
Closed
#71 B5-1: Backup cron + S3 — СРОЧНО (риск потери 6.83M ДДУ)
Closed
#253 bug(frontend): React error #418 hydration mismatch на /admin/scrape/cadastre
Closed
#35 Demand D3: Absorption rate / прогноз месяцев до распродажи 80%
Closed
#254 feat(site-finder): Ad-hoc custom POI с весом — пользователь добавляет свою точку на карту (требование Макса)
Closed
#64 B3-1: Landing page редизайн — B2B value prop + CTA flow
Closed
#63 B2-4: Объектив coverage аудит + расширение групп если <70%
Closed
#62 B2-3: PRINZIP CRM — автоматизация стратегических инсайтов
Closed
#49 UX X3: PDF export «Site Analysis Report» (WeasyPrint)
Closed
#40 Access A2: Endpoint /parcels/{cad}/isochrones (walk/car 10/15/30 мин) + UI
Closed
#37 Demand D5: Buyer affordability index (CRM PRINZIP + CBR + rosreestr_deals)
Closed
#20 Analytics: mortgage-rate sensitivity — 'что будет, если ставка вырастет на 1pp?'
Closed
#244 bug(#232): cad_zouit fallback не срабатывает когда nspd_quarter_dumps вообще пуст (regression PR #240)
Closed
#232 [QA] ЗОУИТ "Нет пересечений" — cad_zouit имеет данные, но analyze их не использует
Closed
#31 Gate G4: Extract max_floors / FAR / parking из pzz_zones_ekb.raw_props
Closed
#29 Gate G2: Парсер ВРИ + категория земель из НСПД per cad
Closed
#256 feat(#126): Sub-PR B — интегрировать grid sampling в harvest_quarter (single-pixel WMS fix)
Closed
#102 Site Finder: WMS-overlay инженерных сетей НСПД на Leaflet карте (low-effort MVP)
Closed
#168 Bulk cadastre ingest ЕКБ — 2408 кварталов через NSPD
Closed
#126 🐛 NSPD WMS GetFeatureInfo НЕ bulk — Sprint 2 grid sampling fix
Closed
#115 🔌 Engineering: Точки подключения к сетям + параметры (KILLER FEATURE от Макса)
Closed
#94 NSPD API client: единый интегратор слоёв (foundation для G1/G2/G3/E1/#93)
Closed
#1246 [Fable 5][uncertain][P2] ObjectSaleChart: ось X строится по месяцам только первого type — серии parking/nonliv рисуются на чужих месяцах
Closed
#1248 [Fable 5][uncertain][P3] useParcelAnalyzeQuery: poll-цикл игнорирует AbortSignal — зомби-поллинг и лишние POST /analyze после навигации
Closed
#1244 [Fable 5][uncertain][P3] Excel-экспортёр §13: строки отчёта, начинающиеся с '=', пишутся как живые формулы (formula/DDE-injection)
Closed
#1245 [Fable 5][uncertain][P3] chat.py: async-хендлер /chat/ask выполняет синхронное чтение БД (JSONB-отчёт) в event loop'е
Closed
#1247 [Fable 5][uncertain][P3] Trade-in: чтение window.location.search во время рендера — hydration mismatch при открытии shareable-ссылки ?id=
Closed
#944 🔮 [EPIC][site-finder] Site Finder v2 — ИИ-прогноз продуктовой стратегии (ТЗ ГенГеныч)
Closed
#731 [tradein][db][tech-debt] Stale stats (ANALYZE никогда) + чистка мёртвой схемы
Closed
#732 [tradein][db][tech-debt] Унификация кадастровой колонки kadastr_num → cadastral_number
Closed
#769 [P3][tradein][backend] Data-layer/op хвост аудита: trgm-индекс на deals.address, FDW fetch_size, matview-refresh, cian-unescape, address-centroid
Closed
#730 [tradein][db][tech-debt] Index hygiene — дубли + 87 unused + бессмысленные партиалы (~42 МБ)
Closed
#800 [tradein][frontend][bug] Retry-storm + белый экран на 401 (/me+/quota без backoff)
Closed
#973 [SF-v2 #950] 950-E2: Расписание cian/yandex_newbuilding enrichment
Closed
#1088 [SF][future-supply] Geo-join земля↔застройщик (ДОМ.РФ + РНС-ИНН + КРТ) по кадастру/гео
Closed
#1087 [SF][future-supply][spike] Разведка ГИСОГД-СО gisogd66.midural.ru — API РНС/ввод + застройщик
Closed
#958 [site-finder] EPIC 14: UI: горизонт-селектор, экран прогноза/сценариев, слои карты, confidence
Closed
#960 [site-finder] EPIC 16: LLM-инфраструктура (провайдер, промпты, секреты, cost/guardrails)
Closed
#999 [SF-v2 #958] 958-B4: Слои карты: будущие ЖК / скрытый склад / зоны риска
Closed
#957 [site-finder] EPIC 13: Чат-интерфейс над движком (LLM-оркестрация + UI-панель)
Closed
#961 [site-finder] EPIC 17: Контракт API результата + версионирование анализа
Closed
#1169 [site-finder] §25.3 истинная каннибализация: overlap vs собственный портфель (own-portfolio)
Closed
#950 [site-finder] EPIC 6: 3-слойный склад (open/hidden/future) + индекс будущего давления
Closed
#946 [site-finder] EPIC 2: Росстат/ЕМИСС + Дом.РФ макро-ingest (доходы, инфляция, распроданность)
Closed
#947 [site-finder] EPIC 3: Сущность «Граддокумент» + парсер ППТ/ПМТ/слушаний/КРТ/ЕИСЖС
Closed
#1084 [sf] EKBGeoportalClient hardening при C8-wiring: CQL float-формат + User-Agent + httpx.Client pooling
Closed
#1134 krt_lookup: многострочный regex в _PLANNING_NO_MATCH_SQL ломает 2 топонима (#1131 follow-up)
Closed
#1119 [qa] post-deploy smoke: ird-блок в /analyze (enable_ird_analyze ON) + latency
Closed
#1122 land_reservation: parser/ingest hardening ПЕРЕД первым реальным прогоном (#1118 follow-up)
Closed
#1085 [SF][future-supply] Ingest ППТ/ПМТ ЕКБ — WFS геометрия + ТЭП из PDF (pdfplumber)
Closed
#1095 [sf] parcel_ird_overlaps: расширить except + тест ProgrammingError (при D9b wiring)
Closed
#1159 okn_objects: недозагрузка реестра (428 vs ~798 ЕГРОКН) + raw_props={id} без названия/адреса
Closed
#1234 [Fable 5][P3] Snapshot-PDF: '—'-фоллбеки двойно экранируются автоэскейпом Jinja2 — в PDF печатается литеральный текст «—»
Closed
#1116 gknspecial_harvest: incremental per-prefix commit (durability на больших прогонах)
Closed
#1231 [Fable 5][P3] noise_loader: loop-UPSERT без begin_nested — один дефектный OSM-way (3-точечное кольцо) валит весь weekly-синк на каждом прогоне
Closed
#1240 [Fable 5][P3] PilotRequestModal: клиентская валидация слабее Pydantic-схемы — лид на лендинге получает сырой JSON 422
Closed
#1228 [Fable 5][P3] OCR-нормализация не чинит задокументированный шум «6б:41:…» — кад-номера тихо теряются
Closed
#1229 [Fable 5][P3] best_layouts: supply-бакеты ('4+', euro-1/2) не стыкуются с velocity-бакетами objective ('4', '5+', '2') — supply=0/sold_pct искажены
Closed
#1221 [Fable 5][P3] recommend_mix: _district_market_saturation без latest-snapshot фильтра — каждый ЖК считается ~3 раза, медиана и гейт n>=5 искажены
Closed
#1222 [Fable 5][P3] §15 report-confidence: _confounded читает ключи, которых нет в forecast-диктах — шок-окно никогда не влияет на уверенность
Closed
#1226 [Fable 5][P3] objective_sync_config.get_config: голый except Exception: pass на seed-INSERT — запрещённый паттерн, сессия остаётся в aborted-состоянии
Closed
#1237 [Fable 5][P3] UserMenu: роль analyst (есть в backend с #962) отображается бейджем «Пилот»
Closed
#1232 [Fable 5][P3] Крах weekly POI-синка 29 февраля: date.replace(year=-2) бросает ValueError
Closed
#1136 ekb_ppt_tep: post-фильтры парсера + врезка в analyze + seed-URL (#1133 follow-up)
Closed
#1223 [Fable 5][P3] PUT /admin/jobs/settings/{job_type} для отсутствующей строки молча теряет изменения и отвечает 200 с fallback-дефолтами
Closed
#1236 [Fable 5][P3] scrape_cadastre: перманентный не-WAF фейл не инкрементит targets_failed → job вечно 'running'; cleanup-таска не в beat
Closed
#1225 [Fable 5][P3] §14.2 price_feasibility: reason говорит «субсид. ставка», хотя платёж считан по рыночной key_rate+4.5 п.п. (~19%)
Closed
#1239 [Fable 5][P3] JobSettingsPanel: правки JSON extra_config молча теряются, если textarea свёрнута при сохранении
Closed
#1235 [Fable 5][P3] nspd_geo: except (NspdLiteError, Exception) проглатывает SoftTimeLimitExceeded — 6-часовой лимит таски не работает
Closed
#1241 [Fable 5][P3] useCustomPois инвалидирует несуществующий ключ ["analyze", cad] — скор и breakdown не обновляются после изменения custom-POI
Closed
#1224 [Fable 5][P3] §25.3 _price_overlap: нулевая ширина ценовой вилки нашего проекта внутри вилки кандидата даёт 0.0 вместо 1.0/None
Closed
#1238 [Fable 5][P3] ObjectSaleChart: серия «цена ₽/м²» рисует значения, делённые на 1000, без valueFormatter — тултип читается с ошибкой в 1000 раз
Closed
#1233 [Fable 5][P3] beat_schedule: 4 cron'а написаны в UTC при timezone=Europe/Moscow — бегут на 3ч раньше; price-index ДО medians
Closed
#1227 [Fable 5][P3] scrape_catalog_batch не делает db.commit() — все UPDATE цен откатятся при закрытии сессии
Closed
#1242 [Fable 5][P3] useSiteAnalysis: общий cancelledRef между конкурентными мутациями — новый analyze воскрешает отменённый poll-цикл
Closed
#1230 [Fable 5][P3] Разорванный переносом строки regex в _PLANNING_NO_MATCH_SQL: ветки «Донбасской» и «Лумумбы» никогда не матчатся
Closed
#1220 [Fable 5][P2] scrape_objective: провал lots_pf-стрима (главный 600МБ отчёт) проглатывается — run завершается status='done'
Closed
#1205 [Fable 5][P2] Artificial Demand (§25.5) фильтрует objective_lots по админ-району без resolve_objective_districts — индекс молча пуст для 7 из 8 районов
Closed
#1203 [Fable 5][P2] recommend_mix: _district_velocity_trend — захардкоженные даты 2025: «recent»-окно растёт безгранично, trend_factor раздут до ~2x
Closed
#1210 [Fable 5][P2] _AVG_PRICE_SQL без snapshot-фильтра: цена конкурента — смесь исторических снапшотов, flats_sold кратно завышен
Closed
#1206 [Fable 5][P2] ON CONFLICT по nullable doc_num: документы без номера дублируются при каждом прогоне
Closed
#1208 [Fable 5][P2] Fallback flat_id через рандомизированный hash() ломает идемпотентность UPSERT квартир
Closed
#1209 [Fable 5][P2] Неограниченный time.sleep по серверному Retry-After блокирует threadpool на часы
Closed
#1211 [Fable 5][P2] price_sensitivity: в _elasticity_coef уходит админ-район вместо микро — регрессия всегда мертва (fallback)
Closed
#1218 [Fable 5][P2] MiniMap обрезает 100px карты и все контролы SiteMap: рыночные слои #999/#958 невозможно включить на странице анализа
Closed
#1214 [Fable 5][P2] ROLLUP grand-total неотличим от NULL-группы rooms_int — velocity/absorption форсайта может схлопнуться
Closed
#1213 [Fable 5][P2] _ACTIVE_STATUSES — английские значения против русского словаря site_status: POST /competitors всегда отдаёт is_active=false, active_count=0
Closed
#1212 [Fable 5][P2] L3 future-supply: фильтр по volatile-колонкам внутри DISTINCT ON берёт «последний подходящий» снапшот, а не последний
Closed
#1216 [Fable 5][P2] scrape_kn: Redis-lock без owner-токена — release удаляет чужой lock, а stale lock после рестарта молча убивает resume
Closed
#1215 [Fable 5][P2] nspd_geo: WAF-backoff sleep (до 240с) > 2-мин порога cleanup_zombies → дубль-запуск того же job двумя воркерами
Closed
#1217 [Fable 5][P2] EGRN-контракт сломан: фронт ждёт vri/category/owner_type, бэкенд шлёт permitted_use_text/land_category — таблица ЕГРН пустая в prod
Closed
#1202 [Fable 5][P2] audit_log_middleware: синхронная запись в БД внутри async-middleware блокирует event loop на каждом sensitive-запросе
Closed
#1201 [Fable 5][P2] GET /{cad}/isochrones и /{cad}/poi-score: 500 (float(None)) для участков с NULL-геометрией — нет фильтра geom IS NOT NULL
Closed
#1204 [Fable 5][P2] RecommendBucket молча отбрасывает per-bucket elasticity/velocity_source — live what-if на фронте считает по неверной эластичности
Closed
#1219 [Fable 5][P2] apiFetch падает с SyntaxError на 204 No Content — DELETE кастомных POI и weight-профилей всегда «ошибается» после успешного удаления
Closed
#1207 [Fable 5][P2] §19 redaction-дыры: мобильный 7XXXXXXXXXX без +/8 и ФИО капсом уходят в OpenAI нередактированными
Closed
#1198 [dx] Integration test для analyze hot-path с реальной PG — mock-БД не ловит SQL-keyword/cast ошибки (#1196 follow-up)
Closed
#1196 [SF] analyze: InFailedSqlTransaction в ird_overlays → пустой neighbors_summary + другие downstream-секции (#1130 follow-up)
Closed
#1130 [SF][perf] analyze latency 5–9s после enable_ird_analyze — кешировать krt по точке (#1102-deeper)
Closed
#1129 [SF][perf] Ускорить §22 forecast — распараллелить 4 горизонта (~4мин → ~1мин)
Closed
#1191 [market-слой] F: GRANT listings для gendesign_reader — unit-level квартиры доступны Site Finder'у запросом
Closed
#976 [SF-v2 #950] 950-E5: Cross-load ETL tradein→gendesign newbuilding
Closed
#1182 [tradein][infra] Вынести scheduler/sweep'ы в отдельный контейнер tradein-scraper (деплой API не убивает скрейпы)
Closed
#962 [site-finder] EPIC 18: Безопасность: роль «аналитик», ACL инсайдов/сделок, аудит-лог
Closed
#951 [site-finder] EPIC 7: Модуль чувствительности к ключевой ставке (§9.6) + макрокоэффициент (§9.5)
Closed
#948 [site-finder] EPIC 4: Сущность «Инсайт» (ручная, ACL) + «Локация» как первый класс
Closed
#1067 [EPIC][ИРД] Слой исходно-разрешительной документации для analyze-таблицы (10 пунктов)
Closed
#1151 pat_subzones: врезка parcel_pat_subzones в analyze + прогон load_koltsovo_pat (#1150 follow-up)
Closed
#1156 genplan_zones_sync: ST_MakeValid для геометрий + backfill 881 битых полигонов (ekb_genplan_functional_zone)
Closed
#1065 [ИРД-9] Приаэродромная территория (Кольцово + Арамиль), подзоны
Closed
#1142 okn_objects: врезка parcel_okn_objects в analyze + Variant B обогащение (#1141 follow-up)
Closed
#1138 genplan функц.зоны: врезка parcel_functional_zones в analyze + per-batch commit (#1137 follow-up)
Closed
#1091 [ИРД][parser] Парсер PDF-постановлений ПАГЕ (проекты межевания/планировки) → перечень ЗУ под изъятие/резервирование
Closed
#1064 [ИРД-8] ООПТ / лесные зоны / водно-болотные (водоохранные) объекты
Closed
#1060 [ИРД-3] КРТ — попадает ли ЗУ в зону комплексного развития территории
Closed
#1059 [ИРД-2] ПЗЗ — ВРИ + предельные параметры (высота/FAR/паркинг)
Closed
#1061 [ИРД-4] Граддокументация (ППТ/ПМТ/ГПЗУ/РНС) + правообладатель и срок права
Closed
#1066 [ИРД-10] ОКН + зоны охраны + ЗРЗ (зоны регулирования застройки)
Closed
#1062 [ИРД-5] Резервирование ЗУ под изъятие
Closed
#1058 [ИРД-1] ГП 2045 — функциональные зоны генплана в analyze
Closed
#1102 [sf] Pre-enablement checklist для enable_ird_analyze (D9b flag)
Closed
#1063 [ИРД-7] Публичные сервитуты
Closed
#959 [site-finder] EPIC 15: Экспорт: DOCX / JSON-report / Markdown / Telegram / презентация
Closed
#975 [SF-v2 #950] 950-E4: gendesign newbuilding_listings таблица + маппинг схемы
Closed
#1086 [SF][future-supply] НСПД opportunity bbox-grid по агломерации ЕКБ (аукцион/свободные/схема/ККР ЗУ)
Closed
#781 [P2][tradein][backend][tests] Quality-gate тесты на P0-баги аудита (anchor n=2, dedup reprice, expected_sold anchor-only, block-page, median=0)
Closed
#1081 [tradein] White-label без logoUrl показывает «Мера»-глиф рядом с именем клиента
Closed
#759 [P2][tradein][backend] avito listings не деактивируются (is_active=true навсегда) → stale раздувает знаменатель coverage
Closed
#575 [tradein][scrapers] N1 Realty integration — scraper class есть, endpoint не подключён
Closed
#859 [tradein][backend] quarter-index: defensive sanity-clamp на factor (follow-up #764)
Closed
#887 [tradein][backend] СберИндекс pull + time-adjust в estimator (impl #794)
Closed
#992 [SF-v2 #961] 961-C1: AnalyzeResponse контракт §22
Closed
#994 [SF-v2 #961] 961-C3: Персист + версионирование прогонов
Closed
#969 [SF-v2 #949] 949-B: Модуль рыночных метрик §9.2
Closed
#979 [SF-v2 #951] 951-C: Нормализация спроса §9.4
Closed
#978 [SF-v2 #951] 951-B: Лаговая регрессия key_rate→спрос §9.6 (Almon/ADL)
Closed
#1057 [ИРД][prereq] Собрать NSPD layer-tree ID для новых ИРД-слоёв (функц.зоны/КРТ/резервирование/ПАТ/зоны охраны ОКН)
Closed
#967 [SF-v2 #945] 945-C: Рыночная ипотечная ставка → временной ряд
Closed
#966 [SF-v2 #945] 945-B: Live-poller макро: CBR key_rate (SOAP) + ипотека (XLSX)
Closed
#965 [SF-v2 #945] 945-A: macro_indicator → data/sql (idempotent DDL)
Closed
#995 [SF-v2 #958] 958-B2: /analyze принимает horizon (6/12/18)
Closed
#968 [SF-v2 #949] 949-A: Вес релевантности конкурентов §9.1 + complex_id join
Closed
#1001 [SF-v2 #958] 958-B5: Починить вход — выбор участка на карте + понятный ввод участка
Closed
#996 [SF-v2 #958] 958-B1: Horizon-селектор компонент
Closed
#998 [SF-v2 #958] 958-B3: Экраны прогноза/сценариев/confidence
Closed
#981 [SF-v2 #952] 952-B: Индексы дефицит/затоварка + MAI §7.9 (рыночная ставка)
Closed
#980 [SF-v2 #952] 952-A: Движок прогноза спрос/предложение 6/12/18 §9.7
Closed
#991 [SF-v2 #955] 955-A5: Excel-экспортёр (real impl)
Closed
#989 [SF-v2 #955] 955-A3: Refactor exporters на SiteFinderReport + unified pdf.py
Closed
#949 [site-finder] EPIC 5: Полная модель релевантности конкурентов + расширенные рыночные метрики
Closed
#970 [SF-v2 #950] 950-A: 3-слойный склад §9.3 (open/hidden/future)
Closed
#993 [SF-v2 #961] 961-C2: analysis_runs таблица + миграция
Closed
#955 [site-finder] EPIC 11: Сборка отчёта/ТЗ + движок уверенности (§15)
Closed
#988 [SF-v2 #955] 955-A2: Report assembler (analyze dict→SiteFinderReport)
Closed
#990 [SF-v2 #955] 955-A4: Confidence engine v2 §15 (структурный rationale)
Closed
#987 [SF-v2 #955] 955-A1: SiteFinderReport структурный объект
Closed
#954 [site-finder] EPIC 10: 3 сценария + продуктовый скоринг (10 scores) + спец-индексы (§25)
Closed
#986 [SF-v2 #954] 954-C: 6 спец-индексов §25 (quick-win: Product Void, Artificial Demand)
Closed
#985 [SF-v2 #954] 954-B: 10 продуктовых скорингов §14.2
Closed
#984 [SF-v2 #954] 954-A: 3 сценария §11 (консерв/база/агрессив)
Closed
#953 [site-finder] EPIC 9: Рекомендательная модель: класс+квартирография+коммерция+УТП (horizon-aware, explainable)
Closed
#983 [SF-v2 #953] 953-B: Класс/коммерция/УТП §10.2/10.4/10.5 + объяснимость §16
Closed
#982 [SF-v2 #953] 953-A: Horizon-aware recommend_mix
Closed
#952 [site-finder] EPIC 8: Прогноз спроса и предложения 6/12/18/24 мес + индексы дефицит/затоварка
Closed
#977 [SF-v2 #951] 951-A: services/forecasting/ scaffold + macro loader §9.5
Closed
#971 [SF-v2 #950] 950-B: Индекс будущего давления предложения
Closed
#945 [site-finder] EPIC 1: Унифицированная сущность «Макропоказатель» + ряд ключевой ставки
Closed
#928 [tradein][backend] Сегментация аналогов/ratio по ppm²-тиру — убрать смешение подрынков (expected_sold недооценка)
Closed
#922 [tradein][backend] sber_index_pull scheduler fails on SSL — sberindex.ru serves an incomplete cert chain (missing Let's Encrypt intermediate)
Closed
#794 [research][tradein][backend] СберИндекс city-index → time-adjustment для замороженных Rosreestr deals (#724/#727)
Closed
#639 🔴 [tradein][вторичка][scrapers] Рефреш Cian session-куки (DMIR_AUTH) — разблокирует cian-каскад
Closed
#901 [tradein][scrapers] Phase 1 — avito на BrowserFetcher (за флагом, default OFF) (#883)
Closed
#581 [tradein][infra] Cron vs in-app scheduler — обсудить переход на Celery или native systemd timer
Closed
#796 [research][tradein] ДомКлик PoC: headless + DataDome (401 на curl_cffi) — отложенный
Closed
#895 [tradein][frontend] Scrapers admin hub page + shared ScraperPage component + settings API fix
Closed
#755 [needs-human][P1][tradein][backend] Same-building anchor фабрикует завышенный headline при n=2 (upward-only, заменяет median/confidence)
Closed
#880 [tradein][backend][scrapers] Per-anchor watchdog timeout в run_*_city_sweep — sweep зависает навсегда
Closed
#879 [qa][analytics] Smoke страницы аналитики (Site Finder) — рендер + endpoints + console/5xx
Closed
#659 [P1][deploy] Выкатить tradein с PR #635 (аккаунт praktika + квота 15/мес) + проверка на проде
Closed
#647 🔴 [tradein][вторичка][analytics] District/quarter price-index — локационная премия в estimator
Closed
#871 [tradein][backend][scrapers] Avito house-link: SERP-карточка JS-only → брать house_url из detail SSR (__preloadedState__)
Closed
#834 [tradein][frontend][a11y] Контраст muted/teal текста <4.5:1 в карточках результата (~20 нод, WCAG AA)
Closed
#849 [P2][tradein][backend][db] #774-2 Dedup домов + matching-sync: UNIQUE(cadastral_number) + merge dupes + double-SAVEPOINT fix (Foundation для cad-join)
Closed
#865 [tradein][qa] Smoke post-merge: N1 scrape + Wave-2 backfill endpoints (#856) + schedules health
Closed
#835 [tradein][frontend][a11y] recharts svg без accessible-text + нет <h1> + пустой <th> (WCAG)
Closed
#855 [tradein][backend][db] Yandex address backfill из <title> → дозаполнить residual street-only listings
Closed
#853 [tradein][backend] avito_imv own-session не через proxy → IMVAuthError(403), IMV-таблицы пусты
Closed
#726 [P1][tradein][backend] avito SERP: listing_date=None у 91.5% — восстановить извлечение даты
Closed
#764 [P0][tradein][вторичка] #647-3 Estimator integration (CLIENT-VISIBLE) — НЕ мержить без зелёного #647-4
Closed
#843 [P1][tradein][scrapers] CIAN SERP fetched=0 — cian-specific (avito-via-proxy=34 OK), мёртв после ~20:06 2026-05-30
Closed
#836 [P1][tradein][backend][scrapers] CIAN SERP-парсер мёртв: descriptionMinhash стал list[int] → pydantic отбраковывает каждый оффер → 0 lots
Closed
#839 [tradein][frontend][a11y] PhotoUpload: input[type=file] без label (CRITICAL, WCAG)
Closed
#827 [tradein][backend] Sentry-алерт на N подряд scraper-фейлов (mark_failed/mark_banned)
Closed
#826 [tradein][backend] N+1 INSERT в _save_yandex_history_items → executemany
Closed
#823 [tradein][scrapers] Avito: детект block/captcha-страниц (HTTP-200) → raise, не «0 lots»
Closed
#821 [P1][tradein][backend][scrapers] base.py ON CONFLICT не персистит listing_date/area_m2 на re-scrape (UPDATE-ветка) — COALESCE-backfill
Closed
#822 [tradein][frontend] Error/not-found UI при восстановлении оценки по ?id=
Closed
#824 [tradein][docs] Актуализировать audits/Tradein_Architecture_Audit_0529 под 2026-05-30
Closed
#623 [tradein][infra][devops] Avito IMV/scrapers — ротация egress IP прод-воркера (#565 follow-up)
Closed
#806 [tradein][backend][scrapers] Проксировать cian-скрейперы (cian.py/cian_detail/cian_session) через mobile proxy
Closed
#763 [P0][tradein][вторичка] #647-4 Backtest gate: MAPE held-out ДКП + canonical A/B (БЛОКИРУЕТ merge integration)
Closed
#799 [tradein][frontend][ux] Pilot-only юзер: авто-redirect на /trade-in/ после входа (вместо «Доступа нет»)
Closed
#396 feat(tradein): #14 — мониторинг через GlitchTip/Sentry
Closed
#795 [tradein][backend] N1 parser: извлекать floor/total_floors (сейчас 0%)
Closed
#762 [P0][tradein][вторичка] #647-2 Schema + refresh: хранить quarter_price_index, cron-refresh
Closed
#770 [P3][tradein][frontend] Resilience/quality хвост аудита: error/empty-UI, 429-handling, WhatIf race, React keys, unsafe cast, freshness, .bak/.gitignore
Closed
#766 [P3][tradein][frontend][security] brand.logo_url без safeUrl + brand-цвета в CSS без валидации
Closed
#760 [P0][tradein][вторичка] #647-1 Foundation: quarter_price_index MV из ДКП (FDW)
Closed
#767 [P3][tradein][backend] asking_to_sold_ratio: хардкод-потолок ppm² 600k выкидывает премиум-сегмент из деривации коэффициента
Closed
#772 [P1][tradein][backend][security] PDF-отчёт: brand-spoof + median=0 «0,0 млн»/фабрикованная таблица потерь + нет дисклеймера + SSRF base_url
Closed
#786 [tradein][ux] MapCard: ДКП-пины не рендерятся + клик по пину аналога не открывает детали
Closed
#768 [P3][tradein][backend] cian verify_session на httpx (TLS-бан Cian) → ложный «cookies expired» алерт оператору
Closed
#773 [P2][tradein][backend] expected_sold пропускается на anchor-only пути (median>0 но expected_sold=NULL у 7.5% прод-оценок)
Closed
#771 [tradein][ux] MapPicker (выбор адреса по карте) перекрывается полосками загрузки источников (SourcesProgress)
Closed
#754 [P2][tradein][backend] Avito content-block (HTTP-200 captcha) маскируется под «end of pagination» — нет parse-failure алерта
Closed
#765 [P2][tradein][frontend][security] ?brand= override перекрывает account-бренд → cross-brand leak (в prod brand должен идти от аккаунта)
Closed
#756 [P2][tradein][backend][security] SSRF: admin scrape-эндпоинты фетчат произвольный URL без host-allowlist + мёртвый ADMIN_TOKEN
Closed
#758 [P2][tradein][backend] cron-scrape.sh падает на tee: Permission denied (set -euo pipefail)
Closed
#757 [P2][tradein][backend] /sales-vs-listings врёт data_quality=«house_linked» из street-матчинга (ломает честность #721)
Closed
#753 [P2][tradein][backend] dedup_hash на волатильном source_url (?context=) → дубли активных listings (Avito)
Closed
#750 [P2][tradein][backend] Scheduler check-then-act без lock → двойной sweep при overlap → риск бана скрейпера
Closed
#748 [P2][tradein][frontend] insufficient_data: «0,00 млн ₽» рендерится в 8 НЕ-headline секциях результата
Closed
#747 [P2][tradein][backend] Quota TOCTOU: атомарный conditional increment вместо check-then-act (пилот превышает 15/мес)
Closed
#742 [P2][tradein][frontend] confidence «средняя» красится success-green; comps-tier substring-парсится из прозы
Closed
#740 [P1][tradein][frontend] HeroSummary: empty-state «недостаточно данных» вместо «0,00 млн ₽» при insufficient_data
Closed
#741 [P2][tradein][frontend] Деление на median=0 → «Infinity%»/«NaN%» в ListingsCard/DealsCard CV и «ниже рынка»
Closed
#695 [tradein][ux] confidence_explanation противоречит счётчикам (шаблонный текст)
Closed
#698 [tradein] n_analogs vs длина analogs[] рассинхрон (массив capped at 10)
Closed
#697 [tradein][ux] median=0 при отсутствии комплов рендерится как «0 ₽» вместо «недостаточно данных»
Closed
#699 [tradein][scrapers] Rosreestr actual_deals содержат выбросы (floor:100, неправдоподобный ppm²)
Closed
#653 [P0] Аудит точности данных: DaData (ключи/квоты/поля) + скраперы Avito/Cian/Yandex
Closed
#727 [P1][backend] rosreestr DKP: сделки заморожены на 2026-01-01 — расследовать источник и обновить
Closed
#722 [P1][tradein][frontend] StreetDealsCard: дисклеймер «по улице, не по дому» при data_quality=street_only
Closed
#724 [needs-human][tradein][data] Temporal blocker linkage: источник ДКП заморожен на 2026-01-01 — решить, размораживать ли bulk Rosreestr ingest
Closed
#728 [P1][tradein][backend][bug] Avito listing_date 100% NULL на проде — диагностировать + починить (temporal linkage killer #2)
Closed
#721 [P1][tradein][backend] /sales-vs-listings: добавить data_quality flag (street_only/no_data) — ADR variant 3
Closed
#693 [tradein] Негеокодируемый адрес возвращает правдоподобную оценку (нет geo-quality gate)
Closed
#717 feat(backend): /health возвращает version приложения
Closed
#714 [TEST] docs: module docstring в backend/app/main.py
Closed
#692 [tradein][ux] Mobile (≤390px): горизонтальный overflow на result — графики/карта/таблицы вылазят
Closed
#694 [tradein][ux] Премиум-итог не подкреплён показанными аналогами (Олимп 13: 207М vs аналоги 41–46М)
Closed
#696 [tradein] GET /estimate/{id} теряет POST-only поля (price_trend/last_scraped_at/avito_imv/dkp_corridor)
Closed
#690 [tradein][security] IDOR: любой пилот читает/скачивает PDF любой оценки по UUID
Closed
#691 [tradein][вторичка] Same-building anchor пропускается при провале геокода → median=0 для домов с комплами
Closed
#666 [tradein][infra][tech-debt] Quality-gate дыры: tradein-mvp вне pre-commit ruff + pytest не в CI/deploy
Closed
#652 [P0] Диапазон цены по ДКП Росреестра — показывать реальный коридор сделок рядом как ориентир
Closed
#651 [P0] Точность диапазона цены: устранить занижение премиум / класс-ЖК / видовых (кейс 50М→реально 100М+)
Closed
#654 [P1][bug] 502 при оценке без полей «этаж» / «всего этажей» — репро + фикс
Closed
#657 [P1] White-label trade-in под «Практику»: цвета/шрифты/лого gk-praktika.ru в веб-UI
Closed
#658 [P2] Текст по окончании лимита → «За полной версией обращайтесь к Копылову» + лимит 15–20 (brand-aware)
Closed
#656 [P1] История по аккаунту: привязать оценку к username + фильтр /history + admin-просмотр (сейчас видны все — data-leak)
Closed
#655 [P1][bug] Rate-limit «Слишком много запросов» бьёт по залогиненным — пропускать X-Authenticated-User / поднять лимит
Closed
#633 scope/backend: noop ping endpoint
Closed
#648 🔴 [tradein][вторичка][analytics] Asking→Sold bias — estimator завышает ~22% vs реальные ДКП-продажи
Closed
#570 [tradein][analytics] Per-source listing history — Phase 0 audit + DDL + writers
Closed
#644 [infra][devops] glitchtip-web healthcheck false-unhealthy (Method Not Allowed /api/0/)
Closed
#578 [tradein][limitation] POI factor — все районы 0.99-1.02 (Sprint 4 не смерджен)
Closed
#561 [tradein][scrapers] Yandex Realty периодический sweep — добавить в scheduler
Closed
#579 [tradein][tech-debt] Mock-bands legacy code removal — PR-8 из 8PR roadmap
Closed
#580 [tradein][tech-debt] Test coverage — estimator IQR/confidence/fallback cascade
Closed
#576 [tradein][tech-debt] dedup_hash plain-text refactor — md5 collision risk в rosreestr
Closed
#636 [tradein][infra][devops] deploy-tradein глотает ошибки миграций + нет tracking (H1)
Closed
#622 [tradein][scrapers] Поднять покрытие listings.repair_state (сейчас avito 1% / cian 5% / yandex 0%)
Closed
#574 [tradein][bug] Velocity per-bucket — миксы статичные + unrealistic значения (0.7 мес / 159 кв/мес)
Closed
#560 [tradein][scrapers] Cian history backfill — переместить в scheduler
Closed
#563 [tradein][scrapers][critical] Rosreestr ДКП автоимпорт после деплоя — сейчас manual shell-скрипт
Closed
#621 [tradein][tech-debt] Нормализовать listings.repair_state → enum (repair v2 prereq)
Closed
#572 [tradein][bug] kn API возвращает obj_class=NULL для всех ЖК — workaround через objective_lots
Closed
#568 [tradein][database] Добавить houses.cian_zhk_url колонку — blocker для Cian newbuilding history backfill
Closed
#573 [tradein][bug] kn flats price_per_m2 заполнен 0.15% — блокирует district median
Closed
#295 fix(mv): mv_layout_velocity unweighted AVG искажает площади/цены в 2-4 раза (P0)
Closed
#567 [tradein][bug] Cian price history таблицы пустые — listings_snapshots / offer_price_history
Closed
#565 [tradein][bug] Avito IMV сломан — merge pending fix/avito-imv-geo-position-3step
Closed
#7 Stage 2a: ПКК Rosreestr парсер + sales_tracker для шахматок
Closed
#566 [tradein][bug] Avito Houses Catalog parser сломан — merge pending fix/avito-houses-preloaded-state-url-encoded
Closed
#569 [tradein][scrapers] Rosreestr ДКП geocoding автоматизация — координаты NULL после импорта
Closed
#571 [tradein][backend] Estimator: вернуть rosreestr_deals в actual_deals (сейчас disabled)
Closed
#577 [tradein][tech-debt] Avito address CSS leak — Emotion .css-* классы в address
Closed
#564 [tradein][analytics] Связать ДКП-сделки Росреестра с listings (Avito/Cian/Yandex) — sales-vs-asks матчинг
Closed
#582 [tradein][bug] Несовпадение адресов: target point / address vs реальность по Яндекс.Картам и 2ГИС
Closed
#67 B3-4: Authentication минимум — NextAuth для продуктовых страниц
Closed
#391 chore(tradein): убрать секреты из sshkey.txt и ротировать
Closed
#415 feat(tradein): выбор адреса на карте ЕКБ
Closed
#399 feat(tradein): #18 — страницы «История» и «Кэш»
Closed
#398 chore(tradein): #17 — visual-проверка PDF-отчёта
Closed
#397 feat(tradein): #15 — бэкап tradein-postgres
Closed
#395 feat(tradein): #12 — CRM-поля в форме оценки
Closed
#394 feat(tradein): #11 — загрузка фото квартиры
Closed
#393 feat(tradein): #10 — кадастр → Росреестр lookup
Closed
#392 feat(tradein): #8 — обогащение house_metadata (картография ЕКБ)
Closed
#390 fix(tradein): cron-scrape 401 — парсинг данных не работает
Closed
#82 B8-2: NorthStar metrics dashboard /admin/dashboard
Closed
#227 fix(#112): competitors avg_price_per_m2 всегда None — WHERE status='sold' filter сломан
Closed
#238 [QA] Celery beat downtime (до 2026-05-16): пропущен еженедельный kn_scrape run 2026-05-12
Closed
#314 feat(trade-in): MVP оценщика вторички на Objective ground truth (P0, UI track)
Closed
#297 feat(scraper): добавить domrf catalog-квартир API — 91% квартир сейчас без цены (P0)
Closed
#271 epic(site-finder): FixList May17 — 20 items consolidation
Closed
#231 [QA] site-finder: "1 предупреждение · нет данных" для всех участков — nspd_quarter_dumps пуста
Closed
#264 bug(#254): useSiteAnalysis не передаёт X-Session-Id → custom POI не учитываются в analyze
Closed
#261 bug(#254): POST /custom-pois возвращает 201 но row не persisted в DB (missing commit?)
Closed
#234 [QA] НСПД данные: harvest_triggered=true но пользователь видит бесконечную загрузку
Closed
#243 bug(#126): harvest_quarter падает psycopg.errors.AmbiguousParameter в INSERT nspd_quarter_dumps
Closed
#242 bug(#104): ekburg_permits_sync SSL CERTIFICATE_VERIFY_FAILED для xn--80acgfbsl1azdqr.xn--p1ai (екатеринбург.рф)
Closed
#233 [QA] Зонирование ПЗЗ недоступно — pzz_zones_ekb пуста (sync задача не запускалась)
Closed
#30 Gate G3: ЗОУИТ overlay (санзоны/охранные/ЛЭП/газ/затопление)
Closed
#104 Open Data Свердл: 1037 datasets из open.midural.ru — РНС / школы / транспорт / дороги
Closed
#235 [QA] Природные риски "Не обнаружены" — nspd_risk_zones: [] из-за пустой nspd_quarter_dumps
Closed
#53 B2B-каналы для site-finder данных — координация с Максом
Closed
#12 Stage 1b: Жадный алгоритм размещения, 3 стратегии, STRtree
Closed
#6 Stage 1c: ТЭП + финансовая модель + экспорты PDF/Excel/DXF
Closed
#5 Stage 1a: Shapely-сервис — отступы, сетка, API-контракт
Closed
#3 Настроить ежесуточный pg_dump → S3 (Selectel или Yandex Object Storage)
Closed
#26 Site Finder v3.1: cad_parcels_geom + POI markers on map + extended OSM coverage
Closed
#43 Infra I2: Per-class weight profile (эконом / комфорт / бизнес)
Closed
#51 Extra E1: Массовый импорт cad_parcels_geom (parcel-level геометрия)
Closed
#74 B5-4: Naполнение pzz_zones_ekb (foundation для G1)
Closed
#127 🔧 Code review audit batch (May 14) — fixes umbrella
Closed
#202 feat(site-finder): NSPD frontend integration — ПЗЗ зоны / ЗОУИТ / engineering nearby в LandTab
Closed
#204 infra: развернуть стек MCP-серверов (GlitchTip + Redis ACL + .claude/mcp.json)
Closed
#197 test-infra: add real-DB integration test gate for site_finder services
Closed
#201 feat(weights): finish #114 Custom POI weights — inline pass-through + Edit/Delete UI + live preview
Closed
#203 data: backfill objective_complex_mapping (114→~2000 EKB ЖК) для повышения mv_layout_velocity coverage
Closed
#105 🎯 Реестры РНС/РВЭ ЕКБ 2022-2026 (xlsx, актуальные) — екатеринбург.рф
Closed
#33 Demand D1: mv_quarter_price_per_m2 из rosreestr_deals (6.83M ДДУ)
Closed
#112 Demand: Активные конкуренты — анализ продаж ЖК в радиусе 1км за квартал (cad → топ конкурентов)
Closed
#113 Generative: Анализ лучших планировок конкурентов → ТЗ на проектирование (Phase 2 после #112)
Closed
#161 📊 Velocity per-room breakdown (студия/1/2/3/4+)
Closed
#162 🏷️ Pipeline 24mo obj_class enrichment via objective_lots (fix 'Не указан: 4075')
Closed
#156 🔄 Migrate velocity + analytics_queries: domrf_kn_sale_graph → objective_corpus_room_month
Closed
#150 🚨 Auto-apply data/sql migrations + fix NN collision (root cause 500 ошибки)
Closed
#34 Demand D2: Velocity-score из domrf_kn_sale_graph по аналогам в радиусе
Closed
#144 🟠 #34 D2 Velocity-score — sub-PR 1/2 backend service
Closed
#32 Gate G5: API/Schema/UI «Gate Verdict» (verdict block + crisis-banner)
Closed
#140 🟢 #32 G5 Gate Verdict UI — sub-PR 1/2 backend aggregator
Closed
#114 UX: Настраиваемые веса POI (садик ≠ Мегамарт) — custom user profiles (расширяет #43)
Closed
#134 ♻️ refactor: split celery_app.py — extract beat_schedule + lifecycle modules
Closed
#129 ♻️ refactor: frontend DRY — SectionLabel + EmptyState + adminStyles.ts
Closed
#128 ♻️ refactor: extract _check_token to app/core/deps.py (DRY 3 admin endpoints)
Closed
#130 🔒 security: renderMarkdown URL validation (javascript: edge case XSS)
Closed
#101 NSPD theme 99 mega-catalog: region-filter + ETL (4531 слоёв = water/heat/gas/электр/СЗЗ/ГПЗУ/затопление от МО)
Closed
#93 Site Finder UX: Auto-fetch cadastre geometry on-demand (404 → NSPD fallback)
Closed
#36 Demand D4: Project pipeline 5км — конкуренция за покупателя 24mo
Closed
#47 UX X1: Score explanation breakdown + verbal explain (per-factor)
Closed
#45 Geom P1: Polygon suitability score (площадь, форма, convexity)
Closed
#46 Geom P2: cad_buildings соседи-высотки + overlap check на участке
Closed
#48 UX X2: Confidence score (data freshness + coverage)
Closed
#21 Stage 2: использовать cad_buildings в Site Finder фильтрах ('соседи-высотки 50K+ ₽/м² кадастра')
Closed
#19 Analytics: конкурентный 360 — топ ближайших ЖК по геометрии для нового проекта
Closed
#27 Site Finder v4: ВРИ + ПЗЗ + OSRM-изохроны + ВСЕГЕИ-shapefiles + real ЗОУИТ
Closed
#25 recommend_mix v3.4: success-driven mix — рекомендация на базе 'что хорошо продавалось'
Closed
#24 recommend_mix v3.3: hard-cap window 24 мес + предупреждение о свежести данных
Closed
#23 recommend_mix v3.2: конкуренты двумерно — расстояние И принадлежность к району
Closed
#22 recommend_mix v3.1: соц-инфраструктура с весом близости и hard-cap по границам района
Closed
#8 Stage 2b: Скоринг + API + UI Site Finder
Closed
#18 Bug: ekb_districts.median_price_per_m2 NULL для половины районов — пересчитать из rosreestr
Closed
#4 Добавить SENTRY_RELEASE в deploy.yml для tracking релизов
Closed
#11 Подключить Антона к knowledge-graph (Claude Desktop + MCP)
Closed
#14 Импорт PRINZIP CRM SQLite (49 MB, 102K заявок) для conversion-аналитики
Closed
#15 API endpoints /api/v1/analytics/object/{id}/{sale_graph,sales_agg,infra,photos}
Closed
#13 Расширить kn-scraper на 442 строящихся ЖК Свердл (после PRINZIP probe)
Closed
#16 Multi-target Dockerfile: Chromium только в worker/beat образе (-200 МБ с backend)
Closed
#10 Plan A vs Original: решение по ДДУ-данным после встречи с Антоном
Closed
#2 Запушить deploy.yml после пропагации DNS
Closed
#1 Пройти ЕСИА-верификацию для домена gendsgn.ru
983 issues created by 4 users
Opened
#1 Пройти ЕСИА-верификацию для домена gendsgn.ru
Opened
#2 Запушить deploy.yml после пропагации DNS
Opened
#3 Настроить ежесуточный pg_dump → S3 (Selectel или Yandex Object Storage)
Opened
#4 Добавить SENTRY_RELEASE в deploy.yml для tracking релизов
Opened
#5 Stage 1a: Shapely-сервис — отступы, сетка, API-контракт
Opened
#6 Stage 1c: ТЭП + финансовая модель + экспорты PDF/Excel/DXF
Opened
#7 Stage 2a: ПКК Rosreestr парсер + sales_tracker для шахматок
Opened
#8 Stage 2b: Скоринг + API + UI Site Finder
Opened
#9 Stage 2c: Интеграция Site Finder ↔ Generative + подача в реестр ПО
Opened
#10 Plan A vs Original: решение по ДДУ-данным после встречи с Антоном
Opened
#11 Подключить Антона к knowledge-graph (Claude Desktop + MCP)
Opened
#12 Stage 1b: Жадный алгоритм размещения, 3 стратегии, STRtree
Opened
#13 Расширить kn-scraper на 442 строящихся ЖК Свердл (после PRINZIP probe)
Opened
#14 Импорт PRINZIP CRM SQLite (49 MB, 102K заявок) для conversion-аналитики
Opened
#15 API endpoints /api/v1/analytics/object/{id}/{sale_graph,sales_agg,infra,photos}
Opened
#16 Multi-target Dockerfile: Chromium только в worker/beat образе (-200 МБ с backend)
Opened
#17 Analytics: velocity-anomaly detection — алерт на ЖК с сильным провалом продаж
Opened
#18 Bug: ekb_districts.median_price_per_m2 NULL для половины районов — пересчитать из rosreestr
Opened
#19 Analytics: конкурентный 360 — топ ближайших ЖК по геометрии для нового проекта
Opened
#20 Analytics: mortgage-rate sensitivity — 'что будет, если ставка вырастет на 1pp?'
Opened
#21 Stage 2: использовать cad_buildings в Site Finder фильтрах ('соседи-высотки 50K+ ₽/м² кадастра')
Opened
#22 recommend_mix v3.1: соц-инфраструктура с весом близости и hard-cap по границам района
Opened
#23 recommend_mix v3.2: конкуренты двумерно — расстояние И принадлежность к району
Opened
#24 recommend_mix v3.3: hard-cap window 24 мес + предупреждение о свежести данных
Opened
#25 recommend_mix v3.4: success-driven mix — рекомендация на базе 'что хорошо продавалось'
Opened
#26 Site Finder v3.1: cad_parcels_geom + POI markers on map + extended OSM coverage
Opened
#27 Site Finder v4: ВРИ + ПЗЗ + OSRM-изохроны + ВСЕГЕИ-shapefiles + real ЗОУИТ
Opened
#28 Gate G1: Импорт ПЗЗ ЕКБ shape → pzz_zones_ekb
Opened
#29 Gate G2: Парсер ВРИ + категория земель из НСПД per cad
Opened
#30 Gate G3: ЗОУИТ overlay (санзоны/охранные/ЛЭП/газ/затопление)
Opened
#31 Gate G4: Extract max_floors / FAR / parking из pzz_zones_ekb.raw_props
Opened
#32 Gate G5: API/Schema/UI «Gate Verdict» (verdict block + crisis-banner)
Opened
#33 Demand D1: mv_quarter_price_per_m2 из rosreestr_deals (6.83M ДДУ)
Opened
#34 Demand D2: Velocity-score из domrf_kn_sale_graph по аналогам в радиусе
Opened
#35 Demand D3: Absorption rate / прогноз месяцев до распродажи 80%
Opened
#36 Demand D4: Project pipeline 5км — конкуренция за покупателя 24mo
Opened
#37 Demand D5: Buyer affordability index (CRM PRINZIP + CBR + rosreestr_deals)
Opened
#38 Demand D6: Класс жилья normalization через yandex_realty (fallback obj_class)
Opened
#39 Access A1: OSRM-докер + osm.pbf Свердл (routing-engine infra)
Opened
#40 Access A2: Endpoint /parcels/{cad}/isochrones (walk/car 10/15/30 мин) + UI
Opened
#41 Access A3: Per-category routing-radius decay (closes Limit_POI_Factor_Tiny)
Opened
#42 Infra I1: POI saturation per capita (Росстат демография по районам)
Opened
#43 Infra I2: Per-class weight profile (эконом / комфорт / бизнес)
Opened
#44 Infra I3: Инженерные сети из OSM (вода/канал/электр/газ) — utility distance
Opened
#45 Geom P1: Polygon suitability score (площадь, форма, convexity)
Opened
#46 Geom P2: cad_buildings соседи-высотки + overlap check на участке
Opened
#47 UX X1: Score explanation breakdown + verbal explain (per-factor)
Opened
#48 UX X2: Confidence score (data freshness + coverage)
Opened
#49 UX X3: PDF export «Site Analysis Report» (WeasyPrint)
Opened
#50 UX X4: Multi-cad сравнение (2-5 участков side-by-side)
Opened
#51 Extra E1: Массовый импорт cad_parcels_geom (parcel-level геометрия)
Opened
#52 Extra E2: B2B integration registry (вопросы для Макса)
Opened
#53 B2B-каналы для site-finder данных — координация с Максом
Opened
#54 B1-1: Generative Stage 1a — Shapely-парсер + placement grid
Opened
#55 B1-2: Generative Stage 1b — Greedy алгоритм + STRtree коллизии
Opened
#56 B1-3: Generative Stage 1c — TEAP + финмодель + PDF/Excel/DXF
Opened
#57 B1-4: Concept UI — фронт от полигона до вариантов и экспортов
Opened
#58 B1-5: Реестр ПО — подготовка заявки (60-180 дней рассмотрения!)
Opened
#59 B1-6: Pilot tracker / коммерческая воронка (50 leads → 3 пилота)
Opened
#60 B2-1: Sales Tracker v1 — шахматки 3-5 застройщиков ЕКБ
Opened
#61 B2-2: Velocity MV для Site Finder + Generative (на данных B2-1)
Opened
#62 B2-3: PRINZIP CRM — автоматизация стратегических инсайтов
Opened
#63 B2-4: Объектив coverage аудит + расширение групп если <70%
Opened
#64 B3-1: Landing page редизайн — B2B value prop + CTA flow
Opened
#65 B3-2: Analytics dashboard — поиск + drill-down + cross-links
Opened
#66 B3-3: Mobile responsiveness — Leaflet + ECharts на планшете
Opened
#67 B3-4: Authentication минимум — NextAuth для продуктовых страниц
Opened
#68 B4-1: Test coverage — критичные пути (recommend / analyze / concepts)
Opened
#69 B4-2: OpenAPI / TS codegen — добавить в CI assert
Opened
#70 B4-3: Performance аудит — Sentry Tracing + EXPLAIN slow queries
Opened
#71 B5-1: Backup cron + S3 — СРОЧНО (риск потери 6.83M ДДУ)
Opened
#72 B5-2: Alembic vs raw SQL — синхронизация состояния схемы
Opened
#73 B5-3: Data freshness monitoring — dashboard + alerts
Opened
#74 B5-4: Naполнение pzz_zones_ekb (foundation для G1)
Opened
#75 B6-1: Uptime monitoring — Uptime Kuma / healthcheck.io
Opened
#76 B6-2: VPS resources аудит — capacity headroom для пилотов
Opened
#77 B6-3: Frontend build cache — npm + Turborepo remote
Opened
#78 B6-4: Secrets rotation policy + procedure documentation
Opened
#79 B7-1: 152-ФЗ — аудит кода на PII в logs / Sentry / БД
Opened
#80 B7-2: License / ToS audit — OSM ODbL, Объектив, DOM.РФ, Open-Meteo
Opened
#81 B8-1: Product analytics — PostHog self-hosted EU
Opened
#82 B8-2: NorthStar metrics dashboard /admin/dashboard
Opened
#83 B9-1: README — обновить под актуальное состояние + quick start
Opened
#93 Site Finder UX: Auto-fetch cadastre geometry on-demand (404 → NSPD fallback)
Opened
#94 NSPD API client: единый интегратор слоёв (foundation для G1/G2/G3/E1/#93)
Opened
#96 Demand: Помещения ЕГРН (38489) + Машино-места (38490) — per-flat cross-check + parking ratio
Opened
#97 UX: Deep-links на сервисы НСПД из Site Finder (Open on ПКК, верификация)
Opened
#99 Demand: «Индикатор цен ДДУ» — применить ARN-framework НСПД к нашим первичным данным
Opened
#100 UX: Differentiation от НСПД (сравнительная таблица + deep-links + footers)
Opened
#101 NSPD theme 99 mega-catalog: region-filter + ETL (4531 слоёв = water/heat/gas/электр/СЗЗ/ГПЗУ/затопление от МО)
Opened
#102 Site Finder: WMS-overlay инженерных сетей НСПД на Leaflet карте (low-effort MVP)
Opened
#103 Engineering networks: Hybrid plan (ФГИС ТП XSD + ИСОГД + Водоканал ЕКБ) — альтернативные источники
Opened
#104 Open Data Свердл: 1037 datasets из open.midural.ru — РНС / школы / транспорт / дороги
Opened
#105 🎯 Реестры РНС/РВЭ ЕКБ 2022-2026 (xlsx, актуальные) — екатеринбург.рф
Opened
#106 ФГИС ТП Минэк: Функциональные зоны (846615) federal Генплан — bbox tiling для ЕКБ
Opened
#107 ekburg.ru/isogd direct scraper: РНС/ППТ/ГПЗУ для ЕКБ-city
Opened
#108 РИАСУРТ Свердл: 14 ключевых layerIds для агломерации ЕКБ (multi-city scaling)
Opened
#112 Demand: Активные конкуренты — анализ продаж ЖК в радиусе 1км за квартал (cad → топ конкурентов)
Opened
#113 Generative: Анализ лучших планировок конкурентов → ТЗ на проектирование (Phase 2 после #112)
Opened
#114 UX: Настраиваемые веса POI (садик ≠ Мегамарт) — custom user profiles (расширяет #43)
Opened
#115 🔌 Engineering: Точки подключения к сетям + параметры (KILLER FEATURE от Макса)
Opened
#126 🐛 NSPD WMS GetFeatureInfo НЕ bulk — Sprint 2 grid sampling fix
Opened
#127 🔧 Code review audit batch (May 14) — fixes umbrella
Opened
#128 ♻️ refactor: extract _check_token to app/core/deps.py (DRY 3 admin endpoints)
Opened
#129 ♻️ refactor: frontend DRY — SectionLabel + EmptyState + adminStyles.ts
Opened
#130 🔒 security: renderMarkdown URL validation (javascript: edge case XSS)
Opened
#134 ♻️ refactor: split celery_app.py — extract beat_schedule + lifecycle modules
Opened
#140 🟢 #32 G5 Gate Verdict UI — sub-PR 1/2 backend aggregator
Opened
#144 🟠 #34 D2 Velocity-score — sub-PR 1/2 backend service
Opened
#150 🚨 Auto-apply data/sql migrations + fix NN collision (root cause 500 ошибки)
Opened
#156 🔄 Migrate velocity + analytics_queries: domrf_kn_sale_graph → objective_corpus_room_month
Opened
#161 📊 Velocity per-room breakdown (студия/1/2/3/4+)
Opened
#162 🏷️ Pipeline 24mo obj_class enrichment via objective_lots (fix 'Не указан: 4075')
Opened
#168 Bulk cadastre ingest ЕКБ — 2408 кварталов через NSPD
Opened
#197 test-infra: add real-DB integration test gate for site_finder services
Opened
#200 cadastre: докачать geom для 932 участков (371 квартал) из job 20
Opened
#201 feat(weights): finish #114 Custom POI weights — inline pass-through + Edit/Delete UI + live preview
Opened
#202 feat(site-finder): NSPD frontend integration — ПЗЗ зоны / ЗОУИТ / engineering nearby в LandTab
Opened
#203 data: backfill objective_complex_mapping (114→~2000 EKB ЖК) для повышения mv_layout_velocity coverage
Opened
#204 infra: развернуть стек MCP-серверов (GlitchTip + Redis ACL + .claude/mcp.json)
Opened
#227 fix(#112): competitors avg_price_per_m2 всегда None — WHERE status='sold' filter сломан
Opened
#231 [QA] site-finder: "1 предупреждение · нет данных" для всех участков — nspd_quarter_dumps пуста
Opened
#232 [QA] ЗОУИТ "Нет пересечений" — cad_zouit имеет данные, но analyze их не использует
Opened
#233 [QA] Зонирование ПЗЗ недоступно — pzz_zones_ekb пуста (sync задача не запускалась)
Opened
#234 [QA] НСПД данные: harvest_triggered=true но пользователь видит бесконечную загрузку
Opened
#235 [QA] Природные риски "Не обнаружены" — nspd_risk_zones: [] из-за пустой nspd_quarter_dumps
Opened
#236 [QA] analytics/recommend: ипотечная ставка показывает "Январь 2026" — данные 4+ месяца назад
Opened
#237 [QA] analytics/recommend: нет индикатора актуальности данных (last_updated)
Opened
#238 [QA] Celery beat downtime (до 2026-05-16): пропущен еженедельный kn_scrape run 2026-05-12
Opened
#242 bug(#104): ekburg_permits_sync SSL CERTIFICATE_VERIFY_FAILED для xn--80acgfbsl1azdqr.xn--p1ai (екатеринбург.рф)
Opened
#243 bug(#126): harvest_quarter падает psycopg.errors.AmbiguousParameter в INSERT nspd_quarter_dumps
Opened
#244 bug(#232): cad_zouit fallback не срабатывает когда nspd_quarter_dumps вообще пуст (regression PR #240)
Opened
#251 bug(backend): GET /api/v1/parcels/{cad} возвращает 501 "Not implemented yet" — удалить или реализовать
Opened
#252 bug(scrapers): NspdLiteError HTTP 500 на nspd.gov.ru WMS — нужна retry policy для transient ошибок
Opened
#253 bug(frontend): React error #418 hydration mismatch на /admin/scrape/cadastre
Opened
#254 feat(site-finder): Ad-hoc custom POI с весом — пользователь добавляет свою точку на карту (требование Макса)
Opened
#255 feat(#232): ЗОУИТ visual layer на Leaflet карте — схематичные полигоны охранных зон (требование Макса)
Opened
#256 feat(#126): Sub-PR B — интегрировать grid sampling в harvest_quarter (single-pixel WMS fix)
Opened
#259 bug(#233): pzz_sync — pkk.rosreestr.ru PKK6 deprecated, мигрировать на NSPD WMS (territorial_zones)
Opened
#261 bug(#254): POST /custom-pois возвращает 201 но row не persisted в DB (missing commit?)
Opened
#263 epic(infra): NSPD unify — Вариант B consolidation (cadastre as single scraper)
Opened
#264 bug(#254): useSiteAnalysis не передаёт X-Session-Id → custom POI не учитываются в analyze
Opened
#271 epic(site-finder): FixList May17 — 20 items consolidation
Opened
#295 fix(mv): mv_layout_velocity unweighted AVG искажает площади/цены в 2-4 раза (P0)
Opened
#297 feat(scraper): добавить domrf catalog-квартир API — 91% квартир сейчас без цены (P0)
Opened
#299 feat(plans): vectorize DOM.РФ floor plans — Phase 1 Potrace spike (P0)
Opened
#300 feat(plans): semantic floor plan vectorization — Phase 2 (CubiCasa5K)
Opened
#301 feat(generative): reverse-train generative engine on real DOM.РФ plans — Phase 3
Opened
#307 feat(objective): активировать data goldmine — 303k lots, 81% цен, mapping backfill (P0)
Opened
#314 feat(trade-in): MVP оценщика вторички на Objective ground truth (P0, UI track)
Opened
#390 fix(tradein): cron-scrape 401 — парсинг данных не работает
Opened
#391 chore(tradein): убрать секреты из sshkey.txt и ротировать
Opened
#392 feat(tradein): #8 — обогащение house_metadata (картография ЕКБ)
Opened
#393 feat(tradein): #10 — кадастр → Росреестр lookup
Opened
#394 feat(tradein): #11 — загрузка фото квартиры
Opened
#396 feat(tradein): #14 — мониторинг через GlitchTip/Sentry
Opened
#395 feat(tradein): #12 — CRM-поля в форме оценки
Opened
#397 feat(tradein): #15 — бэкап tradein-postgres
Opened
#398 chore(tradein): #17 — visual-проверка PDF-отчёта
Opened
#399 feat(tradein): #18 — страницы «История» и «Кэш»
Opened
#400 feat(tradein): #3 — источник ДомКлик
Opened
#401 feat(tradein): #5 — источник Дом.РФ
Opened
#402 feat(tradein): #13 — Yandex Geocoder API-ключ
Opened
#415 feat(tradein): выбор адреса на карте ЕКБ
Opened
#427 [low] basic_auth: расширить username regex под john.doe / jane_smith
Opened
#428 [low] docs/PILOT_ACCESS.md: заменить claudestars@proton.me на role-mailbox
Opened
#429 [low] basic_auth: list_users.sh fragile regex (может матчить комментарии)
Opened
#446 epic(infra): Pilot infra status 2026-05-23 — после security pivot
Opened
#559 [EPIC][tradein] Полная автоматизация scrapers с persistence через redeploy
Opened
#560 [tradein][scrapers] Cian history backfill — переместить в scheduler
Opened
#562 [tradein][scrapers] Avito IMV + Houses batch enrichment после city sweep
Opened
#561 [tradein][scrapers] Yandex Realty периодический sweep — добавить в scheduler
Opened
#565 [tradein][bug] Avito IMV сломан — merge pending fix/avito-imv-geo-position-3step
Opened
#563 [tradein][scrapers][critical] Rosreestr ДКП автоимпорт после деплоя — сейчас manual shell-скрипт
Opened
#564 [tradein][analytics] Связать ДКП-сделки Росреестра с listings (Avito/Cian/Yandex) — sales-vs-asks матчинг
Opened
#568 [tradein][database] Добавить houses.cian_zhk_url колонку — blocker для Cian newbuilding history backfill
Opened
#567 [tradein][bug] Cian price history таблицы пустые — listings_snapshots / offer_price_history
Opened
#569 [tradein][scrapers] Rosreestr ДКП geocoding автоматизация — координаты NULL после импорта
Opened
#566 [tradein][bug] Avito Houses Catalog parser сломан — merge pending fix/avito-houses-preloaded-state-url-encoded
Opened
#572 [tradein][bug] kn API возвращает obj_class=NULL для всех ЖК — workaround через objective_lots
Opened
#570 [tradein][analytics] Per-source listing history — Phase 0 audit + DDL + writers
Opened
#571 [tradein][backend] Estimator: вернуть rosreestr_deals в actual_deals (сейчас disabled)
Opened
#573 [tradein][bug] kn flats price_per_m2 заполнен 0.15% — блокирует district median
Opened
#577 [tradein][tech-debt] Avito address CSS leak — Emotion .css-* классы в address
Opened
#576 [tradein][tech-debt] dedup_hash plain-text refactor — md5 collision risk в rosreestr
Opened
#574 [tradein][bug] Velocity per-bucket — миксы статичные + unrealistic значения (0.7 мес / 159 кв/мес)
Opened
#575 [tradein][scrapers] N1 Realty integration — scraper class есть, endpoint не подключён
Opened
#578 [tradein][limitation] POI factor — все районы 0.99-1.02 (Sprint 4 не смерджен)
Opened
#579 [tradein][tech-debt] Mock-bands legacy code removal — PR-8 из 8PR roadmap
Opened
#581 [tradein][infra] Cron vs in-app scheduler — обсудить переход на Celery или native systemd timer
Opened
#580 [tradein][tech-debt] Test coverage — estimator IQR/confidence/fallback cascade
Opened
#582 [tradein][bug] Несовпадение адресов: target point / address vs реальность по Яндекс.Картам и 2ГИС
Opened
#622 [tradein][scrapers] Поднять покрытие listings.repair_state (сейчас avito 1% / cian 5% / yandex 0%)
Opened
#621 [tradein][tech-debt] Нормализовать listings.repair_state → enum (repair v2 prereq)
Opened
#623 [tradein][infra][devops] Avito IMV/scrapers — ротация egress IP прод-воркера (#565 follow-up)
Opened
#633 scope/backend: noop ping endpoint
Opened
#636 [tradein][infra][devops] deploy-tradein глотает ошибки миграций + нет tracking (H1)
Opened
#639 🔴 [tradein][вторичка][scrapers] Рефреш Cian session-куки (DMIR_AUTH) — разблокирует cian-каскад
Opened
#644 [infra][devops] glitchtip-web healthcheck false-unhealthy (Method Not Allowed /api/0/)
Opened
#647 🔴 [tradein][вторичка][analytics] District/quarter price-index — локационная премия в estimator
Opened
#648 🔴 [tradein][вторичка][analytics] Asking→Sold bias — estimator завышает ~22% vs реальные ДКП-продажи
Opened
#652 [P0] Диапазон цены по ДКП Росреестра — показывать реальный коридор сделок рядом как ориентир
Opened
#655 [P1][bug] Rate-limit «Слишком много запросов» бьёт по залогиненным — пропускать X-Authenticated-User / поднять лимит
Opened
#651 [P0] Точность диапазона цены: устранить занижение премиум / класс-ЖК / видовых (кейс 50М→реально 100М+)
Opened
#653 [P0] Аудит точности данных: DaData (ключи/квоты/поля) + скраперы Avito/Cian/Yandex
Opened
#654 [P1][bug] 502 при оценке без полей «этаж» / «всего этажей» — репро + фикс
Opened
#657 [P1] White-label trade-in под «Практику»: цвета/шрифты/лого gk-praktika.ru в веб-UI
Opened
#658 [P2] Текст по окончании лимита → «За полной версией обращайтесь к Копылову» + лимит 15–20 (brand-aware)
Opened
#656 [P1] История по аккаунту: привязать оценку к username + фильтр /history + admin-просмотр (сейчас видны все — data-leak)
Opened
#659 [P1][deploy] Выкатить tradein с PR #635 (аккаунт praktika + квота 15/мес) + проверка на проде
Opened
#666 [tradein][infra][tech-debt] Quality-gate дыры: tradein-mvp вне pre-commit ruff + pytest не в CI/deploy
Opened
#667 [tradein][analytics] Point-in-time backtest estimator через listing_source_snapshots (#570)
Opened
#690 [tradein][security] IDOR: любой пилот читает/скачивает PDF любой оценки по UUID
Opened
#692 [tradein][ux] Mobile (≤390px): горизонтальный overflow на result — графики/карта/таблицы вылазят
Opened
#693 [tradein] Негеокодируемый адрес возвращает правдоподобную оценку (нет geo-quality gate)
Opened
#691 [tradein][вторичка] Same-building anchor пропускается при провале геокода → median=0 для домов с комплами
Opened
#696 [tradein] GET /estimate/{id} теряет POST-only поля (price_trend/last_scraped_at/avito_imv/dkp_corridor)
Opened
#694 [tradein][ux] Премиум-итог не подкреплён показанными аналогами (Олимп 13: 207М vs аналоги 41–46М)
Opened
#697 [tradein][ux] median=0 при отсутствии комплов рендерится как «0 ₽» вместо «недостаточно данных»
Opened
#698 [tradein] n_analogs vs длина analogs[] рассинхрон (массив capped at 10)
Opened
#695 [tradein][ux] confidence_explanation противоречит счётчикам (шаблонный текст)
Opened
#699 [tradein][scrapers] Rosreestr actual_deals содержат выбросы (floor:100, неправдоподобный ppm²)
Opened
#714 [TEST] docs: module docstring в backend/app/main.py
Opened
#717 feat(backend): /health возвращает version приложения
Opened
#721 [P1][tradein][backend] /sales-vs-listings: добавить data_quality flag (street_only/no_data) — ADR variant 3
Opened
#722 [P1][tradein][frontend] StreetDealsCard: дисклеймер «по улице, не по дому» при data_quality=street_only
Opened
#724 [needs-human][tradein][data] Temporal blocker linkage: источник ДКП заморожен на 2026-01-01 — решить, размораживать ли bulk Rosreestr ingest
Opened
#727 [P1][backend] rosreestr DKP: сделки заморожены на 2026-01-01 — расследовать источник и обновить
Opened
#726 [P1][tradein][backend] avito SERP: listing_date=None у 91.5% — восстановить извлечение даты
Opened
#728 [P1][tradein][backend][bug] Avito listing_date 100% NULL на проде — диагностировать + починить (temporal linkage killer #2)
Opened
#730 [tradein][db][tech-debt] Index hygiene — дубли + 87 unused + бессмысленные партиалы (~42 МБ)
Opened
#731 [tradein][db][tech-debt] Stale stats (ANALYZE никогда) + чистка мёртвой схемы
Opened
#732 [tradein][db][tech-debt] Унификация кадастровой колонки kadastr_num → cadastral_number
Opened
#736 [P1][tradein][qa] Pre-demo consolidated acceptance: milestone-6 estimator/data-quality фиксы вместе на проде
Opened
#740 [P1][tradein][frontend] HeroSummary: empty-state «недостаточно данных» вместо «0,00 млн ₽» при insufficient_data
Opened
#741 [P2][tradein][frontend] Деление на median=0 → «Infinity%»/«NaN%» в ListingsCard/DealsCard CV и «ниже рынка»
Opened
#742 [P2][tradein][frontend] confidence «средняя» красится success-green; comps-tier substring-парсится из прозы
Opened
#747 [P2][tradein][backend] Quota TOCTOU: атомарный conditional increment вместо check-then-act (пилот превышает 15/мес)
Opened
#748 [P2][tradein][frontend] insufficient_data: «0,00 млн ₽» рендерится в 8 НЕ-headline секциях результата
Opened
#750 [P2][tradein][backend] Scheduler check-then-act без lock → двойной sweep при overlap → риск бана скрейпера
Opened
#753 [P2][tradein][backend] dedup_hash на волатильном source_url (?context=) → дубли активных listings (Avito)
Opened
#754 [P2][tradein][backend] Avito content-block (HTTP-200 captcha) маскируется под «end of pagination» — нет parse-failure алерта
Opened
#755 [needs-human][P1][tradein][backend] Same-building anchor фабрикует завышенный headline при n=2 (upward-only, заменяет median/confidence)
Opened
#756 [P2][tradein][backend][security] SSRF: admin scrape-эндпоинты фетчат произвольный URL без host-allowlist + мёртвый ADMIN_TOKEN
Opened
#757 [P2][tradein][backend] /sales-vs-listings врёт data_quality=«house_linked» из street-матчинга (ломает честность #721)
Opened
#758 [P2][tradein][backend] cron-scrape.sh падает на tee: Permission denied (set -euo pipefail)
Opened
#759 [P2][tradein][backend] avito listings не деактивируются (is_active=true навсегда) → stale раздувает знаменатель coverage
Opened
#760 [P0][tradein][вторичка] #647-1 Foundation: quarter_price_index MV из ДКП (FDW)
Opened
#762 [P0][tradein][вторичка] #647-2 Schema + refresh: хранить quarter_price_index, cron-refresh
Opened
#763 [P0][tradein][вторичка] #647-4 Backtest gate: MAPE held-out ДКП + canonical A/B (БЛОКИРУЕТ merge integration)
Opened
#764 [P0][tradein][вторичка] #647-3 Estimator integration (CLIENT-VISIBLE) — НЕ мержить без зелёного #647-4
Opened
#765 [P2][tradein][frontend][security] ?brand= override перекрывает account-бренд → cross-brand leak (в prod brand должен идти от аккаунта)
Opened
#766 [P3][tradein][frontend][security] brand.logo_url без safeUrl + brand-цвета в CSS без валидации
Opened
#767 [P3][tradein][backend] asking_to_sold_ratio: хардкод-потолок ppm² 600k выкидывает премиум-сегмент из деривации коэффициента
Opened
#768 [P3][tradein][backend] cian verify_session на httpx (TLS-бан Cian) → ложный «cookies expired» алерт оператору
Opened
#769 [P3][tradein][backend] Data-layer/op хвост аудита: trgm-индекс на deals.address, FDW fetch_size, matview-refresh, cian-unescape, address-centroid
Opened
#770 [P3][tradein][frontend] Resilience/quality хвост аудита: error/empty-UI, 429-handling, WhatIf race, React keys, unsafe cast, freshness, .bak/.gitignore
Opened
#771 [tradein][ux] MapPicker (выбор адреса по карте) перекрывается полосками загрузки источников (SourcesProgress)
Opened
#772 [P1][tradein][backend][security] PDF-отчёт: brand-spoof + median=0 «0,0 млн»/фабрикованная таблица потерь + нет дисклеймера + SSRF base_url
Opened
#773 [P2][tradein][backend] expected_sold пропускается на anchor-only пути (median>0 но expected_sold=NULL у 7.5% прод-оценок)
Opened
#774 [needs-human][P2][tradein][backend] Matching-subsystem мёртв для оценки — estimator на regex-address, не house_id/cad-join (архитектура)
Opened
#775 [P2][tradein][backend][scrapers] Парсить из embedded-state JSON: Yandex 82% NULL area + Cian buildingCadastralNumber не персистится
Opened
#781 [P2][tradein][backend][tests] Quality-gate тесты на P0-баги аудита (anchor n=2, dedup reprice, expected_sold anchor-only, block-page, median=0)
Opened
#786 [tradein][ux] MapCard: ДКП-пины не рендерятся + клик по пину аналога не открывает детали
Opened
#795 [tradein][backend] N1 parser: извлекать floor/total_floors (сейчас 0%)
Opened
#796 [research][tradein] ДомКлик PoC: headless + DataDome (401 на curl_cffi) — отложенный
Opened
#794 [research][tradein][backend] СберИндекс city-index → time-adjustment для замороженных Rosreestr deals (#724/#727)
Opened
#799 [tradein][frontend][ux] Pilot-only юзер: авто-redirect на /trade-in/ после входа (вместо «Доступа нет»)
Opened
#800 [tradein][frontend][bug] Retry-storm + белый экран на 401 (/me+/quota без backoff)
Opened
#801 [tradein][frontend][infra] Mock-render/MSW для прогона a11y+lighthouse (UI без бэкенда = белый экран)
Opened
#806 [tradein][backend][scrapers] Проксировать cian-скрейперы (cian.py/cian_detail/cian_session) через mobile proxy
Opened
#814 [tradein][backend][ops] Включить avito_city_sweep schedule + verify полного проксированного свипа
Opened
#815 [EPIC/tracking][tradein] Launch readiness всех скрейперов — подготовить к регулярному сбору
Opened
#821 [P1][tradein][backend][scrapers] base.py ON CONFLICT не персистит listing_date/area_m2 на re-scrape (UPDATE-ветка) — COALESCE-backfill
Opened
#822 [tradein][frontend] Error/not-found UI при восстановлении оценки по ?id=
Opened
#824 [tradein][docs] Актуализировать audits/Tradein_Architecture_Audit_0529 под 2026-05-30
Opened
#823 [tradein][scrapers] Avito: детект block/captcha-страниц (HTTP-200) → raise, не «0 lots»
Opened
#826 [tradein][backend] N+1 INSERT в _save_yandex_history_items → executemany
Opened
#827 [tradein][backend] Sentry-алерт на N подряд scraper-фейлов (mark_failed/mark_banned)
Opened
#835 [tradein][frontend][a11y] recharts svg без accessible-text + нет <h1> + пустой <th> (WCAG)
Opened
#834 [tradein][frontend][a11y] Контраст muted/teal текста <4.5:1 в карточках результата (~20 нод, WCAG AA)
Opened
#836 [P1][tradein][backend][scrapers] CIAN SERP-парсер мёртв: descriptionMinhash стал list[int] → pydantic отбраковывает каждый оффер → 0 lots
Opened
#839 [tradein][frontend][a11y] PhotoUpload: input[type=file] без label (CRITICAL, WCAG)
Opened
#843 [P1][tradein][scrapers] CIAN SERP fetched=0 — cian-specific (avito-via-proxy=34 OK), мёртв после ~20:06 2026-05-30
Opened
#849 [P2][tradein][backend][db] #774-2 Dedup домов + matching-sync: UNIQUE(cadastral_number) + merge dupes + double-SAVEPOINT fix (Foundation для cad-join)
Opened
#850 [P1][tradein][backend][вторичка] #774-3 Estimator Tier A → house_id/cadastre-join вместо regex-address (CLIENT-VISIBLE, backtest-gated)
Opened
#853 [tradein][backend] avito_imv own-session не через proxy → IMVAuthError(403), IMV-таблицы пусты
Opened
#854 [tradein][backend][db] IMV bulk backfill → in-app scheduler task (наполнение house_imv_evaluations)
Opened
#855 [tradein][backend][db] Yandex address backfill из <title> → дозаполнить residual street-only listings
Opened
#859 [tradein][backend] quarter-index: defensive sanity-clamp на factor (follow-up #764)
Opened
#865 [tradein][qa] Smoke post-merge: N1 scrape + Wave-2 backfill endpoints (#856) + schedules health
Opened
#871 [tradein][backend][scrapers] Avito house-link: SERP-карточка JS-only → брать house_url из detail SSR (__preloadedState__)
Opened
#879 [qa][analytics] Smoke страницы аналитики (Site Finder) — рендер + endpoints + console/5xx
Opened
#880 [tradein][backend][scrapers] Per-anchor watchdog timeout в run_*_city_sweep — sweep зависает навсегда
Opened
#883 [EPIC][tradein][scrapers] Миграция fetch-слоя на camoufox (real browser anti-bot)
Opened
#884 [tradein][scrapers] Phase 0 — BrowserFetcher (camoufox) abstraction + Docker (#883)
Opened
#885 [tradein][scrapers] Phase 1 — avito на camoufox BrowserFetcher (#883)
Opened
#886 [tradein][scrapers] Phase 2 — cian/n1/yandex на camoufox + снять анти-бот костыли (#883)
Opened
#887 [tradein][backend] СберИндекс pull + time-adjust в estimator (impl #794)
Opened
#888 [tradein][backend][devops] Scheduled poll Росреестра на новый квартал → авто-ingest ДКП (deferred из #727)
Opened
#895 [tradein][frontend] Scrapers admin hub page + shared ScraperPage component + settings API fix
Opened
#901 [tradein][scrapers] Phase 1 — avito на BrowserFetcher (за флагом, default OFF) (#883)
Opened
#902 [tradein][backend] СберИндекс pull: hedonic + asking слаги 404 на /api/sowa — тянется только real_estate_deals
Opened
#905 [tradein][scrapers][devops] Phase 0.5 — вынести camoufox в отдельный tradein-browser сервис (server/connect) (#883)
Opened
#915 [tradein][scrapers] Завершить browser-миграцию avito: пайплайн SERP+detail+houses+IMV (#883)
Opened
#920 [tradein][estimator] Backtest gate для СберИндекс time-adjust перед активацией (#794 follow-up)
Opened
#922 [tradein][backend] sber_index_pull scheduler fails on SSL — sberindex.ru serves an incomplete cert chain (missing Let's Encrypt intermediate)
Opened
#928 [tradein][backend] Сегментация аналогов/ratio по ppm²-тиру — убрать смешение подрынков (expected_sold недооценка)
Opened
#930 feat(tradein): checkpoint/resume для *-full-load скраперов — переживать рестарт/деплой
Opened
#933 [tradein][scrapers] Верифицировать Yandex totalItems extraction после 1-го prod-прогона full-load (#931 follow-up)
Opened
#936 [tradein][estimator] Gate перед flip tier_aware_ratio_enabled ON — backtest + golden-regression (#928/#934 follow-up)
Opened
#941 [tradein][devops] Persistent volume-mount для yandex_cookies.json — переживёт git-reset deploy (#940 follow-up)
Opened
#944 🔮 [EPIC][site-finder] Site Finder v2 — ИИ-прогноз продуктовой стратегии (ТЗ ГенГеныч)
Opened
#945 [site-finder] EPIC 1: Унифицированная сущность «Макропоказатель» + ряд ключевой ставки
Opened
#946 [site-finder] EPIC 2: Росстат/ЕМИСС + Дом.РФ макро-ingest (доходы, инфляция, распроданность)
Opened
#947 [site-finder] EPIC 3: Сущность «Граддокумент» + парсер ППТ/ПМТ/слушаний/КРТ/ЕИСЖС
Opened
#948 [site-finder] EPIC 4: Сущность «Инсайт» (ручная, ACL) + «Локация» как первый класс
Opened
#949 [site-finder] EPIC 5: Полная модель релевантности конкурентов + расширенные рыночные метрики
Opened
#950 [site-finder] EPIC 6: 3-слойный склад (open/hidden/future) + индекс будущего давления
Opened
#951 [site-finder] EPIC 7: Модуль чувствительности к ключевой ставке (§9.6) + макрокоэффициент (§9.5)
Opened
#952 [site-finder] EPIC 8: Прогноз спроса и предложения 6/12/18/24 мес + индексы дефицит/затоварка
Opened
#953 [site-finder] EPIC 9: Рекомендательная модель: класс+квартирография+коммерция+УТП (horizon-aware, explainable)
Opened
#954 [site-finder] EPIC 10: 3 сценария + продуктовый скоринг (10 scores) + спец-индексы (§25)
Opened
#955 [site-finder] EPIC 11: Сборка отчёта/ТЗ + движок уверенности (§15)
Opened
#956 [site-finder] EPIC 12: Извлечение факт/гипотеза/уверенность из граддок (NLP §7.4)
Opened
#957 [site-finder] EPIC 13: Чат-интерфейс над движком (LLM-оркестрация + UI-панель)
Opened
#958 [site-finder] EPIC 14: UI: горизонт-селектор, экран прогноза/сценариев, слои карты, confidence
Opened
#959 [site-finder] EPIC 15: Экспорт: DOCX / JSON-report / Markdown / Telegram / презентация
Opened
#960 [site-finder] EPIC 16: LLM-инфраструктура (провайдер, промпты, секреты, cost/guardrails)
Opened
#961 [site-finder] EPIC 17: Контракт API результата + версионирование анализа
Opened
#962 [site-finder] EPIC 18: Безопасность: роль «аналитик», ACL инсайдов/сделок, аудит-лог
Opened
#965 [SF-v2 #945] 945-A: macro_indicator → data/sql (idempotent DDL)
Opened
#966 [SF-v2 #945] 945-B: Live-poller макро: CBR key_rate (SOAP) + ипотека (XLSX)
Opened
#967 [SF-v2 #945] 945-C: Рыночная ипотечная ставка → временной ряд
Opened
#968 [SF-v2 #949] 949-A: Вес релевантности конкурентов §9.1 + complex_id join
Opened
#969 [SF-v2 #949] 949-B: Модуль рыночных метрик §9.2
Opened
#970 [SF-v2 #950] 950-A: 3-слойный склад §9.3 (open/hidden/future)
Opened
#971 [SF-v2 #950] 950-B: Индекс будущего давления предложения
Opened
#972 [SF-v2 #950] 950-E1: Backfill enrichment-таблиц newbuilding (3 пустые)
Opened
#973 [SF-v2 #950] 950-E2: Расписание cian/yandex_newbuilding enrichment
Opened
#974 [SF-v2 #950] 950-E3: Активировать yandex_newbuilding (0 строк сегодня)
Opened
#975 [SF-v2 #950] 950-E4: gendesign newbuilding_listings таблица + маппинг схемы
Opened
#976 [SF-v2 #950] 950-E5: Cross-load ETL tradein→gendesign newbuilding
Opened
#977 [SF-v2 #951] 951-A: services/forecasting/ scaffold + macro loader §9.5
Opened
#978 [SF-v2 #951] 951-B: Лаговая регрессия key_rate→спрос §9.6 (Almon/ADL)
Opened
#979 [SF-v2 #951] 951-C: Нормализация спроса §9.4
Opened
#980 [SF-v2 #952] 952-A: Движок прогноза спрос/предложение 6/12/18 §9.7
Opened
#981 [SF-v2 #952] 952-B: Индексы дефицит/затоварка + MAI §7.9 (рыночная ставка)
Opened
#982 [SF-v2 #953] 953-A: Horizon-aware recommend_mix
Opened
#983 [SF-v2 #953] 953-B: Класс/коммерция/УТП §10.2/10.4/10.5 + объяснимость §16
Opened
#984 [SF-v2 #954] 954-A: 3 сценария §11 (консерв/база/агрессив)
Opened
#985 [SF-v2 #954] 954-B: 10 продуктовых скорингов §14.2
Opened
#986 [SF-v2 #954] 954-C: 6 спец-индексов §25 (quick-win: Product Void, Artificial Demand)
Opened
#987 [SF-v2 #955] 955-A1: SiteFinderReport структурный объект
Opened
#988 [SF-v2 #955] 955-A2: Report assembler (analyze dict→SiteFinderReport)
Opened
#989 [SF-v2 #955] 955-A3: Refactor exporters на SiteFinderReport + unified pdf.py
Opened
#990 [SF-v2 #955] 955-A4: Confidence engine v2 §15 (структурный rationale)
Opened
#991 [SF-v2 #955] 955-A5: Excel-экспортёр (real impl)
Opened
#992 [SF-v2 #961] 961-C1: AnalyzeResponse контракт §22
Opened
#993 [SF-v2 #961] 961-C2: analysis_runs таблица + миграция
Opened
#994 [SF-v2 #961] 961-C3: Персист + версионирование прогонов
Opened
#995 [SF-v2 #958] 958-B2: /analyze принимает horizon (6/12/18)
Opened
#996 [SF-v2 #958] 958-B1: Horizon-селектор компонент
Opened
#998 [SF-v2 #958] 958-B3: Экраны прогноза/сценариев/confidence
Opened
#999 [SF-v2 #958] 958-B4: Слои карты: будущие ЖК / скрытый склад / зоны риска
Opened
#1001 [SF-v2 #958] 958-B5: Починить вход — выбор участка на карте + понятный ввод участка
Opened
#1057 [ИРД][prereq] Собрать NSPD layer-tree ID для новых ИРД-слоёв (функц.зоны/КРТ/резервирование/ПАТ/зоны охраны ОКН)
Opened
#1058 [ИРД-1] ГП 2045 — функциональные зоны генплана в analyze
Opened
#1059 [ИРД-2] ПЗЗ — ВРИ + предельные параметры (высота/FAR/паркинг)
Opened
#1060 [ИРД-3] КРТ — попадает ли ЗУ в зону комплексного развития территории
Opened
#1061 [ИРД-4] Граддокументация (ППТ/ПМТ/ГПЗУ/РНС) + правообладатель и срок права
Opened
#1062 [ИРД-5] Резервирование ЗУ под изъятие
Opened
#1063 [ИРД-7] Публичные сервитуты
Opened
#1064 [ИРД-8] ООПТ / лесные зоны / водно-болотные (водоохранные) объекты
Opened
#1065 [ИРД-9] Приаэродромная территория (Кольцово + Арамиль), подзоны
Opened
#1067 [EPIC][ИРД] Слой исходно-разрешительной документации для analyze-таблицы (10 пунктов)
Opened
#1066 [ИРД-10] ОКН + зоны охраны + ЗРЗ (зоны регулирования застройки)
Opened
#1070 [ИРД][сети] ООО «Брик» — техприсоединение, образоват. объект ул. Железнодорожников 3 (66:41:0702048:26/:27)
Opened
#1081 [tradein] White-label без logoUrl показывает «Мера»-глиф рядом с именем клиента
Opened
#1084 [sf] EKBGeoportalClient hardening при C8-wiring: CQL float-формат + User-Agent + httpx.Client pooling
Opened
#1085 [SF][future-supply] Ingest ППТ/ПМТ ЕКБ — WFS геометрия + ТЭП из PDF (pdfplumber)
Opened
#1086 [SF][future-supply] НСПД opportunity bbox-grid по агломерации ЕКБ (аукцион/свободные/схема/ККР ЗУ)
Opened
#1087 [SF][future-supply][spike] Разведка ГИСОГД-СО gisogd66.midural.ru — API РНС/ввод + застройщик
Opened
#1088 [SF][future-supply] Geo-join земля↔застройщик (ДОМ.РФ + РНС-ИНН + КРТ) по кадастру/гео
Opened
#1091 [ИРД][parser] Парсер PDF-постановлений ПАГЕ (проекты межевания/планировки) → перечень ЗУ под изъятие/резервирование
Opened
#1095 [sf] parcel_ird_overlaps: расширить except + тест ProgrammingError (при D9b wiring)
Opened
#1102 [sf] Pre-enablement checklist для enable_ird_analyze (D9b flag)
Opened
#1116 gknspecial_harvest: incremental per-prefix commit (durability на больших прогонах)
Opened
#1119 [qa] post-deploy smoke: ird-блок в /analyze (enable_ird_analyze ON) + latency
Opened
#1122 land_reservation: parser/ingest hardening ПЕРЕД первым реальным прогоном (#1118 follow-up)
Opened
#1129 [SF][perf] Ускорить §22 forecast — распараллелить 4 горизонта (~4мин → ~1мин)
Opened
#1130 [SF][perf] analyze latency 5–9s после enable_ird_analyze — кешировать krt по точке (#1102-deeper)
Opened
#1134 krt_lookup: многострочный regex в _PLANNING_NO_MATCH_SQL ломает 2 топонима (#1131 follow-up)
Opened
#1136 ekb_ppt_tep: post-фильтры парсера + врезка в analyze + seed-URL (#1133 follow-up)
Opened
#1138 genplan функц.зоны: врезка parcel_functional_zones в analyze + per-batch commit (#1137 follow-up)
Opened
#1142 okn_objects: врезка parcel_okn_objects в analyze + Variant B обогащение (#1141 follow-up)
Opened
#1151 pat_subzones: врезка parcel_pat_subzones в analyze + прогон load_koltsovo_pat (#1150 follow-up)
Opened
#1156 genplan_zones_sync: ST_MakeValid для геометрий + backfill 881 битых полигонов (ekb_genplan_functional_zone)
Opened
#1159 okn_objects: недозагрузка реестра (428 vs ~798 ЕГРОКН) + raw_props={id} без названия/адреса
Opened
#1169 [site-finder] §25.3 истинная каннибализация: overlap vs собственный портфель (own-portfolio)
Opened
#1182 [tradein][infra] Вынести scheduler/sweep'ы в отдельный контейнер tradein-scraper (деплой API не убивает скрейпы)
Opened
#1184 [tradein] tradein-browser в crash-loop: camoufox InvalidProxy mproxy.site:16928 (прокси недоступен/истёк)
Opened
#1186 [tradein] A: Query-side guard вторички — estimator/asking_to_sold/matview не должны читать novostroyki из listings
Opened
#1187 [tradein] B: Полная загрузка всех сегментов — secondary_only=False (cian/yandex), верификация avito
Opened
#1188 [tradein] C: API-параметр segment=vtorichka|novostroyki|all в выдаче listings
Opened
#1189 [tradein] D: QA полной загрузки сегментов на проде — counts, стабильность estimator, EXPLAIN → решение об индексе
Opened
#1190 [tradein] E (backlog): N1 — режим первички (отдельный URL-паттерн)
Opened
#1191 [market-слой] F: GRANT listings для gendesign_reader — unit-level квартиры доступны Site Finder'у запросом
Opened
#1196 [SF] analyze: InFailedSqlTransaction в ird_overlays → пустой neighbors_summary + другие downstream-секции (#1130 follow-up)
Opened
#1198 [dx] Integration test для analyze hot-path с реальной PG — mock-БД не ловит SQL-keyword/cast ошибки (#1196 follow-up)
Opened
#1204 [Fable 5][P2] RecommendBucket молча отбрасывает per-bucket elasticity/velocity_source — live what-if на фронте считает по неверной эластичности
Opened
#1201 [Fable 5][P2] GET /{cad}/isochrones и /{cad}/poi-score: 500 (float(None)) для участков с NULL-геометрией — нет фильтра geom IS NOT NULL
Opened
#1202 [Fable 5][P2] audit_log_middleware: синхронная запись в БД внутри async-middleware блокирует event loop на каждом sensitive-запросе
Opened
#1203 [Fable 5][P2] recommend_mix: _district_velocity_trend — захардкоженные даты 2025: «recent»-окно растёт безгранично, trend_factor раздут до ~2x
Opened
#1209 [Fable 5][P2] Неограниченный time.sleep по серверному Retry-After блокирует threadpool на часы
Opened
#1210 [Fable 5][P2] _AVG_PRICE_SQL без snapshot-фильтра: цена конкурента — смесь исторических снапшотов, flats_sold кратно завышен
Opened
#1206 [Fable 5][P2] ON CONFLICT по nullable doc_num: документы без номера дублируются при каждом прогоне
Opened
#1205 [Fable 5][P2] Artificial Demand (§25.5) фильтрует objective_lots по админ-району без resolve_objective_districts — индекс молча пуст для 7 из 8 районов
Opened
#1208 [Fable 5][P2] Fallback flat_id через рандомизированный hash() ломает идемпотентность UPSERT квартир
Opened
#1207 [Fable 5][P2] §19 redaction-дыры: мобильный 7XXXXXXXXXX без +/8 и ФИО капсом уходят в OpenAI нередактированными
Opened
#1214 [Fable 5][P2] ROLLUP grand-total неотличим от NULL-группы rooms_int — velocity/absorption форсайта может схлопнуться
Opened
#1213 [Fable 5][P2] _ACTIVE_STATUSES — английские значения против русского словаря site_status: POST /competitors всегда отдаёт is_active=false, active_count=0
Opened
#1211 [Fable 5][P2] price_sensitivity: в _elasticity_coef уходит админ-район вместо микро — регрессия всегда мертва (fallback)
Opened
#1212 [Fable 5][P2] L3 future-supply: фильтр по volatile-колонкам внутри DISTINCT ON берёт «последний подходящий» снапшот, а не последний
Opened
#1215 [Fable 5][P2] nspd_geo: WAF-backoff sleep (до 240с) > 2-мин порога cleanup_zombies → дубль-запуск того же job двумя воркерами
Opened
#1219 [Fable 5][P2] apiFetch падает с SyntaxError на 204 No Content — DELETE кастомных POI и weight-профилей всегда «ошибается» после успешного удаления
Opened
#1216 [Fable 5][P2] scrape_kn: Redis-lock без owner-токена — release удаляет чужой lock, а stale lock после рестарта молча убивает resume
Opened
#1217 [Fable 5][P2] EGRN-контракт сломан: фронт ждёт vri/category/owner_type, бэкенд шлёт permitted_use_text/land_category — таблица ЕГРН пустая в prod
Opened
#1220 [Fable 5][P2] scrape_objective: провал lots_pf-стрима (главный 600МБ отчёт) проглатывается — run завершается status='done'
Opened
#1218 [Fable 5][P2] MiniMap обрезает 100px карты и все контролы SiteMap: рыночные слои #999/#958 невозможно включить на странице анализа
Opened
#1229 [Fable 5][P3] best_layouts: supply-бакеты ('4+', euro-1/2) не стыкуются с velocity-бакетами objective ('4', '5+', '2') — supply=0/sold_pct искажены
Opened
#1223 [Fable 5][P3] PUT /admin/jobs/settings/{job_type} для отсутствующей строки молча теряет изменения и отвечает 200 с fallback-дефолтами
Opened
#1226 [Fable 5][P3] objective_sync_config.get_config: голый except Exception: pass на seed-INSERT — запрещённый паттерн, сессия остаётся в aborted-состоянии
Opened
#1222 [Fable 5][P3] §15 report-confidence: _confounded читает ключи, которых нет в forecast-диктах — шок-окно никогда не влияет на уверенность
Opened
#1221 [Fable 5][P3] recommend_mix: _district_market_saturation без latest-snapshot фильтра — каждый ЖК считается ~3 раза, медиана и гейт n>=5 искажены
Opened
#1224 [Fable 5][P3] §25.3 _price_overlap: нулевая ширина ценовой вилки нашего проекта внутри вилки кандидата даёт 0.0 вместо 1.0/None
Opened
#1225 [Fable 5][P3] §14.2 price_feasibility: reason говорит «субсид. ставка», хотя платёж считан по рыночной key_rate+4.5 п.п. (~19%)
Opened
#1228 [Fable 5][P3] OCR-нормализация не чинит задокументированный шум «6б:41:…» — кад-номера тихо теряются
Opened
#1227 [Fable 5][P3] scrape_catalog_batch не делает db.commit() — все UPDATE цен откатятся при закрытии сессии
Opened
#1230 [Fable 5][P3] Разорванный переносом строки regex в _PLANNING_NO_MATCH_SQL: ветки «Донбасской» и «Лумумбы» никогда не матчатся
Opened
#1234 [Fable 5][P3] Snapshot-PDF: '—'-фоллбеки двойно экранируются автоэскейпом Jinja2 — в PDF печатается литеральный текст «—»
Opened
#1233 [Fable 5][P3] beat_schedule: 4 cron'а написаны в UTC при timezone=Europe/Moscow — бегут на 3ч раньше; price-index ДО medians
Opened
#1231 [Fable 5][P3] noise_loader: loop-UPSERT без begin_nested — один дефектный OSM-way (3-точечное кольцо) валит весь weekly-синк на каждом прогоне
Opened
#1232 [Fable 5][P3] Крах weekly POI-синка 29 февраля: date.replace(year=-2) бросает ValueError
Opened
#1239 [Fable 5][P3] JobSettingsPanel: правки JSON extra_config молча теряются, если textarea свёрнута при сохранении
Opened
#1236 [Fable 5][P3] scrape_cadastre: перманентный не-WAF фейл не инкрементит targets_failed → job вечно 'running'; cleanup-таска не в beat
Opened
#1235 [Fable 5][P3] nspd_geo: except (NspdLiteError, Exception) проглатывает SoftTimeLimitExceeded — 6-часовой лимит таски не работает
Opened
#1238 [Fable 5][P3] ObjectSaleChart: серия «цена ₽/м²» рисует значения, делённые на 1000, без valueFormatter — тултип читается с ошибкой в 1000 раз
Opened
#1237 [Fable 5][P3] UserMenu: роль analyst (есть в backend с #962) отображается бейджем «Пилот»
Opened
#1240 [Fable 5][P3] PilotRequestModal: клиентская валидация слабее Pydantic-схемы — лид на лендинге получает сырой JSON 422
Opened
#1242 [Fable 5][P3] useSiteAnalysis: общий cancelledRef между конкурентными мутациями — новый analyze воскрешает отменённый poll-цикл
Opened
#1241 [Fable 5][P3] useCustomPois инвалидирует несуществующий ключ ["analyze", cad] — скор и breakdown не обновляются после изменения custom-POI
Opened
#1244 [Fable 5][uncertain][P3] Excel-экспортёр §13: строки отчёта, начинающиеся с '=', пишутся как живые формулы (formula/DDE-injection)
Opened
#1246 [Fable 5][uncertain][P2] ObjectSaleChart: ось X строится по месяцам только первого type — серии parking/nonliv рисуются на чужих месяцах
Opened
#1245 [Fable 5][uncertain][P3] chat.py: async-хендлер /chat/ask выполняет синхронное чтение БД (JSONB-отчёт) в event loop'е
Opened
#1248 [Fable 5][uncertain][P3] useParcelAnalyzeQuery: poll-цикл игнорирует AbortSignal — зомби-поллинг и лишние POST /analyze после навигации
Opened
#1247 [Fable 5][uncertain][P3] Trade-in: чтение window.location.search во время рендера — hydration mismatch при открытии shareable-ссылки ?id=
Opened
#1336 (critical) SRID: геометрия кварталов и зданий из rosreestr2coord (WGS84) ошибочно ST_Transform'ится из 3857 → коллапс к Null Island
Opened
#1337 (high) async-хендлер get_poi_score(decay=routing) делает синхронный блокирующий ORS-вызов на 12с в event loop
Opened
#1338 (high) Синхронный CPU-bound генеративный пайплайн geometry.generate блокирует event loop в create_concept
Opened
#1339 (high) useSiteAnalysis: re-POST на 'ready' использует apiFetch без проверки статуса — 202-гонка возвращает stub и крашит render tree
Opened
#1340 [high] obj_class_filter (англ.) сравнивается с русским obj_class в БД — фильтр класса всегда даёт 0 конкурентов (competitors + best_layouts)
Opened
#1341 [high] СЗЗ с упоминанием газ/электр ошибочно эскалируется в hard-blocker — вердикт «Нельзя» вместо «С ограничениями»
Opened
#1342 (high) parcels.analyze: optional DB-блоки без begin_nested() — один сбойный query отравляет всю tx, молча теряет данные и срывает persist рана
Opened
#1343 (high) poi_loader.sync_poi_to_db: UPSERT-цикл без per-row SAVEPOINT — одна битая строка валит весь weekly POI-sync
Opened
#1344 (high) cad_territorial_zones.geom объявлена GEOGRAPHY(POLYGON) — MultiPolygon ПЗЗ-зоны молча отбрасываются при harvest
Opened
#1345 (high) Sber pull: пойманный сбой UPSERT отравляет Session — нет db.rollback(), все оставшиеся серии каскадно падают
Opened
#1346 (medium) Блокирующий синхронный psycopg-IO в async-хендлере get_parcel_connection_points
Opened
#1347 (medium) BrowserSession Semaphore = 8 вместо задокументированных 3 — ~3x риск WAF-блокировки на DOM.РФ sweep
Opened
#1348 (medium) Sber pull выполняет блокирующий DB/CPU на event loop (async-таск без run_in_executor)
Opened
#1349 (medium) Geocode cache get/put делает блокирующий DB-IO на event loop, хотя тот же файл использует to_thread для других DB-вызовов
Opened
#1350 (medium) Аэродромы запрашиваются из OSM только как node — авиашум молча теряется в скоринге
Opened
#1351 (medium) PDF-отчёт Trade-In печатает period_months=24, тогда как данные за 12 месяцев — неверное окно в клиентском документе
Opened
#1352 (medium) refresh_ekb_districts_median: ST_Intersects двойного-счёта сделок на пограничных кварталах искажает медиану/среднюю цену района
Opened
#1353 [medium] is_residential_zone: prefix-проверка мертва для NSPD zone_code, детект жилой зоны держится на хрупкой подстроке 'жил' без negative-list
Opened
#1354 [medium] velocity: monthly_velocity делит суммарный объём конкурентов на MAX месяцев одного конкурента — занижение при разнородных окнах
Opened
#1355 [medium] supply_layers: один domrf-объект может учитываться И в Layer2 (hidden) И в Layer3 (future) — двойной счёт предложения на горизонтах 18/24 мес
Opened
#1356 [medium] fetch_status: завершённый/paused job с непустым target-статусом проваливается в неверный ответ 'not_in_nspd'
Opened
#1357 [medium] _score_label игнорирует порог 'хорошо'=25 — участки со score 15..25 помечены 'хорошо' вместо 'средне'
Opened
#1358 [medium] object_flats_quartirography: бакет 'Нежилые' дробится на дубли, когда у нежилого юнита rooms не NULL
Opened
#1359 (medium) recommend_mix: success-boost меняет share_pct, но не пересчитывает units/revenue/velocity → внутренне противоречивый ответ
Opened
#1360 (medium) gate_verdict: blocker subcategory=17 сравнивается через isinstance(int) — строковый subcategory из nspd-dump молча деградирует до warning
Opened
#1361 (medium) pzz_loader: rosreestr_id может быть NULL → дубли строк, ON CONFLICT не срабатывает при повторном sync
Opened
#1362 (medium) OwnPlannedProjectUpdate без price-range валидатора → PUT может сохранить инвертированную вилку (min > max)
Opened
#1363 (medium) reap_zombies может пометить живой sweep 'zombie' → терминальные mark_done/mark_failed молча no-op, риск дубль-sweep
Opened
#1364 (medium) asking→sold ratio: в asking-медиану попадают новостройки (нет listing_segment guard в seed-миграциях 080/098)
Opened
#1365 (medium) 062 address cleaner: regex 'Площадь \\d' усекает легитимные адреса ЕКБ ('Площадь 1905 года')
Opened
#1366 (medium) trade_in_pdf: страница «Сделки» рисует выдуманные дни экспозиции (4–118) для rosreestr ДКП-сделок
Opened
#1367 (medium) Не-idempotent миграции (110 ADD CONSTRAINT, 74 DROP TABLE→VIEW) при ложном заявлении об идемпотентности ломают DR-restore
Opened
#1368 (medium) Avito enrichment: пойманная ошибка оставляет общий Session в aborted-state → каскад на все оставшиеся строки
Opened
#1369 (medium) corp_sum: сбой парсера оставляет run помеченным 'done' (silent failure) — асимметрия с фиксом lots_pf #1220
Opened
#1370 (low) Глобальный per-cache Lock удерживается на время сетевого вызова Open-Meteo — сериализация всех analyze-запросов одного cache-типа
Opened
#1371 (low) get_connection_points игнорирует harvest_error/staleness — error-only дамп отдаётся как dump_available=true
Opened
#1372 (low) _classify зависит от порядка вставки в OSM_CATEGORIES — вторая категория multi-tag элемента молча теряется
Opened
#1373 (low) Несогласованный вывод quarter_cad для 3-сегментного кад. номера: REGEXP_REPLACE vs _quarter_cad
Opened
#1374 (low) trigger_kn_sweep: queued_at всегда null — берётся date_done (время завершения) только что поставленной задачи
Opened
#1375 (low) recommend_mix: comparables/competitors матчат obj_class = :cls точно, has_class_data проверяет лишь NOT NULL — молчаливо пустой результат при разном словаре (RU vs EN)
Opened
#1376 (low) scenarios.py: module-docstring численно противоречит реализации _horizon_widen_factor
Opened
#1377 (low) Air quality берёт hourly[0] (00:00 forecast-дня), а не текущий час — docstring обещает «текущий час»
Opened
#1378 (low) ForecastConfidenceBlock: coverage=1.0 (100%) рендерится как «1» вместо «100%» из-за строгого < 1
Opened
#1379 (low) SeasonalWeatherBlock: строка экстремумов мин/макс подписана как «макс» (только максимум)
Opened
#1380 (low) Cadastre jobs: React-key на внутреннем <tr> вместо mapped Fragment — нестабильная reconciliation / key-warning
Opened
#1381 (low) street-deals: period_from считается 30-дневными месяцами, а фильтр — календарными — отображаемое окно не совпадает с запросом
Opened
#1382 [low] velocity: знаменатель score использует число MAPPED конкурентов (включая с нулевыми продажами) — систематическое занижение velocity_score
Opened
#1383 [low] leads/stats: revenue/deals считаются за всё время под контрактом «за последние N месяцев»
Opened
#1384 [low] quartirography (deals): хардкод period_start_date >= '2025-07-01' — окно неограниченно растёт со временем
Opened
#1385 [low] Guard-2 same_quarter_ratio: знаменатель включает аналоги без кадастрового номера — занижение ratio, over-correction
Opened
#1386 [low] Avito detail abort: транзиентная не-block ошибка сбрасывает consecutive_blocks, маскируя продолжающийся IP-блок
Opened
#1387 [low] Avito relative-date parser возвращает None для бесцифровых форм ('час назад', 'неделю назад', 'день назад')
Opened
#1388 [low] Cian has_furniture: реальное False теряется через or-коалесинг двух boolean-полей
Opened
#1389 [low] TradeInEstimateInput допускает floor > total_floors (нет cross-field валидации)
Opened
#1390 [low] izyatie_client: мёртвый fallback a_tag.get('title', href) недостижим (title уже непуст)
Opened
#1391 (low) Fan-out по objective_complex_mapping завышает SUM-метрики в _INLINE_VELOCITY_SQL (best_layouts)
Opened
#1392 (low) own_portfolio: слабый regex-guard '^[0-9]+' позволяет non-numeric префиксу dev_id уронить весь current-portfolio запрос
Opened
#1393 (low) Cian _walk_price_range: force-paginate ветка молча теряет хвост ценового бакета (задокументированная потеря в hot path)
Opened
#1394 (low) POST /geo/bulk игнорирует rate_ms — все bulk-джобы создаются с дефолтом 600ms без контроля оператора
Opened
#1395 (low) queue_status: broker-failure except-блоки без логирования (silent swallow в UI hot-path)
Opened
#1396 (low) _fmt_number падает на NaN/Inf-float (ValueError в детерминированном fallback-пути chat)
Opened
#1397 (low) Классификация таймаута LLM по имени класса вместо isinstance (хрупко)
Opened
#1398 (low) De-partиализация 5 listings-индексов в 097 на ложной посылке «is_active = 100% true», которую 104 подтверждает устаревшей
Opened
#1399 (low) decode_to_file.py: f.write(decoded) падает TypeError, если JSON декодируется в list/dict
Opened
#1400 (low) 55_schema_scrape_resume.sql: partial-index на heartbeat_at мёртв — reaper фильтрует по COALESCE(heartbeat_at, started_at)
Opened
#1401 (medium) scrape/all/page.tsx logs: при filter=all кнопка «логи» не задаёт scraper_type — смешивает логи разных скраперов по совпадающему run_id
Opened
#1402 (medium) scrape/all/page.tsx: смена filter не сбрасывает logsRunId — стейл-стейт показывает логи чужого прогона
Opened
#1403 (low) scrape/all/page.tsx summary: плитки считают по top-30 и не покрывают статусы skipped/paused/queued — сумма плиток ≠ числу строк
Opened
#1404 (low) scrape/all/page.tsx isStale: UI-порог 5 мин расходится с backend-zombie 10 мин — ложный статус «stale» у живого kn-прогона
Opened
#1405 (high) QuartirographyChart.tsx/portfolioMap: бар «Студии» в портфеле всегда 0 — график противоречит вердикту «52% — студии и однушки»
Opened
#1406 (high) QuartirographyChart.tsx/portfolioMap: портфель по числу комнат наложен на ось площади (м²) — сравнение в разных единицах
Opened
#1407 (high) page.tsx / KpiCard «Sold % (квартиры)»: вердикт «выше/ниже среднего рынка» считается по собственному sold% объекта без рыночных данных
Opened
#1408 (medium) page.tsx / KpiCard «Нежилые» и «Машино-места»: hint гейтит на perc, но печатает realised → возможна строка «null продано»
Opened
#1409 (low) prinzip/page.tsx KpiCard «Средний метраж»: двойной минус при avg≥49 и ложный «-0» при null
Opened
#1410 (high) ConceptVariantsResult: плотность (FAR) подписана как 'м²/га' — неверная единица и занижение в ~10000×
Opened
#1411 (medium) concept/page.tsx: устаревший результат концепции против перерисованного полигона (стейл-стейт)
Opened
#1412 (low) ConceptVariantsResult: IRR-proxy подписан как 'IRR / Внутренняя норма доходности' — переобещание метрики
Opened
#1413 (low) data-sources/page.tsx · SOURCES «Объектив»: неверный домен атрибуции (objced.ru вместо objctv.ru)
Opened
#1414 (high) page.tsx/districtLabel: KPI «X км от центра» показывает дистанцию до границы района, а не до центра ЕКБ
Opened
#1415 (low) page.tsx/trendColor: цвет KPI тренда рассинхронизирован с текстовой меткой backend (порог 5% vs 8%)
Opened
#1416 (low) page.tsx/noiseColor: цвет KPI шума противоречит метке level на интервалах [45,50) и [60,65)
Opened
#1417 (low) page.tsx/noiseValue: число и цвет KPI шума считаются от разных значений (round vs raw)
Opened
#1418 (low) page.tsx/handleWeightsChange: смена весов во время первичного analyze (data ещё null) молча теряется
Opened
#1419 (medium) site-finder/page.tsx FilterBarBridge: счётчик показывает «0 / 0 участков» во время загрузки/смены bbox вместо состояния загрузки
Opened
#1420 (low) site-finder/page.tsx FilterBarBridge: matchCount и totalCount из двух независимых запросов → транзиентный рассинхрон (matchCount может временно > totalCount)
Opened
#1421 (low) site-finder-api.ts by-bbox адаптер: parcel с area_m2 === null приземляется в area_ha=0 → «0.00 га» как факт и тихое попадание в площадные фильтры
Opened
#1422 (medium) CompareTable velocity-строка + winnersFor: velocity_score=0 ('нет данных') рендерится как факт и выигрывает зелёную подсветку 'лучшее'
Opened
#1423 (low) compare/page.tsx handleResult: dedup-гард сравнивает не все отображаемые поля → возможен стейл медианной цены/района/подписей
Opened
#1424 (high) trade-in/page.tsx restoredEstimate: восстановленный по shared-ссылке отчёт показывает выдуманные параметры объекта (0 м², «Студия», «0 из 0», чужой адрес)
Opened
#1425 (medium) trade-in/page.tsx useEstimateId: чтение window.location.search вместо useSearchParams → SSR hydration mismatch и нереактивность к смене URL
Opened
#1426 (medium) trade-in/page.tsx: протухшая/битая shared-ссылка молча показывает EmptyState «Введите параметры», ошибка GET /estimate/{id} не отображается
Opened
#1427 (low) trade-in/page.tsx: freshResult навсегда перекрывает URL id — переход по другой shared-ссылке в той же сессии показывает устаревший результат
Opened
#1428 (medium) BulkGeoPanel/handleSubmit: очистка поля Parallelism шлёт parallelism=0 → 422, запуск молча проваливается
Opened
#1429 (low) JobSettingsPanel/isPendingFor: одна общая updateMutation — спиннер/opacity рассинхронизируются при параллельных Save
Opened
#1430 (low) JobSettingsPanel/handleSave: очистка max_concurrency/max_retries молча шлёт 0 → 422
Opened
#1431 (medium) RecommendVelocityPanel vs RecommendLiquidityChart: KPI ликвидности на per-bucket эластичности, график «24 мес = liquidity» — на единой scope-эластичности
Opened
#1432 (medium) RecommendVelocityPanel footnote: текст «темп = базовый × pf^elasticity» не совпадает с фактическим Темпом продаж
Opened
#1433 (low) DeveloperLeaderboard COLS: pct_three_plus/avg_area_sqm/sverdl_sqm_th со значением 0 рендерятся как «—» (falsy-zero)
Opened
#1434 (low) ObjectInfraMap: счётчик «Найдено N POI» и чипы категорий считаются по уже отфильтрованным бэкендом данным
Opened
#1435 (medium) QuartirographyChart.tsx/portfolioMap: бар «строится · Студии» всегда 0% — рассинхрон с подписью «52% портфеля — студии»
Opened
#1436 (medium) QuartirographyChart.tsx/portfolioMap: portfolio по числу комнат сопоставлен с deals по площади под общими площадными ярлыками
Opened
#1437 (low) PrinzipGapBar.tsx: единая безымянная value-ось X смешивает м² и % — несопоставимые длины баров между строками
Opened
#1438 (low) RecommendRevenueChart.tsx: при total=0 подписи «0.0 млн» показываются на всех нулевых сегментах
Opened
#1439 (medium) RouteGuard.tsx/RouteGuard: analyst на запрещённом /admin/* молча редиректится в /trade-in/ вместо NoAccessScreen
Opened
#1440 (low) UserMenu.tsx/UserMenu: роль вне TS-union даёт пустой role-badge (нет рантайм-валидации /me)
Opened
#1441 (medium) ConceptVariantsResult/VariantPanel: FAR (безразмерный) подписан единицей «м²/га» — неверная единица и рассинхрон с PDF движка
Opened
#1442 (low) ConceptResultMap/FitBounds: нестабильная зависимость bounds перезапускает fitBounds на каждом ре-рендере, сбрасывая ручной zoom/pan
Opened
#1443 (low) ConceptExportButtons: error/serverLoading не сбрасываются при смене variant — стейл-сообщение/disabled под чужой вкладкой
Opened
#1444 (low) ConceptVariantsResult/VariantPanel: нулевая валовая прибыль подписывается как «Положительная маржа»
Opened
#1445 (low) ConceptVariantsResult: IRR-proxy движка подаётся в UI как полноценная «Внутренняя норма доходности»
Opened
#1446 (low) ConceptDrawMap: нарисованный полигон отрисовывается дважды (FeatureGroup-слой + внешний GeoJSON по prop)
Opened
#1447 (low) PilotRequestModal/deriveTrackingId: показанный лиду «Номер заявки GD-XXXXXXXX» не хранится в БД и не находится поддержкой
Opened
#1448 (medium) BestLayoutsBlock/handleDownloadPdf: PDF собирается из живого состояния контролов, а не из показанного расчёта
Opened
#1449 (medium) BestLayoutsBlock/TopLayoutsTable: тултип >100% жёстко пишет «за 24 мес» вместо выбранного time_window
Opened
#1450 (low) EnvironmentTab/WeatherBlock: футер жёстко пишет «7 дн.» при динамическом forecast_days
Opened
#1451 (medium) ScoreBreakdownStackedBar.tsx / source-view barWidth: знаменатель = макс. знаковый вклад, а не макс. модуль — шкала ломается при отрицательном лидере
Opened
#1452 (low) WeightProfilePanel.tsx / handleSliderChange: дебаунс-таймер дублирует немедленный setDraft и не чистится при unmount
Opened
#1453 (medium) Pipeline24moBlock.tsx / fmtMonth: new Date(ISO-date) даёт UTC-полночь — месяц «Сдача» уезжает на предыдущий в отрицательных TZ
Opened
#1454 (low) ScoreBreakdownStackedBar.tsx / легенда показывает категории с contribution===0, отсутствующие в обеих полосах
Opened
#1455 (high) ZouitLayer.tsx/ZouitLayer: хеш-сегмент React-key константен для Polygon — старая геометрия ЗОУИТ остаётся на карте
Opened
#1456 (high) VelocityBlock.tsx/VelocityBlock: рассинхрон bucket-ключей — 4-комн. и 5+ сделки молча выпадают из «По комнатности» и «Топ продавцов»
Opened
#1457 (medium) MarketTab.tsx/MarketTab: подпись «строящихся» не соответствует activeCount (включает сданные ≤1 года)
Opened
#1458 (medium) VelocityBlock.tsx/VelocityBlock: «Топ продавцов» показывает «Продано 0 м²» при отсутствии данных velocity
Opened
#1459 (low) CpLayerControlPanel.tsx/CpLayerControlPanel: «Показать все» рассинхронизируется при наличии пустых категорий
Opened
#1460 (medium) MarketTrendBlock.tsx/LABEL_COLORS: бейдж тренда всегда серый — ключи карты не совпадают с label из бэкенда
Opened
#1461 (medium) NspdEngineeringNearbyBlock.tsx: смешение радиусов 200 м (analyze) и 500 м (connection-points) под подписью «200 м»
Opened
#1462 (medium) NspdEngineeringNearbyBlock.tsx: дедуп label+round(distance) пропускает дубли — расстояния меряются до разных опорных точек
Opened
#1463 (high) Section2NetworksUtilities.getUtilityConfig: реальные subtype сетей не маппятся → сырые англ. ключи в таблице
Opened
#1464 (high) Section2NetworksUtilities.buildSubtitle: газ/водопровод теряются в подзаголовке (неверные subtype-ключи)
Opened
#1465 (low) Section2NetworksUtilities.buildSubtitle: расстояния в подзаголовке без ru-группировки ('1234 м' vs '1 234 м' в таблице)
Opened
#1466 (medium) Section1ParcelInfo POI-fallback: инвест-балл участка показывается как POI-score «X / 100» с фейковыми weight/score_contribution
Opened
#1467 (low) Section1ParcelInfo headlineSubtitle: захардкоженный «Score +12 vs район» в fallback-подзаголовке
Opened
#1468 (low) AnalysisSidebar.tsx — мёртвый компонент с неверными подписями секций (4. Инфраструктура / 5. Свежесть) и без section-6
Opened
#1470 (medium) PoiList2Gis/site-finder-api: «{totalScore}/100» может превышать 100 и в fallback показывает не POI-метрику
Opened
#1469 (medium) ScenariosBlock/ScenarioCard: индекс дефицита берётся с самого длинного горизонта, но подписывается целевым — рассинхрон числа и подписи
Opened
#1471 (low) EgrnPropertyTable/formatDate: невалидная дата ЕГРН рендерится как «Invalid Date» — мёртвый try/catch
Opened
#1472 (medium) compare/page.tsx handleResult: дедуп по подмножеству полей теряет обновления district/цены/scoreLabel/errorMsg → стейл-данные в таблице сравнения
Opened
#1473 (low) CompareTable.tsx строка velocity: velocity_score рендерится как «N / 100», канонический VelocityBlock — как «N%» → рассинхрон единицы метрики
Opened
#1474 (high) EntryMap/ParcelDrawer: deselect-overlay z399 перекрывает карточку участка (z20) — drawer некликабелен
Opened
#1475 (high) site-finder-api/applyFilters: фильтры «Район» и «ВРИ» в prod дают пустую карту (клиентская фильтрация по плейсхолдерам)
Opened
#1476 (medium) site-finder/useRecentParcels: «Недавние» не обновляются до 60с после визита (нет инвалидации кэша)
Opened
#1477 (low) site-finder: визит пишется только из map-попапа — переход из ParcelDrawer/CadInput/RecentParcels не попадает в «Недавние»
Opened
#1478 (medium) EstimateResult.tsx hero-бейдж: 'N аналогов' = listings+deals, не совпадает с таблицей аналогов
Opened
#1479 (medium) AnalogsTable.tsx сортировка по 'Дней': days_on_market=null трактуется как 0, пустые всплывают как самые свежие
Opened
#1480 (high) trade-in/page.tsx восстановление по ?id=: параметры объекта синтезируются нулями → EstimateResult показывает '0 м²', 'Студия', 'Этаж 0 из 0' и чужой адрес
Opened
#1481 (low) Drawer.tsx/Drawer: slide-out анимация при закрытии не проигрывается (ветка !open рендерит новый пустой узел)
Opened
#1482 (low) Drawer.tsx/Drawer: prop width молча игнорируется для side='bottom'
Opened
#1483 (low) Drawer.tsx/Drawer: восстановление фокуса на close может не сработать для размонтированного триггера
Opened
#1484 (low) useCustomPois/customPoisKey: session_id отсутствует в queryKey — кэш может переиспользоваться между сессиями
Opened
#1485 (low) useSiteAnalysis poll-loop: неизвестный FetchStatus молча поллится до 2-мин таймаута вместо явной ошибки
Opened
#1486 (high) site-finder-api.ts/useParcelPoiScoreQuery: poi_weighted_score из weight в неверной шкале — клиент видит абсурдный «~10/100»
Opened
#1487 (medium) site-finder-api.ts/applyFilters: фильтры district/vri в prod обнуляют карту (все участки district='—', vri='other')
Opened
#1488 (medium) download.ts/triggerDownload: синхронный revokeObjectURL в том же тике после a.click() — гонка, срывающая скачивание в Firefox/Safari
Opened
#1489 (low) weightProfiles.ts/useWeightProfiles: admin-токен лишний в queryKey React Query
Opened
#1490 (low) weightProfiles.ts/useDeleteProfile: JSDoc 'Returns true if deleted' не соответствует поведению (хук возвращает undefined)
Opened
#1491 (high) migrate_kg_to_obsidian.py extract_date/_DATE_PATTERNS: ведущий \b перед месяцем срывает извлечение даты у entity с разделителем '_'
Opened
#1492 (medium) migrate_kg_to_obsidian.py _moc_for_subdir/sort_key: хроносортировка MOC вырождается в обратно-алфавитную из-за None от extract_date
Opened
#1493 (low) cleanup-worktrees-aggressive.py fetch_all_prs: жёсткий лимит 30 страниц (1500 PR) может пометить ветку с PR за пределом как stale и удалить worktree
Opened
#1494 (medium) cleanup_ghosts.py main: _all_docs limit=10000 без пагинации — при росте vault живые chunks ошибочно удаляются как orphan
Opened
#1495 (low) check-no-print.py/normalize_path: rfind('backend/') матчит подстроку, а не сегмент пути
Opened
#1496 (low) check-no-print.py/normalize_path: rfind берёт последнее 'backend/' — ломает allow-prefix для вложенных backend-каталогов
Opened
#1497 (low) check-no-print.py/PRINT_RE: ловит закомментированный print, строковые литералы и method-call .print() — ложные блокировки
Opened
#1498 (low) check-no-print.py/main: matcher только Edit|Write — print через MultiEdit не блокируется
Opened
#1499 (low) server.py/developer_track_record: двойной учёт лотов при N сайтах на один Objective-проект
Opened
#1500 (medium) server.py/jk_full: import psycopg2 в проде (psycopg v3 only) → photos/sale_graph всегда пустые
Opened
#1501 (low) server.py/district_time_machine: AVG(price) выдаётся под ключом median_price_kr
Opened
#1502 (low) server.py/price_distribution: квантиль int(p*n) завышает p25/p50/p75 на малых выборках
Opened
#1503 (low) server.py/smart_suggestions: нет фильтра 'score выше точки', обещанного в докстринге
Opened
#1504 (high) 04_report.py/main: JSON weights_used не соответствует реальным весам скоринга и не содержит economic
Opened
#1505 (high) 04_report.py/build_html: HTML-подпись весов противоречит JSON weights_used в том же отчёте
Opened
#1506 (medium) 04_report.py/build_html: заголовок «последние 90 дней» не соответствует реальным периодам real_* (12 мес / всё время)
Opened
#1507 (medium) 04_report.py/build_html: селектор .r.r красит все числовые ячейки в красный и перебивает зелёный
Opened
#1508 (medium) 09_macro_and_trend.py/main: trend_ratio=2.0 при v_prior==0 даёт максимальный буст районам без истории продаж
Opened
#1509 (low) 10_score_v2.py/main: sat_factor вычисляется и пишется, но не применяется к скорости (мёртвая логика vs комментарий)
Opened
#1510 (medium) 12_more_pois.py/main: bbox padding ±0.005° меньше радиуса привязки 2 км — POI у границ теряются
Opened
#1511 (low) 06_match_economics.py/main: median_price_m2 считается по равновзвешенным строкам room×month, а не по объёму сделок
Opened
#1512 (low) 06_match_economics.py/main: months_to_sellout смешивает сток разных месяцев окна со sold за всё окно
Opened
#1513 (low) 08_enrich_economics.py/main: real_n_lots/sold_pct/price считаются по всем лотам, но отчёт подписывает их как период (12 мес/90 дней)
Opened
#1514 (high) search.py/search_query.py: кадастровый номер всегда NULL в выдаче поиска — рассинхрон имён cadastral_number vs kadastr_num
Opened
#1515 (medium) search.py/search(): cache_hit всегда false даже при отдаче из кэша — поле врёт
Opened
#1516 (low) schemas/search.py _validate_geo_pair: нет проверки инвертированных вилок floor/year_built/floors_total (min>max)
Opened
#1517 (low) search.py/_validate_geo_pair: cross-field min>max через truthiness — граничный 0 обходит проверку
Opened
#1518 (medium) estimator.py/estimate_quality SB-anchor: границы диапазона из RAW comp_ppm2 без repair_coef рассинхронизированы с центром
Opened
#1519 (low) estimator.py/estimate_quality: freshness/last_scraped_at/days_on_market считаются по listings_clean, а не по показанным anchor_comps_used
Opened
#1520 (low) estimator.py/_fetch_dkp_corridor: low/high_ppm2 = чистые min/max выборки, а не P10/P90 — advisory-текст по одиночному выбросу
Opened
#1521 (medium) scrape_pipeline.run_avito_city_sweep: IMV-фаза отравляет сессию → update_heartbeat без rollback переводит успешный sweep в 'failed'
Opened
#1522 (medium) scheduler.py/trigger_cian_backfill_run: при протухших cookies next_run_at не сдвигается → verify_session бьёт по Cian каждые 60с
Opened
#1523 (low) house_imv_backfill.py/pick_lot_params: нет инварианта floor<=floor_at_home → при total_floors=NULL везде floor_at_home падает на 9
Opened
#1524 (medium) house_imv_backfill.py/_process_one_house: IMV вернул price=0 → дом помечается imv_status='ok' и больше не переоценивается
Opened
#1525 (low) scheduler.py/import_rosreestr_dkp: substring(floor FROM '[0-9]+') теряет минус — этаж '-1' импортируется как 1
Opened
#1526 (medium) image_sanitizer.sanitize_image: EXIF orientation срезается без поворота пикселей → фото клиента лежат на боку
Opened
#1527 (medium) admin.test_cian_auth: 403-бан Cian отдаётся как authenticated=True (VERIFY_BAN_SENTINEL не различается)
Opened
#1528 (low) cian_price_history.backfill: saved считает len(price_changes), а не реально вставленные строки
Opened
#1529 (low) dadata._classify_kind: fias_level 65 (planning) и 75 (plot) ошибочно попадают в kind='house'
Opened
#1530 (medium) trade_in_pdf._build_cover: «Срок действия данных» захардкожен today+30д, игнорирует estimate.expires_at (=now+24ч)
Opened
#1531 (low) trade_in_pdf._build_listings_page: строка «(с учётом ремонта)» дублирует тот же n_total, фильтрации по ремонту нет
Opened
#1532 (low) trade_in_pdf._build_deals_page: house_label не содержит monolith_brick/other — рассинхрон «Тип дома» между стр.2 и стр.3
Opened
#1533 (low) trade_in_pdf._examples_rows: days_on_market==0 рендерится как «—» из-за or вместо is not None
Opened
#1534 (high) normalize.py/normalize_address: асимметричное раскрытие ' д '->' дом ' даёт разные ключи для одного дома
Opened
#1535 (medium) normalize.py/normalize_address: инициалы 'К.'/'Д.' в названии улицы раскрываются в 'корпус'/'дом'
Opened
#1536 (low) conflict_resolution.py/_resolve cross_validate: молча возвращает медиану, не сигнализирует расхождение цен
Opened
#1537 (medium) houses.py/match_or_create_house Tier 0: cadastr_exact не регистрирует alias -> риск дубля при бескадастровом скрейпе
Opened
#1538 (low) houses.py/_upsert_house_source: ON CONFLICT не обновляет matched_method/matched_at — провенанс врёт
Opened
#1539 (low) conflict_resolution.py/_resolve: строковые правила игнорируют приоритет источников (порядок dict)
Opened
#1551 Avito detail-enrichment backfill для legacy listings (detail_enriched_at IS NULL) — прокси уже есть
Opened
#1553 Yandex detail-enrichment не реализован: нет save + detail не fetch'ится в свипе (area_m2 23%, repair 1%)
Opened
#1560 Три async-хендлера competitors / best-layouts / best-layouts-pdf блокируют event loop sync DB-IO (и WeasyPrint write_pdf)
Opened
#1561 persist_analysis_run коммитит result ДО дописывания forecast/ird/developer_attribution — сохранённый ран расходится с live-ответом
Opened
#1562 bulk_enqueue_geo (/geo/bulk): невалидный thematic_id в середине списка → 400 при уже запущенных geo-jobs (partial execution, нет atomicity/idempotency)
Opened
#1563 Отрицательный query-param limit на 7 GET-эндпоинтах admin_scrape → 'LIMIT -N' → необработанный 500 вместо 422
Opened
#1564 estimate_pdf (trade_in.py:347): TTL-проверка через .replace(tzinfo=UTC) перепривязывает, а не конвертирует timestamptz — при не-UTC session TZ просроченные оценки отдаются ка…
Opened
#1565 DDU-индикатор: area_ranges целиком вне диапазона 1..6 молча возвращает ВСЕ площади вместо пустого/422
Opened
#1566 DDU-индикатор: нет валидации формата/порядка periodFrom/periodTo — мусорный или инвертированный period тихо отдаёт пустой/усечённый ряд
Opened
#1567 Sentry/GlitchTip scrub-хук навешен только на transaction-события (before_send_transaction), error-события не редактятся — apiKey из URL/spans/breadcrumbs утекает в трекер
Opened
#1569 alembic/env.py регистрирует только Parcel — JobSetting и ~50 реальных таблиц невидимы для drift-detection, autogenerate сгенерировал бы фантомный CREATE TABLE parcels
Opened
#1570 ORM-модель Parcel мапится на несуществующую таблицу 'parcels' с устаревшими колонками — мёртвый и вводящий в заблуждение код
Opened
#1571 JobSetting.updated_at — NOT NULL без Python/server default: ORM-вставка строки даст IntegrityError (латентная ловушка)
Opened
#1572 ChatAskRequest.history: max_length=20 даёт hard-422 на длинном диалоге вместо задокументированного усечения (контракт-vs-поведение)
Opened
#1573 get_features_in_bbox_grid молча глотает WAF-403 и server-error для ПЗЗ-grid-walk → ложный tz_count=0, без layer_failed
Opened
#1574 Голый int(cat_id)/int(total) в парсинге meta search_by_quarter падает на нечисловом NSPD-ответе и валит Phase 1 квартала
Opened
#1575 cian offer_price_history frozen since 2026-05-24 — server backfill is a silent no-op; needs local Playwright runner
Opened
#1576 recommend_mix: weighted_avg_price_per_m2 не пересчитывается после success-boost share_pct → средневзвешенная цена рассогласована с долями бакетов (пробел в фиксе #1359)
Opened
#1577 weather_cache._fetch_weather_remote: агрегаты min/max/sum по daily-массивам падают на None-днях -> весь 7-day forecast молча теряется
Opened
#1578 weather_cache._fetch_seasonal_remote: ZeroDivisionError/ValueError при пустых t_min/precip и непустом t_max (раздельные None-guard'ы)
Opened
#1579 objective_etl.get_sqlite_info: утечка SQLite-соединения/fd на error-path (close() не в finally)
Opened
#1580 _jsonb_param: json.dumps без allow_nan=False — NaN/Infinity ломают jsonb-INSERT, ран теряется молча
Opened
#1581 velocity_alerts: prior_n использует COUNT(*) вместо COUNT(realised) — NULL-строки засчитываются в гейт значимости z-score
Opened
#1582 ddu_price_indicator: missing MV даёт ProgrammingError, а ловится только OperationalError — диагностический except мёртв для своего же кейса
Opened
#1583 Phase 2.5 ПЗЗ собирается ДО auto-heal геометрии квартала — broken-geom кварталы молча остаются без территориальных зон при первом harvest
Opened
#1584 Grid-walk discovered-счётчик завышается на skipped/чужекатегорийные features и misattribution parcels/buildings
Opened
#1585 intents.py: _fmt_number отдаёт английские 'nan'/'inf' в RU-прозу детерминированного chat-ответа при NaN/Inf-числах
Opened
#1586 intents.py: при наличии headline подавляется честная пометка о пустом разделе product_tz (what_to_build)
Opened
#1587 dry_run objective-backfill возвращает auto_accepted=0 вместо числа потенциальных auto-accept — preview вводит в заблуждение
Opened
#1588 objective_distinct не фильтрует group_name, но objective_group хардкодится 'Екатеринбург' — латентный кросс-город mislabel при расширении датасета (#307)
Opened
#1589 trade_in_pdf.py:256 — бейдж достоверности печатает n_analogs=объявления+сделки, завышая «N аналогов» и противореча заголовку стр.2
Opened
#1590 Экспортёры report_*: подпись «Индекс дефицита (12 мес)» лжёт при отсутствии 12-мес прогноза — fallback берёт дефицит чужого горизонта
Opened
#1591 Snapshot-PDF: блок «Конкуренты (топ 5)» отбирает крупнейшие ЖК по flat_count, а не ближайшие — расходится с комментарием кода
Opened
#1592 [Fable 5][P2] §25 compute_special_indices: итоговый confidence считается по ВСЕМ 6 индексам (включая unavailable→'low'), а не «MIN по доступным» — карточка систематически …
Opened
#1593 demand_only overlay: deficit_index ранжирует форматы по rate-крутизне (§9.5 segment_steepness), а не по силе спроса — §9.2/§9.4-компоненты сокращаются
Opened
#1594 demand_only: rate_future=0.0 placeholder при отсутствии будущей ставки даёт максимальный аплифт §9.4 (clamp 1.2), а не нейтраль — комментарий ложный
Opened
#1595 _score_future_competition: count = len(всех конкурентов), а mean_weight — только по не-None весам → возможное завышение плотности при частичных данных
Opened
#1596 [Fable 5][P3] §15 confidence_engine: advisory-cap сообщение дублируется в rationale при all-high (самый частый advisory-случай)
Opened
#1597 place_strategy не отбраковывает стратегию с нулевым размещением: пустой концепт (revenue=0, margin=-land, IRR=-33%) выдаётся как валидный вариант
Opened
#1598 ConceptInput.land_cost_rub без ge=0: отрицательная стоимость земли молча завышает маржу и IRR-proxy
Opened
#1599 DXF-экспорт теряет внутренние кольца (отверстия) участка/пятна застройки — вырезы зарисовываются сплошняком
Opened
#1600 Подписи секций в DXF привязаны по левому-нижнему углу к центроиду, а не отцентрованы на нём
Opened
#1601 _parse_openai_response: int() на нечисловых usage-токенах бросает ValueError/TypeError мимо fallback-гарантии complete
Opened
#1602 LLMResult.from_provider теряет finish_reason — content_filter/length-обрезка возвращаются как ok=True
Opened
#1603 make_thumbnail: неатомарная запись WebP (thumbs.py:53) — усечённый thumb навсегда кэшируется и отдаётся как валидный
Opened
#1604 Lazy-загрузка фото: при провале make_thumbnail оригинал записан на диск, но local_path не сохранён в БД (photos.py:113-125) — вечный re-fetch + осиротевший файл
Opened
#1605 Phase A не пагинирует и молча теряет хвост объектов при limit=999999, run всё равно 'done'
Opened
#1606 EMISS-парсер: годовой агрегат (PERIOD='год') и I квартал коллидируют по obs_date=date(year,1,1) — последний Series молча затирает первый
Opened
#1607 ekburg_permits: _COORD_FIRST_RE требует дробную часть — целочисленные координаты МСК-66 теряют геопривязку молча
Opened
#1608 domrf_catalog _TextCollector: void-теги (<br>/<img>/<input>) рассинхронизируют стек/буфер — текст блоков теряется
Opened
#1609 domrf_catalog status: классификация по первому ключевому слову во всём HTML + 'продано'≠'продана' → sold помечается free
Opened
#1610 domrf_catalog scrape_one_flat: success=True даже при updated=False / 0 извлечённых полей — ложь в статистике батча
Opened
#1611 nspd_denorm.denorm_dump: штатный пропуск feature без cad_num считается ошибкой → завышенный error-счётчик в метрике прогона
Opened
#1612 obj_checks.extract_obj_checks: or-коалесинг passed-значения (list-ветка) теряет boolean False → проваленная проверка пишется как пройденная
Opened
#1613 obj_checks.extract_obj_checks: bool() на строковом флаге → 'false'/'0'/'нет' трактуется как пройдено
Opened
#1614 nspd_lite.fetch_geoportal / nspd_client._http_get_json: json.loads на HTTP 200 не обёрнут → WAF-челлендж со статусом 200 даёт JSONDecodeError мимо autoretry harvest_quarter
Opened
#1615 competitors.py:491-502 — ценовой fallback покрывает только objective_complex_mapping, игнорируя nearest_cx gap-fill: конкурент с velocity>0 из спатиального матча получает avg_price=None
Opened
#1616 premises_lookup: KNN ближайшего здания ранжирует в ГРАДУСАХ (LIMIT 1) — на широте ЕКБ выбирает не ближайшее по метрам, parking_ratio чужого дома / потеря вали…
Opened
#1617 gate_verdict: warning NO_ENGINEERING_NEARBY при ОТСУТСТВИИ инж.сетей форсирует «С ограничениями» вместо «Можно» — чистый вердикт недостижим для жилого учас…
Opened
#1618 granddoc is_active: регистрозависимое сравнение == "Действующий" расходится с документированным lowercase doc_status_name → флаг и сортировка ломаются
Opened
#1619 ppt_tep JOIN: slug-fallback ILIKE перевёрнут (doc_ref ILIKE '%doc_full_name%') — никогда не матчит + LIKE-метасимволы не экранированы
Opened
#1620 worker_ready (lifecycle.py:160-171) немедленно ре-enqueue'ит WAF-paused nspd_geo jobs, обходя 30-минутный WAF-cooldown из cleanup_zombies
Opened
#1621 process_nspd_geo_job (nspd_geo.py:374-408, 82-97) не имеет атомарного claim → дублирующие task-сообщения для одного job_id могут идти параллельно (двойные WAF-хиты + зат…
Opened
#1622 [scrape_kn_catalog_objects] force=True «Загрузить все» молча ограничивается LIMIT 300 — каталог недогружается
Opened
#1623 [objective_etl] import_anton_objective: FileNotFoundError возвращает dict без raise — Celery-таск SUCCESS при проваленном ETL
Opened
#1624 [opportunity_harvest] n_features инкрементится до per-quarter commit — отчёт завышает число persisted фич при сбое commit
Opened
#1625 Parcel.geometry объявлена как POLYGON — реинтродукция класса крашей на многоконтурных (MultiPolygon) участках, который чинила миграция 93 (латентно: модел…
Opened
#1626 search_by_quarter (nspd_bulk_client.py:305-316): подстрочная классификация 404/400 по тексту исключения с подмешанным body_preview проглатывает 5xx и валидный 400 как «кв…
Opened
#1627 wms_feature_info (nspd_bulk_client.py:418-420): отсутствует isinstance(data, dict)-guard — non-dict JSON-ответ роняет ячейку grid-walk через AttributeError, потеря без сигнала
Opened
#1628 date_cr минует _parse_nspd_date → CAST(:date_cr AS date) роняет upsert_quarter_stats и весь harvest_quarter квартала (нет savepoint)
Opened
#1629 grid_geometry.py:59-61 — sanity-check сравнивает искажённые единицы EPSG:3857 с порогами, заданными как наземные метры → валидные крупные/вытянутые квартал…
Opened
#1630 intents.py: _render_why_forecast объявляет future_market источником provenance даже когда из него не выведено ни строки
Opened
#1631 trade_in_pdf._analog_rows: floor==0 (или total_floors==0) у аналога рендерится как «—» из-за truthiness вместо is not None
Opened
#1632 report_md._md_kv_lines: многострочное значение (напр. product_tz.summary «Резюме») ломает Markdown-буллет — нет свёртки переводов строк
Opened
#1633 [Fable 5][P4] §25.3 _geo_weight: подтверждённо-далёкий проект (>6.9 км) получает вес ниже floor для проекта без координат — инверсия против комментария
Opened
#1634 market_now.summary: district-wide счёт ЖК-выборки (obj_count) выдаётся за «N ЖК-конкурентов рядом»
Opened
#1635 commercial: sell_through_pct (темп распродажи нежилого) мислейблится как «доля коммерции» (commercial_share_pct)
Opened
#1636 §9.6 Almon-адаптер хардкодит confounded=False → §15 шок-фактор (#1222) частично мёртв в production
Opened
#1637 [Fable 5][P3] §15 confidence: нота deal_count теряет окно «за N мес» — расходится с контракт-примером модуля
Opened
#1638 normalize.py: 0-заполненная сетка SalesSeries.units сводит guard _count_full_years к диапазону дат, а не к числу реальных наблюдений (латентно, до подключения #979)
Opened
#1639 affordability.py:339-342: payment_at_scenario считает аннуитет по rate_path[h] без спреда, хотя rate_path в стеке = key_rate ЦБ → занижен и на иной базе, чем monthly_payment_rub (латент…
Opened
#1640 INN-regex затирает легитимные слитные 10/12-значные числа (крупные суммы в рублях) в text/строковых fields перед отправкой в LLM
Opened
#1641 Форматированный 10-значный мобильный без кода страны (922 123 45 67 / 922-123-45-67) проходит redaction нетронутым
Opened
#1642 make_thumbnail: пропуск по факту существования → устаревшая миниатюра после перекачки оригинала
Opened
#1643 Сбой загрузки квартир глотается молча — провал /portal/table не пишется в kn_scrape_failures, run рапортует ложную полноту
Opened
#1644 _norm_flat: деривация price_per_m2 падает с TypeError при строковом totalArea — необработанное исключение роняет весь run
Opened
#1645 [domrf_catalog] price_rub regex ловит цену за м² раньше полной цены → price_rub=NULL при наличии цены на странице
Opened
#1646 [ekburg_permits] parse_xlsx не закрывает read_only workbook (wb.close()) — утечка дескриптора/буфера
Opened
#1647 stealth: BrowserSession.download_binary обходит семафор concurrency (в отличие от get_json)
Opened
#1649 extract_obj_checks фабрикует passed=False для отсутствующих в payload проверок → UNKNOWN трактуется как FAILED (латентно, endpoint отключён)
Opened
#1648 fetch_via_rosreestr2coord глотает все исключения → None: WAF-блоки не детектируются, цель помечается 'done' с 0 features, run-статус лжёт
Opened
#1650 v_supply_layers_latest (м.125) схлопывает все L3 dev_group'ы района в 1 строку — DISTINCT ON без dev_group_name заново вносит #970 на read-слое future_supply
Opened
#1651 zone_regulation._RE_FLOORS требует литерал 'этаж' после числа → документированная форма 'предельное количество этажей – N' (голое число) не извлекаетс…
Opened
#1652 Fallback REFRESH MV CONCURRENTLY: проверка подстроки 'cannot refresh materialized view' не матчит реальное сообщение PostgreSQL → recovery-ветка мёртвый код
Opened
#1653 ppt_tep OR-JOIN (doc_ref=source_key ИЛИ doc_full_name ILIKE) может вернуть один ППТ-документ несколько раз → дубли ТЭП в ИРД-блоке
Opened
#1654 scrape_cadastre: enqueue_cadastre_harvest freshness-skip не идемпотентен — на resume targets_total сжимается ниже targets_done → преждевременный 'done' + раздутый targets_skipped
Opened
#1655 nspd_geo: jobs, застрявшие в 'queued' (потерянное брокер-сообщение), никогда не ре-reap'ятся — cleanup_zombies и worker_ready матчат только 'running'/'paused'
Opened
#1656 [backend][celery] Beat-таски refresh_quarter_price_index_chain и etl_newbuilding_crossload не зарегистрированы на воркере (отсутствуют в include) — молча никогда не выполняются
Opened
#1666 (site-finder) mv_layout_velocity не рефрешится по расписанию → best_layouts молча устаревают в проде
Opened
#1667 (site-finder) analyze: metro_block — заглушка nearest_top3=None (скрапер метро не подключён)
Opened
#1668 (site-finder) analyze inline confidence — stub, не дотянут до §15 confidence_engine (форсайт)
Opened
#1709 CI-шторм 2026-06-17 ~18:30 UTC — очередь раннеров забита, tradein-деплой #1699 застрял на ~17+ мин
Opened
#1723 [tradein][data] Objective bank_name/registration_number не отдаётся на текущем тарифе (ЕГРН-поля)
Opened
#1736 (site-finder) точки подключения ресурсов не отображаются на карте analyze (рендеринг-баг)
Opened
#1737 (site-finder) confidence: сырой ярлык «Компонент · вкладывающий сервис: high» — теряется имя сервиса
Opened
#1738 (site-finder) future-supply/pipeline считает СУБЪЕКТ анализа как будущего конкурента (self-count) + уже строящиеся как «будущее»
Opened
#1739 (site-finder) PDF analyze не скачивается — 500 (snapshot_pdf глотает причину) + forecast/export?format=pdf→422
Opened
#1740 (site-finder) противоречие: gate «МКД нельзя», но рекомендация советует квартирографию
Opened
#1741 (site-finder) порядок блоков analyze: характеристики участка и стройки вперемешку
Opened
#1742 (site-finder) объяснимость: «затоваренность» = 2 разных смысла; не ясно почему класс рекомендации
Opened
#1743 (site-finder) отчёт «Остатки и скорость» непонятен (3 разнородных понятия, англицизм Velocity-score)
Opened
#1744 (site-finder) прогноз и горизонты неясны: переключатель без подсказки + голые числа без единиц
Opened
#1745 (site-finder) [feature] прогноз продаж по ВСЕМ типам квартир (студии/1-5к) для игры ассортиментом
Opened
#1746 (site-finder) [feature/data] все инженерные сети на карту + единый источник (191-ФЗ engineering_networks не используется)
Opened
#1772 [tradein] Один дом дробится на несколько houses → same-building компы теряются (unify по кадастру)
Opened
#1773 [tradein] Адреса убивают same-building anchor: cian-новостройка без номера дома, avito «29р-н» слип, дубль-листинги
Opened
#1774 [tradein] Эстиматор: same-building anchor хрупок (один house_id, exclude avito) — резолвить через фрагменты/кадастр + same-house avito
Opened
#1781 [tradein] cian-первичка не освежается: 9205 заморожены с 31.05, 93% без house_id_fk, фантомы не гаснут (Савкова 29)
Opened
#1785 Кадастр: bulk NSPD grid-walk структурно теряет дома (покрытие МКД ~25-30%) — нужен анализ + денсер-сетка
Opened
#1789 [tradein][scrapers] Avito ЖК-enrichment не долетает в БД — отзывы/тип/история по дому пусты (house_reviews=0, avito_validated_at=0)
Opened
#1790 [tradein][scrapers] Avito прокси-ротация выключена на проде (AVITO_PROXY_MAX_ROTATIONS=0) → avito_full_load банится мгновенно
Opened
#1791 [tradein][scrapers] Cian detail-обогащение: kitchen 3% / ceiling 0% / описание 3% не долетают; отзывы ЖК не садятся
Opened
#1792 [tradein][scrapers] Yandex покрытие полей: area 63%, ceiling 0, описание 50%, kitchen 0; отзывы/рейтинг ЖК не садятся
Opened
#1793 [tradein][scrapers] tradein-browser: per-provider concurrency — параллель между поставщиками, ≤1 коннект на поставщика
Opened
#1795 tradein/estimator: завышение оценки в бизнес/премиум — кламп к коридору сделок + робастный anchor
Opened
#1796 tradein: Avito-баны режут покрытие аналогов и кросс-валидацию оценки
Opened
#1801 [tradein][scrapers] Cian прокси деградировали — CIAN_PROXY_URL (socks5) таймаут + BROWSER_PROXY_CIAN 503 → detail-покрытие cian ≤3%
Opened
#1803 [tradein][frontend] Мера estimate — React hydration error #418 (SSR≠client mismatch)
Opened
#1804 [tradein][frontend] Мера estimate — секция «Фото квартиры» 422 на preview-UUID (0/12 фото)
Opened
#1805 [tradein][scrapers] #883 Phase 2: avito.py SERP — дефолт на BrowserFetcher (camoufox)
Opened
#1806 [tradein][scrapers] #883 Phase 2: cian.py SERP — миграция на BrowserFetcher (camoufox)
Opened
#1811 [tradein][scrapers] Post-merge polish PR #1809 (avito SERP browser) — косметические минор'ы из ревью
Opened
#1812 [tradein][scrapers] tradein-browser: снизить per-page fan-out — within-provider rate-cap прокси (~12% fetch-fail при бэкфиле)
Opened
#1814 [tradein][scrapers] avito_detail_backfill: browser-fetch падает → curl-fallback → анти-бот 429 (+ снапшот тащит legacy не-ЕКБ листинги)
Opened
#1816 tradein: HTTP POST /estimate отдаёт инвариантный центрально-схлопнутый результат и не персистит (estimate_quality напрямую — корректен)
Opened
#1820 [tradein][scrapers] avito pipeline: новостройки house-страница (housePage widget missing) + AvitoBlockedError крашит весь прогон
Opened
#1843 [site-finder][ПТИЦА][data] Оживить КСИТ/высоту/зону в /analyze — crosswalk reg_numb_border → zone_index (+ латентный null zone_code)
Opened
#1846 DomClick scraper мёртв: VPS-IP заблокирован QRATOR + редизайн сайта (нужен прокси + rewrite на новый API)
Opened
#1850 [site-finder][perf] Оптимизировать zone-regulation резолв в /analyze (мемоизация zone_index_at, двойной резолв, timeout)
Opened
#1871 [AUDIT 2026-06-22] ПТИЦА deep-audit: реестр дефектов (цифры/логика/минусы/дизайн)
Opened
#1881 [epic] Настоящая финмодель проекта (DCF/NPV/IRR/PBP) — объединить геометрию ПТИЦА + полноту девелоперской БДДС
Opened
#1917 [tradein][scrapers] /fetch-json: тюнинг settle после навигации (транзиентный NetworkError на первом XHR)
Opened
#1918 [tradein] yandex browser-proxy мёртв (za.mobileproxy.space:62011) → yandex detail/newbuilding/address enrichment в 503
Opened
#1926 [AUDIT #1871 остаток] invest_score advisory flag + units_sold align + yandex total_seen obs + frontend polish
Opened
#1940 [tradein][scrapers] Browser-sweep'ы зависают ДО первого HTTP (http_requests=0) → zombie/stuck-running на 6ч, источник теряет день
Opened
#1945 [site-finder][scrapers] domrf_kn FLATS loader сломан с ~17.05 (DOM.РФ WAF): flats 376k→~0, best-layouts supply пустой 5 недель
Opened
#1949 [tradein][scrapers] cian: full_load зомбится ~43% + city_sweep self-inflicted watchdog-бан → 86% инвентаря stale
Opened
#1950 [tradein][scrapers] avito: changeip-recovery одношотный (30s timeout роняет run) + статус 'banned' завышен когда SERP отработал
Opened
#1951 [tradein][devops] Деплой неатомарен — recreate scraper посреди run убивает in-flight sweep (cian_full_load → zombie)
Opened
#1953 [EPIC] ПТИЦА analysis report — UX + data-honesty аудит (на примере 66:41:0205010:287)
Opened
#1954 P0 Объект-карточка: площадь «—», обременения «—», «обновлено» — читаются мёртвые колонки (эпик #1953)
Opened
#1955 P0 «Что хорошо продаётся» — дубли бакетов (obj_class не проброшен) + фантом Comfort/Комфорт (эпик #1953)
Opened
#1956 P0 4.2 Планировки: «срок продажи 0 мес» / «% продано —» — per-object snapshot (регрессия #1944) (эпик #1953)
Opened
#1957 P0 ЗОУИТ: сырой «cad_zouit», дубли, пустые «Охраняемые зоны» + СЗЗ-смысл и баннер «жильё ограничено» (эпик #1953)
Opened
#1958 P0 График дефицита: оси налезают + плоское/пустое состояние; фактор «Прогноз спрос/предложение» ×4 дубль (эпик #1953)
Opened
#1959 P0 Индекс дефицита −1.00 ВЕЗДЕ — basis mismatch (спрос сегмент vs предложение район) + honesty-guard (эпик #1953)
Opened
#1960 P1 «Медиана рынка» 64k — квартальная n=1 ДКП-медиана вместо новостроечного базиса (эпик #1953)
Opened
#1961 P1 Сети/точки подключения не на карте (нет слоя источника + радиус 500м vs 2км + полигоны без центроида) (эпик #1953)
Opened
#1962 P1 Градрегламент НСПД (тер.зона/КСИТ/высота/этажность) — вывести в Раздел 1 (эпик #1953)
Opened
#1963 P2 Человеческий язык / микрокопия отчёта (6.2/6.3/6.5 + легенды дефицита/затоварки) (эпик #1953)
Opened
#1964 P2 Data-quality: objective_lots раздут (1.75M), n_sold=99110 аномалия, registration_date разрежен (эпик #1953)
Opened
#1965 [feat] Консолидация фин-модели/Концепции в отчёт + интерактив house-picker → 3D → пересчёт (эпик #1953)
Opened
#1966 [tradein][analytics] Accuracy-loop → CI-гейт: point-in-time backtest на ПОЛНОМ движке (per-rooms MAPE + range-coverage SLA)
Opened
#1967 [tradein][data] avito 54% NULL lat → невидим PostGIS-радиусу: geo-backfill + dedup на ингесте (рычаг точности массы оценок)
Opened
#1968 [tradein][ux] Honesty-fix вывода: «7 источников»→честные 4, убрать фейковую per-source медиану, выпилить domclick из sources
Opened
#1969 [tradein][compliance] ФЗ-152 / ToS — блокер B2C: PII потребителей в БД + правовой риск скрейпа
Opened
#1970 [tradein][tech-debt] Flag sprawl: ~40 estimate_* флагов, матрица взаимодействий непротестирована → паралич правок
Opened
#1971 [tradein][business] Лид-флоу — тупик: CTA = mailto-стаб, нет реального POST /lead → воронка в никуда
Opened
#1972 [tradein][ux] Редизайн результата «Тихая уверенность»: одна цифра-герой (expected_sold) + confidence-driven типографика + снять тройное дублирование цен
Opened
#1989 [UX-аудит #01] Закрепить итог (выкупная стоимость + «Скачать PDF») вверху страницы результата
Opened
#1990 [UX-аудит #02] Дедуп чисел на странице результата — одни и те же суммы повторяются 3–4 раза
Opened
#1991 [UX-аудит #03] Свести четыре цены к двум + явная пометка «эта идёт в оффер»
Opened
#1992 [UX-аудит #04] Один источник вводных + один инструмент «что-если» (сейчас три места пересчёта)
Opened
#1993 [UX-аудит #05] Убрать сырые внутренние подписи с витрины (start_price, benchmark, yandex_valuation, asking…)
Opened
#1994 [UX-аудит #06a] Прятать пустые блоки + единый формат сумм (frontend)
Opened
#1995 [UX-аудит #06b] Данные сделок-заглушки: все даты 01.01.26 + немонотонный sell-time (backend/data)
Opened
#1996 [UX-аудит #07] Иерархия «ответ → доказательство → тех-детали» на странице результата
Opened
#2000 DomClick Layer B (deep detail-backfill) заблокирован QRATOR — нужен dedicated residential RU proxy
Opened
#2002 [tradein][analytics] Elite/premium estimate accuracy — data-research findings + roadmap
Opened
#2003 [tradein][tech-debt] houses.house_class never populated — dead merge engine + Avito «Класс жилья» not extracted
Opened
#2007 [tradein][yandex] SERP _entity_to_lot: писать ceiling_height + kitchen_area_m2 в колонки + нормализовать house_type
Opened
#2008 [tradein][cian] SERP: промоут полей из raw_payload в колонки — kitchen_area_m2, mortgage_available (+ новые is_apartments, is_rosreestr_checked)
Opened
#2009 [tradein][avito] detail: дописать house_type + house_catalog_url (+5 house-level полей) в save_detail_enrichment
Opened
#2010 [tradein][avito] IMV: персист comparables + searchSimilarUrl (сейчас полностью выбрасываются)
Opened
#2011 [tradein] Аудит покрытия полей скрапперов avito/cian/yandex — сводка + прод-замер (2026-06-27)
Opened
#2012 [tradein][estimator] Подключить house_type/kitchen/ceiling как фичи comp-scoring (+ обязательный backtest)
Opened
#2013 [tradein][avito] year_built = 0% — источник не отдаёт год постройки (потолок ~1.7% через houses-catalog)
Opened
#2036 trade-in/v2: подключить боевые ручки к новому UI (/trade-in/v2)
Opened
#2038 trade-in/v2 [FE-1]: data shell + main dashboard wiring (page.tsx + mappers + ParamsPanel/ResultPanel/ObjectSummary/Hero/Footer)
Opened
#2039 trade-in/v2 [FE-2]: overlay «История / Продажи в доме» (HistoryView)
Opened
#2040 trade-in/v2 [FE-3]: overlay «Аналитика дома» (AnalyticsView)
Opened
#2041 trade-in/v2 [FE-4]: overlay «РЫНОК / Аналогичные объявления» (SourcesView)
Opened
#2042 trade-in/v2 [FE-5]: «Предыдущие оценки» (CacheView) + PDF-ссылка + quota + автокомплит адреса
Opened
#2043 trade-in/v2 [BE-1]: estimate +cv +source_counts +created_at; /history +sources_used; cache-KPI
Opened
#2044 trade-in/v2 [BE-2]: optional radius_m param (estimate / house-analytics / sell-time-sensitivity)
Opened
#2045 trade-in/v2 [BE-3]: Коэффициент локации + POI-разложение (LocationDrawer) — DEFER / решение
Opened
#2046 trade-in/v2 [BE-4]: профиль пользователя (name/org/email) для TopNav — DEFER
Opened
#2062 trade-in/v2: UI/UX-полировка по аудиту (доступность, доверие к числам, иерархия, копирайт)
Opened
#2081 trade-in/v2: UI/UX аудит — round 2 (системный контраст · честность чисел: дедуп/фильтр/адрес · a11y drawer+автокомплит)
Opened
#2087 trade-in/v2: data-contract — рассинхрон счётчика источников / ratio-vs-медианы / базы торга + кросс-source дедуп (из аудита #2081)
Opened
#2111 «Все точки показывают максимум информации» — карты-попапы недоливают данные (verified audit)
Opened
#2119 Точки подключения с характеристиками: 51 источник, 27 верифицированы (research 2026-07-02)
Opened
#2126 [EPIC] scraper-kit — внутренний код-пакет монорепо (консолидация скрапперов)
Opened
#2127 [EPIC] market — контракт данных скрапперов для внешних потребителей
Opened
#2128 scraper-kit A: скаффолд пакета + workspace-подключение
Opened
#2129 scrapers K: fix _unix_to_date TZ-inconsistency (3 копии MSK/UTC/naive)
Opened
#2130 market I: contract-view market.v_* поверх producer-таблиц
Opened
#2131 scraper-kit B: Protocol-границы (matcher/config/session/jobs) + adapters
Opened
#2132 scraper-kit C: перенос core-слоя в пакет
Opened
#2133 scraper-kit D: перенос провайдеров (avito/cian/yandex/domclick)
Opened
#2134 scraper-kit E: консолидация бисекции цены (4 копии → pricing/bisection.py)
Opened
#2135 scraper-kit F: перенос pipeline (scrape_pipeline) в пакет
Opened
#2136 scraper-kit G: scheduler + registry-dispatch (25+ trigger_* → dict-реестр)
Opened
#2137 scraper-kit H: Docker/build wiring для пакета
Opened
#2138 market J: перенацелить gendesign_reader на market.v_* + обновить ETL #976
Opened
#2160 [EPIC] proxy-pool — хранилище прокси в БД + автовыбор свободного/рабочего
Opened
#2161 proxy-pool P1: таблица scrape_proxies + admin bulk-load + seed env
Opened
#2162 proxy-pool P2: сервис proxy_pool (acquire/release/health) + health-checker
Opened
#2163 proxy-pool P3: интеграция curl-путей на пул (acquire/release)
Opened
#2164 proxy-pool P4: динамический browser server (acquire + relaunch + release)
Opened
#2177 §4.2 «Анализ планировок»: покрытие 17% при 100% данных в Объективе — дедуп ЖК + расширение mapping + lots-fallback
Opened
#2178 §4.3 «Тренд рынка»: считать динамику цен из objective_lots_history вместо устаревшего Росреестра
Opened
#2179 §7 отчёта: раскрыт по умолчанию + участок выделен на 3D-подложке + больший кусок карты
Opened
#2180 3D-макет окружения в «Размещении застройки»: соседние здания из cad_buildings
Opened
#2181 Альтернативы при отрицательном вердикте: оптимизатор программы (класс × этажность × mix) в конце отчёта
Opened
#2188 tradein/deploy: tradein-scraper не пересоздаётся при изменении matching/dedup-кода — DORMANT-дедуп запустил бы старый код
Opened
#2187 tradein/dedup: ослабить geo-guard в fias-pass — 130 same-fias групп не смержены (NULL geom / >250 м)
Opened
#2189 tradein/canon: слэш-коллапс в tradein_canon_addr — «Сулимова, 32» ≡ «Сулимова, 3/2» (подтверждено ревизией DaData)
Opened
#2192 rewire: scheduler_main на kit-scheduler за флагом USE_KIT_SCHEDULER (ship-dark)
Opened
#2200 EPIC: Мера (trade-in) — ремедиация полного аудита 2026-07-02
Opened
#2201 [P0] Продлить 3 mobile-прокси до 15.07 (иначе avito+cian+yandex умрут вместе)
Opened
#2202 [P0] Подключить scrape_proxies pool к боевым скрейперам — убрать single-IP SPOF
Opened
#2203 [P0] Off-box бэкап tradein-postgres + restore-тест + hardening backup-скрипта
Opened
#2204 [P0] deactivate_stale для domklik/n1 + честный трекинг freshness domklik
Opened
#2205 [P0] Убрать публичную фейк-оценку /trade-in/ui-preview с прода + noindex
Opened
#2206 [P1] Обновлять scraped_at в upsert (base.py) — вернуть ~55% инвентаря эстиматору
Opened
#2207 [P1] Снять блокировку event loop на POST /estimate (asyncio.to_thread)
Opened
#2208 [P1] Pre-merge CI-гейт для tradein-mvp (backend pytest + frontend typecheck/lint)
Opened
#2209 [P1] Честность диапазона оценки: раскрыть/рекалибровать 56.6% + min-width floor + backtest baseline + CI-гейт
Opened
#2211 [P1] Честность UI-источников: убрать «/7», фолбэк-чипы, «классическую», зелёный cache-дот, «CV»
Opened
#2212 [P1] Починить rosreestr_dkp_import (deals заморожены 182д) + алерт на max(deal_date)
Opened
#2213 [P1] Defense-in-depth для trusted-header auth + rate-limiter fix
Opened
#2214 [P1] Observability: off-box uptime-probe + fail health-check на dead backend + mem-лимиты + log-rotation
Opened
#2215 [P2] Кросс-источник дедуп аналогов (house+floor+area) — убрать ~19% двойного счёта
Opened
#2216 [P2] Миграции tradein: порядок (до рестарта) + реконсиляция 152 vs 131 + дубль-префиксы
Opened
#2217 [needs-human] 152-ФЗ позиция (17342 телефона) + права на переопубликование скрейпленных данных
Opened
#2218 [needs-human] Продуктовая ясность: мот vs бесплатных оценок + конверсионный слой + README
Opened
#2233 [P1] photo-upload буферизует всё тело в RAM до проверки лимита (OOM-риск при mem_limit 768m)
Opened
#2234 [P2] admin.py: текст исключений утекает в HTTP-ответы (8 мест detail=f"...: {e}")
Opened
#2235 [P2] yandex: 204 активных URL-дубля — дедуп + уникальность source_url
Opened
#2236 [P2] external_valuations.house_id всегда NULL (1579/1579) — привязать к houses
Opened
#2254 B2B-запрос в ЕЭСК: реестр ТП/РП с адресами или координатами (полная карта точек подключения)
Opened
#2255 [P3] Эстиматор: сегментная калибровка по классу жилья — за фичефлагом (follow-up #2209)
Opened
#2259 Полный PDF/DOCX-экспорт ПТИЦА-отчёта (/analyze): §1-§7 + альтернативы
Opened
#2262 [tradein][v2] Жёсткий аудит нового дизайна «Мера» v2 (пост honest-interval + design-sync) — ЭПИК
Opened
#2264 [tradein][v2][a11y] Жёсткий аудит доступности — клавиатура/SR end-to-end + aria-modal оверлеев (эпик #2262)
Opened
#2265 [tradein][v2] Живой аудит честности чисел на проде — resolved ли жалоба оценщика + остаток #2087 (эпик #2262)
Opened
#2266 [tradein][v2] Визуальный аудит — иерархия 3 цен, CTA, микрокопи, консистентность после honest-hero (эпик #2262)
Opened
#2267 [tradein][v2][design-sync] Аудит DS-панели claude.ai/design + авторинг 6 floor-card v2-компонентов (эпик #2262)
Opened
#2269 [P2] Кросс-source дедуп: ключ схлопывает лишь 13.5% дублей — канонизация по house_id_fk (follow-up #2215)
Opened
#2275 [tradein][v2] Мобильной раскладки нет: 390px → overflowX 473px, десктопная сетка без брейкпоинта (из аудита #2266)
Opened
#2277 [tradein] cleanup-волна после стабилизации scraper-kit: удалить legacy-дубли скрапперов + косметика pool
Opened
#2291 [P3] Дедуп-остаток после #2269: mkr-misfire (334), ё/е-фолд (~60), area-straddle (139)
Opened
#2294 [P3] Сегментный множитель: confidence-гейт против band-by-predicted утечки (follow-up #2255)
Opened
#2295 [P3] POST /concepts отдаёт 422 на многоконтурных участках (MultiPolygon)
Opened
#2304 [tradein] scraper_kit migration — Stage 0: общий parity-test harness
Opened
#2305 [tradein] scraper_kit migration — Group A: admin/scripts debug (низкий риск)
Opened
#2306 [tradein] scraper_kit migration — Group B: cian/yandex price-history & session
Opened
#2307 [tradein] scraper_kit migration — Group D: порт orphan-модулей (domclick_detail, ekb_geoportal_client)
Opened
#2308 [tradein] scraper_kit migration — Group E: core valuation (estimator.py) — МАКСИМАЛЬНЫЙ РИСК
Opened
#2309 [tradein] scraper_kit migration — Group F: широкий рефактор структуры providers/*
Opened
#2310 [tradein] scraper_kit migration — Group C: backfill/enrichment tasks
Opened
#2316 [P4] mypy strict: 3 пред-существующие ошибки в generative/exporters/dxf.py
Opened
#2317 trade-in/v2: подключить LocationDrawer к GET /location-coef (frontend wiring, follow-up #2045)
Opened
#2320 [tradein][analytics] Point-in-time backtest на listing_source_snapshots — заблокировано данными, не кодом
Opened
#2322 [tradein] scraper_kit bug: yandex/cian newbuilding providers — BrowserFetcher без endpoint= ломает любого caller'а
Opened
#2323 [tradein] admin.py: scrape_cian_newbuilding awaits sync save_newbuilding_enrichment — TypeError at runtime
Opened
#2330 [tradein] scraper_kit: avito build_warmed_session() не выставляет config= — тихо теряет sticky-proxy на prod-default пути
Opened
#2334 [tradein] scraper_kit Group E1: avito_imv → kit (estimator.py dependency, часть #2308)
Opened
#2335 [tradein] scraper_kit Group E2: cian_valuation → kit (estimator.py dependency, часть #2308)
Opened
#2336 [tradein] scraper_kit Group E3: yandex_valuation → kit (estimator.py dependency, часть #2308)
Opened
#2337 [tradein] scraper_kit Group E4: финальное переключение estimator.py на kit (#2308 завершение)
Opened
#2349 [tradein] scraper_kit Group F1: fix yandex/cian newbuilding BrowserFetcher missing endpoint= (#2322)
Opened
#2350 [tradein] scraper_kit Group F2: fix avito build_warmed_session() missing config= (#2330)
Opened
#2351 [tradein] scraper_kit Group F3: системный аудит config-footgun паттерна во всех providers/*
Opened
#2352 [tradein] scraper_kit Group F4: shared base classes + consistent naming/layout providers/*
Opened
#2358 [tradein] scraper_kit Group F4-Foundation: shared base/utils для providers/*
Opened
#2361 [tradein] scraper_kit Group F4a: миграция avito/* на shared base (_base.py)
Opened
#2362 [tradein] scraper_kit Group F4b: миграция cian/* на shared base (_base.py)
Opened
#2363 [tradein] scraper_kit Group F4c: миграция yandex/* на shared base (_base.py)
Opened
#2364 [tradein] scraper_kit Group F4d: миграция domclick/* на shared base (_base.py)
Opened
#2367 [site-finder] ИСОГД Свердл: реестр РНС как ранний сигнал future-supply (§6) — наследник Потока 2 из #103
Opened
#2369 [tradein][obs] scrape_runs.total_seen=0 у yandex (и проверить avito/cian) — counters пишутся только в jsonb
Opened
#2376 backend: POST /api/v1/trade-in/lead + persist (parent #1971)
Opened
#2377 frontend: заменить mailto-CTA на форму лида в HeroTransparency (parent #1971)
Opened
#2378 chore(tradein/estimator): схлопнуть low-risk кластер флагов (dedup/disclosure/manual-review/confidence-floor) — #1970
Opened
#2379 chore(tradein/estimator): схлопнуть quarter-index price-correction флаги (#764) — #1970
Opened
#2380 chore(tradein/estimator): схлопнуть #1795 corridor-clamp/radius-floor/expected-sold-clamp флаги — #1970
Opened
#2381 chore(tradein/estimator): схлопнуть same-building-anchor + IMV-blend tuning флаги (#651/#652/#680/#1774) — #1970
Opened
#2382 fix(tradein/estimator): merge orphaned floor term for hedonic composite (#2002 roadmap item 1)
Opened
#2385 [tradein] scraper_kit F4 follow-up: сделать config mandatory в {cian,yandex}/newbuilding.py + домиграция на _base
Opened
#2386 [tradein] scraper_kit F4 follow-up: mock-target artifact блокирует миграцию avito/imv.py на _base
Opened
#2395 [tradein][v2] Форма лида (#2377) невидима на проде — смонтирована в мёртвом legacy-дереве, не в v2
Opened
#2397 [tradein] scraper_kit: decommission legacy orchestration (scrape_pipeline.py / scheduler.py) — enable full legacy deletion
Opened
#2406 [tradein] port legacy-only sweep edge cases (cancel-midway / watchdog-timeout / SIGTERM-drain) onto kit run_*_city_sweep
Opened
#2408 [tradein] standalone kit unit-тесты для SERP/houses парсеров (после удаления legacy golden-parity) + чистка orphaned fixtures
Opened
#2409 [needs-human][data] 191-ФЗ engineering_networks: нужен датасет из личного кабинета Минстроя (ФГИС ТП, QGIS.zip)
Opened
#2416 [needs-human][devops] deploy-obsidian.yml: живо ли GitHub-зеркало, или workflow мёртв с 16.05?
Opened
#2422 [tradein] kit standalone unit-покрытие после удаления legacy golden-parity (final E #2419) + чистка orphaned fixtures
Opened
#2423 [tradein] dedup: avito house-no regex хватает цифры из приклеенного названия метро вместо реального номера дома
Opened
#2425 [tradein] v2: клик по «Предыдущие оценки» не переключает вид, если в этой же SPA-сессии уже был submit свежей оценки
Opened
#2431 [tradein] dedup regression: PR #2429 сломал сравнение корпуса дома между avito/cian («NкM») и domklik («N/M»)
Opened
#2435 [tradein] Houses Catalog: Cian bti_data/valuation house_info распарсены, но выбрасываются (никогда не пишутся в houses)
Opened
#2440 feat(scraper): harvest plan_image из уже работающего catalog-скрапера (22d) — блокер для #299/#300
Opened
#2442 feat(scrapers): подключить flat-level catalog scraper в Celery + прокинуть catalog_url_hash
Opened
#2443 [needs-human] DOM.РФ WAF hard-ban на VPS IP с 2026-05-24 — статус cooldown не проверялся 6 недель
Opened
#2445 EPIC: аудит кода ПТИЦЫ (мульти-агентный code review 2026-07-05) — 18 подтверждённых находок
Opened
#2449 fix(site-finder): раскрыть/устранить 2 оставшихся *45.0 proxy-сайта в velocity.py (follow-up #2445-A4)
Opened
#2452 fix(frontend): нейтральный fallback ещё в 4 enum-lookup-местах (follow-up #2445-B2/B3)
Opened
#2457 fix(export): «НДС (паркинг)» → «НДС (паркинг + коммерция)» в full_report экспортёрах (follow-up #2445-C1)
Opened
#2462 [needs-human][devops] deploy-очередь: контейнер отстаёт от :latest при серии быстрых мержей + SENTRY_RELEASE-флаг врёт о готовности
Opened
#2464 EPIC: exhaustive line-by-line аудит backend ПТИЦЫ (2026-07-07) — 89 подтверждённых находок