# Codex: выпустить v0.1.0-alpha.20 и закрыть дыру в проверке выпуска

## Репозиторий

- https://github.com/ochenstarik-ui/server-monitor-manager
- База: `main` @ `7c43977`
- Ветка: `codex/release-alpha20`
- `main` защищён: PR обязателен, обязательны статусы `build-and-test` и `build`, force-push запрещён
- один PR — одна тема; описание PR заполняется **после** завершения CI

## Что произошло

Тег `v0.1.0-alpha.19` создан на `7c43977`, `Release pipeline` упал, релиз не опубликован. Номер сожжён и не переиспользуется — так же, как `alpha.10` и `alpha.11`.

Причина в шаге `Package bootstrap` workflow `linux-release.yml`:

```bash
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
  sed -i "s/^PROGRAM_VERSION=.*$/PROGRAM_VERSION=\"${GITHUB_REF_NAME}\"/" "$DIST_DIR/ochenstarik-server-monitor-manager.sh"
  grep -Fq "readonly DEFAULT_RELEASE_TAG=\"${GITHUB_REF_NAME}\"" "$DIST_DIR/smm-setup.sh"
fi
```

Проверка требует, чтобы `DEFAULT_RELEASE_TAG` в `deploy/smm-setup.sh` совпадал с выпускаемым тегом. В `main` там `v0.1.0-alpha.18`. Проверка сама по себе правильная: она не даёт выпустить установщик, который по умолчанию тянет ассеты чужого релиза.

**Дыра в другом.** Весь блок закрыт условием `refs/tags/*`, поэтому пробный прогон через `workflow_dispatch` идёт по `refs/heads/main` и эту проверку пропускает. Репетиция перед тегированием, введённая как раз для того, чтобы не сжигать номера, не покрывает единственный шаг, который на теге и ломается. Пока это так, каждый выпуск остаётся лотереей.

---

## Часть 1 — сделать репетицию честной

Дать `linux-release.yml` вход `workflow_dispatch` с необязательным параметром `tag` и выполнять при пробном прогоне те же проверки согласованности версий, что и на настоящем теге: подстановку `PROGRAM_VERSION` и сверку `DEFAULT_RELEASE_TAG`. Публикация при этом по-прежнему не выполняется — она остаётся привязанной к `refs/tags/*`.

Смысл: прогон `workflow_dispatch` с `tag=v0.1.0-alpha.20` должен падать ровно там же, где упал бы настоящий тег, и по той же причине.

Если сочтёте, что вход-параметр — плохое решение, допустима альтернатива: вынести сверку согласованности версий в обычный тест, исполняемый на каждом PR, который сравнивает `DEFAULT_RELEASE_TAG` с последним тегом в `docs/release-policy.md`. Обоснуйте выбор в отчёте.

## Часть 2 — привести версии в согласие

Обновить до `v0.1.0-alpha.20` все места, где номер зашит. На момент написания их пять:

- `deploy/smm-setup.sh:6` — `readonly DEFAULT_RELEASE_TAG`;
- `deploy/smm-setup.sh:37` — текст справки `SMM_TAG  Release tag (default: ...)`;
- `docs/linux-bootstrap.md:9,12,13` — команды скачивания;
- `.github/workflows/windows-build.yml:43` — `SMM_TEST_RELEASE_TAG` для шага live-release.

Перечень проверьте сами: `git grep -n 'alpha\.18'` по `deploy/`, `docs/`, `.github/`. Если после обновления где-то останется старый номер, это дефект.

Заведите проверку, которая не даёт им разъехаться впредь: все зашитые упоминания версии релиза должны сверяться автоматически, а не глазами при следующем выпуске.

## Часть 3 — записать судьбу alpha.19

В `docs/release-policy.md`: `v0.1.0-alpha.19` — тег создан, `Release pipeline` упал на сверке `DEFAULT_RELEASE_TAG`, релиз не опубликован, номер не переиспользуется.

## Часть 4 — выпустить

1. Прогнать `Release pipeline` через `workflow_dispatch` с `tag=v0.1.0-alpha.20` на своей ветке и получить зелёный — теперь это осмысленная репетиция, а не формальность.
2. Создать и запушить тег обычным `git push`.
3. Убедиться, что релиз опубликован и что `Release Verification` запустился сам по `workflow_run` и зелёный.
4. Тег не двигать ни при каких обстоятельствах.

## Границы

Antigravity ведёт Control и веб-консоль. **Не трогать:** `src/**`.

Ваша область: `deploy/**`, `.github/workflows/linux-release.yml`, `.github/workflows/windows-build.yml` в части `SMM_TEST_RELEASE_TAG`, `tests/bootstrap/**`, `docs/linux-bootstrap.md`, `docs/release-policy.md`.

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

- пробный прогон с параметром `tag` выполняет сверку версий и падает на несогласованности;
- все зашитые упоминания версии обновлены до `v0.1.0-alpha.20`, расхождение ловится автоматически;
- судьба `alpha.19` записана в `docs/release-policy.md`;
- `v0.1.0-alpha.20` опубликован, набор ассетов совпадает с `tests/release-verification/verify-assets.sh`;
- `Release Verification` отработал по событию и зелёный, ссылка на прогон в отчёте;
- всё через PR, CI зелёный, PR не смержен до зелёного.

## Отчёт

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