[Fable 5][uncertain][P3] useParcelAnalyzeQuery: poll-цикл игнорирует AbortSignal — зомби-поллинг и лишние POST /analyze после навигации #1248

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

Из армейского ревью Claude Fable 5 (2026-06-11) — UNCERTAIN (1/2 верификаторов real)

⚠️ Только 1 из 2 адверсариальных верификаторов подтвердил баг как real. Заведено по решению Anton (2026-06-13) — требует дополнительной проверки перед фиксом. Severity P3 (performance), confidence 0.7.

Файл

frontend/src/lib/site-finder-api.ts:390

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

      if (first.status === 202) {
        for (let i = 0; i < ANALYZE_POLL_MAX_ITERATIONS; i++) {
          await new Promise((r) => setTimeout(r, ANALYZE_POLL_INTERVAL_MS));

Why bug (по версии finder'а)

queryFn не принимает { signal } из TanStack v5: signal не передаётся в fetch и не проверяется в цикле. При уходе со страницы анализа (или смене cad/horizon) цикл живёт до 2 минут: каждые 2 с GET /fetch-status, а при готовности — re-POST /analyze (на бэке ~10-30 с + enqueue Celery-форсайта 30-180 с) для участка, который никто не смотрит. Быстрый просмотр нескольких незакешированных участков множит параллельные зомби-циклы и фоновую нагрузку на НСПД-fetch/forecast-пайплайн.

Suggested fix

Принять ({ signal }) в queryFn, прокидывать в apiFetch/apiFetchWithStatus и в начале каждой итерации делать if (signal?.aborted) throw — RQ отменит цикл при анмаунте.

Verify notes (вердикты адверсариальных верификаторов)

  • [real/P3] queryFn не берёт {signal} и не проверяет отмену в цикле (строки 364, 390-428). Без consumed signal TanStack v5 не отменяет промис при unmount: после навигации/смены horizon цикл живёт до 2 мин — GET /fetch-status каждые 2с, при ready re-POST /analyze (sync def держит threadpool slot + enqueue Celery-форсайта). Sibling useSiteAnalysis.ts:133 проверяет cancelledRef в том же цикле. cancelQueries/AbortController в src нет. P3 честен: bounded, данные не портятся.
  • [refuted/P3] Signal не используется, но это дефолт TanStack (доделать и закэшировать), цикл ограничен 2 мин. Мультипликаторы опровергнуты: смена horizon цикл не порождает — селектор скрыт при isLoading, disabled при isFetching, после первого 200 геометрия в БД → 202 невозможен; НСПД-нагрузки нет — fetch-job запущен первым POST и дедупится бэком; re-POST персистит ран+форсайт, потребляемые при возврате (staleTime 5 мин). Остаток ≤60 дешёвых GET + 1 analyze — трейдофф, не дефект.

Provenance

  • Finders: fe-app-lib
  • Confidence: 0.7
  • Verifier votes: 1 real / 1 refuted (на основании 2 попыток)
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) — UNCERTAIN (1/2 верификаторов real) ⚠️ **Только 1 из 2 адверсариальных верификаторов подтвердил баг как `real`**. Заведено по решению Anton (2026-06-13) — требует **дополнительной проверки** перед фиксом. Severity **P3** (performance), confidence 0.7. ## Файл [`frontend/src/lib/site-finder-api.ts:390`](frontend/src/lib/site-finder-api.ts:390) ## Evidence (цитата кода) ``` if (first.status === 202) { for (let i = 0; i < ANALYZE_POLL_MAX_ITERATIONS; i++) { await new Promise((r) => setTimeout(r, ANALYZE_POLL_INTERVAL_MS)); ``` ## Why bug (по версии finder'а) queryFn не принимает { signal } из TanStack v5: signal не передаётся в fetch и не проверяется в цикле. При уходе со страницы анализа (или смене cad/horizon) цикл живёт до 2 минут: каждые 2 с GET /fetch-status, а при готовности — re-POST /analyze (на бэке ~10-30 с + enqueue Celery-форсайта 30-180 с) для участка, который никто не смотрит. Быстрый просмотр нескольких незакешированных участков множит параллельные зомби-циклы и фоновую нагрузку на НСПД-fetch/forecast-пайплайн. ## Suggested fix Принять ({ signal }) в queryFn, прокидывать в apiFetch/apiFetchWithStatus и в начале каждой итерации делать if (signal?.aborted) throw — RQ отменит цикл при анмаунте. ## Verify notes (вердикты адверсариальных верификаторов) - [real/P3] queryFn не берёт {signal} и не проверяет отмену в цикле (строки 364, 390-428). Без consumed signal TanStack v5 не отменяет промис при unmount: после навигации/смены horizon цикл живёт до 2 мин — GET /fetch-status каждые 2с, при ready re-POST /analyze (sync def держит threadpool slot + enqueue Celery-форсайта). Sibling useSiteAnalysis.ts:133 проверяет cancelledRef в том же цикле. cancelQueries/AbortController в src нет. P3 честен: bounded, данные не портятся. - [refuted/P3] Signal не используется, но это дефолт TanStack (доделать и закэшировать), цикл ограничен 2 мин. Мультипликаторы опровергнуты: смена horizon цикл не порождает — селектор скрыт при isLoading, disabled при isFetching, после первого 200 геометрия в БД → 202 невозможен; НСПД-нагрузки нет — fetch-job запущен первым POST и дедупится бэком; re-POST персистит ран+форсайт, потребляемые при возврате (staleTime 5 мин). Остаток ≤60 дешёвых GET + 1 analyze — трейдофф, не дефект. ## Provenance - Finders: `fe-app-lib` - Confidence: 0.7 - Verifier votes: 1 real / 1 refuted (на основании 2 попыток) - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:58:13 +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#1248
No description provided.