fix(site-finder): true-counts вместо молча-усечённых len(list) в connection-points/utility (#2445-A1/A2) #2450

Merged
bot-backend merged 1 commit from fix/silent-cap-true-counts into main 2026-07-05 18:54:50 +00:00
Collaborator

Summary

Аудит-находки A1+A2 (epic #2445). Два «silent truncation as total» бага:

  • quarter_dump_lookup.pytotal_structures_in_radius=len() от LIMIT 50, protection_zones_intersecting=len() от LIMIT 100 (+ БЕЗ ORDER BY → недетерминированные 100).
  • utility_infrastructure_loader.pytotal_features=len() от LIMIT 200.

Показывали усечение как полный итог — нарушение «no silent caps».

Fix

Паттерн permits_nearby.py: отдельный COUNT(*) по полной выборке (WHERE вынесен в общую константу → count и fetch не могут разъехаться), LIMIT остаётся на display-списке, *_truncated булевы флаги. Плюс детерминированный ORDER BY перед zouit LIMIT 100.

Schema: 3 новых булевых поля (аддитивно, default False). api-types.ts регенерирован (только 3 поля, без churn — codegen-check пройдёт).

Test plan

  • 130 targeted + 311 broader тестов зелёные (7 новых: true-count>capped + not-truncated + ORDER-BY + graceful-failure)
  • ruff/prettier чисто, psycopg CAST соблюдён
  • code-reviewer: APPROVE (0 блокеров; предикаты count/fetch идентичны — флаг не врёт)

Follow-up (не в этом PR)

frontend/src/types/nspd.ts:132 (hand-maintained mirror) + cockpit-UI должны показать truncated-флаги — когда будет UI-эпик отображения.

Refs #2445

## Summary Аудит-находки A1+A2 (epic #2445). Два «silent truncation as total» бага: - `quarter_dump_lookup.py` — `total_structures_in_radius`=`len()` от `LIMIT 50`, `protection_zones_intersecting`=`len()` от `LIMIT 100` (+ БЕЗ ORDER BY → недетерминированные 100). - `utility_infrastructure_loader.py` — `total_features`=`len()` от `LIMIT 200`. Показывали усечение как полный итог — нарушение «no silent caps». ## Fix Паттерн `permits_nearby.py`: отдельный `COUNT(*)` по полной выборке (WHERE вынесен в общую константу → count и fetch не могут разъехаться), `LIMIT` остаётся на display-списке, `*_truncated` булевы флаги. Плюс детерминированный ORDER BY перед zouit `LIMIT 100`. Schema: 3 новых булевых поля (аддитивно, default False). `api-types.ts` регенерирован (только 3 поля, без churn — codegen-check пройдёт). ## Test plan - [x] 130 targeted + 311 broader тестов зелёные (7 новых: true-count>capped + not-truncated + ORDER-BY + graceful-failure) - [x] ruff/prettier чисто, psycopg `CAST` соблюдён - [x] code-reviewer: ✅ APPROVE (0 блокеров; предикаты count/fetch идентичны — флаг не врёт) ## Follow-up (не в этом PR) `frontend/src/types/nspd.ts:132` (hand-maintained mirror) + cockpit-UI должны показать truncated-флаги — когда будет UI-эпик отображения. Refs #2445
bot-backend added 1 commit 2026-07-05 18:38:42 +00:00
fix(site-finder): true-counts вместо молча-усечённых len(list) (#2445-A1/A2)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m7s
CI / openapi-codegen-check (pull_request) Successful in 2m0s
CI / backend-tests (pull_request) Successful in 14m52s
c2306c78c4
quarter_dump_lookup (connection-points) и utility_infrastructure_loader
капали список через SQL LIMIT, но выдавали len(list) как полный итог —
молча скрывая structures/zones/features сверх капа. Паттерн permits_nearby.py:
отдельный COUNT(*) по полной выборке, LIMIT остаётся на display-списке,
*_truncated булевы флаги. Плюс добавлен детерминированный ORDER BY перед
zouit_engineering LIMIT 100 (раньше был неупорядоченный, недетерминированные 100).

Schema: +protection_zones_truncated/structures_truncated (ConnectionPointsSummary),
+features_truncated (UtilityInfrastructureSummary), аддитивно default False.
api-types.ts регенерирован (только 3 новых поля).

Refs #2445
bot-backend merged commit 82e0b8b0a3 into main 2026-07-05 18:54:50 +00:00
bot-backend deleted branch fix/silent-cap-true-counts 2026-07-05 18:54:51 +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#2450
No description provided.