Задания, отчёты и патчи, лежавшие в C:\Users\Ochenstarik\projects и в домашней папке, перенесены в agents/. Разложено по агентам там, где имя файла позволяло определить автора; остальное — в _salvage-2026-08-18/ и разбирается вручную. Патчи в notes/salvage-2026-08-18/ — незакоммиченная работа из брошенных рабочих копий: она существовала только на диске. Тяжёлое (релизные архивы, инсталляторы, наборы данных) в репозиторий не попало: оно лежит рядом, в Agent_projects/_archive и Agent_projects/_data. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
137 lines
11 KiB
Markdown
137 lines
11 KiB
Markdown
# Гигиена репозитория и цепочки поставки
|
||
|
||
## Репозиторий и ветка
|
||
|
||
- Репозиторий: https://github.com/ochenstarik-ui/server-monitor-manager
|
||
- База: `main` @ `b11c277ac7f79a18670932eca4622982d9ff48e0`
|
||
- Ветка: `antigravity/repo-hygiene`
|
||
- Работать в **отдельном клоне или worktree**. Клон `C:\Users\Ochenstarik\projects\server-monitor-manager` и рабочая копия `C:\Users\Ochenstarik\projects\server-monitor-manager-task3-b3` заняты другими исполнителями; вторая содержит 24 незакоммиченных файла, которые нельзя потерять.
|
||
|
||
Задание самодостаточно: истории переписки у исполнителя нет, всё нужное — ниже.
|
||
|
||
## Зачем
|
||
|
||
Server Monitor Manager устанавливает на серверы бинарники, работающие с правами root, и управляет firewall. При этом:
|
||
|
||
- все GitHub Actions подключены по плавающим тегам, то есть содержимое шага сборки может измениться без нашего ведома и без изменения кода репозитория;
|
||
- у проекта нет `SECURITY.md` — для инструмента безопасности отсутствие канала сообщений об уязвимостях само по себе дефект;
|
||
- нет истории изменений, хотя опубликовано пять предрелизов;
|
||
- нет автоматического отслеживания уязвимых зависимостей.
|
||
|
||
Задача закрывает это. Она не касается кода, тестов и логики — только цепочки поставки и оформления репозитория.
|
||
|
||
## Работы
|
||
|
||
### 1. Запинить GitHub Actions по commit SHA
|
||
|
||
Полная инвентаризация на базе `b11c277` — 23 подключения, 5 различных действий, 5 файлов в `.github/workflows/`:
|
||
|
||
| Действие | Текущий тег | Вхождений |
|
||
|---|---|---|
|
||
| `actions/checkout` | `@v6` | 8 |
|
||
| `actions/setup-dotnet` | `@v5` | 5 |
|
||
| `actions/upload-artifact` | `@v6` | 5 |
|
||
| `actions/download-artifact` | `@v8` | 2 |
|
||
| `softprops/action-gh-release` | `@v2` | 3 |
|
||
|
||
Файлы: `linux-control-agent.yml`, `linux-platform-matrix.yml`, `linux-release.yml`, `windows-build.yml`, `windows-release.yml`.
|
||
|
||
Формат замены — полный 40-символьный SHA коммита, тег сохраняется комментарием:
|
||
|
||
```yaml
|
||
uses: actions/checkout@<40-символьный-sha> # v6.x.x
|
||
```
|
||
|
||
**Требование, нарушение которого само по себе проваливает задание: SHA нельзя придумывать.** Каждый SHA обязан быть получен из upstream-репозитория действия и соответствовать указанному тегу. В отчёте привести способ получения — например вывод `gh api repos/actions/checkout/git/ref/tags/v6` или `git ls-remote --tags https://github.com/actions/checkout` — для каждого из пяти действий. Если тег указывает на аннотированный объект, разыменовать до commit SHA.
|
||
|
||
### 2. Автоматическое отслеживание зависимостей
|
||
|
||
`.github/dependabot.yml` с двумя экосистемами:
|
||
|
||
- `github-actions`, каталог `/`, еженедельно — чтобы запиненные SHA не превратились в вечно устаревшие;
|
||
- `nuget`, каталог `/`, еженедельно.
|
||
|
||
Ограничить число одновременно открытых PR разумным значением, чтобы бот не завалил доску.
|
||
|
||
### 3. Сузить права workflow
|
||
|
||
`linux-release.yml` и `windows-release.yml` объявляют `permissions: contents: write` на уровне всего workflow. Право записи нужно только шагу публикации релиза.
|
||
|
||
Перенести `permissions` на уровень job'а публикации; на уровне workflow оставить `contents: read`. Проверить остальные три workflow: если права шире необходимого — сузить, если уже минимальны — оставить и отметить это в отчёте.
|
||
|
||
### 4. `SECURITY.md` в корне
|
||
|
||
Содержательный документ, не заглушка:
|
||
|
||
- канал сообщения об уязвимости — приватный, не публичные issue;
|
||
- ожидаемое время первичного ответа;
|
||
- какие версии поддерживаются: сейчас alpha, поддерживается последний предрелиз;
|
||
- что считается уязвимостью в этом проекте, с опорой на его модель угроз (`docs/security-model.md`): обход разделения ролей, получение root вне typed provisioning, утечка приватных ключей или enrollment-токенов, обход kill switch, подмена артефактов поставки;
|
||
- что уязвимостью не считается: известные и задокументированные ограничения alpha — в частности отсутствие подписи release manifest и отсутствие доверенной подписи Windows MSIX, оба пункта открыты в `docs/roadmap.md`.
|
||
|
||
### 5. `CHANGELOG.md`
|
||
|
||
Формат Keep a Changelog, версии по существующим тегам. Содержание восстанавливать **из git-истории и текстов релизов**, не сочинять.
|
||
|
||
Опубликованные предрелизы: `v0.1.0-alpha.1`, `.2`, `.3`, `.4` (все 16.07.2026), `.5` (17.07.2026).
|
||
|
||
После `v0.1.0-alpha.5` в `main` вошли PR #6–#12 — они попадают в раздел `Unreleased`.
|
||
|
||
### 6. Оформление вклада
|
||
|
||
- `CONTRIBUTING.md`: как собрать, как прогнать тесты, требование прогонять Control suite **на Linux** (часть тестов помечена `OperatingSystem.IsLinux()` и на Windows молча пропускается), один PR — одна тема;
|
||
- `CODEOWNERS`;
|
||
- шаблоны issue (баг, задача) и pull request. В шаблоне PR — обязательный раздел с раздельным перечислением: что проверено локально, что в CI, что не проверялось и почему.
|
||
|
||
### 7. SBOM
|
||
|
||
Генерация SBOM (`dotnet CycloneDX`) и приложение его к артефактам релиза в `linux-release.yml` и `windows-release.yml`.
|
||
|
||
### 8. Удалить слитые ветки
|
||
|
||
На origin остались слитые ветки: `agent/remove-lightweight-server-references`, `codex/ttl-backup-acceptance`. Удалить.
|
||
|
||
**Не трогать** `hermes/release-alpha.6`, `hermes/sprint1-desktop-security`, `hermes/sprint1-server-security`, `hermes/task2-b-link-reconciliation` — их статус не проверен. `docs/product-horizons-and-integration` — открытый PR #13, не трогать.
|
||
|
||
## Границы
|
||
|
||
Задание не касается кода. Категорически не изменять:
|
||
|
||
- `src/ServerMonitorManager.Control/LinkService.cs`, `LinkPolicyApplier.cs`, `LinkReconciliationBackgroundService.cs`, `ControlStore.cs`, `ControlMaintenance.cs`, `ControlOptions.cs`, `appsettings.json`;
|
||
- `src/ServerMonitorManager.Provisioning.Helper/**`, `deploy/ochenstarik-smm-policy-apply`, `deploy/ochenstarik-server-monitor-manager.sh`;
|
||
- `src/ServerMonitorManager.Control/CertificateAuthority.cs`, `CertificateLifecycleService.cs`, `src/ServerMonitorManager.Agent/AgentClient.cs`;
|
||
- `src/ServerMonitorManager.Desktop/**`, `tests/**`.
|
||
|
||
Первые две группы заняты заданием B-3R, третья — заданием по жизненному циклу сертификатов, обе ведутся параллельно.
|
||
|
||
Также не входит в задание:
|
||
|
||
- `Directory.Build.props`, `Directory.Packages.props`, lock-файлы и `TreatWarningsAsErrors` — отдельная задача; включение сейчас сломает незавершённую ветку;
|
||
- изменение логики workflow: шаги, матрицы, условия остаются как есть, меняются только версии действий, права и добавление SBOM;
|
||
- merge собственного PR.
|
||
|
||
## Критерий приёмки
|
||
|
||
- ни одно подключение действия в пяти workflow не ссылается на плавающий тег; все 23 вхождения используют 40-символьный SHA с комментарием-тегом;
|
||
- в отчёте для каждого из пяти действий показано, откуда взят SHA;
|
||
- `dependabot.yml` покрывает `github-actions` и `nuget`;
|
||
- `contents: write` присутствует только на job'ах публикации релиза;
|
||
- `SECURITY.md` содержит канал, сроки, поддерживаемые версии и перечень того, что уязвимостью не считается, со ссылкой на открытые пункты roadmap;
|
||
- `CHANGELOG.md` соответствует реальным тегам и реальной истории; выдуманных записей нет;
|
||
- шаблон PR требует раздельного перечисления локальных проверок, CI и непроверенного;
|
||
- слитые ветки удалены, чужие не тронуты;
|
||
- ни один файл из списка границ не изменён — проверяется `git diff --name-only main`;
|
||
- CI зелёный на PR;
|
||
- PR создан, но не смержен.
|
||
|
||
## Отчётность
|
||
|
||
В описании PR раздельно перечислить:
|
||
|
||
- что запущено локально и с каким результатом;
|
||
- что запущено в CI, со ссылками на прогоны;
|
||
- что не запускалось и почему.
|
||
|
||
Физический acceptance (`SMM_ACCEPT_RESTORE=1 SMM_ACCEPT_REBOOT=1 tests/acceptance/three-server-mesh.sh`) выполнить нельзя — не выданы SSH- и topology-параметры. Contract- и mock-тесты за него не выдавать.
|
||
|
||
Отсутствие проверки — не дефект отчёта. Выдача непроверенного за проверенное — дефект, и он обесценивает весь отчёт.
|