# Antigravity: проверка опубликованного релиза установкой

## Состояние

`main` @ `61471f0`. Открытых PR нет. Очередь B подписанной поставки слита (#35), все замечания по ней закрыты.

Задание относится к завершению Горизонта 0 — это проверка того, что уже сделано, а не новая функциональность. Гейт горизонта не нарушается.

Ветка: `antigravity/release-verification`.

---

## Часть 1 — установка из опубликованного релиза как проверка в CI

### Зачем

Вся цепочка поставки собрана: manifest v2, подпись cosign, проверка в bootstrap и в Desktop, воспроизводимые сборки. Но **ни один автоматический тест не устанавливает систему из фактически опубликованного релиза.**

Цена этого пробела уже известна. При первой живой установке нашлись подряд:

- `alpha.8` был опубликован вообще без Linux-архивов — единственной поддерживаемой серверной платформы;
- `verify_archive` искал в manifest ключ `ServerMonitorManager-linux-x64.tar.gz`, тогда как ассет называется `server-monitor-manager-linux-x64.tar.gz`, и захардкоженную архитектуру — то есть проверка подписи ломала штатную установку;
- release-workflow трижды падали на CycloneDX и путях артефактов.

Ни одно из этого не ловилось зелёным CI, потому что CI проверяет **сборку из дерева**, а не **релиз как продукт**. Тесты работают с локально собранным архивом; настоящие имена ассетов, настоящий manifest и настоящая подпись в них не участвуют.

### Что сделать

Новый workflow, запускаемый после публикации релиза и вручную через `workflow_dispatch` с параметром тега.

На чистом runner'е, без доступа к дереву исходников кроме самого скрипта установки:

1. Скачать `smm-setup.sh` из релиза по тегу и проверить его контрольную сумму по опубликованному `.sha256`.
2. Запустить `smm-setup.sh hub <локальный-хост>` — то есть пройти ровно тот путь, которым пользуется владелец: загрузка bootstrap и архива из релиза, проверка контрольных сумм, проверка подписи manifest, `preflight`, `verify-release`, установка Control, `mesh-init`.
3. Проверить, что Control активен и `/healthz` отвечает.
4. Выпустить код Node через `node-code`, установить Node на той же машине, дождаться активного `ochenstarik-smm-agent.service` и выданного сертификата.
5. Проверить `install-monitor`: пользователь создан, forced command выдаёт снимок, поля совпадают с `tests/contracts/monitor-snapshot-v1.txt`.
6. Снять всё через `uninstall-*` и убедиться, что следов не осталось.

Требования:

- скрипт установки берётся **из релиза**, а не из рабочего дерева — иначе проверяется не то, что получит пользователь;
- проверка подписи не обходится: `SMM_ALLOW_UNSIGNED` в этом прогоне не используется;
- прогон падает, если в релизе отсутствует любой ожидаемый ассет.

### Негативные проверки

Отдельными шагами, каждый обязан завершиться отказом установки:

- архив с изменённым байтом;
- manifest с подменённым хэшем без переподписи;
- manifest без файла подписи;
- подпись, сделанная другой identity.

Первые три уже покрыты юнит-тестами против синтетических данных; здесь они проверяются на настоящем релизе и настоящем cosign.

---

## Часть 2 — проверка того, что релиз полон

Отдельный шаг того же workflow: сверить набор ассетов релиза с ожидаемым списком и упасть при расхождении.

```
ochenstarik-server-monitor-manager.sh(+.sha256)
server-monitor-manager-linux-x64.tar.gz(+.sha256)
server-monitor-manager-linux-arm64.tar.gz(+.sha256)
server-monitor-manager-linux-x64-sbom.json
server-monitor-manager-linux-arm64-sbom.json
server-monitor-manager-win-x64-sbom.json
ServerMonitorManager-win-x64.msix
ServerMonitorManager-test-signing.cer
SHA256SUMS
smm-setup.sh(+.sha256)
server-monitor-manager-manifest.json
server-monitor-manager-manifest.sig
```

Ровно этой проверки не хватало, когда `alpha.8` вышел без Linux-архивов и это заметил человек, а не CI.

---

## Границы

Hermes параллельно выпускает `v0.1.0-alpha.10`, правит `deploy/smm-setup.sh` (значение `DEFAULT_RELEASE_TAG`), roadmap, переводы README и удаляет слитые ветки. Может также добавить Debian VM в матрицу.

**Не трогать:** `deploy/**`, `docs/roadmap.md`, `docs/i18n/**`, `docs/linux-platform-matrix.md`.

Ваша область — новый workflow и вспомогательные скрипты проверки под `tests/`. Если для задачи потребуется изменить существующий workflow, согласовать: релизный пайплайн ведёт Hermes, и три починки подряд за день случились именно из-за правок с двух сторон.

## Чего опасаться

Новый workflow по определению не запускается на pull request — он привязан к публикации релиза. Зелёный PR про него ничего не докажет, ровно как было с `permissions` и `locked-mode`.

Поэтому обязательно: `actionlint` на новом файле с выводом в отчёт и прогон через `workflow_dispatch` на своей ветке против уже существующего тега `v0.1.0-alpha.9`. Это заодно ответит на главный вопрос — прошла бы проверка на реальном релизе или нет.

## Критерий приёмки

- новый workflow выполняет полный цикл установки из опубликованного релиза и снимает её;
- четыре негативные проверки отвергают установку;
- отсутствие любого ожидаемого ассета роняет прогон;
- `SMM_ALLOW_UNSIGNED` в основном прогоне не используется;
- `actionlint` чист, вывод приложен;
- выполнен `workflow_dispatch`-прогон против `v0.1.0-alpha.9`, ссылка в отчёте;
- `git diff --name-only main` не содержит файлов из списка границ;
- PR не смержен.

## Отчёт

Раздельно: локально, в CI со ссылками, не запускалось и почему. Описание PR заполнять после завершения CI.
