Второе срабатывание того же 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>
3.9 KiB
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):
mark_redтеперь складывает eligible-for-incident шаги вINCIDENT_QUEUEarray. Inline incident-файлы НЕ создаёт.- Добавлен
process_incidents()— вызывается после ВСЕХ шагов в конце run'a. Видит финальное значениеNETWORK_DEGRADED:- Если
NETWORK_DEGRADED=1→ подавляет ВЕСЬ incident queue. - Если
NETWORK_DEGRADED=0→ создаёт incidents для всего queue'a.
- Если
- Добавлены новые паттерны 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 нет.