- шесть записей по кластерам причин: журнал под внешним значением, нулевой код ответа в журнале, затирание вложения бедным ответом, открытый анониму адрес подтверждения почты, рубеж расшифровки без работы, пределы длительности - находка про код 500 у отказа приёма дописана в json-api-for-spa: там живёт единая точка отображения доменной ошибки - telegram-account-link и bot-api-only-through-bot-client оставлены с оговоркой, что предмета у них нет до возвращения входа
4.7 KiB
🧹 Запретить обращаться к Bot API мимо клиента бота
- Тип: chore
- Категория: Очередь — Правило границы клиента ставится на тот же транспорт, мелочи которого разбирает строка выше: своя обёртка, заведённая раньше правила, вернёт утечку токена молча.
- Зачем: Чистка отказа от адреса с токеном живёт в клиенте; свой http.Client в транспорте вернёт утечку молча — правило noctx такую подмену не ловит, а класс уже стоил одного дефекта.
Токен бота стоит в пути каждого обращения к Bot API, а http.Client кладёт
адрес запроса в *url.Error целиком. Поэтому 2026-08-13 чистка перенесена на
границу клиента: internal/adapter/telegram, NewBot — свой Do разворачивает
отказ в первопричину, а подменённый логгер вычищает токен из строк самой
библиотеки. Случай записан в журнал дефектов
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.
Предмета у задачи сейчас нет. Клиент бота удалён вместе со входом задачей
remove-telegram-intake 2026-08-15 — временно, решение записано
ADR-2026-08-15-telegram-intake-removed-temporarily.
Запись остаётся гигиеной возврата: класс стоил проекту одного дефекта, и
запрет надо ставить вместе с новым клиентом, а не после него.
Затрагивает
internal/archrules— новое правило-сканер и его перечень предметов;internal/controller/tg— как поднадзорный пакет;internal/adapter/telegram— как единственное законное место, где клиент заводится;- go-linters.md — строка в перечне механизированного и снятие соответствующей прозы.
Критерии приёмки
- Свой
http.Client,http.DefaultClientилиtgbotapi.NewBotAPIвinternal/controller/tgроняет проверку и называет файл. Оракул — мутация: внести каждую из трёх форм по очереди, все три краснеют. - Законное употребление в
internal/adapter/telegramпроверку не роняет. Оракул — тот же прогон на нетронутом дереве, зелёный. - Правило не молчит, потеряв предмет: переименованный или исчезнувший пакет роняет проверку, а не проходит обходом по пустому перечню. Оракул — мутация с переименованием каталога.
- Правило записано строкой в
go-linters.md, и проза, которую оно заменило, оттуда снята. Оракул — чтение записи.
Рамки
Боевым токеном не запускаться: сканер читает исходники, живого бота ему не
нужно. Внутренний логгер библиотеки правилом не выражается — его сторожит
проверка TestLibraryLoggerIsActuallyInstalled, и это остаётся так.