Нарезка задач под целевое состояние: 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:
av
2026-08-10 21:36:54 +03:00
parent 4d1c2bf44c
commit 115b3796e8
19 changed files with 536 additions and 160 deletions
+11 -2
View File
@@ -120,8 +120,17 @@
другим. Данные не переносим — начинаем с чистого листа.
- **Учётные записи.** Вход через OIDC, провайдер — Authelia. Не решено, где
живёт сессия и как связываются пользователь Telegram и пользователь веба.
- **Веб-интерфейс.** Формы нет вовсе, есть только API. Конвенция веб-UI на htmx
описана в [conventions/web-ui.md](conventions/web-ui.md) заранее.
- **Приложение.** Экранов нет вовсе, есть только API. Решено делать SPA,
устанавливаемое на телефон; фреймворк выбирает разведка
`spa-framework-choice`, и до её итога
[conventions/web-ui.md](conventions/web-ui.md) стоит почти пустой. Шаг сборки
фронтенда меняет требования к машине разработчика и к образу — решение уровня
ADR.
- **Уведомления.** Пользователь веба узнаёт о готовности только опросом.
Доставку решено брать внешнюю — apprise как отправитель, ntfy как канал; Web
Push с VAPID отвергнут. Появляется внешняя зависимость, которой сегодня нет, и
текст расшифровки начинает уходить на сторону — сдвиг периметра
[security.md](security.md).
- **Долгие записи.** Потолок сегодня неизвестен и не замерялся: 20 МиБ на приём
из Telegram — точно, ограничения `deferred-general` по длине — нет.
- **Формат для распознавания.** Конвертер отдаёт ogg/vorbis (`libvorbis`), а