Нарезка задач под целевое состояние: PWA, вход, хранилище
Роадмап: web-access переименована под приложение, которое ставится на телефон; заведена цель ready-notification — уведомление о готовности без открытого приложения. Беклог: десять задач. Многопользовательская цепочка (oidc-login, record-ownership, telegram-account-link), веб (json-api-for-spa, spa-skeleton, upload-and-status-screen, records-list-screen, installable-pwa), уведомления через apprise и ntfy, разведка выбора фреймворка. Очередь: долги, хранилище, вход, приложение. Решение сменилось с htmx на SPA, поэтому conventions/web-ui.md снята целиком и оставлена честной строкой до итога разведки. Открытые вопросы архитектуры, границы паспорта и триггеры метки ревью приведены в соответствие.
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
# ✨ Сопоставить пользователя Telegram с учётной записью
|
||||
|
||||
- **Тип:** feature
|
||||
- **Категория:** Ядро
|
||||
- **Зачем:** Белый список сверяется с именем пользователя Telegram, которое владелец меняет в любой момент, а записи из бота ни с кем не связаны.
|
||||
- **Теги:** goal:multi-user
|
||||
|
||||
Двигает пункты 4 и 5 «Завершения» цели: записи из бота видны тому же человеку в
|
||||
приложении, а белый список перестаёт быть отдельным механизмом — право писать
|
||||
боту выводится из учётной записи.
|
||||
|
||||
Берётся после `record-ownership`: связывать не с чем, пока у записи нет
|
||||
владельца.
|
||||
|
||||
## Затрагивает
|
||||
|
||||
- связь учётной записи с чатом Telegram: таблица и её миграция;
|
||||
- команда бота для привязки и способ её подтвердить;
|
||||
- `internal/controller/tg`, проверка отправителя — сегодня `slices.Contains` по
|
||||
строке автора;
|
||||
- ключ конфигурации `[server] users_while_list` — он уходит;
|
||||
- `config.dist.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` переписывается этой же задачей, а не остаётся врать.
|
||||
Reference in New Issue
Block a user