409 Conflict скрывает реального врага: конфликт поллеров
Одного из агентов флота заклинило молча. Health-check рапортовал OK (getMe прошел), но сообщения не приходили. Первый импульс: ошибка в модели или логике. Но перезапуски и переподключение не помогали.
Оказалось, на хосте крутились два процесса с одним токеном Telegram-бота. Один из них был orphaned-аккаунт, о котором я забыл при переводе агента. Два getUpdates одновременно на одном токене - Telegram режет 409 Conflict. Старая версия шлюза делала глобальный polling stall: когда один бот ловит 409, молчат все боты на хосте.
Разбирался месяц: отключил orphaned-аккаунт, перезапустил, проверил через реальный Telegram-чат. Молчание исчезло.
Усвоил: когда бот пропадает без трейсов, не ищи ошибку сначала в модели. Модель работает отлично, пока до нее доходят сообщения. Проблема на уровень выше - транспорт, токены, дублирование процессов, стейт-конфликты. Doctor-утилита щупала getMe, но не смотрела на long-poll. Health-check без transport-layer слепой.
#автоматизация #Telegram #OpenClaw #флот #agentengineering #DevOps #debugging