diff --git a/agents/claude/done/2026-08-18-deps-update.md b/agents/claude/done/2026-08-18-deps-update.md new file mode 100644 index 0000000..f4324d0 --- /dev/null +++ b/agents/claude/done/2026-08-18-deps-update.md @@ -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` (строки 3–12), на 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. diff --git a/agents/claude/done/2026-08-18-git-sync.md b/agents/claude/done/2026-08-18-git-sync.md new file mode 100644 index 0000000..e5bdb4b --- /dev/null +++ b/agents/claude/done/2026-08-18-git-sync.md @@ -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`, или это + возвращается автору ветки? diff --git a/agents/claude/done/2026-08-18-review-pr63-console-links.md b/agents/claude/done/2026-08-18-review-pr63-console-links.md new file mode 100644 index 0000000..6101ec2 --- /dev/null +++ b/agents/claude/done/2026-08-18-review-pr63-console-links.md @@ -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-*`-атрибуты + (347–351). Непроэкранированных вставок пользовательских данных не найдено. +- **Разбор NDJSON корректен.** app.js:412–413 — `split('\n')` с + возвратом хвоста в буфер через `pop()`; разрыв события на границе чанка + не теряется и не портит разбор. +- **Переподключение не размножается.** `startEventStream` вызывается ровно + из двух мест (app.js:89 при инициализации и 431 по таймеру), в начале + функции прежний `AbortController` прерывается. Накопления параллельных + таймеров нет. +- **Журнал ограничен**: `MAX_EVENTS_IN_JOURNAL = 100`, `unshift` + `pop` + (app.js:437–439). Неограниченного роста в долгоживущей вкладке нет. + +## Замечания + +**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:444–448).** + +```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:230–233). Ни 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. diff --git a/agents/claude/inbox/2026-08-18-deps-update.md b/agents/claude/inbox/2026-08-18-deps-update.md new file mode 100644 index 0000000..8cb7c6e --- /dev/null +++ b/agents/claude/inbox/2026-08-18-deps-update.md @@ -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 на рабочей машине на момент постановки задачи не определено. diff --git a/agents/claude/inbox/2026-08-18-git-sync.md b/agents/claude/inbox/2026-08-18-git-sync.md new file mode 100644 index 0000000..f6552bd --- /dev/null +++ b/agents/claude/inbox/2026-08-18-git-sync.md @@ -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`. diff --git a/agents/claude/notes/2026-08-18-передача-состояния.md b/agents/claude/notes/2026-08-18-передача-состояния.md new file mode 100644 index 0000000..55ea5a3 --- /dev/null +++ b/agents/claude/notes/2026-08-18-передача-состояния.md @@ -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//inbox/` | +| Отчёты агента | `agents//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 безопасна — проверено на живой машине; +- опубликованный тег неизменяем, ассеты не заменяются: исправление выпускается + следующим номером.