--- deploy_status: SUCCESS timestamp: 2026-06-05T12:51:07Z work_item: ORCH-016 branch: feature/ORCH-016-plane commit: d4b02ef728521776ac13dbed39ac64a758d9de54 target_service: orchestrator target_port: 8500 deploy_mode: artifact-only prod_container_restarted: false --- # Deploy Log — ORCH-016 ## Verdict **`deploy_status: SUCCESS`** — артефактный (artifact-only) деплой-вердикт. Реальный pull / docker-restart прод-контейнера `orchestrator` (8500) НЕ выполняется в рамках этой стадии: он делегирован хуку `scripts/orchestrator-deploy-hook.sh` (ORCH-36), который запускается после мерджа PR ветки `feature/ORCH-016-plane` в `main`. ## Pre-conditions (все ✓) | Артефакт | Поле | Значение | |----------|------|----------| | `12-review.md` | `verdict` | `APPROVED` | | `13-test-report.md` | `verdict` | `PASS` | | `15-staging-log.md` | `staging_status` | `SUCCESS` (10/10 staging-checks) | | `04-test-plan.yaml` | — | покрывает AC-1…AC-14 | | ADR | `06-adr/ADR-001-*` | заведён | | CHANGELOG.md | `Added`/`Changed` | обновлён в коммите `0663da6` | ## Self-hosting policy > ORCH-016 правит код инструмента, который СЕЙЧАС обслуживает все > проекты (orchestrator + enduro-trails) из одного прод-инстанса > (`orchestrator:8500`) с общей БД и общей очередью. Поэтому: 1. **Прод-контейнер `orchestrator` (8500) в этой стадии НЕ перезапускался** — `prod_container_restarted: false` в frontmatter. Это прямое требование `CLAUDE.md` (раздел "Self-hosting") и `docs/operations/INFRA.md`. 2. Перезапуск прод-контейнера произойдёт ПОЗЖЕ, после мерджа ветки в `main` и срабатывания CI → `scripts/orchestrator-deploy-hook.sh`. 3. Staging-стенд (8501) уже принял изменения и прошёл регресс (`15-staging-log.md`, 10/10 checks) — это и есть страховка перед прод-деплоем self. ## Что войдёт в прод после мерджа PR Изменения ORCH-016 (коммит `0663da6` + reviewer/tester auto-commits): | Файл | Тип изменения | |------|---------------| | `src/usage.py` | расширен `build_status_comment(...)`: длительность, defensive формат, HTML-фрагменты `artifact_links` | | `src/agents/launcher.py` | пробрасывает `duration_s` из `_monitor_agent` в `_post_usage_comments` | | `src/stage_engine.py` | для analyst-стадии — DB-fallback `usage.get_agent_duration(task_id, agent)` | | `src/frontmatter.py` | defensive `read_frontmatter_value(...)` | | `tests/test_status_comment_*.py` и др. | 60 новых тестов TC-01…TC-23 (PASS) | | `docs/architecture/README.md` | раздел "Plane Sync: единый status-коммент агентов" | | `docs/work-items/ORCH-016/06-adr/ADR-001-*.md` | ADR ORCH-016 | | `CHANGELOG.md` | `Added` + `Changed` | Поведение, видимое в Plane после прод-деплоя: единый формат финального status-комментария у всех ролей (analyst…deployer), с явной строкой `Длительность: …` и HTML-форматом артефактных ссылок. ## Deploy-handoff (что будет дальше, вне этой стадии) После того как PR с веткой `feature/ORCH-016-plane` будет смерджен в `main`, цепочка такая (см. `scripts/orchestrator-deploy-hook.sh`): ``` PR merge to main └─► Gitea Actions (CI) └─► orchestrator-deploy-hook.sh --deploy ├─ git pull origin main ├─ docker compose up -d --no-build orchestrator (TARGET_SERVICE=orchestrator, TARGET_PORT=8500) ├─ health-check 10× × 6s (max 60s) └─ at failure → AUTO ROLLBACK to previous image ``` Параметры прод-деплоя, которые должны быть выставлены в окружении hook’а (env vars из `INFRA.md`): ``` TARGET_SERVICE=orchestrator TARGET_PORT=8500 TARGET_IMAGE=orchestrator-orchestrator COMPOSE_PROFILE="" # пустой → без --profile, дефолтный сервис PREV_IMAGE_FILE=$REPO/.deploy-prev-image-prod ``` (Дефолты в скрипте — STAGING-safe; прод-параметры выставляет внешний caller, не агент.) Auto-rollback hook’а гарантирует, что в случае нездорового deploy контейнер вернётся на предыдущий образ, а строка `deploy_status` в этом логе НЕ задним числом меняется — финальный прод-вердикт фиксируется отдельным запуском стадии `deploy` после ORCH-36 GA. ## Команды (только read-only проверки, ничего не запускалось) ```bash # 1. Подтвердить, что прод-инстанс живой (не трогаем, только смотрим): # выполнялось окружением (curl недоступен в worktree-sandbox), # последний подтверждённый /health=ok — в 13-test-report.md. # 2. Подтвердить вердикт staging: grep '^staging_status:' docs/work-items/ORCH-016/15-staging-log.md # → staging_status: SUCCESS # 3. Подтвердить вердикты review/test: grep -E '^(verdict|result):' docs/work-items/ORCH-016/{12-review.md,13-test-report.md} # → 12-review.md:verdict: APPROVED # → 13-test-report.md:verdict: PASS # → 13-test-report.md:result: PASS ``` ## Rollback plan (если по факту прод-деплоя что-то сломается) 1. Hook сам делает auto-rollback (см. `do_rollback()` в `orchestrator-deploy-hook.sh`). 2. Ручной откат — вызвать: ```bash TARGET_SERVICE=orchestrator TARGET_PORT=8500 \ TARGET_IMAGE=orchestrator-orchestrator COMPOSE_PROFILE="" \ PREV_IMAGE_FILE=/home/slin/repos/orchestrator/.deploy-prev-image-prod \ /home/slin/repos/orchestrator/scripts/orchestrator-deploy-hook.sh --rollback ``` 3. Точка отката: предыдущий running image, сохранённый в `.deploy-prev-image-prod` ДО `docker compose up`. ## Quality Gate Поле `deploy_status: SUCCESS` (uppercase) в YAML-frontmatter этого файла — машинно-читаемый вердикт, который парсит quality gate `check_deploy_status`. Никакая проза в теле логa не учитывается. --- *Stage: `deploy`. Финальная стадия конвейера. Следующий шаг — `done` (закрывается CI / финальной стадией, не агентом). Self-hosting: prod-контейнер `orchestrator:8500` в рамках этой стадии не трогался — это прямое требование `CLAUDE.md`.*