Files
transcriber/tasks/items/telegram-account-link.md
T
av b4b19db6e4 tasks: заведён урожай ревью remove-telegram-intake
- шесть записей по кластерам причин: журнал под внешним значением, нулевой
  код ответа в журнале, затирание вложения бедным ответом, открытый анониму
  адрес подтверждения почты, рубеж расшифровки без работы, пределы длительности
- находка про код 500 у отказа приёма дописана в json-api-for-spa: там живёт
  единая точка отображения доменной ошибки
- telegram-account-link и bot-api-only-through-bot-client оставлены с оговоркой,
  что предмета у них нет до возвращения входа
2026-08-15 07:46:16 +03:00

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 переписывается этой же задачей, а не остаётся врать.