# Браузерный кэш и выравнивание значков города

Сборка `54b1b9a4865de2f7`, схема 27. Исправления опубликованы в основной игре и проверены. [Общий отчёт](data/http-cache-verification.json). [Сервер](data/http-cache-server-verification.json) · [Браузер](data/browser-http-cache-verification.json) · [Сохранение ETag](data/http-cache-publication-verification.json).

## Кэширование

Для HTML, JSON и URL без версии сервер возвращает `Cache-Control: public, max-age=0, must-revalidate`. Браузер может сохранить ответ, но перед повторным использованием проверяет его по ETag или Last-Modified. Неизменившийся файл получает **304 без тела**, изменившийся — **200 с новым содержимым**. `fetch` правил и манифеста больше не использует `no-store`: установлен `no-cache`, который разрешает хранение и требует актуализации. Приложению браузер возвращает сохранённый JSON прозрачно.

Версионированные JS/CSS/изображения/звуки получают `public, max-age=31536000, immutable`. Условие применяется к поддерживаемому типу файла и параметру `v` с шестнадцатеричной версией; HTML, JSON и ошибки 404 в этот режим не попадают. Новая версия файла меняет URL в импортах, CSS или манифесте. Обычная навигация может брать неизменившиеся ресурсы из кэша без запроса на сервер; принудительное обновление браузером может выполнять дополнительные проверки.

Текстовые ответы сжимаются zstd/gzip в зависимости от возможностей браузера. Реальная передача основного профиля через gzip уменьшилась с **1 461 559 до 81 999 байт** при точном совпадении распакованного содержимого. Изображения и звук сохраняются без изменений содержимого.

Публикация игры теперь сравнивает содержимое и оставляет неизменившиеся файлы на месте. Резервная копия сохраняется отдельно. При атомарной публикации исследований одинаковые файлы получают прежнее время модификации. Это предотвращает смену ETag только из-за очередной публикации сайта.

Правила Caddy ограничены `/civilization/*`. Перед применением активная конфигурация была сверена с исходной; после удаления добавленного обработчика конфигурации остальных маршрутов совпадают. Выполнены проверка конфигурации и плавная перезагрузка. Шаблон: `deployment/civilization-cache.caddy`; исходная конфигурация сохранена приватно для отката.

Основания: [кэш HTTP и условные запросы](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/ETag), [заголовки Caddy](https://caddyserver.com/docs/caddyfile/directives/header), [статические файлы Caddy](https://caddyserver.com/docs/caddyfile/directives/file_server).

## Значки города

По изображению пользователя `/tmp/codex-image-bcaad617-6656-4520-803a-5c6eaf829903.png` значки торговли, коррупции, науки и налогов объединены со своими подписями в группы, выровненные через `align-items: center`. Общая строка ресурсов использует то же выравнивание; «Подключены» и названия ресурсов больше не имеют разных базовых линий. Ширина изображения и его подпись переносятся вместе.

Браузерная проверка измеряет центры значков и подписей, включая пищу/щиты и подключённые ресурсы; допустимое расхождение — один пиксель. Оригинальные изображения не перерисованы.

![Значки и подписи после выравнивания](data/city-resource-icons-centered.png)

## Подтверждённые проверки

- ETag и Last-Modified возвращают 304 для неизменившихся HTML, JSON и изображения.
- Изменённый временный JSON вернул 200 и новый ETag; проверочный файл удалён.
- Gzip-вариант JSON совпадает после распаковки, условный запрос к нему тоже возвращает 304.
- Версионированные ресурсы имеют длительный кэш; JSON и 404 не получают `immutable`.
- ETag неизменившихся профиля, манифеста и городского атласа сохранились после настоящих публикаций; неизменённый файл исследований тоже сохранил ETag и вернул304.
- В свежем Chromium повторная обычная навигация использовала кэш для **118 ресурсов**; оба основных JSON получили сетевой статус 304. То же подтверждено после перезагрузки. Зафиксированные Chrome объёмы: холодный проход 8 570 461 байт, тёплый — 291 байт; это измерение конкретного состояния и браузерного протокола, не гарантия для любого клиента.
- DOM прошёл. Ядро и медиа совпадают с предыдущей проверенной сборкой после исключения версии статических импортов; прежние 664 автоматические проверки сохраняют область покрытия. Дополнительно пройдены **пять сценариев Chromium на основном сайте**: HTTP-кэш/значки, визуальные исправления, классическое управление, обмен знаниями и полная партия до победы на 18-м ходу с точным экспортом/перезагрузкой. Все отчёты имеют текущий адрес/версию и пустые списки ошибок.

Полный MVP, точное Windows-поведение и оставшиеся задачи плана остаются в работе.
