WEB-397 · Задача · — · web
[Телефония] Watchdog переподключения telegram-call-native (зомби с 24.08 — /call падал 2 дня)
Закрыт
P2
ведёт: —
эпик: WEB-395
Суть
## ДЛЯ НУЛЕВОГО АГЕНТА (обновлено 2026-09-05 UTC)
- **Суть одной строкой:** [Телефония] Watchdog переподключения telegram-call-native (зомби с 24.08 — /call падал 2 дня)
- **Текущее состояние:** статус: done; [05.09 21:03Z координатор] [05.09 21:35Z координатор] Вотчдог telegram-call-native на Pi не мог помочь: с 01.09 11:27Z юнит падает на AuthKeyDuplicatedError (StringSession использована с двух IP — ключ отозван Telegram), рестарт-петля до 20:37Z, остановлен. Лечение только владельцем: /home/pi/tel…
- **Кто работал:**
- 2026-09-05T21:03:16.157Z — coordinator — [05.09 21:03Z координатор] [05.09 21:35Z координатор] Вотчдог telegram-call-native на Pi не мог помочь: с 01.09 11:27Z юнит падает на AuthKeyDuplicatedError (StringSession использована с двух IP — ключ отозван Telegram),
- **Ветки/бандлы/отчёты:** нет данных в тикете
- **KNOWN ISSUES / ТРАБЛШУТИНГ:**
- [05.09 21:03Z координатор] [05.09 21:35Z координатор] Вотчдог telegram-call-native на Pi не мог помочь: с 01.09 11:27Z юнит падает на AuthKeyDuplicatedError (StringSession использована с двух IP — ключ отозван Telegram), рестарт-петля до 20:37Z, остановлен. Лечение только владельцем: /home/pi/tel…
- **Эволюция:**
- 2026-09-05 → [05.09 21:03Z координатор] [05.09 21:35Z координатор] Вотчдог telegram-call-native на Pi не мог помочь: с 01.09 11:27Z юнит падает на AuthKeyDuplicatedError (StringSession использована с двух IP — ключ отозван Telegram), рестарт-петля до 20:37Z, остановлен. Ле
- [05.09 21:03Z координатор] [05.09 21:35Z координатор] Вотчдог telegram-call-native на Pi не мог помочь: с 01.09 11:27Z юнит падает на AuthKeyDuplicatedError (StringSession использована с двух IP — ключ отозван Telegram), рестарт-петля до 20:37Z, остановлен. Лечение только владельцем: /home/pi/tel…
- **Следующий шаг:** [05.09 21:03Z координатор] [05.09 21:35Z координатор] Вотчдог telegram-call-native на Pi не мог помочь: с 01.09 11:27Z юнит падает на AuthKeyDuplicatedError (StringSession использована с двух IP — ключ отозван Telegram), рестарт-петля до 20:37Z, остановлен. Лечение только владельцем: /home/pi/tel…
Доказательства
[2026-08-27 00:20Z] Диспатчнут watchdog397 на A1 (sol high): health-сигнал воркера, systemd timer вотчдог с анти-флаппингом, негативный тест; установка на Pi — координатором.
[2026-08-27 01:35Z] WATCHDOG397 DONE (автор): вотчдог+timer+тесты, НО затронуты и файлы воркера (worker.py health-контракт). Деплой отложен до независимой приёмки accwatchdog (в очереди): главный вопрос — можно ли ставить вотчдог БЕЗ обновления worker.py (минимальный прод-риск), анти-флаппинг, ложные срабатывания.
[2026-08-27 01:50Z] ДОКУМЕНТЫ (путь эволюции): автор A1:/home/ubuntu/waves/WATCHDOG397-REPORT.md + wt-watchdog397/ (units в infra/telegram_call_native/, WATCHDOG.md); приёмка queue/046-accwatchdog-brief.md -> ACCWATCHDOG-REPORT.md; исток: зомби-инцидент 24-26.08.
[2026-08-27 02:55Z] ЗАДЕПЛОЕН ПАРНО (по acc-вердикту GO-парой): бэкап /home/pi/wd397-backup-20260826T235256Z. ВАЖНО: база волны отстала от прода (на Pi worker.py нёс _CANONICAL_REALTIME_DATED_NEWS_RE, в базе волны нет) — слепое копирование затёрло бы; наложен git-diff волны (216 строк) на ЖИВЫЕ файлы Pi, patch rc=0, py_compile OK, прод-логика сохранена (regex 2 refs). Воркер рестартнут: active, healthz 200 (авторизованный MTProto get_me, tgUser 6529129062), heartbeat пишется. Вотчдог: разовая проба healthy latency 33ms, таймер 3мин enabled. Анти-флаппинг: 2 провала подряд -> рестарт, не чаще 1/600с. -> review (наблюдение до утра).
[2026-08-27 20:29:19Z tickacc5] ВЕРДИКТ: частично доказано
Что проверил: открыл WATCHDOG397-REPORT.md и ACCWATCHDOG-REPORT.md; выполнил targeted unittest 7/7, py_compile, git diff --check и systemd-analyze verify service+timer; проверил A1 watchdog paths; попытался read-only SSH к Pi напрямую и через proxy.
Что увидел: healthz/get_me, threshold/cooldown и timer contract проходят локальные tests/verify. Board trail заявляет Pi deployment/healthy worker, но current Pi check невозможен: direct SSH timeout, proxy authentication Permission denied (publickey). На A1 watchdog service/timer не установлены; это не proof Pi failure.
Отрицательный тест: A1 systemctl is-enabled watchdog units вернул not-found; Pi healthz/heartbeat/timer status получить не удалось из-за authorized key.
Чего не хватает: read-only current-Pi receipt с authenticated healthz, heartbeat, worker PID, watchdog timer status и observation window.
## 2026-08-28 ~12:15Z — взято в работу (координатор Фабл)
Волна `web397`. **Уточнение диагноза координатором:** `telegram-call-native.service` **активна и enabled**, MainPID 882018 — это НЕ падение службы. Процесс жив, но переподключение не происходит. Значит болезнь другая и лечится иначе, чем считалось.
Задача: найти корень зомби-состояния (кончились попытки и никто не сказал · состояние застряло в «подключаюсь» · ошибка проглочена · ждём ответа, которого не будет), сделать сторож переподключения с ответами на три вопроса, **живость проверять сквозной пробой, а не наличием процесса** (у нас трижды порт слушал при мёртвом канале), вывести наружу признак для проверки одной командой.
Зона телефонии открыта решением владельца 28.08.
[28.08 ~13:35Z Фабл] web397 сдана: сериализованный watchdog — реальный GetDhConfigRequest каждые 10 с, timeout 5 с, reconnect backoff 1..30 без лимита, /call отказывает без свежей пробы, healthz 200 только при probe.ok. ВАЖНЫЙ факт координатора: служба на малинке СЕЙЧАС жива по-настоящему — healthz:3630 отвечает mtprotoConnected=true, ping 46 мс, heartbeat свежий (зомби нет; закалка против повторения 24–26.08). Заряжена приёмка **acc397** (очередь 258): граница процесса, матрица мусора probe-ответа, зомби→503, отсутствие каскадного reconnect при икоте. Отчёты: WEB397-REPORT.md, будет ACC397-REPORT.md.
[28.08 14:30Z Фабл] ACC397 = NO-GO: нет гистерезиса — одна transient-ошибка/timeout рвёт ЖИВОЙ transport (ложная тревога опаснее зомби — риск, названный в брифе, подтвердился); DH-ответ валидируется только по random; healthz по truthiness; recovery плодит попытки на каждый poll. Заряжен web397b (очередь 260) со списком «до GO»: hysteresis N устойчивых отказов, полная форма DH (g,p,random,тип), схемная валидация healthz (bool строго, чужая форма→503), regression slow-live/concurrent/garbage. Отчёты: ACC397-REPORT.md, будет WEB397B-REPORT.md.
[28.08 17:00Z Фабл] ACC397B = NO-GO, но прогресс: гистерезис и отбраковка truthy-форм ПРИНЯТЫ; остались узкие — schema gate пропускает неизвестные поля и не проверяет enum/семантику вложенных. Заряжен web397c (очередь 265, узкий). Отчёты: ACC397B-REPORT.md, будет WEB397C-REPORT.md.
[28.08 19:10Z Фабл] ACC397C = NO-GO: блокеры прошлого круга закрыты; новые узкие — probe↔telegram.healthy не сверяются взаимно, timing/counter принимают невозможные значения. Заряжен web397d (очередь 270). Отчёты: ACC397C-REPORT.md.
[28.08 ~19:50Z ★ ACC397H_VERDICT=GO — линия сторожа/переподключения ПРИНЯТА]
Отчёт: /home/ubuntu/waves/ACC397H-REPORT.md. Проверялась работа web397g (дерево /home/ubuntu/waves/wt-web397), дерево приёмки несло состояние автора патчем на базе посаженной l65.
Закрывалось замечание N13: собственный health snapshot отвергал nextRetryAt только потому, что retry был опубликован после полного probe/reconnect пути.
Приёмка требовала обе стороны (валидный retry принимается / мусорный отвергается), матрицу значений nextRetryAt (прошлое, далёкое будущее, ноль, отрицательное, не-число, null, строка, NaN/Infinity), три вопроса, свой негативный тест и скан на глушение. Вердикт GO.
СТАТУС: готово к посадке l66.
Починено в
watchdog397@A1-wt
Лента
2026-09-05T21:03:16.157Z · coordinator[05.09 21:03Z координатор] [05.09 21:35Z координатор] Вотчдог telegram-call-native на Pi не мог помочь: с 01.09 11:27Z юнит падает на `AuthKeyDuplicatedError` (StringSession использована с двух IP — ключ отозван Telegram), рестарт-петля до 20:37Z, остановлен. Лечение только владельцем: `/home/pi/telegram-call-native/relogin-telegram.sh` (интерактив: телефон + код → новая `TELEGRAM_STRING_SESSION` в `current/worker.env`, restart). Вотчдогу стоит распознавать AuthKeyDuplicatedError/AuthKeyUnregisteredError и НЕ рестартовать, а слать владельцу «нужен перелогин» (backlog). Подробности: WEB-395.
2026-09-05T22:57:43.941Z · coordinator[05.09 22:57Z координатор] [06.09 03:40Z координатор | ПРИЁМКА 2111 = NO-GO (один блокер) → доработка 2115] Luna на A2 (`/home/ubuntu/waves/ACCTGVOICERETRY-REPORT.md`) кандидата 5cfa4ed6 (durable retry транскрипции голосовых): прошли — закрытый accounting gate не жжёт attempt и деньги, runner каждые 5 мин с TTL 6 ч, model_not_allowed и TTL терминальны, wiring file:line; блокер — `telegramVoiceRetryRunner.ts:55-56` getFile 4xx (404 протухший файл) бросает обычный Error без статуса → ретраи до cap вместо терминального честного сообщения пользователю. → волна 2115 (luna, A2): типизированная ошибка Telegram API, 4xx → permanent + одно сообщение пользователю, тесты; затем повторная приёмка → l113b. Ранбук «догнать 4 голосовых 05.09» — в отчёте приёмки (§Ранбук), применим после посадки.
2026-09-05T23:28:35.169Z · coordinator[05.09 23:28Z координатор] [06.09 06:20Z координатор | ПРИЁМКА 2116 = NO-GO только по наложению на l113 → 2124] Luna на A2 (`/home/ubuntu/waves/ACCTGVOICERETRY2-REPORT.md`) кандидата ceb4aa9d: по существу всё PASS — закрытый gate не тратит attempt/деньги, backoff 60/120/240 с, cap 1 ч, MAX_ATTEMPTS=3, TTL 6 ч; model_not_allowed permanent; getFile 404 → terminal `telegram_file_unavailable` за один run + одно уведомление; ранбук догнать сообщение идемпотентен (task_created/task_reopened, dedupe=1). NO-GO: `cherry_pick_on_l113=conflict` (кандидат на базе l112). → волна 2124 (luna): перебазирование на 87111a95 с сохранением поведения + повтор негативов → l113b.
2026-09-05T23:40:12.094Z · coordinator[05.09 23:40Z координатор] [06.09 06:55Z координатор | 2124 = GO: цепочка TG-ретрая перенесена на l113] Кандидат `a04bb9156707fe1d6a9b3c965ae3940fabd674d9` (luna, A2, база 87111a95; бандл `/home/ubuntu/waves/TGVOICERETRYONL113.bundle`, отчёт `TGVOICERETRYONL113-REPORT.md`): cherry-pick 900b773c7..ceb4aa9d на прод-линию чистый после разрешения конфликтов, тесты и негативы приёмки 2116 повторены (getFile 404 терминал за один тик, закрытый gate без трат, идемпотентность). Содержание принято приёмками 2111/2116 → в l113b. После посадки: ранбук «догнать 4 голосовых 05.09» (`ACCTGVOICERETRY2-REPORT.md` §Ранбук) — выполнить координатором, затем проверить, что владелец получил тексты.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-397","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-05T21:05:36.501Z