docs(s28): incident 1780985101 — patch v2 watchdog run-level suppression
Some checks failed
Auto-tag / Create date-tag (push) Has been cancelled

Второе срабатывание того же 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>
This commit is contained in:
nns 2026-06-09 11:24:33 +05:00
parent b3ed6796ce
commit dc885f36b4

View file

@ -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 нет.