Merge branch 'phase/64-event-defs'

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-20 22:15:33 +03:00
co-authored by Cursor
39 changed files with 953 additions and 23 deletions
+13 -13
View File
@@ -12,28 +12,28 @@
## Задачи
- [ ] `EventDef`: id, `severity` (`info` / `warning` / `error`), `pause`, `ttlMs` (0 = не гаснуть),
- [x] `EventDef`: id, `severity` (`info` / `warning` / `error`), `pause`, `ttlMs` (0 = не гаснуть),
`trigger` (`dayStart` / `lessonStart` / `generationFailed`), `action` (`none` в этой фазе).
Локаль как у других def. Валидатор каталога
- [ ] Ваниль `DayStarted` и `LessonStarted`: info, без паузы, TTL 8000, `action` none
- [ ] Симуляция на крае рабочего утра и на звонке (смена периода урока, один факт на школу)
- [x] Ваниль `DayStarted` и `LessonStarted`: info, без паузы, TTL 8000, `action` none
- [x] Симуляция на крае рабочего утра и на звонке (смена периода урока, один факт на школу)
отдаёт факт, без UI. Работник сопоставляет def и кладёт info-`Notice`
- [ ] Новый кадр S→C (уведомление: id, defName, severity, pause, ttlMs, optional personId = 0).
- [x] Новый кадр S→C (уведомление: id, defName, severity, pause, ttlMs, optional personId = 0).
Новый кадр C→S dismiss по id. `ProtocolCodec.cs`, `protocol.ts`, [`protocol.md`](../../protocol.md)
в одном коммите. Версия протокола +1
- [ ] Клиент: тост поверх школы, текст из каталога/`t` по defName, клик шлёт dismiss, TTL
- [x] Клиент: тост поверх школы, текст из каталога/`t` по defName, клик шлёт dismiss, TTL
гасит локально. Строки через `t(...)`. Не колонка «События»
- [ ] Info не писать в сейв. Открытие школы info не повторяет. Гость тост видит
- [ ] `generationFailed` в каталоге можно завести, но не эмитить — фаза 67 / 65
- [x] Info не писать в сейв. Открытие школы info не повторяет. Гость тост видит
- [x] `generationFailed` в каталоге можно завести, но не эмитить — фаза 67 / 65
## Тесты, без которых фаза не закрыта
- [ ] Каталог грузит `DayStarted` / `LessonStarted`; неизвестный trigger — ошибка загрузки
- [ ] Переход через край рабочего утра даёт один факт `dayStart`; повторный тик в ту же минуту — нет
- [ ] Смена периода на урок даёт один `lessonStart` на школу, не по числу классов
- [ ] Круглый трип и байтовая раскладка кадра уведомления и dismiss — на обеих сторонах
- [ ] Клиентский тест: тост показывает локализованный текст, клик вызывает dismiss, без монтирования колонки
- [ ] Хостовый: открытая школа после утра получает кадр; после Close/Open info-тост не висит из сейва
- [x] Каталог грузит `DayStarted` / `LessonStarted`; неизвестный trigger — ошибка загрузки
- [x] Переход через край рабочего утра даёт один факт `dayStart`; повторный тик в ту же минуту — нет
- [x] Смена периода на урок даёт один `lessonStart` на школу, не по числу классов
- [x] Круглый трип и байтовая раскладка кадра уведомления и dismiss — на обеих сторонах
- [x] Клиентский тест: тост показывает локализованный текст, клик вызывает dismiss, без монтирования колонки
- [x] Хостовый: открытая школа после утра получает кадр; после Close/Open info-тост не висит из сейва
## Критерий готовности
+1 -1
View File
@@ -18,7 +18,7 @@
| Фаза | Статус | Зачем |
| --- | --- | --- |
| [64. События и info-тост](64-event-defs.md) | 🔄 | `EventDef`, утро и звонок, кадр на сокете, тост |
| [64. События и info-тост](64-event-defs.md) | | `EventDef`, утро и звонок, кадр на сокете, тост |
| [65. Варнинг и пауза](65-warning-pause.md) | ⬜ | sticky, Play игнор, сейв, dismiss хозяина |
63 независима. 65 стоит на 64.