fix(best-layouts): покрытие §4.2 в комплексах, не в сырых obj_id (#2177, шаг 1/3) #2198

Merged
bot-backend merged 2 commits from fix/best-layouts-coverage-2177 into main 2026-07-02 19:34:12 +00:00
Collaborator

Summary

  • «Покрытие 17% (2 из 12 ЖК)» было артефактом дублей: domrf_kn_objects дробит один ЖК на несколько obj_id (Симфония ×3, Квартет ×2, Депо ×2, безымянные корпуса). Знаменатель теперь считается в комплексах: group_radius_objects — именованные по (застройщик, нормализованное ядро имени: ёлочки, «N очередь», generic-префиксы, повторы токенов; «Квартал Депо» сохраняется), безымянные — single-linkage гео-кластеры ≤300 м per застройщик.
  • Группа «с данными», если хоть один её obj_id имеет velocity. Прод-кейс 66:41:0204016:10: 12 obj_id → 6 комплексов → «2 из 6» = 33% (безымянный кластер Эфеса в 600 м от «7 ключей» — честно отдельная группа, не приклеиваем).
  • raw_objects_total добавлен в LayoutDataQuality для прозрачности; подпись «N из M ЖК» → «N из M комплексов» (фронт-бейдж + PDF-экспортер).
  • Ревью-верификация: пере-агрессивного среза нет («ЖК Первый квартал»→«первый квартал», «Микрорайон Солнечный»→«солнечный»), пустые ядра уходят в гео-кластеризацию (не сливаются пустым ключом), 410 безымянных точек кластеризуются за 30 мс.

Шаги 2-3 (#2177): авто-расширение objective_complex_mapping и lots-fallback — отдельными PR. Follow-up: npm run codegen после деплоя (api-types.ts дрейфует, нужен живой OpenAPI).

Test plan

  • pytest -k layout: 100 passed; ruff clean; tsc/eslint clean
  • code-reviewer APPROVE (нормализация/кластеры/контракт проверены пробами)
  • post-deploy: §4.2 на 66:41:0204016:10 показывает «покрытие 33% (2 из 6 комплексов)» + codegen-chore

Refs #2177

## Summary - «Покрытие 17% (2 из 12 ЖК)» было артефактом дублей: `domrf_kn_objects` дробит один ЖК на несколько obj_id (Симфония ×3, Квартет ×2, Депо ×2, безымянные корпуса). Знаменатель теперь считается в **комплексах**: `group_radius_objects` — именованные по (застройщик, нормализованное ядро имени: ёлочки, «N очередь», generic-префиксы, повторы токенов; «Квартал Депо» сохраняется), безымянные — single-linkage гео-кластеры ≤300 м per застройщик. - Группа «с данными», если хоть один её obj_id имеет velocity. Прод-кейс 66:41:0204016:10: 12 obj_id → **6 комплексов → «2 из 6» = 33%** (безымянный кластер Эфеса в 600 м от «7 ключей» — честно отдельная группа, не приклеиваем). - `raw_objects_total` добавлен в `LayoutDataQuality` для прозрачности; подпись «N из M ЖК» → «N из M комплексов» (фронт-бейдж + PDF-экспортер). - Ревью-верификация: пере-агрессивного среза нет («ЖК Первый квартал»→«первый квартал», «Микрорайон Солнечный»→«солнечный»), пустые ядра уходят в гео-кластеризацию (не сливаются пустым ключом), 410 безымянных точек кластеризуются за 30 мс. Шаги 2-3 (#2177): авто-расширение objective_complex_mapping и lots-fallback — отдельными PR. Follow-up: `npm run codegen` после деплоя (api-types.ts дрейфует, нужен живой OpenAPI). ## Test plan - [x] pytest -k layout: 100 passed; ruff clean; tsc/eslint clean - [x] code-reviewer ✅ APPROVE (нормализация/кластеры/контракт проверены пробами) - [ ] post-deploy: §4.2 на 66:41:0204016:10 показывает «покрытие 33% (2 из 6 комплексов)» + codegen-chore Refs #2177
bot-backend added 1 commit 2026-07-02 18:59:26 +00:00
fix(best-layouts): знаменатель покрытия в комплексах, не в сырых obj_id (#2177)
Some checks failed
CI / changes (pull_request) Successful in 8s
CI / frontend-tests (pull_request) Successful in 1m21s
CI / openapi-codegen-check (pull_request) Failing after 2m6s
CI / backend-tests (pull_request) Successful in 14m35s
6a554b559e
domrf_kn_objects дробит один ЖК на несколько obj_id (очереди, дубли
snapshot-строк, безымянные корпуса) — §4.2 показывала «покрытие 17%
(2 из 12 ЖК)» вместо честного счёта комплексов.

- group_radius_objects: именованные группируются по (застройщик, ядро
  имени) — нормализация ёлочек/«N очередь»/generic-префиксов/повторов
  токенов («Квартал Депо» сохраняется); безымянные — single-linkage
  гео-кластеры ≤300 м per застройщик (кластер в 600 м от именованного —
  отдельная честная группа)
- coverage по группам: группа с данными = хоть один её obj_id с velocity;
  прод-кейс 66:41:0204016:10: 12 obj_id → 6 комплексов → 33% вместо 17%
- raw_objects_total в LayoutDataQuality для прозрачности; подпись
  «N из M ЖК» → «N из M комплексов» (бейдж + PDF)

Шаг 1 из 3 issue #2177 (mapping-расширение и lots-fallback — следом).
Follow-up: npm run codegen после деплоя (нужен живой OpenAPI).
Light1YT added 1 commit 2026-07-02 19:04:44 +00:00
chore(frontend): regen api-types.ts — raw_objects_total в LayoutDataQuality (#2177)
All checks were successful
CI / changes (pull_request) Successful in 9s
CI / frontend-tests (pull_request) Successful in 1m14s
CI / backend-tests (pull_request) Successful in 14m48s
CI / openapi-codegen-check (pull_request) Successful in 2m5s
44bb1e58ca
Дамп app.openapi() (метод openapi-codegen-check) + пиненный
openapi-typescript/prettier из package-lock.
bot-backend merged commit b028377584 into main 2026-07-02 19:34:12 +00:00
bot-backend deleted branch fix/best-layouts-coverage-2177 2026-07-02 19:34:12 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2198
No description provided.