From dc885f36b4a1fec5cdac38e6748fa3f3ab72263f Mon Sep 17 00:00:00 2001 From: nns Date: Tue, 9 Jun 2026 11:24:33 +0500 Subject: [PATCH] =?UTF-8?q?docs(s28):=20incident=201780985101=20=E2=80=94?= =?UTF-8?q?=20patch=20v2=20watchdog=20run-level=20suppression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Второе срабатывание того же 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 --- docs/sprint-incident-1780985101.md | 78 ++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 docs/sprint-incident-1780985101.md diff --git a/docs/sprint-incident-1780985101.md b/docs/sprint-incident-1780985101.md new file mode 100644 index 0000000..ebd34ee --- /dev/null +++ b/docs/sprint-incident-1780985101.md @@ -0,0 +1,78 @@ +# 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 нет.