При загрузке страницы AuthProvider вызывает POST /auth/refresh (src/features/auth/model/auth.vm.ts). Любой неуспех (!data или исключение) вызывает clearSession(). Во время деплоя backend останавливается (бэкап и миграция), nginx отдаёт 502, и пользователь с валидной refresh-cookie оказывается разлогинен: UI уходит на login, кэш очищен. После запуска backend cookie ещё валидна, но приложение уже не пытается ею воспользоваться.
Expected Behavior
Сессия сбрасывается только когда сервер подтвердил, что refresh-токен недействителен (401). Сетевая ошибка и 5xx не считаются выходом: сессия и кэш сохраняются, готовность (ready) устанавливается, следующий защищённый запрос с 401 снова запускает refresh. Политика single-flight и «один retry после 401» не меняется, собственный retry-loop не добавляется (.ai/conventions/data.md, «Auth и invalidation»).
Scope
In scope
Различать в refresh() 401 и транзитивные сбои (network error, 5xx).
Обновить тест auth.test.tsx «settles unauthenticated … transport error» и добавить кейс 5xx.
Уточнить правило в .ai/conventions/data.md, если оно описывает очистку при любом сбое.
Холодный старт: refresh отвечает 401 → сессия сброшена, пользователь видит login (как сейчас).
Холодный старт: refresh завершился сетевой ошибкой или 5xx → сессия не очищается, ready становится true, кэш не удаляется, пользователь не получает ложное «вы вышли».
Следующий запрос, получивший 401 UNAUTHORIZED, по-прежнему запускает single-flight refresh.
Тест MSW на transport boundary для 401, сетевой ошибки и 5xx.
Verification
npm run verify (кроме отдельной Issue про date-зависимые тесты AccountEventsPage).
## Problem
При загрузке страницы `AuthProvider` вызывает `POST /auth/refresh` (`src/features/auth/model/auth.vm.ts`). Любой неуспех (`!data` или исключение) вызывает `clearSession()`. Во время деплоя backend останавливается (бэкап и миграция), nginx отдаёт 502, и пользователь с валидной refresh-cookie оказывается разлогинен: UI уходит на login, кэш очищен. После запуска backend cookie ещё валидна, но приложение уже не пытается ею воспользоваться.
## Expected Behavior
Сессия сбрасывается только когда сервер подтвердил, что refresh-токен недействителен (401). Сетевая ошибка и 5xx не считаются выходом: сессия и кэш сохраняются, готовность (`ready`) устанавливается, следующий защищённый запрос с 401 снова запускает refresh. Политика single-flight и «один retry после 401» не меняется, собственный retry-loop не добавляется (`.ai/conventions/data.md`, «Auth и invalidation»).
## Scope
### In scope
- Различать в `refresh()` 401 и транзитивные сбои (network error, 5xx).
- Обновить тест `auth.test.tsx` «settles unauthenticated … transport error» и добавить кейс 5xx.
- Уточнить правило в `.ai/conventions/data.md`, если оно описывает очистку при любом сбое.
### Out of scope
- Retry/backoff внутри refresh.
- Изменения backend (cookie Max-Age: WealthLedger/backend#123).
- Межвкладочная синхронизация.
## Acceptance Criteria
- [ ] Холодный старт: refresh отвечает 401 → сессия сброшена, пользователь видит login (как сейчас).
- [ ] Холодный старт: refresh завершился сетевой ошибкой или 5xx → сессия не очищается, `ready` становится true, кэш не удаляется, пользователь не получает ложное «вы вышли».
- [ ] Следующий запрос, получивший 401 `UNAUTHORIZED`, по-прежнему запускает single-flight refresh.
- [ ] Тест MSW на transport boundary для 401, сетевой ошибки и 5xx.
## Verification
`npm run verify` (кроме отдельной Issue про date-зависимые тесты AccountEventsPage).
## Traceability
Связано с WealthLedger/backend#123 (refresh cookie без срока жизни).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
При загрузке страницы
AuthProviderвызываетPOST /auth/refresh(src/features/auth/model/auth.vm.ts). Любой неуспех (!dataили исключение) вызываетclearSession(). Во время деплоя backend останавливается (бэкап и миграция), nginx отдаёт 502, и пользователь с валидной refresh-cookie оказывается разлогинен: UI уходит на login, кэш очищен. После запуска backend cookie ещё валидна, но приложение уже не пытается ею воспользоваться.Expected Behavior
Сессия сбрасывается только когда сервер подтвердил, что refresh-токен недействителен (401). Сетевая ошибка и 5xx не считаются выходом: сессия и кэш сохраняются, готовность (
ready) устанавливается, следующий защищённый запрос с 401 снова запускает refresh. Политика single-flight и «один retry после 401» не меняется, собственный retry-loop не добавляется (.ai/conventions/data.md, «Auth и invalidation»).Scope
In scope
refresh()401 и транзитивные сбои (network error, 5xx).auth.test.tsx«settles unauthenticated … transport error» и добавить кейс 5xx..ai/conventions/data.md, если оно описывает очистку при любом сбое.Out of scope
Acceptance Criteria
readyстановится true, кэш не удаляется, пользователь не получает ложное «вы вышли».UNAUTHORIZED, по-прежнему запускает single-flight refresh.Verification
npm run verify(кроме отдельной Issue про date-зависимые тесты AccountEventsPage).Traceability
Связано с WealthLedger/backend#123 (refresh cookie без срока жизни).
codex-bot referenced this issue2026-10-23 08:06:16 +03:00