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