# Фаза 54. Что нового ## Зависимости Нет. Сессия (фаза 38) уже ставит куку входа; это отдельная кука и отдельное окно. ## Зачем После наката игрок не обязан читать git. Окно один раз показывает, что изменилось с прошлого захода в этот браузер. ## Задачи - [x] Сборка Server вшивает SHA и `git log --first-parent` (не вызов git в рантайме) - [x] `GET /api/changelog?since=` с сессией: текущий SHA и коммиты строго после `since` - [x] Нет `since`, неизвестный SHA, `since` = текущий — `commits` пустой - [x] Subject `Mark phase N…` в окне нет; в цепочке якоря они остаются - [x] Кука `hschool.seen-rev` (не HttpOnly, не сессионная): первый заход молча запоминает HEAD - [x] Модалка только после `ensureSession` (вход и повторный вход после logout), не с меню школы - [x] [`protocol.md`](../protocol.md) HTTP, версию сокета не бампить ## Тесты, без которых фаза не закрыта - [x] Срез после известного SHA — видимые коммиты старше→новее, без `Mark phase` - [x] Якорь на `Mark phase` — следующие видимые всё равно отдаются - [x] Нет `since` / неизвестный SHA / `since` = текущий — пустой список - [x] `GET /api/changelog` без сессии — `401` - [x] С сессией без `since` — 40 hex в `current`, `commits` пустой - [x] Нет куки — запрос без `since`, кука = `current`, диалога нет - [x] Кука старше, сервер вернул коммиты — диалог, по закрытию кука = `current` ## Критерий готовности - Первый заход после деплоя с новой сборкой Server показывает окно; повторный заход в том же браузере — нет - `run-aspire` без `--rebuild` после коммита только в доках может показать старый SHA: вшито на сборке, не HEAD рабочего дерева ## Стоп Не писать last-seen в `users.json`. Не бампить сокет. Не вызывать git из бегущего сервера. Не показывать окно при возврате из школы на меню.