98 lines
6.8 KiB
Markdown
98 lines
6.8 KiB
Markdown
# Автопродление Agent-сертификата и ротация Control CA
|
||
|
||
- **Кому:** antigravity
|
||
- **Дата:** 2026-09-05
|
||
- **От кого:** владелец проекта через проверяющего `codex`
|
||
- **Ветка:** `antigravity/agent-certificate-lifecycle`
|
||
- **Файл отчёта:** `../done/2026-09-05-agent-certificate-lifecycle.md`
|
||
|
||
## Что нужно сделать
|
||
|
||
Закрыть оставшийся программный критерий certificate lifecycle Горизонта 0:
|
||
|
||
1. Реализовать автоматическое продление сертификата Agent до истечения срока без
|
||
потери накопленных метрик и без повторного использования отозванной identity.
|
||
2. Сделать замену сертификата атомарной: сбой после получения нового материала не
|
||
должен уничтожать рабочий старый сертификат; после успешной замены старый не
|
||
должен продолжать использоваться.
|
||
3. Определить и зафиксировать порог продления, retry/backoff, поведение при
|
||
недоступном Control, при clock skew и при отзыве сертификата.
|
||
4. Документировать операционную ротацию Control CA с rollback/recovery: подготовка,
|
||
распространение trust, переключение, проверка Agent/Operator/Desktop,
|
||
завершение старой CA и действия при частично обновлённом флоте.
|
||
5. Обновить roadmap/horizon status только для критериев, доказанных тестами и
|
||
воспроизводимой процедурой. Не объявлять Горизонт 0 закрытым: физический mesh
|
||
acceptance проверяется отдельным заданием.
|
||
|
||
## Порядок выполнения
|
||
|
||
Это задание начинается после закрытия уже находящихся в твоём inbox задач:
|
||
|
||
1. `2026-08-19-console-behaviour-tests.md`;
|
||
2. `2026-08-19-console-events-throttle.md`;
|
||
3. `2026-08-20-console-node-metrics.md`;
|
||
4. `2026-08-20-reconciliation-poll-interval.md`.
|
||
|
||
По каждой из них нужен отдельный отчёт; объединять их изменения с certificate
|
||
lifecycle в один PR запрещено.
|
||
|
||
### Обязательное обновление локального репозитория перед началом
|
||
|
||
Не начинать certificate lifecycle из текущей рабочей ветки или поверх чужих
|
||
незакоммиченных изменений. Сначала завершить и сдать предыдущую задачу, убедиться,
|
||
что рабочее дерево чистое, затем выполнить:
|
||
|
||
```powershell
|
||
git fetch --all --prune
|
||
git switch main
|
||
git pull --ff-only gitea main
|
||
git switch -c antigravity/agent-certificate-lifecycle
|
||
git status --short --branch
|
||
```
|
||
|
||
Если `git pull --ff-only` не проходит, локальный `main` содержит собственные
|
||
коммиты либо рабочее дерево не чистое — не использовать reset/rebase и не терять
|
||
изменения. Остановиться, записать фактический вывод в отчёт и передать ситуацию
|
||
проверяющему. В отчёте обязательно привести commit SHA актуального `gitea/main`,
|
||
от которого создана рабочая ветка.
|
||
|
||
## Границы
|
||
|
||
Допустимы Agent, Control, Core, относящиеся к lifecycle тесты и документация
|
||
ротации CA. Не менять web console, Links, provisioning actions, `deploy/**`,
|
||
release workflows, MSIX version и release-status переводы. Доверенная подпись
|
||
MSIX и физическая three-server приёмка — отдельные работы.
|
||
|
||
Не ослаблять mTLS, revocation, CSR ownership, срок одноразовых token или проверки
|
||
привязки Node identity. Не добавлять silent fallback на недоверенный сертификат.
|
||
|
||
## Как проверить результат
|
||
|
||
Обязательные доказательства в отчёте:
|
||
|
||
- `dotnet build ServerMonitorManager.slnx --configuration Release` — фактический
|
||
вывод, ошибок 0;
|
||
- полный `dotnet test` Control-набора — все тесты зелёные;
|
||
- тесты: продление при остатке менее порога; отсутствие продления выше порога;
|
||
Control недоступен — старый валидный сертификат продолжает работать и метрики
|
||
сохраняются; revoked certificate не продлевается; mismatch `node_id` отвергается;
|
||
прерванная атомарная замена сохраняет рабочий сертификат; повтор запроса
|
||
идемпотентен либо явно безопасен;
|
||
- каждый новый тест показать зелёным на исправном коде и красным на намеренно
|
||
сломанном соответствующем поведении;
|
||
- отдельная репетиция процедуры CA rotation на disposable Control + минимум одном
|
||
Agent: команды, фактические fingerprints/chain results до и после, reconnect и
|
||
rollback. Если полноценная dual-trust схема ещё не реализуема, не отмечать
|
||
критерий выполненным, а вернуть точный блокер и минимальное следующее задание;
|
||
- ссылки на зелёные CI-прогоны PR.
|
||
|
||
## Контекст и ограничения
|
||
|
||
Источник требований: `docs/product-horizons.md`, Горизонт 0, и
|
||
`docs/roadmap.md`, этап 14. В репозитории уже есть
|
||
`CertificateLifecycleTests`; существование тестов не доказывает наличие полного
|
||
runtime lifecycle — необходимо проследить фактический Agent path от определения
|
||
срока до атомарного переключения сохранённого PFX.
|
||
|
||
Приёмку выполняет `codex`. Не пушить в `main` и не смешивать с соседними
|
||
исправлениями.
|