- Клиент бота собирается один раз и достаётся отправителю и транспорту; разрез прошёл по «ответил ли Telegram»: ответ «такого бота нет» роняет старт, недоступность даёт подъём без Telegram (ADR-2026-08-13). Ожидание при сборке ограничено сроком — иначе молчащий Telegram вешал подъём. - Недоставленный ответ не роняет шаг: пишется с job_id и считается метрикой, уровень по причине — WARN для неподнятого входа, ERROR для неназванного адресата. Заведены transcriber_intake_up и transcriber_undelivered_reply_count. - Закрыта утечка токена в журнал: отказ разбора адреса рождается раньше обращения к клиенту, то есть мимо чистки на его границе.
5.1 KiB
✨ Поднимать сервис без токена бота, работая одним входом
- Тип: feature
- Категория: Очередь — Поднято к долгам входа: живой прогон нужен именно им, а сегодня его нет ни у одной задачи.
- Зачем: Адаптер Telegram проверяет токен обращением к Telegram и роняет старт, а боевым токеном запускаться запрещено: проверить поведение живым прогоном не может ни одна задача.
Замечено при попытке проверить вход вживую в задаче oidc-login 2026-08-12;
подтверждено прогоном: с выдуманным токеном старт кончается отказом создания
отправителя раньше, чем поднимается HTTP-сервер.
Отсюда следствие, которое стоит дороже самого неудобства: поведенческая верификация живым запуском недоступна проекту вовсе. Всякая задача, меняющая наблюдаемое поведение, проверяется только тестами, а «поднять и посмотреть» остаётся человеку с боевым конфигом.
Запрет запускаться боевым токеном снимать не надо: второй процесс с тем же токеном перехватывает обновления у работающего.
Разбор 2026-08-13 нашёл вторую половину работы, из-за которой запись сменила тип с обслуживания на функцию. Отправитель ответов сегодня существует всегда, и конвейер зовёт его без проверки. Уберите его — и задача, пришедшая из Telegram и лежащая в базе с прошлого запуска, дойдёт до ответа и уронит процесс. Что с ней происходит без бота, надо решить и записать нормой: молчаливая потеря принятой записи запрещена инвариантом.
Затрагивает
- создание отправителя Telegram при старте в
main.go; - ответ отправителю в конвейере расшифровки: задача из Telegram, дошедшая до ответа при отсутствующем боте;
- секция
[telegram]конфига и её образец; - раздел «Запреты» в
CLAUDE.md— строка про боевой токен остаётся, но рядом появляется способ поднять сервис без него; docs/review.md, подраздел «Недоступно проверке»: строка про недоступность живого прогона снимается или сужается.
Критерии приёмки
- Сервис поднимается с пустым токеном бота: HTTP отвечает, воркеры идут, бот не
создан. Оракул — запуск с конфигом без токена и запрос
GET /health: код 200. - Отсутствие бота названо в журнале один раз при старте, а не молчанием. Оракул — тот же запуск: в выводе есть строка о том, что бот не поднят и почему.
- Поведение с настоящим токеном не изменилось. Оракул — тест на создание отправителя с непустым токеном: прежний путь сохранён.
- Задача из Telegram, дошедшая до ответа при отсутствующем боте, не роняет
процесс и не теряется молча. Оракул — тест конвейера с заведённой задачей
источника Telegram и без отправителя: процесс жив, задача осталась в
достигнутом состоянии, в повтор не ушла и в
failedне переведена, а недоставка видна записью журнала с идентификатором задачи.
Правка критерия 2026-08-13, решение владельца на чекпоинте: прежняя редакция
требовала повтора либо failed, и оба исхода отвергнуты дизайном с ценой —
пометка отказа на удавшейся работе врёт панели и метрике, а повтор не помогает,
потому что бот от ожидания не появится.