architect(ET): auto-commit from architect run_id=190
All checks were successful
CI / test (push) Successful in 18s
All checks were successful
CI / test (push) Successful in 18s
This commit is contained in:
@@ -52,6 +52,34 @@ created → analysis → architecture → development → review → testing →
|
||||
|
||||
Подробнее: [adr-0006](adr/adr-0006-merge-gate.md), детально — `docs/work-items/ORCH-043/06-adr/ADR-001-merge-gate.md`.
|
||||
|
||||
### Исполняемый самодеплой стадии `deploy` (ORCH-36)
|
||||
`deploy` перестаёт быть «бумажной»: для self-hosting (`is_self_hosting_repo`) стадия
|
||||
РЕАЛЬНО деплоит прод (8500) через хост-хук `scripts/orchestrator-deploy-hook.sh`,
|
||||
а `deploy_status: SUCCESS` означает доказанный health-ok, не декларацию LLM. Три фазы
|
||||
(детерминированно, без LLM в критическом пути self-restart):
|
||||
- **Фаза A (вход в `deploy`)** — при `deploy_require_manual_approve=true` вместо запуска
|
||||
прод-deployer выставляется approval-pending статус Plane + запрос approve
|
||||
(Plane-коммент + Telegram). Перехват в `advance_stage` ПОСЛЕ `check_staging_status`
|
||||
и merge-gate.
|
||||
- **Фаза B (Plane → `Approved`)** — `advance_stage(deploy, finished_agent=None)`
|
||||
запускает **detached host-процесс** (ssh + setsid → хук с прод-параметрами +
|
||||
build-once retag `SOURCE_IMAGE`) и ставит детерминированный **finalizer-job**;
|
||||
маркер `initiated` — идемпотентность. Возврат БЕЗ advance (вердикта ещё нет).
|
||||
- **Фаза C (finalizer)** — новый контейнер после рестарта читает sentinel `result`
|
||||
(exit-code хука), маппит `0→SUCCESS / иначе→FAILED`, пишет `14-deploy-log.md`,
|
||||
вызывает `advance_stage(deploy, finished_agent="deployer")` → существующие контракты:
|
||||
`SUCCESS → done`, `FAILED → откат БАГ-8 на development`.
|
||||
|
||||
Approve = смена статуса Plane на `Approved` (status-only verdict model; комментарии
|
||||
не управляют конвейером). На старте — обязательный ручной approve (флаг `true`); полный
|
||||
авто — отдельная задача (ORCH-54). Условность как ORCH-35: реально для `orchestrator`,
|
||||
прочие репо — прежний синхронный ssh-деплой агентом. Контракты не меняются:
|
||||
`STAGE_TRANSITIONS`, реестр QG, `check_deploy_status`/`_parse_deploy_status`, БАГ-8,
|
||||
terminal-sync, merge-gate, exit-code-контракт хука. Restart-safe состояние —
|
||||
sentinel-файлы (`<repos_dir>/.deploy-state-<repo>/<wi>/`), без миграции БД.
|
||||
Подробнее: [adr-0007](adr/adr-0007-executable-self-deploy.md), детально —
|
||||
`docs/work-items/ORCH-036/06-adr/ADR-001-executable-self-deploy.md`.
|
||||
|
||||
## Откаты
|
||||
- Reviewer REQUEST_CHANGES → откат на `development` + retry (`MAX_DEVELOPER_RETRIES = 3`).
|
||||
- Tester `check_tests_passed` FAIL → откат на `development` + retry.
|
||||
@@ -109,4 +137,4 @@ created → analysis → architecture → development → review → testing →
|
||||
Схема БД, потоки данных, resilience-слой, детали Dockerfile — [internals.md](internals.md).
|
||||
|
||||
---
|
||||
*Актуально на 2026-06-06. Обновлять при изменении src/stages.py, src/qg/checks.py, src/main.py. ORCH-043: merge-gate — design (см. adr-0006), реализация в ветке feature/ORCH-043.*
|
||||
*Актуально на 2026-06-06. Обновлять при изменении src/stages.py, src/qg/checks.py, src/main.py. ORCH-043: merge-gate — design (см. adr-0006), реализация в ветке feature/ORCH-043. ORCH-036: исполняемый самодеплой стадии `deploy` — design (см. adr-0007), реализация в ветке feature/ORCH-036.*
|
||||
|
||||
64
docs/architecture/adr/adr-0007-executable-self-deploy.md
Normal file
64
docs/architecture/adr/adr-0007-executable-self-deploy.md
Normal file
@@ -0,0 +1,64 @@
|
||||
# ADR-0007: Исполняемый самодеплой стадии `deploy` (Вариант B, ORCH-36)
|
||||
|
||||
## Статус
|
||||
Accepted (design) — реализация в ветке `feature/ORCH-036`.
|
||||
|
||||
## Контекст
|
||||
Стадия `deploy` была «бумажной»: deployer-агент писал `deploy_status:` в
|
||||
`14-deploy-log.md`, гейт `check_deploy_status` парсил вердикт и двигал
|
||||
`deploy → done`. Реального деплоя не было. ORCH-36 делает стадию исполняемой для
|
||||
self-hosting (`orchestrator`), сохраняя прежний ssh-путь для остальных репо.
|
||||
|
||||
Три ограничения формируют дизайн (детально — `docs/work-items/ORCH-036/06-adr/ADR-001`):
|
||||
1. **Self-restart**: рестарт прод-контейнера 8500 убивает in-container процесс →
|
||||
рестарт делает ВНЕШНИЙ host-процесс.
|
||||
2. **Status-only verdict model**: approve = смена статуса Plane на `Approved`
|
||||
(комментарии не управляют конвейером).
|
||||
3. **Гонка гейта**: вердикт нельзя читать до завершения асинхронного хука.
|
||||
|
||||
## Решение
|
||||
Для self-hosting стадия `deploy` исполняется в три фазы детерминированным кодом
|
||||
(без LLM в критическом пути self-restart):
|
||||
|
||||
- **Фаза A (вход в `deploy`)** — для self + `deploy_require_manual_approve=true`
|
||||
вместо запуска прод-deployer выставляется approval-pending статус Plane + запрос
|
||||
approve (Plane-коммент + Telegram). Перехват в `advance_stage` на ребре
|
||||
`deploy-staging → deploy` (после `check_staging_status` и merge-gate).
|
||||
- **Фаза B (Plane → Approved)** — `advance_stage(deploy, finished_agent=None)`
|
||||
запускает **detached host-процесс** (ssh + setsid → `orchestrator-deploy-hook.sh`
|
||||
с прод-параметрами и build-once retag) и ставит **детерминированный finalizer-job**
|
||||
с задержкой; маркер `initiated` — идемпотентность. Возврат БЕЗ advance.
|
||||
- **Фаза C (finalizer)** — после рестарта новый контейнер дочитывает sentinel
|
||||
`result` (exit-code хука), маппит `0→SUCCESS / иначе→FAILED`, пишет
|
||||
`14-deploy-log.md`, вызывает `advance_stage(deploy, finished_agent="deployer")`
|
||||
→ существующие контракты: `SUCCESS → done`, `FAILED → откат БАГ-8 на development`.
|
||||
|
||||
### Ключевые инварианты (НЕ меняются)
|
||||
`STAGE_TRANSITIONS`, реестр QG, `check_deploy_status` / `_parse_deploy_status`
|
||||
(frontmatter only), откат БАГ-8, terminal-sync `deploy → done`, merge-gate (ORCH-43),
|
||||
exit-code-контракт хука (0/1/2).
|
||||
|
||||
### Новое (сквозное)
|
||||
- **Детерминированный job-kind** `deploy-finalizer` в очереди (reserved-agent, не
|
||||
LLM): read-result | defer | map+write+advance. Зеркалит детерминизм merge-gate.
|
||||
- **Approve-флаг** `deploy_require_manual_approve` (дефолт `true`; полный авто —
|
||||
отдельная задача после набора метрик доверия, ORCH-54).
|
||||
- **Build-once**: опциональный `SOURCE_IMAGE` retag в хуке (обратно совместимо).
|
||||
- **Restart-safe состояние** деплоя — sentinel-файлы под
|
||||
`<repos_dir>/.deploy-state-<repo>/<wi>/` (как merge-lease), БЕЗ миграции БД.
|
||||
|
||||
### Условность
|
||||
Вся логика — только для `is_self_hosting_repo(repo)` (как ORCH-35). Прочие репо
|
||||
деплоятся прежним синхронным ssh-путём агентом.
|
||||
|
||||
## Последствия
|
||||
- `deploy_status: SUCCESS` доказан реальным health-ok; критический путь self-restart
|
||||
детерминирован.
|
||||
- Вводится новая под-компонента (finalizer job-handler) → изменение помечено
|
||||
`arch:major-change`.
|
||||
- Approve вписан в status-only модель: restart-safe, аудируемо, идемпотентно.
|
||||
- На старте — обязательный ручной approve; молчаливых деплоев нет (Plane+Telegram).
|
||||
|
||||
## Связанные ADR
|
||||
`adr-0003` (staging-gate), `adr-0006` (merge-gate), `adr-0005` (run-as-host-uid).
|
||||
Детальный per-work-item: `docs/work-items/ORCH-036/06-adr/ADR-001-executable-self-deploy.md`.
|
||||
Reference in New Issue
Block a user