From cce2bf3f3e9d8a267b70e893f63aa6e7b9ebb0de Mon Sep 17 00:00:00 2001 From: lekss361 Date: Tue, 12 May 2026 08:58:46 +0300 Subject: [PATCH] fix(site-finder): address PR #95 auto-review minor feedback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend (cadastre_fetch.py): 1. (race condition) Advisory lock `pg_try_advisory_xact_lock(hashtext(cad_num))` обёрнут вокруг шагов "check active job → enqueue" в find_or_enqueue_fetch. Lock transaction-scoped, released at COMMIT. Параллельные запросы на тот же cad: первый получает lock и enqueue; второй lock=false → re-check active job (уже виден после первого COMMIT) → возвращает тот же job_id. Docstring обновлён, упоминание SELECT FOR UPDATE удалено. Backend (parcels.py): 3. (threadpool exhaustion) _INLINE_FETCH_WAIT_S снижен 25 → 15s с подробным комментарием: tradeoff про default Starlette anyio threadpool (40 slots) и concurrent burst saturation. 15s баланс: НСПД avg 5-15s для quarter, ~70% fast path; остальные 30% получают 202 + polling без блока. Data (87_on_demand_indexes.sql): 2. (missing index) New migration: - `nspd_geo_targets_cad_num_idx ON nspd_geo_targets(cad_num)` — для find_active/recent_completed_job (existing UNIQUE composite не покрывает WHERE cad_num=:c). - `nspd_geo_jobs_source_status_idx ON nspd_geo_jobs(source_kind, status)` composite для filter auto_on_demand + queued/running. Idempotent (CREATE INDEX IF NOT EXISTS), не блокер при текущем размере, критично при росте on-demand traffic. Frontend (useSiteAnalysis.ts): 4. (UI flicker) setFetchingState(null) перемещён ПОСЛЕ `await second apiFetch`. Иначе между clear и resolve есть момент когда mutation isPending=true + fetchingState=null → пустой экран ~1 RTT. NOT addressed (rebuttal): 5. (Tailwind convention) — проверил: в проекте нет ни globals.css, ни @tailwind directives. ВСЕ существующие site-finder components используют inline styles (ConfidenceBadge, GeotechRiskBlock, ScoreBreakdownPanel etc). Tailwind в deps но не wired up. Keep inline styles для consistency. 6. (animate-spin) — требует Tailwind globals (см. #5). `