# Antigravity: подписанная поставка, очередь B

## Приёмка очереди A

Queue A принята. В релизе `v0.1.0-alpha.8` присутствуют `server-monitor-manager-manifest.json` и `server-monitor-manager-manifest.sig`, Linux-артефакты и SBOM собираются, пайплайн после трёх починок отрабатывает целиком. Manifest v2 с подписью — это ровно то, чего не хватало для закрытия Горизонта 0 по поставке.

Ветка: `antigravity/signed-delivery-queue-b`.

---

## Часть 1 — проверка подписи на стороне Desktop · начинать сразу

Desktop свободен, ни Hermes, ни вы его сейчас не трогаете.

Сегодня Desktop скачивает и ставит обновления, не проверяя, что артефакт подписан тем, кем должен. Manifest и подпись уже публикуются — осталось их использовать.

1. Вшить в Desktop **константой** ожидаемую identity подписи: при keyless-режиме cosign это issuer и subject (репозиторий и workflow), при `minisign` — публичный ключ. Не скачивать её вместе с релизом: подпись, проверяемая ключом из того же релиза, ничего не доказывает.
2. Перед предложением обновления: скачать manifest и `.sig`, проверить подпись, сверить хэш артефакта с manifest, и только потом показывать пользователю кнопку обновления.
3. Несовпадение подписи или хэша — отказ с внятным текстом и записью в диагностику. Не предупреждение, не «продолжить всё равно».
4. Отсутствие manifest или подписи в релизе — тоже отказ; путь «старый релиз без подписи» допускается только под явным флагом разработчика, как `SMM_ALLOW_UNSIGNED` в bootstrap.

Тесты: валидная подпись принимается; подписанный чужой identity manifest отклоняется; manifest с подменённым хэшем отклоняется; отсутствующая подпись отклоняется.

---

## Часть 2 — проверка в bootstrap · после merge задания Hermes

Hermes сейчас правит `deploy/ochenstarik-server-monitor-manager.sh` — исправляет формат снимка Monitor. **Не заходить в этот файл, пока его PR не смержен.** Момент согласовать.

После merge:

1. `verify_archive` сверяет хэш архива **с manifest**, а не с соседним `.sha256`. Старый путь остаётся только под явным `SMM_ALLOW_UNSIGNED=1` с громким предупреждением.
2. Новое действие `verify-manifest MANIFEST SIGNATURE`.
3. Публичный ключ или OIDC-identity вшиты константой в bootstrap.
4. Отсутствие инструмента проверки подписи — отказ, а не предупреждение.
5. Отказ `update-control` и `update-agent` при несовместимой паре версий Control ↔ Agent ↔ helper. Требование `docs/installer-contract.md` §6, невыполненное с самого начала; manifest v2 уже содержит нужные версии.

---

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

Release-workflow **не запускаются на pull request** — они триггерятся тегом и `workflow_dispatch`. Зелёный PR про них ничего не доказывает. Вы уже дважды на этом обожглись: `permissions` в #14 всплыли только при первом настоящем релизе, `locked-mode` в #15 — тоже.

Поэтому обязательно: `actionlint` на всех workflow с выводом в отчёт, и прогон через `workflow_dispatch` на своей ветке.

Отдельно: если для части 2 понадобится правка workflow — **не вносить самостоятельно**, описать в `REPORT.md`. Release-пайплайн сейчас ведёт Hermes, и три починки подряд за один день были ровно из-за того, что в него правили с двух сторон.

---

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

- Desktop отказывается ставить обновление с неверной, чужой или отсутствующей подписью; четыре теста зелёные;
- identity подписи вшита в Desktop, а не берётся из релиза;
- `verify_archive` работает от manifest, `verify-manifest` существует;
- несовместимые версии блокируют `update-*`;
- `deploy/ochenstarik-server-monitor-manager.sh` не тронут до merge PR Hermes — проверяется историей коммитов;
- `.github/workflows/**` не изменены;
- `actionlint` чист, вывод приложен;
- CI зелёный, PR не смержены.

## Отчёт

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