Tell the frozen frontend that a revoked session now arrives as a named frame, not as a silent disconnect it would answer by reconnecting into a 401

This commit is contained in:
heaven 2026-08-29 12:32:49 +03:00
parent e548e5ab5f
commit e14561b258

View file

@ -13,6 +13,24 @@
> `API_CONTRACT_DRAFT.md` (`API_CONTRACT_INPUT.md` — исполненный вход, под ⚠-баннером). > `API_CONTRACT_DRAFT.md` (`API_CONTRACT_INPUT.md` — исполненный вход, под ⚠-баннером).
> Сверху — текущее состояние, ниже — хроника по сессиям. > Сверху — текущее состояние, ниже — хроника по сессиям.
## 📌 ПИНГ ОРКЕСТРАТОРА (29.08, D39.169) — новый терминальный кадр SSE `session_ended`, зоне при разморозке
Канон **0.8.0** объявил девятый кадр потока: `session_ended`, payload — ровно `EventBase`.
**Почему он появился.** Закрыта единственная открытая уязвимость платформы (`PD-379`): отзыв сессии
не выключал уже открытый поток событий — «выйти везде» не работало, поток жил ещё сорок секунд после
отзыва. Теперь сервер гасит поток и шлёт этот кадр.
**Половина, которую сервер закрыть НЕ МОЖЕТ, и она ваша.** Без обработчика на клиенте отзыв
неотличим от обрыва сети: браузер увидит закрытое соединение и пойдёт переподключаться — в `401`,
объяснить который ему нечем. То есть для ЧЕЛОВЕКА уязвимость остаётся наполовину открытой.
**Что нужно при разморозке:** обработать `session_ended` отдельно от `end` и `resync_required`
`end` значит «книга кончилась, возвращаться незачем», `resync_required` — «спроси заново», а здесь
единственное верное действие **войти заново**. Переподключение без входа бессмысленно.
Носитель — `docs/architecture/14-api-contract/openapi.yaml`, схема `EventSessionEnded`.
## Текущее состояние ## Текущее состояние
> **Запись оркестратора №15, 07.08.** Абзацы ниже — состояние на 04.08, и первый из них с тех пор > **Запись оркестратора №15, 07.08.** Абзацы ниже — состояние на 04.08, и первый из них с тех пор