# Release readiness v0.2

`release-readiness-v0.2` усиливает v0.1 в части коммерческого релиза и
подготовки к реестру российского ПО.

Дата фиксации: `2026-06-03`.

## 1. Что добавлено

| Блок | Файл |
|---|---|
| Machine SBOM generation | `scripts/generate_release_sbom_v0_2.sh` |
| Release asset verification | `scripts/verify_release_assets.sh` |
| CI checksum/signature self-test | `.github/workflows/release-assets.yml` |
| Pilot acceptance act | `docs/CUSTOMER_PILOT_ACCEPTANCE_RU.md` |
| pfSense perimeter positioning | `docs/NETWORK_PERIMETER_PFSENSE_RU.md` |
| Pilot freeze gate | `docs/PILOT_FREEZE_READINESS_RU.md` |

## 2. Machine SBOM as GitHub Release asset

Сгенерировать assets:

```bash
bash scripts/generate_release_sbom_v0_2.sh dist/release-v0.2
```

Ожидаемые файлы:

```text
dist/release-v0.2/sbom/cyclonedx-rust-v0.2.json
dist/release-v0.2/sbom/spdx-rust-v0.2.json
dist/release-v0.2/sbom/cargo-metadata-v0.2.json
dist/release-v0.2/sbom/cargo-tree-v0.2.txt
dist/release-v0.2/sbom/python-inputs-v0.2.txt
dist/release-v0.2/RELEASE_ASSETS_MANIFEST-v0.2.json
dist/release-v0.2/SHA256SUMS-v0.2.txt
```

Эти файлы публикуются как GitHub Release assets. Они не хранятся в tracked
source, потому что `dist/` является generated output.

## 3. Подпись release assets

Release manager подписывает checksum file detached signature:

```bash
openssl dgst -sha256 -sign <RELEASE_PRIVATE_KEY.pem> \
  -out dist/release-v0.2/SHA256SUMS-v0.2.txt.sig \
  dist/release-v0.2/SHA256SUMS-v0.2.txt
```

Проверка:

```bash
RELEASE_VERIFY_PUBLIC_KEY=<RELEASE_PUBLIC_KEY.pem> \
  bash scripts/verify_release_assets.sh dist/release-v0.2
```

## 4. Подписанный Git tag

Требование для финального релиза:

```bash
git tag -s release-readiness-v0.2 -m "release-readiness-v0.2"
git tag -v release-readiness-v0.2
git push origin release-readiness-v0.2
```

Tag должен быть подписан пользовательским ключом правообладателя/maintainer, а
не сторонним системным ключом пакетов ОС.

## 5. CI gate

Workflow:

```text
.github/workflows/release-assets.yml
```

Проверяет:

- генерацию CycloneDX/SPDX JSON;
- валидность JSON;
- self-test checksum/signature verifier;
- отрицательные сценарии checksum mismatch и missing signature.

## 6. Pilot acceptance

Шаблон:

```text
docs/CUSTOMER_PILOT_ACCEPTANCE_RU.md
```

Использовать для коммерческого пилота после установки и первичной настройки.
Публичная версия должна оставаться обезличенной.

Перед фиксацией pilot freeze candidate использовать:

```text
docs/PILOT_FREEZE_READINESS_RU.md
```

Этот gate не добавляет функциональность. Он проверяет, что текущий main
остается в границах Pilot v1: Rust Backend, Rust Agent, HTML/HTMX Portal,
role-based views, rule-based UEBA v1, pfSense только как
contract/readiness/optional integration layer и сохраненный PowerShell
runtime/fallback до burn-in/canary/rollback gate.

Полное удаление PowerShell не входит в `release-readiness-v0.2` или текущий
pilot freeze: оставшиеся runtime/fallback/installer/repair scripts считаются
документированным слоем отката, установки и поддержки.

## 7. pfSense perimeter

Документ:

```text
docs/NETWORK_PERIMETER_PFSENSE_RU.md
```

Ключевая позиция: pfSense является опциональным интеграционным слоем, а не
обязательной частью продукта AWatch-rus.

## 8. Acceptance checklist

- SBOM assets сгенерированы.
- `SHA256SUMS-v0.2.txt` создан.
- `SHA256SUMS-v0.2.txt.sig` создан release private key.
- `scripts/verify_release_assets.sh` проходит с public key.
- Git tag подписан ключом maintainer.
- GitHub release содержит SBOM JSON/TXT, manifest, checksum и signature.
- `CUSTOMER_PILOT_ACCEPTANCE_RU.md` заполнен для пилотного заказчика.
- pfSense не описан как обязательный компонент продукта.
- `PILOT_FREEZE_READINESS_RU.md` заполнен для pilot freeze candidate.
- PowerShell retirement не заявлен как выполненный без отдельного
  burn-in/canary/rollback/acceptance gate.
