# ✨ Сопоставить пользователя Telegram с учётной записью - **Тип:** feature - **Категория:** Очередь — Связывать чат с учётной записью не с чем, пока у записи нет владельца. - **Зачем:** Белый список сверяется с именем пользователя Telegram, которое владелец меняет в любой момент, а записи из бота ни с кем не связаны. Записи из бота видны тому же человеку в приложении, а белый список перестаёт быть отдельным механизмом — право писать боту выводится из учётной записи. Берётся после `record-ownership`: связывать не с чем, пока у записи нет владельца. **Предмета у задачи сейчас нет.** Вход Telegram убран задачей `remove-telegram-intake` 2026-08-15 — временно, решение записано [ADR-2026-08-15-telegram-intake-removed-temporarily](../../docs/adr/ADR-2026-08-15-telegram-intake-removed-temporarily.md). Эта задача остаётся **условием возврата**: без связи чата с учётной записью вход вернуть нельзя — записи снова пошли бы без владельца, а колонка владельца пустого значения больше не принимает. ## Затрагивает - связь учётной записи с чатом 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` переписывается этой же задачей, а не остаётся врать.