# 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.