gendesign/backend/app/services
Light1YT 0778af5d2c
All checks were successful
CI / changes (push) Successful in 7s
CI / changes (pull_request) Successful in 8s
CI / frontend-tests (push) Successful in 1m5s
CI / frontend-tests (pull_request) Successful in 59s
CI / openapi-codegen-check (push) Successful in 2m10s
CI / openapi-codegen-check (pull_request) Successful in 1m39s
CI / backend-tests (push) Successful in 9m2s
CI / backend-tests (pull_request) Successful in 8m56s
feat(site-finder): additive objective_lots price fallback for competitors (#307 OBJ-3)
competitors._AVG_PRICE_SQL читает domrf_kn_flats.price_per_m2, но на последнем
snapshot эта колонка пуста (0 строк, скрапер перестал отдавать per-flat цены
~2026-06-03) -> avg_price_per_m2=None почти всем конкурентам, price_similarity
вырождается в нейтраль 0.5. Добавлен additive fallback: где domrf-цены нет,
берём медиану objective_lots.price_per_m2_rub через objective_complex_mapping
(1:1 мост, ~80% покрытие, прод-median 136k руб/м²). domrf-цены приоритетны
(precedence domrf > objective); новое поле price_source ('domrf'/'objective')
для прозрачности инвест-рекомендаций. Веса и mv_layout_velocity не тронуты
(#295 defer). Медиана (не weighted-avg) устойчива к хвостам. api-types.ts
regenerated (v7.13.0 pinned + prettier).

Refs #307
2026-06-14 20:59:53 +05:00
..
analysis_runs feat(parcels): typed AnalyzeResponse + run-history read endpoints (#961) 2026-06-06 18:13:34 +00:00
analytics feat(analytics): velocity-anomaly alerts (#17) + ARN ДДУ price indicator (#99) 2026-06-13 22:04:49 +05:00
cadastre fix(cadastre): NSPD 500-retry + per-layer skip (#252) + disable dead pzz-beat (#259) + geom backfill (#200) 2026-06-13 20:45:05 +05:00
chat feat(chat): LLM tool-loop + §19 redaction wiring for #957 (Step 2+3) 2026-06-08 17:45:01 +05:00
etl fix(sf): psql stdin-bootstrap пароля gendesign_reader + COALESCE-protect внешних id (review fixup, #976) 2026-06-12 11:26:40 +03:00
exporters fix(backend): экранировать Excel formula-injection (#1244) + увести chat-чтение с event loop (#1245) 2026-06-13 18:10:21 +05:00
forecasting fix(forecasting): propagate confounded flag DemandSupplyForecast → §15 (#1222) 2026-06-13 15:02:50 +05:00
generative feat(generative): exporters (dxf/pdf) + generative test suite (#54 #55 #56) 2026-06-13 21:33:20 +05:00
llm fix(llm): cap серверного Retry-After через _MAX_BACKOFF_S=30s (#1209) 2026-06-13 06:07:46 +00:00
photos fix ui lag 2026-04-27 20:26:55 +03:00
scrapers fix(scrapers): izyatie OCR — '6б:' → '66:' для кад-номеров МСК-66 (#1228) 2026-06-13 15:03:59 +05:00
site_finder feat(site-finder): additive objective_lots price fallback for competitors (#307 OBJ-3) 2026-06-14 20:59:53 +05:00
__init__.py init 2026-04-25 13:45:19 +03:00
analytics_queries.py fix(analytics): свежая ипотечная ставка + recommend last_updated + drop dead route (#236 #237 #251) 2026-06-13 15:22:22 +00:00
analytics_refresh.py fix(scrape): SQLAlchemy text() парсил ':00:' regex как named-param 2026-04-30 23:16:11 +03:00
forecast_request_cache.py perf(forecast): per-request memoization cache for §22 cold build (#1129) 2026-06-08 05:26:27 +00:00
insights.py feat(insights): manual-entry Insight entity CRUD + §19 audit (#948 part A) 2026-06-08 12:41:39 +05:00
job_settings.py fix(admin-jobs): UPSERT в PUT /admin/jobs/settings — не терять изменения (#1223) 2026-06-13 08:36:23 +00:00
objective_etl.py fix(worker): port objective_etl from psycopg2 → psycopg v3 2026-05-11 12:07:57 +03:00
objective_sync_config.py fix(objective-sync): log seed failure вместо bare except pass (#1226) 2026-06-13 15:03:34 +05:00
own_projects.py feat(site-finder): own-portfolio data source for §25.3 cannibalization (#1169 PR1) 2026-06-08 16:21:53 +05:00
weather_cache.py perf(site-finder): air-quality TTL-кэш + neighbors_summary 2→1 SQL (#1130 Phase B) 2026-06-12 22:42:32 +05:00