# 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 теста: ```bash 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 нет.