# `web/dl/` — корень хоста `dl.governorpoker.app`

Отсюда Caddy отдаёт сборку и канал обновлений (`deploy/caddy/Caddyfile`, блок 2;
корень на сервере — `/srv/web/dl`, он же этот каталог: `deploy/up.sh` монтирует
`web/` как есть).

## Что здесь лежит после выпуска

Четыре файла, и все четыре кладёт `macapp/dmg.sh` (раздел 12):

| файл                     | что это                          | вес     |
|--------------------------|----------------------------------|---------|
| `Governor.dmg`           | сама сборка, подписанная          | 321 МБ  |
| `manifest.json`          | канал обновлений, его читает клиент (`updater.MANIFEST_URL`) | 1.8 КБ |
| `code-<версия>.tar.gz`   | слой кода                         | 0.8 МБ  |
| `weights-<версия>.tar.gz`| слой весов зрения                 | 24 МБ   |

`appcast.xml` — МЁРТВАЯ заглушка формата Sparkle. Кода Sparkle в проекте нет
вовсе, клиент её не читает НИКОГДА (`client_gate.py`, проверка П5). Не считать
её каналом обновлений.

## ⛔⛔ ПОЧЕМУ ЭТИХ ЧЕТЫРЁХ ФАЙЛОВ НЕТ В GIT

Они в `.gitignore`, и это решение, а не недосмотр. 361 МБ двоичных данных в
истории репозитория необратимы, а `Governor.dmg` меняется каждый выпуск.

⛔ И ГЛАВНОЕ: `manifest.json` исключён ВМЕСТЕ С НИМИ, ХОТЯ ОН ТЕКСТОВЫЙ И
ВЕСИТ 1.8 КБ. Причина — в `deploy/edge_gate.py:348-380`: манифест и файлы
СВЯЗАНЫ. Если манифест отдаётся с кодом 200, гейт требует непустых слоёв И
настоящего `/Governor.dmg` с кодом 200. Оставь мы манифест в git, а двоичные
файлы вне его — свежая выкладка получила бы манифест, обещающий четыре слоя, и
503 на каждый из них. То есть край покраснел бы, а уже установленные клиенты
увидели бы выпуск, которого нет.

⇒ ПРАВИЛО: манифест и файлы ездят ТОЛЬКО ВМЕСТЕ. Нет файлов — нет и манифеста,
и тогда `dl.` честно отвечает 503 «сборка ещё не опубликована», а `edge_gate`
проверяет это плечом NEG-8.

Второе плечо того же правила — на стороне сайта: `web/download.html` ссылается
на `/dl/Governor.dmg`, и `web/web_gate.py` проверяет ссылку ПО ДИСКУ. Пока
полезной нагрузки нет, обход сайта краснеет строкой
«битая ссылка download.html → /dl/Governor.dmg». Замерено обоими плечами
10.08: файл убран — битых 1, файл на месте — битых 0.

## Как выложить выпуск

```
SIGN_ID="Governor Release Self-Signed" DOMAIN=governorpoker.app \
  STAGE=<каталог вне репозитория> bash macapp/dmg.sh
cp <каталог вне репозитория>/dl/* web/dl/
```

⛔ `STAGE` задавать ОБЯЗАТЕЛЬНО и вне `/Applications`: пересборка приложения
на месте отзывает у владельца разрешение «Запись экрана», и он не сможет играть,
пока не выдаст его заново.
