# Автопродление 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` и не смешивать с соседними исправлениями.