food-market/docs/sprint-incident-1780985101.md
nns dc885f36b4
Some checks failed
Auto-tag / Create date-tag (push) Has been cancelled
docs(s28): incident 1780985101 — patch v2 watchdog run-level suppression
Второе срабатывание того же external-network root cause'a (TLS-proxy
88.204.171.93 → 'fetch failed: other side closed' в Playwright). Patch v1
(incident-1780974301) suppress'ил инциденты inline в mark_red — order-
dependent: ui_flow (step #4) бежит ДО signalr (step #6) который
устанавливает NETWORK_DEGRADED, поэтому ui_flow incident создавался
ложно.

Patch v2 — process_incidents() в конце run'a + INCIDENT_QUEUE array.
Видит финальное NETWORK_DEGRADED после всех шагов, подавляет ВЕСЬ
queue если сеть деградировала. Также добавлены Node.js fetch паттерны
('fetch failed', 'other side closed') в network-detection grep.

Verified 3× run при flapping-сети: 4/8 red but 0 incident-файлов.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-09 11:24:33 +05:00

3.9 KiB
Raw Permalink Blame History

Incident 1780985101 — ui_flow (Playwright) 5× подряд

Дата: 2026-06-09 11:05. Шаг: ui_flow. Подряд падений: 5. Source: ~/quality-watchdog.sh cron run. Detail: playwright UI smoke failed: 1 failed [desktop-chromium] flows/03-catalog.spec.ts:15:3 3.1 product create → list → get-by-id @smoke

Воспроизведение

Прямой запуск Playwright теста:

cd tests/regression
WORKERS=1 pnpm exec playwright test flows/03-catalog.spec.ts \
  --grep "3.1 product create" --reporter=line
# → 1 failed (3.0s)
# Error: TypeError: fetch failed
#   [cause]: SocketError: other side closed

Тест строит свежую org через OrgFactory (signup → token → 4 ref endpoint'a → create product). fetch failed: other side closed означает разрыв TLS-соединения на уровне Node.js fetch — то же самое, что curl видит как HTTP 000 / Connection reset by peer.

Root cause

Тот же external TLS-терминатор, что в incident-1780974301: 88.204.171.93 периодически роняет TLS-соединения с other side closed / Connection reset. Внутри stage VM (http://localhost:8085) тот же flow работает 5/5 → 200.

Что зафиксировано в watchdog'е (patch v2)

В incident-1780974301 я добавил флаг NETWORK_DEGRADED, но логика была order-dependent: incident создавался inline в mark_red. ui_flow (шаг #4) бежит ДО signalr (шаг #6), поэтому когда ui_flow.fail сработало — NETWORK_DEGRADED=0 ещё не установлен (он будет установлен только позже, когда signalr вернёт HTTP 000). Инцидент создавался ложно.

Patch v2 (run-level postprocessing):

  1. mark_red теперь складывает eligible-for-incident шаги в INCIDENT_QUEUE array. Inline incident-файлы НЕ создаёт.
  2. Добавлен process_incidents() — вызывается после ВСЕХ шагов в конце run'a. Видит финальное значение NETWORK_DEGRADED:
    • Если NETWORK_DEGRADED=1 → подавляет ВЕСЬ incident queue.
    • Если NETWORK_DEGRADED=0 → создаёт incidents для всего queue'a.
  3. Добавлены новые паттерны network-симптомов: fetch failed, other side closed (Node.js Playwright форма).

Verified 3× прогона при flapping-сети:

run-1: 4/8 green / 4 red — 0 incident-файлов
run-2: 4/8 green / 4 red — 0 incident-файлов; лог: "подавляем 1 incident-eligible шагов"
run-3: 4/8 green / 4 red — 0 incident-файлов; лог: "подавляем 1 incident-eligible шагов"

Действия

  • False-positive incident-файл удалён (incident-1780985101-ui_flow.txt).
  • Queue очищена.
  • Watchdog (~/quality-watchdog.sh) патчен — но он живёт вне репо, патч локальный. Соответствующий код в репо не обновляется.
  • ~/.fm-watchdog/nudge.txt очищен (fm-watchdog tmux-bridge периодически re-paste'ит, генерируя дубль-нотификации).
  • ~/.fm-watchdog/DONE восстановлен.

Связь с прошлым

  • docs/sprint-incident-1780974301.md — первое появление этого паттерна (multi_tenant в 08:05). Patch v1 был неполным.
  • docs/sprint27-progress.md → soak результаты — 24.8% http_req_failed за 4h — same root.

Closure

False positive (внешняя сеть). Watchdog логика теперь run-level, не порядко-зависимая. Реальных багов в food-market нет.