spec: archive quiet-user-feedback and sync canonical specs (#50)
Specs security / security (push) Successful in 8s
Specs verify / verify (push) Successful in 10s

Native archive применил 9 added и 12 modified требований без удалений; все 10 сценариев сохранены. Новый canonical spec frontend-user-feedback внесён в AI_INDEX.
This commit was merged in pull request #52.
This commit is contained in:
2026-10-17 22:18:27 +03:00
parent 5a7e319caf
commit f0478c6d6b
26 changed files with 654 additions and 129 deletions
@@ -0,0 +1,116 @@
## MODIFIED Requirements
### Requirement: Экран списка брокерских счетов
Клиент SHALL загружать список при открытии защищённого маршрута `/accounts`
без ручного обновления. Клиент MUST использовать успешный frontend-кэш списка
в течение 60 секунд. После истечения этого срока открытие или возвращение
на экран SHALL инициировать получение актуального списка; имеющийся Client
Cached Snapshot MUST оставаться видимым во время обновления и после временной
ошибки без индикации собственного чтения и действий повтора.
Автоматическое восстановление SHALL соответствовать `frontend-data-resilience`.
Открытый экран MAY периодически перечитывать backend-результат, сохраняя
видимый snapshot, и MUST NOT создавать импорт T-Bank. Состояние источника из
`meta` MUST представляться по `frontend-data-resilience`.
При успешном непустом ответе клиент MUST отобразить адаптивный одноколоночный
список широких интерактивных карточек счетов с локализованными типом и, если
доступна, датой открытия без времени; каждая карточка MUST ясно показывать тип,
имя, финансовую сводку, вторичные метаданные и заметное действие открытия счёта,
вести на `/accounts/:accountId` по всей области и сохранять доступное
клавиатурное состояние. После успешной замены или удаления T-Bank connection
клиент MUST инвалидировать список счетов.
Для доступной `portfolioSummary` карточка MUST показывать не более двух
Money-итогов в исходных валютах и обозначать наличие остальных валют, если
они есть; она MUST NOT показывать или подразумевать FX-конвертацию,
межвалютный агрегированный итог либо Cash Balance как отдельный второй итог.
При `portfolioSummary: null` карточка MUST показывать локальное нейтральное
состояние недоступности сводки, сохраняя метаданные счёта и возможность открыть
его. При доступной пустой сводке карточка MUST не выдавать отсутствие итогов
за временную ошибку.
#### Scenario: Пользователь открывает счёт из списка
- **WHEN** клиент успешно загрузил непустой список и User выбирает карточку счёта
- **THEN** клиент переходит на `/accounts/:accountId` с `id` выбранного счёта
#### Scenario: Список пуст
- **WHEN** клиент получает успешный полный пустой массив
- **THEN** клиент показывает штатное сообщение об отсутствии инвестиционных счетов T-Bank
#### Scenario: Список берётся из свежего frontend-кэша
- **WHEN** User повторно открывает список в течение 60 секунд после успешной загрузки
- **THEN** клиент показывает сохранённые счета без нового API-запроса
#### Scenario: Устаревший список загружается повторно
- **WHEN** User открывает список после истечения 60 секунд frontend-кэша и уже существует последний успешный список
- **THEN** клиент оставляет этот список видимым во время нового запроса без индикации фонового обновления
#### Scenario: Открытый экран перечитывает список
- **WHEN** экран Accounts остаётся открытым 30 минут после последнего успешного HTTP-чтения
- **THEN** клиент выполняет фоновое HTTP-перечитывание backend-результата, сохраняет видимый snapshot и не запускает импорт T-Bank
#### Scenario: Последняя попытка неуспешна после полного списка
- **WHEN** клиент получает полный `data` списка и `meta` с неуспехом последней часовой попытки
- **THEN** клиент сохраняет список видимым, показывает его исходное время и текстовое либо доступно именованное предупреждение о неуспешной попытке, не предлагая ручной повтор
#### Scenario: Первая загрузка списка выполняется или неуспешна
- **WHEN** клиент получает `data: null`, а `meta` обозначает выполнение первой загрузки либо её неуспех
- **THEN** клиент показывает соответственно доступное состояние загрузки либо локальной недоступности без карточек счетов и без представления частичного списка как полного
#### Scenario: Ошибка фонового обновления не скрывает snapshot
- **WHEN** обновление устаревшего списка завершается временной ошибкой при наличии последнего успешного Client Cached Snapshot
- **THEN** клиент сохраняет snapshot видимым без предупреждения и ручного повтора и восстанавливает получение данных автоматически
#### Scenario: Карточка ограничивает валютные итоги
- **WHEN** доступная сводка счёта содержит итоги в трёх или более валютах
- **THEN** карточка показывает не более двух исходных валютных итогов и обозначает наличие остальных без общего сконвертированного значения
#### Scenario: Недоступность сводки локальна карточке
- **WHEN** клиент получает список, в котором `portfolioSummary` одного счёта равна `null`
- **THEN** он показывает нейтральную недоступность только этой сводки, не скрывает остальные карточки и сохраняет переход на детали счёта
#### Scenario: Пустая сводка не является ошибкой
- **WHEN** клиент получает доступную `portfolioSummary` с пустым `totalsByCurrency`
- **THEN** он показывает нейтральное состояние отсутствия финансовых итогов, а не состояние временной ошибки
### Requirement: Клиентские состояния ошибки списка счетов
Клиент SHALL автоматически восстанавливать временно неуспешное чтение списка
по правилам `frontend-data-resilience` без кнопок обновления и повтора. При
`TBANK_NOT_CONNECTED` клиент MUST показать необходимость подключения и действие
открытия настроек T-Bank. При `INVALID_TBANK_TOKEN` клиент MUST показать
необходимость восстановить подключение и то же действие. Эти подтверждённые
состояния MUST скрывать личный список и MUST NOT запускать автоматические повторы.
При временной недоступности, включая `TBANK_UNAVAILABLE`, клиент MUST сохранять
успешный результат текущей границы доступа без предупреждений. Если результата
нет, после первичного ожидания клиент SHALL показать спокойную локальную
недоступность без технических подробностей. Неизвестная ошибка MUST получать
безопасное локальное представление; отсутствие известного кода MUST NOT
разрешать бесконечные повторы или обход доступа. Временный сбой MUST NOT
предлагать перенастройку действующего подключения как способ повторить загрузку.
#### Scenario: Подключение требуется
- **WHEN** клиент получает `TBANK_NOT_CONNECTED`
- **THEN** клиент не показывает список и предлагает открыть настройки T-Bank
#### Scenario: Известная ошибка не повторяется автоматически
- **WHEN** запрос списка завершается подтверждённой ошибкой подключения или доступа, требующей действия пользователя
- **THEN** клиент не выполняет автоматических повторов и предлагает соответствующее действие вместо технической повторной загрузки
#### Scenario: Token требует внимания
- **WHEN** клиент получает `INVALID_TBANK_TOKEN`
- **THEN** клиент скрывает личный список и предлагает восстановить подключение в настройках T-Bank
#### Scenario: Временная ошибка T-Bank
- **WHEN** клиент получает `TBANK_UNAVAILABLE` без доступного результата списка
- **THEN** клиент автоматически восстанавливает получение и после первичного ожидания показывает нейтральную недоступность без повторной загрузки и предложения перенастроить подключение
#### Scenario: Неизвестная ошибка загрузки
- **WHEN** клиент получает ошибку без известного кода списка счетов и без доступного результата
- **THEN** клиент показывает безопасное нейтральное состояние без технического сообщения или кнопки повтора, применяя только допустимое ограниченное восстановление
#### Scenario: Известная ошибка при сохранённом snapshot
- **WHEN** фоновое обновление списка с последним успешным Client Cached Snapshot получает `TBANK_UNAVAILABLE`
- **THEN** клиент сохраняет snapshot видимым без предупреждения, времени получения и ручных действий восстановления