# Hermes: совместимость БД, выпуск alpha.8, роль Monitor

## Состояние

- `main` @ `df4dfd1`;
- PR #24 `fix(enrollment): repair node enrollment path` слит — блокирующий дефект регистрации Node закрыт;
- слиты шесть обновлений dependabot, включая **SQLitePCLRaw 2.1.12 → 3.0.5**;
- последний релиз — `v0.1.0-alpha.7`, в нём фикса регистрации **нет**;
- на живом Hub пользователя развёрнут alpha.7 с работающей `control.db`, созданной версией 2.1.12.

Ветка: `hermes/release-alpha8-and-monitor` (части 1–2) и `hermes/monitor-role` (часть 3) — либо одна ветка на часть, по вашему усмотрению, но части 1–2 и часть 3 разными PR.

---

## Часть 1 — совместимость существующей базы с SQLitePCLRaw 3.0.5 · сделать первым

`SQLitePCLRaw` — нативная библиотека под SQLite, на которой держится вся база Control: enrollment, identities, links, provisioning, audit. Мажорное обновление слито без проверки на **существующей** базе; CI создаёт базу с нуля и потому совместимость не проверяет в принципе.

Если совместимости нет, это проявится в момент `update-control` на живом Hub — то есть в самый неудобный момент и без пути назад.

Проверить:

1. Взять `control.db`, созданную сборкой на 2.1.12 (подойдёт база с реального Hub либо созданная из тега `v0.1.0-alpha.7`).
2. Открыть её сборкой из текущего `main`: `PRAGMA user_version` читается, значение прежнее, миграции не пытаются примениться повторно.
3. Данные читаются: агенты, identities, links, provisioning-задания, аудит.
4. `backup-create` на этой базе и `backup-restore` из полученного бэкапа проходят и дают рабочий Control.
5. Повторить на `linux-arm64` self-contained trimmed single-file: нативные библиотеки в такой сборке линкуются иначе, чем под x64.

Если хоть один пункт не проходит — **не выпускать релиз**, откатить #23 отдельным PR и написать об этом прямо.

**Обязательно добавить тест**, которого сейчас нет: открытие базы предыдущей схемы. Зафиксировать в репозитории эталонную `control.db` (или скрипт её воспроизведения) и проверять открытие при каждом прогоне. Без него следующее обновление SQLite повторит ту же историю.

---

## Часть 2 — выпустить `v0.1.0-alpha.8`

Пользовательские серверы стоят: Hub развёрнут и работает, Node зарегистрировать нельзя, потому что фикс лежит только в `main`.

После части 1:

1. Тег `v0.1.0-alpha.8` на текущий `main`, push тегом через `git push` — release-workflow триггерится на `push: tags: v*`.
2. Убедиться, что оба release-workflow отработали и в релиз попали: bootstrap + `.sha256`, оба `tar.gz` + `.sha256`, manifest, MSIX, SBOM.
3. Проверить, что `permissions` на job-уровне из PR #14 действительно сработали — release-workflow **не запускаются на pull request**, и это первый настоящий их прогон после той правки. Если публикация упадёт по 403, чинить здесь же.
4. К релизу приложить `smm-setup.sh` из `server-monitor-manager-deliverables` — файл берётся как ассет релиза и должен обновиться на новый тег. В нём есть временный обход бага `validate_control_url`; **убрать его**, раз дефект исправлен в #24. Обход помечен комментарием в коде.

После выпуска сообщить: пользователь повторит регистрацию Node на своих серверах через `update-control` и новый `node-code`.

---

## Часть 3 — роль Monitor в bootstrap

Пункт Горизонта 0, который никто не начинал. Сегодня SSH-мониторинг — функция, ради которой существует Desktop, — не имеет серверной части: в bootstrap нет действия установки, forced-command скрипт не поставляется, а парсер `SshMonitorService.QueryAsync` ожидает ключи `PROTOCOL`, `CPU_COUNT`, `MEM_AVAILABLE_KB`, `DISK_INODES_TOTAL` и другие, которых в репозитории не производит никто.

Объём:

- действия `install-monitor PUBLIC_KEY` и `uninstall-monitor`;
- системный пользователь `ochenstarik-monitor`: `nologin`, без пароля, без sudo;
- `/usr/local/libexec/ochenstarik-smm-metrics`, root-owned `0755`, выдающий ровно снимок из `docs/installer-contract.md` §7 и read-only `mesh status`;
- `authorized_keys` с `command="…",restrict,no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding`;
- идемпотентность повторного запуска и корректное удаление;
- **контрактный тест формата снимка, общий для скрипта и парсера Desktop** — иначе они разъедутся снова.

Формат снимка не выдумывать: он уже зафиксирован в `docs/installer-contract.md` §7.

`SshMonitorService.cs` не менять — если парсер потребует правки, описать нужное в `REPORT.md`.

---

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

- существующая база открывается новой сборкой, backup/restore работают, есть тест на предыдущую схему;
- `v0.1.0-alpha.8` выпущен со всеми ассетами, публикация не упала по правам;
- обход `validate_control_url` из `smm-setup.sh` убран;
- чистый сервер попадает под мониторинг одной командой, README соответствует коду;
- контрактный тест формата снимка в CI;
- Control suite прогнан на Linux;
- PR созданы, CI зелёный.

## Отчёт

Раздельно: локально, в CI со ссылками, не запускалось и почему. Физическая приёмка на трёх серверах выполняется пользователем и в это задание не входит.
