# 🧹 Запретить обращаться к Bot API мимо клиента бота - **Тип:** chore - **Категория:** Очередь — Правило границы клиента ставится на тот же транспорт, мелочи которого разбирает строка выше: своя обёртка, заведённая раньше правила, вернёт утечку токена молча. - **Зачем:** Чистка отказа от адреса с токеном живёт в клиенте; свой http.Client в транспорте вернёт утечку молча — правило noctx такую подмену не ловит, а класс уже стоил одного дефекта. Токен бота стоит в пути каждого обращения к Bot API, а `http.Client` кладёт адрес запроса в `*url.Error` целиком. Поэтому 2026-08-13 чистка перенесена на границу клиента: `internal/adapter/telegram`, `NewBot` — свой `Do` разворачивает отказ в первопричину, а подменённый логгер вычищает токен из строк самой библиотеки. Случай записан в журнал дефектов [review.md](../../docs/review.md), 2026-08-13. Держится это на двух стыках, и оба обходятся одной строкой: скачивание записи берёт клиента у бота (`c.bot.Client.Do`), а не общий, и бот заводится единой точкой, а не `tgbotapi.NewBotAPI`. Проверки на оба стыка есть (`internal/controller/tg/download_test.go`, `internal/adapter/telegram/bot_test.go`), но они судят **сегодняшние** места: новый файл в транспорте, заведший свой клиент, они не увидят. Ступень по лестнице механизации — четвёртая: свойство о структуре, а не о вызове, и выражается тест-сканером в `internal/archrules`. ## Затрагивает - `internal/archrules` — новое правило-сканер и его перечень предметов; - `internal/controller/tg` — как поднадзорный пакет; - `internal/adapter/telegram` — как единственное законное место, где клиент заводится; - [go-linters.md](../../docs/conventions/go-linters.md) — строка в перечне механизированного и снятие соответствующей прозы. ## Критерии приёмки - Свой `http.Client`, `http.DefaultClient` или `tgbotapi.NewBotAPI` в `internal/controller/tg` роняет проверку и называет файл. Оракул — мутация: внести каждую из трёх форм по очереди, все три краснеют. - Законное употребление в `internal/adapter/telegram` проверку не роняет. Оракул — тот же прогон на нетронутом дереве, зелёный. - Правило не молчит, потеряв предмет: переименованный или исчезнувший пакет роняет проверку, а не проходит обходом по пустому перечню. Оракул — мутация с переименованием каталога. - Правило записано строкой в `go-linters.md`, и проза, которую оно заменило, оттуда снята. Оракул — чтение записи. ## Рамки Боевым токеном не запускаться: сканер читает исходники, живого бота ему не нужно. Внутренний логгер библиотеки правилом не выражается — его сторожит проверка `TestLibraryLoggerIsActuallyInstalled`, и это остаётся так.