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

## Состояние

`release-verification.yml` находится в `main`. Структура задания выполнена: триггеры `release: published` и `workflow_dispatch` с входным тегом, шаги проверки набора ассетов, изоляции рабочего каталога, положительной установки и негативных проверок, три отдельных скрипта под `tests/release-verification/`, `permissions: contents: read`.

Но **оба выполненных прогона `workflow_dispatch` против `v0.1.0-alpha.9` завершились отказом**, и workflow при этом оказался в `main`.

Ветка: `antigravity/release-verification-fix`, от текущего `main`.

---

## 1. Почему падает

Прогон `31419452912`, шаг `Run Positive Installation`:

```
rm -rf * .git
...
Running positive installation test for v0.1.0-alpha.9...
failed to run git: fatal: not a git repository (or any of the parent directories): .git
##[error]Process completed with exit code 1.
```

Замысел верен: рабочий каталог стирается вместе с `.git`, чтобы установка шла из релиза, а не из дерева исходников. Именно это и требовалось.

Ошибка в средстве. `run-positive-installation.sh` вызывает `gh release download`, а `gh` без явного `--repo` определяет репозиторий по git-контексту, который только что удалён. Инструмент конфликтует с изоляцией, ради которой всё и делается.

## 2. Как чинить — и почему именно так

Формально хватило бы передать `--repo ochenstarik-ui/server-monitor-manager` во все вызовы `gh`. Но правильнее убрать `gh` из проверки совсем.

Реальный пользователь на чистом сервере не имеет ни `gh`, ни `GH_TOKEN`, ни клона репозитория. Он выполняет ровно то, что описано в `docs/linux-bootstrap.md`: `curl` по публичному адресу релиза, `sha256sum`, затем `cosign` для подписи. Проверка, использующая `gh` с токеном, тестирует путь, которым никто не пользуется, и не заметит поломки публичной загрузки.

Требование: **в положительном сценарии использовать только те средства, которые есть у пользователя** — `curl`, `sha256sum`, `cosign`. Токен не использовать. Если какой-то ассет недоступен анонимным `curl`, это дефект релиза, и проверка обязана его показать.

Шаг `Verify Assets List` может продолжать пользоваться `gh` — он выполняется до изоляции и решает другую задачу.

## 3. Что вернуть в изолированный каталог

Сейчас после очистки копируется `tests/contracts/monitor-snapshot-v1.txt`. Это правильно: контракт задаёт ожидаемые значения, а не участвует в установке.

Зафиксировать это явным правилом в комментарии скрипта: из репозитория возвращаются **только ожидания** — контракты, списки, эталонные значения. Ничто исполняемое: ни установщик, ни bootstrap, ни архивы. Иначе изоляция перестаёт что-либо доказывать, а понять это по диффу будет уже нельзя.

## 4. Обязательное доказательство

Задание считается выполненным только при **зелёном прогоне `workflow_dispatch` против `v0.1.0-alpha.9`**, ссылка на прогон в отчёте.

Это тот самый случай, ради которого workflow и создавался: прогон против настоящего опубликованного релиза отвечает на вопрос, прошла бы поставка проверку или нет. Прогон против alpha.9 ценен ещё и тем, что этот релиз собран до всех недавних правок пайплайна.

Если прогон покажет дефект **релиза**, а не проверки — это успех задачи, а не провал. Зафиксировать находку отдельно и не «чинить» её ослаблением проверки.

## 5. Процесс

Изменения провести **через pull request**, не прямым коммитом в `main`.

Красный workflow попал в `main` потому, что за последние сутки шесть коммитов легли туда напрямую, минуя PR и гейт CI. Hermes параллельно включает защиту ветки: обязательный PR, обязательные статусы, запрет force-push. После этого прямой путь просто закроется.

Ветку сделать от текущего `main` — она сейчас отстаёт, в `main` вошли синхронизация переводов и правки release contract.

## Границы

Hermes ведёт `deploy/**`, `linux-release.yml`, `docs/release-policy.md`, roadmap и переводы; он же выпускает `v0.1.0-alpha.11` и чинит job `bootstrap` в релизном пайплайне.

Ваша область: `.github/workflows/release-verification.yml` и `tests/release-verification/**`. Остального не касаться; если потребуется — описать в `REPORT.md`.

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

- положительный сценарий использует только `curl`, `sha256sum` и `cosign`, без `gh` и без токена;
- в изолированный каталог возвращаются только файлы ожиданий, правило записано в скрипте;
- **зелёный прогон `workflow_dispatch` против `v0.1.0-alpha.9`**, ссылка в отчёте;
- негативные проверки по-прежнему отвергают: изменённый архив, подменённый хэш в manifest, отсутствующую подпись, подпись другой identity;
- отсутствие любого ожидаемого ассета роняет прогон;
- `actionlint` чист, вывод приложен;
- изменения внесены через PR, не прямым коммитом;
- `git diff --name-only main` не выходит за границы.

## Отчёт

Раздельно: локально, в CI со ссылками, не запускалось и почему. Описание PR заполнять после завершения CI. Если прогон против alpha.9 обнаружит дефект релиза — вынести отдельным разделом.
