Files
transcriber/openspec/changes/archive/2026-08-13-start-without-telegram-token/proposal.md
T
av b733a84d6a telegram: сервис поднимается без бота и работает одним входом
- Клиент бота собирается один раз и достаётся отправителю и транспорту;
  разрез прошёл по «ответил ли Telegram»: ответ «такого бота нет» роняет
  старт, недоступность даёт подъём без Telegram (ADR-2026-08-13). Ожидание
  при сборке ограничено сроком — иначе молчащий Telegram вешал подъём.
- Недоставленный ответ не роняет шаг: пишется с job_id и считается метрикой,
  уровень по причине — WARN для неподнятого входа, ERROR для неназванного
  адресата. Заведены transcriber_intake_up и transcriber_undelivered_reply_count.
- Закрыта утечка токена в журнал: отказ разбора адреса рождается раньше
  обращения к клиенту, то есть мимо чистки на его границе.
2026-08-13 19:10:08 +03:00

55 lines
3.9 KiB
Markdown

## Why
Сервис принимает записи двумя входами — ботом Telegram и HTTP API, — но
поднимается только тогда, когда настроены оба: пустой токен бота кончает старт
отказом раньше, чем встаёт HTTP-сервер. Боевым токеном запускаться запрещено, и
из этого следует, что **поднять сервис и посмотреть на него живьём не может
никто**: всякая задача, меняющая поведение, проверяется одними тестами.
Намерение «работать без Telegram» в сервисе уже есть — отдельное значение «токен
не задан» и терпимость к отказу сборки бота при старте, — но один путь его
отменяет, и потому оно ничего не значит.
## What Changes
- Ненастроенный вход Telegram больше не мешает подъёму: сервис встаёт и работает
оставшимся входом — принимает записи по HTTP, расшифровывает их и отдаёт текст
туда же. Об отсутствии бота сервис говорит одной строкой журнала при старте, а
не молчанием.
- Задача, пришедшая из Telegram и дошедшая до ответа тогда, когда бота нет,
доводится до конца, а факт недоставки уезжает в журнал владельца. Сегодня такая
задача уронила бы процесс.
- Запрет запускаться боевым токеном остаётся: рядом с ним появляется способ
поднять сервис без токена вовсе.
Ломки нет: с заданным токеном не меняется ничего.
## Capabilities
### New Capabilities
Новых нет: оба требования ложатся в capability, чей раздел `Purpose` сам
называет их своим предметом и приглашает дописать.
### Modified Capabilities
- `intake`: добавляется требование о подъёме с ненастроенным входом Telegram —
сервис работает оставшимся входом. Приём из Telegram по существу (кто допущен,
как скачивается запись) остаётся ненормированным, и оговорка спеки об этом
сохраняется;
- `pipeline`: добавляется требование об ответе отправителю, чей вход не поднят —
шаг не роняется, задача доводится до конца, недоставка идёт в журнал.
## Impact
- сборка сервиса при старте: отправитель ответов и клиент бота;
- ответ отправителю в конвейере расшифровки;
- секция `[telegram]` конфига и её образец `config.dist.toml`;
- `CLAUDE.md`, раздел «Запреты» — рядом с запретом на боевой токен встаёт способ
подняться без него;
- `docs/review.md`, подраздел «Недоступно проверке» — строка о недоступности
живого прогона сужается;
- `docs/architecture.md` — перечень capability и то, что каждая нормирует.
Внешних зависимостей, схемы хранилища и контракта HTTP API изменение не трогает.