Files
docs/architecture/cross-cutting/data-freshness.md
T
ksv741 0ee54ca952 docs: record minimal runtime coordination
Document accepted cross-tab reauthentication, on-demand candles,
native query/logging ownership and the complete deployment path.

Preserve historical ADR context and link amendments through ADR 018.
Related backend change: WealthLedger/backend@d698ed9
2026-10-03 21:32:35 +03:00

71 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Свежесть данных и повторное использование
WealthLedger читает инвестиционные данные из SQLite. Обычный GET возвращает
сохранённый результат и запрашивает фоновые зависимости, если они отсутствуют
или устарели. HTTP-ответ не ждёт T-Bank. Модель принята в
[ADR 017](../../adr/017-local-tbank-reads-and-background-sync.md).
## Клиентский и серверный снимки
[Client Cached Snapshot](../../glossary.md#client-cached-snapshot) — успешный
ответ в TanStack Query. Он сохраняет показанное содержимое при временной ошибке
запроса в той же границе доступа. SQLite сохраняет источники независимо от
браузера: membership, последний полный portfolio, исполненные операции,
общие сведения об инструментах, котировки, свечи и календари.
[Полнота периода](../../glossary.md#полнота-истории-счёта) и свежесть различаются.
Успешно проверенный пустой интервал полон; последняя страница журнала сама
по себе полноту не доказывает. Ошибка сверки сохраняет прежние данные и время.
Старый полный портфель не удаляется по истечении TTL. `isStale` показывает
возраст portfolio source, а не сам факт неудачного обновления.
| Источник | Когда обычный запрос требует обновления |
| --- | --- |
| Portfolio, котировки, изменяемый хвост дневных свечей | Через 60 секунд |
| Membership и изменяемый хвост операций | Через 5 минут |
| Metadata, поиск каталога, company и календари | Через сутки |
| Полные прошлые интервалы операций и завершённые свечи | При явном обновлении показанного периода |
TTL не создаёт таймер импорта. Запрошенная работа может закончиться после
ухода со страницы. После перезапуска нет автоматического обхода intent:
следующий подходящий запрос повторяет незавершённый интервал с первой страницы,
переиспользуя полные интервалы. Cursor брокера не служит durable checkpoint.
Ручное «Обновить» перечитывает зависимости текущего экрана и применённый
период независимо от TTL. Повторная сверка полного периода публикуется одной
транзакцией после всех страниц, интервалов и счетов, включая `all`.
Сбой сохраняет весь прежний результат. Первая загрузка может публиковать
полные малые интервалы и показывать частичный период без окончательных сумм.
Клиент наблюдает только известную активную работу открытого экрана.
Status GET и data GET с `sync=observe` не запускают работу. После изменения
состояния ответ попадает в ту же query identity; после ухода или завершения
наблюдение прекращается. Поздний ответ не заменяет уже принятый новый.
[HTTP API](../http-api.md) объясняет envelope и экранный refresh.
Отменой query lifecycle владеет TanStack Query. Status не пересобирает
финансовые ответы и не передаёт hash notifications. Свечи нового диапазона
загружаются при его открытии; предзагрузка всей истории портфеля не выполняется.
## Смена подключения
Каждое чтение проверяет локальную сессию, текущее подключение, известный отказ
токена и сохранённый состав доступных счетов. Расшифровка token и GetAccounts
для локальной выдачи не нужны. Старый membership допускает выдачу и фоновую
сверку; это задержка обнаружения отзыва доступа, а не live-проверка брокера.
Unknown membership не даёт доступа к произвольному accountId: ответ сообщает
о загрузке доступа. Успешный новый список немедленно ограничивает последующие
чтения. Известный invalid token блокирует личные данные.
Успешный PUT атомарно сохраняет token, новую случайную внутреннюю revision
и membership из проверки token. Прежние личные datasets и work становятся
недоступны. DELETE удаляет подключение и личные данные; общие неперсональные
источники могут оставаться. Неуспешный PUT сохраняет действующую границу.
Публикация проверяет revision и attempt в той же SQLite-транзакции; поздняя
работа старого подключения не меняет даже timestamp. Revision не попадает
в API, логи или cursor. Frontend очищает personal queries при смене подключения
и известном отказе доступа; поздний ответ не восстанавливает скрытые данные.
Logout очищает сессию и query cache. Подробнее —
[интеграция T-Bank](../../integrations/tbank.md).