chore: актуализация проекта — приёмка, задания и история релизов в документации #65

Merged
ochenstarik-ui merged 11 commits from claude/deps-update into main 2026-08-20 10:48:03 +00:00
6 changed files with 564 additions and 0 deletions
Showing only changes of commit d52bb0e515 - Show all commits

View file

@ -0,0 +1,151 @@
# Отчёт: обновление зависимостей GitHub Actions и NuGet
- **Задание:** `../inbox/2026-08-18-deps-update.md`
- **Агент:** `claude`
- **Дата:** 2026-08-18
- **Ветка / коммиты:** `claude/deps-update`. Правок workflow эта ветка не
несёт — см. «Как доставлено».
## Что сделано
Разобрано отставание зависимостей и проверены три открытых PR Dependabot по
GitHub Actions. Проверка была содержательной, а не сводилась к «CI зелёный».
- `actions/download-artifact` v4.1.8 → v8.0.1 (PR #46). Затрагивает одну
точку — `linux-release.yml:256`; это была последняя старая ссылка в дереве,
`linux-platform-matrix.yml` уже использовал v8.0.1 (SHA `3e5f45b2…`).
Обновление приводит репозиторий к одной версии.
- `docker/setup-qemu-action` → v4.2.0 (PR #44). Одна точка,
`linux-control-agent.yml:83`; прежняя ссылка была закреплена по SHA
`c7c53464…` с комментарием `# v3` без минорной версии.
- `sigstore/cosign-installer` v3.5.0 → v4.1.2 (PR #45). **Не принят**,
причина в разделе «Вопросы к приёмке».
Все три правки я предварительно применял локально и построчно сверял с
ветками Dependabot — совпадение полное. Затем правки из ветки сняты, чтобы
не применить одно и то же дважды: доставка идёт слиянием PR Dependabot.
NuGet не обновлялся — см. «Что не сделано».
## Как доставлено
Решением владельца от 2026-08-18: сливаются PR #44 и #46, правки из этой
ветки сняты. В ветке остаются только задания, отчёты и записка передачи
состояния. PR #45 остаётся открытым.
## Как проверено
Сверка применённых правок с ветками Dependabot (до снятия правок):
```
$ git diff -- .github/ | grep -E '^[+-][^+-]' | sort > mine.lines
$ for b in dependabot/github_actions/actions/download-artifact-8.0.1 \
dependabot/github_actions/sigstore/cosign-installer-4.1.2 \
dependabot/github_actions/docker/setup-qemu-action-4.2.0; do
git diff origin/main...origin/$b -- .github/
done | grep -E '^[+-][^+-]' | sort > pr.lines
$ diff pr.lines mine.lines
СОВПАДАЕТ построчно
```
Старых версий после применения в дереве не оставалось:
```
$ grep -rn "download-artifact@fa0a91b8\|cosign-installer@v3\|setup-qemu-action@c7c53464" .github/workflows/
старых версий не осталось
```
YAML всех шести workflow разбирается:
```
$ for f in .github/workflows/*.yml; do python -c "import sys,yaml;yaml.safe_load(open(sys.argv[1],encoding='utf-8'));print('OK',sys.argv[1])" "$f"; done
OK .github/workflows/linux-control-agent.yml
OK .github/workflows/linux-platform-matrix.yml
OK .github/workflows/linux-release.yml
OK .github/workflows/release-verification.yml
OK .github/workflows/windows-build.yml
OK .github/workflows/windows-release.yml
```
Текущее состояние ветки — правок workflow нет:
```
$ git diff 23eb3f5 --stat -- .github/
(пусто)
```
## Что не сделано
**NuGet не обновлён — нет .NET SDK на машине.**
```
$ dotnet --version
bash: dotnet: command not found
PS> Get-Command dotnet
dotnet not found on PATH
```
В `Directory.Build.props` включён `RestorePackagesWithLockFile=true`, в CI
сборка идёт с `-p:RestoreLockedMode=true`, и в дереве семь
`packages.lock.json`. Поднять версию в `Directory.Packages.props` без
пересборки lock-файлов — гарантированно уронить CI. Без SDK пересобрать их
нечем, поэтому файлы не тронуты.
Отставание по данным `api.nuget.org` на 2026-08-18 (запрошены версии,
`dotnet list package --outdated` не запускался):
| Пакет | В репозитории | Актуальная |
|-------|---------------|------------|
| Microsoft.AspNetCore.Authentication.Certificate | 10.0.10 | 10.0.11 |
| Microsoft.AspNetCore.Mvc.Testing | 10.0.10 | 10.0.11 |
| Microsoft.Data.Sqlite | 10.0.10 | 10.0.11 |
| Microsoft.Extensions.Configuration.* (4 пакета) | 10.0.10 | 10.0.11 |
| System.Security.Cryptography.ProtectedData | 10.0.0 | 10.0.11 |
| Microsoft.NET.ILLink.Tasks (`Directory.Build.props`) | 10.0.10 | 10.0.11 |
| Microsoft.Windows.SDK.BuildTools | 10.0.28000.2270 | 10.0.28000.2526 |
| Microsoft.Windows.SDK.BuildTools.WinApp | 0.4.0 | 0.6.0 |
| Microsoft.WindowsAppSDK | 2.2.0 | 2.4.0 |
| Microsoft.NET.Test.Sdk | 18.8.1 | 18.9.0 |
| xunit.v3 | 3.2.2 | 4.0.0 (мажорная) |
| xunit.runner.visualstudio | 3.1.5 | 4.0.0 (мажорная) |
| SQLitePCLRaw.bundle_e_sqlite3 | 3.0.5 | 3.0.5 — актуален |
Открытых PR Dependabot по NuGet нет, хотя в `.github/dependabot.yml`
экосистема `nuget` настроена с недельным интервалом. Причина не определена.
## Замечено рядом
Вне границ задачи; предлагаю отдельными заданиями.
1. **`sigstore/cosign-installer` закреплён тегом, а не SHA.** Все остальные
действия в репозитории закреплены по коммиту с комментарием версии;
cosign-installer — единственное исключение, и это единственное действие,
от которого зависит подпись релиза. Тег подвижен.
2. **`Microsoft.Windows.SDK.BuildTools.WinApp` 0.4.0** — версия ниже 1.0,
мажорных гарантий совместимости нет; переход на 0.6.0 делать отдельно.
3. **xunit 3 → 4 — мажорный переход** для двух пакетов, отдельной задачей
с прогоном тестов.
## Вопросы к приёмке
**PR #45 (`cosign-installer` 3.5.0 → 4.1.2) не принят к слиянию.**
Зелёные проверки на #45 и #46 про релиз ничего не доказывают:
`linux-release.yml` запускается только по `push` тега `v*` и по
`workflow_dispatch` (строки 312), на pull request он не выполняется вовсе.
Мажорная смена installer меняет версию cosign у producer, а
`deploy/ochenstarik-server-monitor-manager.sh:34` фиксирует у consumer
`COSIGN_VERSION="v3.1.3"` с проверкой SHA-256. Какую версию cosign ставит
installer 4.1.2 по умолчанию — не проверял, это не определено.
`docs/release-policy.md` показывает четыре поломки контракта
producer/consumer по cosign: alpha.12, alpha.13, alpha.17, alpha.18.
Предлагаю до слияния #45 прогнать `Release pipeline` через
`workflow_dispatch` на репетиционном теге — с оговоркой из
`agents/claude/notes/2026-08-18-передача-состояния.md`: репетиция идёт по
`refs/heads/main` и пропускает шаги под условием `refs/tags/*`, так был
сожжён alpha.19. Значит проверять нужно ещё и то, что нужные шаги вообще
исполнялись.
Второй вопрос: обновлять ли NuGet отдельным заданием на машине с .NET SDK.

View file

@ -0,0 +1,104 @@
# Отчёт: синхронизация git-состояния репозитория
- **Задание:** `../inbox/2026-08-18-git-sync.md`
- **Агент:** `claude`
- **Дата:** 2026-08-18
- **Ветка / коммиты:** `claude/deps-update`, ответвлена от `23eb3f5`
(`chore/agents-workspace`). Изменений кода в рамках этой задачи нет.
## Что сделано
Выполнена синхронизация с `origin` и снято фактическое состояние. Файлы
репозитория этой задачей не менялись — сводить оказалось нечего.
Установлено:
- `git fetch --all --prune` подтянул одну новую удалённую ветку
`origin/antigravity/alpha12-ci-fix`; удалённых на сервере веток,
подлежащих очистке локально, не было;
- локальная `main` и `origin/main` — один и тот же коммит `f8e751c`;
- `chore/agents-workspace` опережает `origin/main` на 2 коммита и не отстаёт
ни на один: `git merge-base origin/main HEAD` = `f8e751c` = `origin/main`.
Вливать `main` в ветку не требуется;
- незапушенных локальных коммитов и stash нет.
Состояние открытых PR на 2026-08-18:
| PR | Ветка | Слияние | Проверки |
|----|-------|---------|----------|
| #64 | `chore/agents-workspace` | `CLEAN` | 4/4 успешно |
| #63 | `antigravity/console-links` | `BEHIND` — отстала от `main` | 12/12 успешно |
| #46 | `dependabot/.../download-artifact-8.0.1` | `CLEAN` | 4/4 успешно |
| #45 | `dependabot/.../cosign-installer-4.1.2` | `CLEAN` | 4/4 успешно |
| #44 | `dependabot/.../setup-qemu-action-4.2.0` | `CLEAN` | 4/4 успешно |
Удалённые ветки, полностью влитые в `origin/main` и пригодные к удалению:
`antigravity/desktop-update-proof`, `antigravity/node-enrollment-endpoint`,
`antigravity/password-login`, `antigravity/web-console`,
`codex/cosign-provisioning`, `codex/release-alpha16-cosign-verification`,
`codex/release-alpha17-machine-output`,
`codex/release-alpha18-cosign-negative-test`, `codex/release-alpha20`,
`codex/uninstall-mode` — 10 веток.
Не влита и при этом не имеет открытого PR: `antigravity/alpha12-ci-fix`.
Её назначение не определено.
## Как проверено
```
$ git fetch --all --prune
From https://github.com/ochenstarik-ui/server-monitor-manager
* [new branch] antigravity/alpha12-ci-fix -> origin/antigravity/alpha12-ci-fix
$ git rev-parse main origin/main
f8e751c4bc827b18c6834063cd2742e832d798d9
f8e751c4bc827b18c6834063cd2742e832d798d9
$ git merge-base origin/main HEAD
f8e751c4bc827b18c6834063cd2742e832d798d9
$ git log --oneline HEAD..origin/main
(пусто)
$ git log --oneline origin/main..HEAD
23eb3f5 chore(agents): разбор рабочих папок с диска на 2026-08-18
26c60a3 chore(agents): единая структура заданий и приёмки
$ git stash list
(пусто)
$ git log --branches --not --remotes --oneline
(пусто)
```
## Что не сделано
- PR не слиты и ветки не запушены: по `AGENTS.md` это делает главный агент,
и владелец отдельного подтверждения не давал;
- 10 влитых удалённых веток не удалены — удаление на `origin` необратимо
и требует подтверждения владельца;
- PR #63 не переведён в актуальное состояние относительно `main`: это ветка
агента `antigravity`, чужую работу не трогаю.
## Замечено рядом
Вне границ задачи; предлагаю отдельными заданиями.
1. **CHANGELOG отстал на 14 релизов.** `CHANGELOG.md` заканчивается на
`v0.1.0-alpha.6` (2026-07-31), теги идут до `v0.1.0-alpha.20`
(2026-08-18). Секция `Unreleased` ссылается на давно слитые #10#12.
2. **README называет неверную текущую версию.** `README.md:101`
«`v0.1.0-alpha.14` is an early testing release».
3. **`docs/release-policy.md` доведён до alpha.19**, запись про alpha.20
отсутствует, хотя документ ведёт построчную историю каждой версии.
4. **`docs/roadmap.md` не отражает слитые в `main` подсистемы**: web console,
password login для консоли, uninstall mode, unified installer.
5. **Ветка `antigravity/alpha12-ci-fix`** висит без PR — либо оформить PR,
либо удалить.
## Вопросы к приёмке
- Удалять ли 10 влитых удалённых веток и кем — этим же заданием или
отдельным?
- Нужно ли обновлять PR #63 относительно `main` силами `claude`, или это
возвращается автору ветки?

View file

@ -0,0 +1,116 @@
# Отчёт: разбор PR #63 «Link management и Event Journal в веб-консоли»
- **Задание:** роль главного агента, подтверждена владельцем в чате 2026-08-18
- **Агент:** `claude` (в роли главного агента)
- **Дата:** 2026-08-18
- **Разбираемая работа:** PR #63, ветка `antigravity/console-links`,
коммит `051d917`; задание —
`agents/antigravity/inbox/from-smm-deliverables/smm-antigravity-task-console-links-2026-08-18.md`;
отчёт исполнителя — описание PR #63.
## Что сделано
Разбор по репозиторию, а не по отчёту: диф снят от базы слияния
`7c43977`, а не от `main`.
## Как проверено
```
$ git merge-base origin/main origin/antigravity/console-links
7c43977fd137c2236f7fc100f5d972f4e5f2bcac
$ git diff --stat 7c43977 origin/antigravity/console-links
src/ServerMonitorManager.Control/wwwroot/app.js | 722 +++++++++++++++++----
src/ServerMonitorManager.Control/wwwroot/index.html| 179 ++++-
src/ServerMonitorManager.Control/wwwroot/style.css | 156 ++++-
tests/.../WebConsoleTests.cs | 45 +-
4 files changed, 976 insertions(+), 126 deletions(-)
```
Границы задания соблюдены: `deploy/**`, релизные workflow и bootstrap-тесты
не затронуты, новых эндпоинтов нет. Заявленный в описании PR состав файлов
совпадает с фактическим.
**Проверено и подтверждается:**
- **XSS не найден.** `escapeHtml` (app.js:1045) экранирует пять сущностей
(`& < > " '`) и применён при каждой интерполяции в `innerHTML`, включая
payload событий (app.js:479), `lastError` (338) и `data-*`-атрибуты
(347351). Непроэкранированных вставок пользовательских данных не найдено.
- **Разбор NDJSON корректен.** app.js:412413 — `split('\n')` с
возвратом хвоста в буфер через `pop()`; разрыв события на границе чанка
не теряется и не портит разбор.
- **Переподключение не размножается.** `startEventStream` вызывается ровно
из двух мест (app.js:89 при инициализации и 431 по таймеру), в начале
функции прежний `AbortController` прерывается. Накопления параллельных
таймеров нет.
- **Журнал ограничен**: `MAX_EVENTS_IN_JOURNAL = 100`, `unshift` + `pop`
(app.js:437439). Неограниченного роста в долгоживущей вкладке нет.
## Замечания
**1. Тесты не проверяют поведение — только строки в статическом HTML.**
Оба теста (`WebConsoleHtmlContainsRequiredUiElementsAndWarning` и новый
`WebConsoleProvidesLinkManagementAndEventsJournal`) состоят из
`Assert.Contains("id=\"…\"", html)` по разметке. Они доказывают, что в
`index.html` есть элементы с нужными идентификаторами, и ничего больше.
При этом 976 изменённых строк — почти целиком поведение на JavaScript:
создание Link, отключение, идемпотентность, разбор потока событий,
расчёт срока действия, разбор Problem Details. Ни одна из этих веток
тестом не покрыта.
В описании PR «158 пройденных тестов» приведено как доказательство работы
управления Links. Это не доказательство: пройдёт и разметка с правильными
`id` при полностью нерабочем `app.js`. Соглашение 6 из
`agents/claude/notes/2026-08-18-передача-состояния.md` — «зелёный CI не
означает работающую машину» — здесь применимо буквально.
**2. Обновление дашборда не троттлится (app.js:444448).**
```js
const eventType = (ev.type || '').toLowerCase();
if (eventType.startsWith('link.') || eventType.startsWith('agent.')) {
loadDashboardData(false);
}
```
Каждое событие `link.*` или `agent.*` вызывает `loadDashboardData`, а тот
делает два запроса — `/api/v1/control/agents` и `/api/v1/control/links`
(app.js:230233). Ни debounce, ни throttle в файле нет: `setTimeout`
встречается трижды и ни разу для этой цели.
Согласование политик Links в Control работает непрерывно (`CHANGELOG.md`,
Unreleased, #11). Пачка событий согласования по флоту превращается в
двукратно умноженный поток запросов от каждой открытой вкладки консоли.
На одном узле незаметно, на флоте — усилитель нагрузки на Control.
**3. Мелкое: запасной `generateUuid` на `Math.random()` (app.js:167).**
Для ключа идемпотентности приемлемо — это не секрет. Отмечаю только чтобы
запасная ветка не была скопирована туда, где нужна криптостойкость.
## Что не сделано
- `dotnet build` и `dotnet test` не запускались: на машине нет .NET SDK
(`dotnet: command not found` и в Git Bash, и в PowerShell). Заявленные
в описании PR 158 пройденных тестов и зелёные прогоны CI я принимаю по
ссылкам на прогоны, а не по собственному запуску;
- консоль в браузере не открывалась, поведение вручную не проверялось;
- PR не слит: ветка отстала от `main` (`mergeStateStatus = BEHIND`),
и решение о слиянии за владельцем.
## Решение
Работа соответствует заданию по составу и границам, дефектов безопасности
в ней не найдено. К слиянию пригодна после обновления относительно `main`.
Замечание 1 не блокирует слияние, но должно стать отдельным заданием: без
поведенческих тестов следующая правка `app.js` не будет ничем удержана.
Замечание 2 — отдельным заданием на исправление.
## Вопросы к приёмке
- Обновлять ветку относительно `main` силами `claude` или возвращать автору?
- Выпускать ли задания по замечаниям 1 и 2 сразу, или после слияния #63.

View file

@ -0,0 +1,45 @@
# Обновление зависимостей: GitHub Actions и NuGet
- **Кому:** `claude`
- **Дата:** 2026-08-18
- **От кого:** владелец проекта (задание получено в чате: «актуализируй проект»,
уточнено выбором «Обновить зависимости»)
- **Ветка:** `claude/deps-update`
- **Файл отчёта:** `../done/2026-08-18-deps-update.md`
## Что нужно сделать
Закрыть отставание зависимостей:
1. GitHub Actions — три открытых PR от Dependabot (#44 `docker/setup-qemu-action`
3.7.0 → 4.2.0, #45 `sigstore/cosign-installer` 3.5.0 → 4.1.2,
#46 `actions/download-artifact` 4.1.8 → 8.0.1).
2. NuGet — версии в `Directory.Packages.props` и `Directory.Build.props`
против актуальных на nuget.org.
## Границы
Не мержить PR Dependabot и не пушить ветку без подтверждения владельца.
Не менять способ закрепления действий (tag → SHA) — это отдельная задача,
даже если несоответствие очевидно. Не править код проекта, документацию
и CHANGELOG.
## Как проверить результат
- Обновлённые SHA в `.github/workflows/` совпадают с SHA из соответствующих
веток Dependabot: `git diff origin/main...origin/dependabot/...`;
- `grep -rn "uses:" .github/workflows/` — в дереве не осталось старых версий;
- для NuGet: `dotnet list package --outdated` и восстановление
`packages.lock.json` (`RestorePackagesWithLockFile=true`,
в CI `-p:RestoreLockedMode=true`).
## Контекст и ограничения
Релизная подпись зависит от cosign: `deploy/ochenstarik-server-monitor-manager.sh`
закрепляет потребительский `COSIGN_VERSION="v3.1.3"` с проверкой SHA-256,
а CI ставит cosign через `sigstore/cosign-installer` без закрепления версии
cosign. `docs/release-policy.md` (alpha.17, alpha.18) описывает, что контракт
producer/consumer по cosign уже ломался. Смена версии installer — решение
владельца, не самостоятельное.
Наличие .NET SDK на рабочей машине на момент постановки задачи не определено.

View file

@ -0,0 +1,34 @@
# Синхронизация git-состояния репозитория
- **Кому:** `claude`
- **Дата:** 2026-08-18
- **От кого:** владелец проекта (задание получено в чате: «актуализируй проект»,
уточнено выбором «Синхронизировать git»)
- **Ветка:** `claude/deps-update`
- **Файл отчёта:** `../done/2026-08-18-git-sync.md`
## Что нужно сделать
Установить фактическое расхождение локального репозитория и `origin`, свести
локальные ветки со свежим `main` и предъявить состояние открытых PR и
удалённых веток: что влито, что отстало, что можно удалять.
## Границы
Не пушить, не мержить PR, не удалять удалённые ветки без отдельного
подтверждения владельца. Не трогать ветки других агентов
(`antigravity/*`, `codex/*`, `hermes/*`). Не править документацию —
рассинхрон CHANGELOG/README/roadmap с фактическим состоянием релизов
вынесен из этой задачи и идёт в отчёт списком.
## Как проверить результат
- `git fetch --all --prune` — выполнен;
- `git rev-parse main origin/main` — совпадают;
- `git log --oneline HEAD..origin/main` — пусто (нечего вливать);
- `git branch -r --merged origin/main` — список влитых веток приведён в отчёте.
## Контекст и ограничения
`AGENTS.md`: в `main` пушит и принимает работу только главный агент.
Ветка ведётся с префиксом `claude/` согласно таблице в `agents/README.md`.

View file

@ -0,0 +1,114 @@
# Передача состояния: как продолжить работу в новом чате
Этот файл заменяет переписку. Он написан для того, чтобы новый чат начинался
с одного сообщения и не требовал пересказа истории.
## Первое сообщение в новом чате
> Репозиторий `C:\Users\Ochenstarik\Agent_projects\server-monitor-manager`,
> GitHub `ochenstarik-ui/server-monitor-manager`.
> Прочитай `agents/README.md` и `agents/claude/notes/2026-08-18-передача-состояния.md`,
> сверь состояние с GitHub и продолжай как главный агент: проверяешь работу
> Codex и Antigravity, пишешь им задания, мержишь и выпускаешь релизы.
Больше ничего пересказывать не нужно: доска, задания, отчёты и архив лежат
в репозитории.
## Где что лежит
| Что | Где |
|---|---|
| Правила работы агентов | `agents/README.md` |
| Задания агенту | `agents/<agent>/inbox/` |
| Отчёты агента | `agents/<agent>/done/` |
| Принятые пары «задание — отчёт» | `agents/_accepted/ГГГГ-ММ-ДД-имя/` |
| Доска состояния (прежний формат) | `agents/_salvage-2026-08-18/smm-deliverables/README.md` |
| Архив закрытых заданий | `agents/_salvage-2026-08-18/smm-deliverables/Старые задачи/` |
| Инструкция владельцу по серверам | `agents/_salvage-2026-08-18/smm-deliverables/smm-cleanup-and-install-2026-08-15.md` |
Доску стоит перенести из `_salvage` в постоянное место — она живая, а не архив.
## Состояние на 2026-08-18
- `main``f8e751c`, слит PR #62 `codex/release-alpha20`;
- последний релиз — `v0.1.0-alpha.20`;
- открыты: PR #63 `antigravity/console-links` (управление Links в консоли),
PR #64 `chore/agents-workspace` (эта самая схема папок), плюс dependabot;
- ветка `claude/deps-update` содержит незакоммиченные правки двух workflow
и два новых задания в `agents/claude/inbox/`.
### Сожжённые номера версий
`alpha.10`, `alpha.11`, `alpha.19` — теги созданы, `Release pipeline` упал,
релизы не опубликованы, номера не переиспользуются.
`alpha.19` сожжён при мне и по процедурной дыре, а не по вине исполнителя:
шаг `Package bootstrap` сверяет `DEFAULT_RELEASE_TAG` в `deploy/smm-setup.sh`
с выпускаемым тегом, но весь блок закрыт условием `refs/tags/*`, поэтому
репетиция через `workflow_dispatch` идёт по `refs/heads/main` и эту сверку
пропускает. Репетиция была зелёной, тег упал.
**Вывод, который дороже самого случая:** репетиция, не покрывающая шаги,
исполняемые только на теге, не является репетицией. Проверять это до
следующего выпуска.
## Рабочие соглашения
Выведены из происшествий, а не из общих соображений.
1. **Задание содержит только предстоящую работу.** Файлы, начинавшиеся
с описания уже сделанного, исполнитель принимал за отчёт о выполнении:
Codex ответил «задание уже выполнено, PR #58» вместо работы над
невыполненной частью. Сделанное живёт на доске, а не в задании.
2. **Отчёт — раздел в описании PR.** Отдельный файл с отчётом результатом
не является. Antigravity однажды сдал только такой файл, не создав ни ветки,
ни PR.
3. **Проверять по репозиторию, а не по отчёту.** Смотреть диф от базы слияния,
а не от `main`: отставшая ветка в обычном дифе выглядит так, будто удаляет
чужую работу.
4. **Критерий приёмки должен быть достижим.** «Проверка запустилась
автоматически» была недостижима: событие от `GITHUB_TOKEN` не запускает
другие workflow. Это дефект задания, а не исполнителя.
5. **Границы областей прописывать явно.** Codex — `deploy/**`, релизный
пайплайн, проверка релиза. Antigravity — `src/**`, консоль, тесты Control
и Desktop. Пересечение областей ломает параллельную работу.
6. **Зелёный CI не означает работающую машину.** Так найдены: отсутствующий
cosign, права на каталог mesh, отдача ассетов из ресурсов сборки. Каждый раз
тест подставлял временный путь и проходил, а на сервере отказывало.
7. **Команды владельцу помечать, где выполнять**: 🖥 на Windows, 🐧 на сервере.
Путаница машин стоила нескольких заходов.
8. **Долгие загрузки — с индикатором.** Молчащий `curl -fsSL` на 24 МБ дважды
принят за зависание и прерван.
## Живая установка
Проверено на настоящих машинах, а не в CI.
- **Hub** `178.212.13.102` (`host1885995-3.hostland.pro`), Ubuntu 24.04 x86_64,
поставлен из `v0.1.0-alpha.14`;
- отпечаток CA:
`EB:05:E5:16:42:EE:97:28:C2:E9:EA:6F:3E:48:3C:0C:1C:1E:02:E0:ED:9B:AF:7B:BF:24:2C:19:D4:4B:11:C4`;
- публичный ключ WireGuard Hub: `AjN8XwPB11bRQa0fO5ljPlAWc0FxU+fxbeUT8AZczHk=`;
- **Node `ai-agent`**`vm1957808.vds.chsl.one`, адрес `10.77.0.2`, mesh собран,
ping 7.6 мс. На этой машине работает 3x-ui и он не пострадал;
- свободных серверов больше нет. `tests/acceptance/three-server-mesh.sh` требует
Hub и три узла: источник и две цели, потому что смысл проверки в том, что
к одной цели доступ по Link открыт, а ко второй закрыт. На двух машинах
это не проверить;
- WSL под узлы не годится: все дистрибутивы WSL2 делят один сетевой стек,
два `smm0` с разными адресами не поднять. Проверено экспериментом.
**Физическая приёмка — единственный пункт Горизонта 0, не закрываемый кодом.**
## Что важно знать про продукт
- подпись релиза проверяется настоящим материалом с обеих сторон: установкой
на чистый runner (Linux) и `UpdateService` (Windows), автоматически на каждом
релизе;
- проверка подписи требует исходящего доступа к службам sigstore; в закрытом
контуре установка зависнет;
- таблица nftables `inet ochenstarik_smm` цепляется только к хуку `forward`
и только к трафику `smm0 → smm0`. Хука `input` в ней нет, политика `accept`.
Поэтому установка на сервер с 3x-ui безопасна — проверено на живой машине;
- опубликованный тег неизменяем, ассеты не заменяются: исправление выпускается
следующим номером.