- шесть записей по кластерам причин: журнал под внешним значением, нулевой код ответа в журнале, затирание вложения бедным ответом, открытый анониму адрес подтверждения почты, рубеж расшифровки без работы, пределы длительности - находка про код 500 у отказа приёма дописана в json-api-for-spa: там живёт единая точка отображения доменной ошибки - telegram-account-link и bot-api-only-through-bot-client оставлены с оговоркой, что предмета у них нет до возвращения входа
3.7 KiB
3.7 KiB
✨ Сопоставить пользователя Telegram с учётной записью
- Тип: feature
- Категория: Очередь — Связывать чат с учётной записью не с чем, пока у записи нет владельца.
- Зачем: Белый список сверяется с именем пользователя Telegram, которое владелец меняет в любой момент, а записи из бота ни с кем не связаны.
Записи из бота видны тому же человеку в приложении, а белый список перестаёт быть отдельным механизмом — право писать боту выводится из учётной записи.
Берётся после record-ownership: связывать не с чем, пока у записи нет
владельца.
Предмета у задачи сейчас нет. Вход Telegram убран задачей
remove-telegram-intake 2026-08-15 — временно, решение записано
ADR-2026-08-15-telegram-intake-removed-temporarily.
Эта задача остаётся условием возврата: без связи чата с учётной записью вход
вернуть нельзя — записи снова пошли бы без владельца, а колонка владельца пустого
значения больше не принимает.
Затрагивает
- связь учётной записи с чатом Telegram: таблица и её миграция;
- команда бота для привязки и способ её подтвердить;
internal/controller/tg, проверка отправителя — сегодняslices.Containsпо строке автора;- ключ конфигурации
[server] users_while_list— он уходит; config.example.toml,internal/config;docs/security.md, раздел «Что разграничивает доступ»;- инвариант «Бот отвечает только тем, кто в белом списке» в
CLAUDE.md.
Критерии приёмки
- Сообщение от непривязанного чата обрабатывать не начинаем и файл не скачиваем. Оракул — тест: обновление от неизвестного чата не заводит задачу и не ходит в сеть.
- Привязка идёт по идентификатору чата, а не по имени пользователя: смена имени
в Telegram доступа не меняет. Оракул — тест: то же обновление с изменённым
From.UserNameпо-прежнему принимается. - Запись, пришедшая ботом, видна тому же человеку в приложении. Оракул — тест: задача из привязанного чата читается сессией связанной учётной записи и не читается чужой.
- Ключ
users_while_listиз конфига и из документов убран. Оракул —task gate, шагdocs.py check, иgrep users_while_listпо репозиторию пуст.
Рамки
Одна учётная запись — один чат: нескольких чатов на человека не заводим.
Инвариант в CLAUDE.md переписывается этой же задачей, а не остаётся врать.