6.4 KiB
type, work_item_id, verdict, version
| type | work_item_id | verdict | version |
|---|---|---|---|
| review | ORCH-036 | REQUEST_CHANGES | 1 |
Review ORCH-036 — Исполняемый самодеплой стадии deploy (Вариант B)
Summary
Реализация трёхфазного исполняемого самодеплоя (src/self_deploy.py + перехваты
Фаз A/B/C в src/stage_engine.py, reserved-agent deploy-finalizer в
src/agents/launcher.py, build-once SOURCE_IMAGE в хуке) — архитектурно
соответствует ADR-001 и закрывает большинство критериев приёмки. Код аккуратный,
defensive (never-raise), 566/566 тестов зелёные, контракты STAGE_TRANSITIONS /
_parse_deploy_status / БАГ-8 / merge-gate не тронуты, условность по репо
(self_deploy_applies) корректна, документация (deployer.md, INFRA.md,
DEPLOY_HOOK.md, CHANGELOG, ADR-001 + глобальный adr-0007, README) обновлена
содержательно.
Однако обнаружены два P1, блокирующие приёмку: (1) sentinel-маркеры не
очищаются на откате → повторный прод-деплой после фикса невозможен (конвейер
зависает на deploy); (2) не обновлён канонический .env.example вопреки прямому
требованию ТЗ §2.6 и правилу CLAUDE.md №8.
Findings
P0 — Blocker
- (нет)
P1 — Must fix
-
Stale deploy-state маркеры ломают re-deploy после отката (
src/stage_engine.py,src/self_deploy.py). Маркерыinitiated/result/approve-requestedлежат под<repos_dir>/.deploy-state-<repo>/<work_item_id>/и ключуются по work_item_id, который стабилен на всю жизнь задачи. БАГ-8 откат (_handle_qg_failure_rollbacks, веткаdeployer+check_deploy_status, строки 620–647) НЕ удаляет эти маркеры, и нигде вsrc/нет их очистки (проверено grep'ом). Сценарий: deploy FAILED → откат на development → developer чинит → задача снова доходит доdeploy→ человек ставит Approved → Фаза B (_handle_self_deploy_phase_b) видит существующийinitiated(от первой попытки) → возвращаетself-deploy-already-initiatedno-op, detached-хук НЕ запускается, finalizer НЕ ставится. Задача навсегда зависает наdeploy, ожидая approve, который ничего не делает. Дополнительно: устаревшийresult(FAILED exit от первой попытки) тоже остаётся и был бы прочитан новым finalizer'ом. Это ломает retry-контракт самой стадии для self-hosting-репо — ровно тот класс, под который сделана фича (AC-4 работает только на ПЕРВЫЙ провал; AC-10 «БАГ-8 rollback+retry не сломан» нарушается на втором проходе). Нужно очищать маркеры (initiated,result,approve-requested) на откатеdeploy → development(и/или в начале Фазы B/Фазы A для нового прохода), плюс тест на сценарий FAILED → rollback → повторный deploy. -
.env.exampleне обновлён (/.env.example). ТЗ §2.6 прямо требует: «Прописать дескрипторы в.env.example», CLAUDE.md правило №8 объявляет.env.exampleканоном env-конфигурации, а предыдущая задача ORCH-043 (merge-gate) задала прецедент — добавила своиORCH_MERGE_*именно туда с описаниями. ORCH-036 ввёл ~14 новых настроек вsrc/config.py(self_deploy_enabled,self_deploy_repos,deploy_require_manual_approve,deploy_ssh_user/host,deploy_hook_script,deploy_host_repo_path,deploy_prod_*,deploy_finalize_delay_s/max_attempts) и задокументировал их в таблице INFRA.md, но в.env.exampleони отсутствуют полностью. Оператор, поднимающий сервис по канону.env.example, не узнает про обязательныйORCH_DEPLOY_SSH_HOST(дефолт пустой → detached-деплой не запустится). Добавить блокORCH_SELF_DEPLOY_*/ORCH_DEPLOY_*с дескрипторами по образцу merge-gate (значения — плейсхолдеры, секреты не коммитить).
P2 — Should fix
- (опц.) INFRA.md обновлён в части env-карты, но пошаговой процедуры «approve → прод-деплой через хук» в INFRA нет (есть в deployer.md и DEPLOY_HOOK.md). Желательно дать короткую сквозную процедуру оператору в одном месте. Не блокирует.
Документация
Обновлена содержательно и в том же PR: .openclaw/agents/deployer.md (стадия
deploy = вызов хука, явный запрет self-restart 8500), docs/operations/INFRA.md
(env-карта новых настроек), docs/operations/DEPLOY_HOOK.md (SOURCE_IMAGE
build-once + прод-пример), docs/architecture/README.md (раздел про исполняемый
самодеплой), CHANGELOG.md (детальная запись), ADR-001 в 06-adr/ + глобальный
docs/architecture/adr/adr-0007-executable-self-deploy.md.
Пробел (см. P1): .env.example — канонический шаблон env по CLAUDE.md №8 и
прямое требование ТЗ §2.6 — НЕ обновлён новыми ORCH_DEPLOY_* / ORCH_SELF_DEPLOY_*.
Это и есть основание держать вердикт REQUEST_CHANGES по оси документации, в
дополнение к функциональному P1 по очистке маркеров.