[Fable 5][P3] useCustomPois инвалидирует несуществующий ключ ["analyze", cad] — скор и breakdown не обновляются после изменения custom-POI #1241

Closed
opened 2026-06-13 04:49:49 +00:00 by bot-backend · 0 comments
Collaborator

Из армейского ревью Claude Fable 5 (2026-06-11)

Confirmed by 2/2 адверсариальных верификатора, severity P3 (correctness), confidence 0.8.

Файл

frontend/src/hooks/useCustomPois.ts:31

Evidence (цитата кода)

function analyzeKey(parcelCad: string): unknown[] {
  return ["analyze", parcelCad];
}
...
if (parcelCad) {
  void queryClient.invalidateQueries({ queryKey: analyzeKey(parcelCad) });
}

Why bug

Ни один useQuery в проекте не использует ключ ["analyze", cad]: канонический ключ — ["parcel-analyze", cad, horizon] (site-finder-api.ts:363), а legacy-страница вообще держит результат в useMutation. Инвалидация в onSuccess add/update/delete custom-POI — no-op: после добавления/удаления точки с весом (через SiteMap на /legacy/site-finder) score и score_breakdown_detailed с вкладом custom-POI остаются stale, хотя docstring хука заявляет «Invalidates list + analyze query on success». Хук обнаружен через SiteMap (зона site-finder).

Suggested fix

Инвалидировать префикс ["parcel-analyze", parcelCad] (покроет все горизонты); для legacy-потока на useMutation — явный re-mutate или миграция analyze на useQuery.

Verify notes

  • [real/P3] Подтверждено: ни один useQuery не регистрирует ключ ["analyze",...] — единственный analyze-ключ ["parcel-analyze", cad, horizon] (site-finder-api.ts:363), префикс не совпадает → invalidateQueries no-op во всех 3 мутациях. parcelCad передаётся только на /legacy/site-finder, где score из useSiteAnalysis=useMutation вне query-кэша. Бэкенд включает custom POI в score (parcels.py:2653) → после add/delete POI отображаемый score/breakdown stale до ручного перезапуска.
  • [real/P3] Единственный producer ключа ["analyze",cad] — сам хук; ни один useQuery его не использует (живые ключи: ["parcel-analyze",cad,horizon], ["parcel-poi-score",cad] — префикс не совпадает, инвалидация no-op). Единственная страница с POI-редактированием (/legacy/site-finder) держит analyze в useMutation вне query-cache; mutate на POI-изменения не перезапускается. Backend включает custom POI в score (score += _contribution) — score/breakdown stale. Защиты нет. P3: legacy, лечится ручным re-analyze.

Provenance

  • Finders: fe-sitefinder, fe-app-lib
  • Confidence: 0.8
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) Confirmed by 2/2 адверсариальных верификатора, severity **P3** (correctness), confidence 0.8. ## Файл [`frontend/src/hooks/useCustomPois.ts:31`](frontend/src/hooks/useCustomPois.ts:31) ## Evidence (цитата кода) ``` function analyzeKey(parcelCad: string): unknown[] { return ["analyze", parcelCad]; } ... if (parcelCad) { void queryClient.invalidateQueries({ queryKey: analyzeKey(parcelCad) }); } ``` ## Why bug Ни один useQuery в проекте не использует ключ ["analyze", cad]: канонический ключ — ["parcel-analyze", cad, horizon] (site-finder-api.ts:363), а legacy-страница вообще держит результат в useMutation. Инвалидация в onSuccess add/update/delete custom-POI — no-op: после добавления/удаления точки с весом (через SiteMap на /legacy/site-finder) score и score_breakdown_detailed с вкладом custom-POI остаются stale, хотя docstring хука заявляет «Invalidates list + analyze query on success». Хук обнаружен через SiteMap (зона site-finder). ## Suggested fix Инвалидировать префикс ["parcel-analyze", parcelCad] (покроет все горизонты); для legacy-потока на useMutation — явный re-mutate или миграция analyze на useQuery. ## Verify notes - [real/P3] Подтверждено: ни один useQuery не регистрирует ключ ["analyze",...] — единственный analyze-ключ ["parcel-analyze", cad, horizon] (site-finder-api.ts:363), префикс не совпадает → invalidateQueries no-op во всех 3 мутациях. parcelCad передаётся только на /legacy/site-finder, где score из useSiteAnalysis=useMutation вне query-кэша. Бэкенд включает custom POI в score (parcels.py:2653) → после add/delete POI отображаемый score/breakdown stale до ручного перезапуска. - [real/P3] Единственный producer ключа ["analyze",cad] — сам хук; ни один useQuery его не использует (живые ключи: ["parcel-analyze",cad,horizon], ["parcel-poi-score",cad] — префикс не совпадает, инвалидация no-op). Единственная страница с POI-редактированием (/legacy/site-finder) держит analyze в useMutation вне query-cache; mutate на POI-изменения не перезапускается. Backend включает custom POI в score (score += _contribution) — score/breakdown stale. Защиты нет. P3: legacy, лечится ручным re-analyze. ## Provenance - Finders: `fe-sitefinder, fe-app-lib` - Confidence: 0.8 - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:49:49 +00:00
Sign in to join this conversation.
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#1241
No description provided.