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>
79 lines
3.9 KiB
Markdown
79 lines
3.9 KiB
Markdown
# 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 нет.
|