feat(site-finder): supply_layers v2 compute service (#950 EPIC6 step3+4) #1004

Merged
Light1YT merged 1 commit from feat/950c-supply-layers-service into main 2026-06-02 20:34:26 +00:00
Owner

Site Finder v2 / EPIC 6 — #950 Step 3+4. Детерминированный, без LLM, read-only compute. Часть #944.

Сервис supply_layers.py — считает 3 слоя склада предложения (§9.3) и возвращает SupplyLayerRow dataclasses (воркер #950 Step 5 UPSERT-ит их в supply_layers m.125). Зеркалит house-style market_metrics.py (frozen dataclass, _SQL consts, graceful-to-empty, pure helpers, CAST(:x AS type)).

  • L1 open: objective_lots available по district x class (objective/high).
  • L2 hidden (crux): SUM max(0, flat_count - free_flats) по district, mapping-free через domrf_kn_objects (free_flats m.124) — БЕЗ domrf<->objective join (обходит 2.5% маппинг). domrf_declared, medium/low по покрытию free_flats. NULL free_flats исключены (нет sold-колонки).
  • L3 future: domrf multiphase (ready_dt за горизонтом 12мес, ~нет выставленных) по dev_group_name (domrf_multiphase/low). graddoc_stub отложен на #956.

Latest-snapshot DISTINCT ON (obj_id) защищает от cross-snapshot double-count (domrf_kn_objects = UNIQUE(obj_id, snapshot_date)). Только whitelist source/confidence (m.125 CHECK). 45 unit-тестов, ruff clean. code-reviewer opus OK (все колонки существуют против реального schema; latest-snapshot фильтр верен; L1 зеркалит market_metrics; psycopg v3). Refs #950

**Site Finder v2 / EPIC 6 — #950 Step 3+4.** Детерминированный, без LLM, read-only compute. Часть #944. Сервис `supply_layers.py` — считает 3 слоя склада предложения (§9.3) и возвращает `SupplyLayerRow` dataclasses (воркер #950 Step 5 UPSERT-ит их в `supply_layers` m.125). Зеркалит house-style `market_metrics.py` (frozen dataclass, _SQL consts, graceful-to-empty, pure helpers, `CAST(:x AS type)`). - **L1 open:** `objective_lots` available по district x class (objective/high). - **L2 hidden (crux):** `SUM max(0, flat_count - free_flats)` по district, **mapping-free** через `domrf_kn_objects` (free_flats m.124) — БЕЗ domrf<->objective join (обходит 2.5% маппинг). domrf_declared, medium/low по покрытию free_flats. NULL free_flats исключены (нет sold-колонки). - **L3 future:** domrf multiphase (ready_dt за горизонтом 12мес, ~нет выставленных) по dev_group_name (domrf_multiphase/low). graddoc_stub отложен на #956. **Latest-snapshot `DISTINCT ON (obj_id)`** защищает от cross-snapshot double-count (domrf_kn_objects = UNIQUE(obj_id, snapshot_date)). Только whitelist source/confidence (m.125 CHECK). **45 unit-тестов**, ruff clean. code-reviewer opus OK (все колонки существуют против реального schema; latest-snapshot фильтр верен; L1 зеркалит market_metrics; psycopg v3). Refs #950
Light1YT added 1 commit 2026-06-02 20:34:25 +00:00
Deterministic 3-layer склад предложения (ТЗ §9.3), read-only compute returning
SupplyLayerRow dataclasses for the #950 Step5 worker to UPSERT into supply_layers
(m.125). Mirrors market_metrics.py house style (frozen dataclass, _SQL consts,
graceful-to-empty, pure helpers, CAST(:x AS type)).

- L1 open: objective_lots available lots per district x class (objective/high)
- L2 hidden: SUM max(0, flat_count - free_flats) per district, mapping-free via
  domrf_kn_objects (free_flats m.124) - no domrf<->objective join (domrf_declared,
  medium/low by free_flats coverage). NULL free_flats excluded (no sold column).
- L3 future: domrf multiphase (ready_dt beyond 12mo horizon, ~no listed flats)
  grouped by dev_group_name (domrf_multiphase/low). graddoc_stub deferred to #956.

Latest-snapshot DISTINCT ON guards against cross-snapshot double-count
(domrf_kn_objects is UNIQUE(obj_id, snapshot_date)). Only whitelisted
source/confidence values (m.125 CHECK). 45 unit tests, ruff clean.
Light1YT merged commit 900802264a into main 2026-06-02 20:34:26 +00:00
Light1YT deleted branch feat/950c-supply-layers-service 2026-06-02 20:34:27 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1004
No description provided.