Понять, как Orchestrator управляет всем процессом: какие у него состояния, как он принимает решения, как делегирует, как реагирует на сбои. После этой главы вы сможете «по шагам» проследить любую задачу от начала до завершения.
- Состояние (workflow state) — узел жизненного цикла Orchestrator: PLANNING / WAITING_APPROVAL / PLAN_REVIEW / ACTING / REVIEWING / COMPLETE.
- Гейт-событие (gate event) — структурированное сообщение, фиксирующее переход состояния и решение. Контракт:
schemas/orchestrator.gate-event.schema.json. - Делегирование (delegation) — передача задачи subagent-у с явным контрактом и контекстом.
- Approval gate — точка, в которой требуется явное одобрение пользователя.
- Trace ID — UUIDv4, генерируемый при старте задачи и пробрасываемый во все события и делегирования для корреляции логов.
stateDiagram-v2
[*] --> PLANNING
PLANNING --> WAITING_APPROVAL: план готов
WAITING_APPROVAL --> PLAN_REVIEW: пользователь одобрил
PLAN_REVIEW --> ACTING: ревью пройдено
PLAN_REVIEW --> WAITING_APPROVAL: REJECTED / стагнация
PLAN_REVIEW --> PLAN_REVIEW: NEEDS_REVISION (≤max_iterations)
ACTING --> REVIEWING: фаза выполнена
REVIEWING --> WAITING_APPROVAL: фазное одобрение
WAITING_APPROVAL --> ACTING: следующая фаза
WAITING_APPROVAL --> COMPLETE: все фазы готовы
ACTING --> WAITING_APPROVAL: HIGH_RISK_APPROVAL_GATE
COMPLETE --> [*]
Важно: В прампт-описании Orchestrator используется лейбл PLAN_REVIEW, но в wire-формате schemas/orchestrator.gate-event.schema.json это сериализуется через event_type: PHASE_REVIEW_GATE + поля iteration_index / max_iterations. Не путайте: «лейбл состояния в промпте» ≠ «значение workflow_state в схеме».
Из schemas/orchestrator.gate-event.schema.json:
| Event type | Когда |
|---|---|
PLAN_GATE |
Решение о принятии плана к исполнению. |
PREFLECT_GATE |
Pre-action гейт (4 risk-класса). |
PHASE_REVIEW_GATE |
Ревью результата фазы или итерации plan-review. |
HIGH_RISK_APPROVAL_GATE |
Деструктивная операция требует одобрения. |
COMPLETION_GATE |
Финальная сводка. |
Каждое событие содержит как минимум:
event_type— один из enum выше.workflow_state— текущее состояние.decision—GO/REPLAN/ABSTAIN/APPROVED/REJECTED/ …requires_human_approval— boolean.reason— одно предложение.next_action— что произойдёт дальше.trace_id— UUIDv4 для корреляции.iteration_index,max_iterations— для review-loop.
sequenceDiagram
participant U as User
participant O as Orchestrator
participant P as Planner
participant Rev as Reviewers
participant E as Executor
participant CR as CodeReviewer
U->>O: задача / план
O->>O: PLANNING
alt план получен от Planner
O->>O: WAITING_APPROVAL
else расплывчатая задача
O->>P: делегировать планирование
P-->>O: handoff(plan_path)
O->>O: WAITING_APPROVAL
end
U-->>O: approve plan
O->>O: PLAN_REVIEW
par по тиру
O->>Rev: PlanAuditor
O->>Rev: AssumptionVerifier (MEDIUM/LARGE)
O->>Rev: ExecutabilityVerifier (LARGE)
end
Rev-->>O: verdicts
alt approved
O->>O: ACTING
loop по фазам/волнам
O->>E: delegate phase
E-->>O: execution report
O->>CR: review phase
CR-->>O: verdict
O->>O: REVIEWING → WAITING_APPROVAL
U-->>O: approve phase
end
O->>O: COMPLETE
O-->>U: completion summary
else needs revision
O->>P: REPLAN
P-->>O: revised plan
end
Orchestrator делегирует задачу subagent-у через структурированный payload по schemas/orchestrator.delegation-protocol.schema.json. Минимальные поля:
target_agent— имя subagent-а.phase_id,phase_title.executor_agent— должно совпадать с полем фазы из плана.scope— описание задачи.inputs— пути к файлам, контекст.expected_output_schema— какую схему subagent должен вернуть.trace_id,iteration_index— пробрасываются через все payloads для Planner (replan/update) и dispatches внутри цикла ревью для полной корреляции событий.
Правило: Orchestrator делегирует только агентам, перечисленным в plans/project-context.md. Внешние агенты запрещены.
Обязательные точки паузы:
- После одобрения плана — пользователь явно одобряет план до любого исполнения.
- После каждого ревью фазы — verdict CodeReviewer показывается; продолжение только по подтверждению.
- Перед completion — финальная сводка перед коммитом/мерджем.
- Перед HIGH_RISK операциями — деструктивные действия (delete, drop, force push, …).
Batch approval: для многофазных планов одобрение запрашивается раз на волну, а не на фазу. Исключение — фазы с деструктивными операциями требуют per-phase approval.
Перед любым action batch Orchestrator выполняет PreFlect — проверку 4 risk-классов из skills/patterns/preflect-core.md:
- Scope drift — выходим ли мы за рамки текущей фазы?
- Schema/contract drift — нарушим ли контракт?
- Missing evidence — есть ли доказательства, или мы угадываем?
- Safety/destructive — нужна ли подтверждённая высокорисковая авторизация?
Решение: GO / REPLAN / ABSTAIN. «Silent GO with unresolved risk is a contract violation.»
Каждый сбой получает failure_classification. Orchestrator маршрутизирует автоматически (см. главу 13):
| Класс | Действие | Лимит |
|---|---|---|
| transient | Retry той же задачи | 3 |
| fixable | Retry с подсказкой | 1 |
| needs_replan | Замкнуть на Planner для замены фазы | 1 |
| escalate | СТОП → WAITING_APPROVAL → пользователь | 0 |
Reliability policy (из governance/runtime-policy.json):
max_retries_per_phase= 5 кумулятивно.- 3 одинаковых сбоя подряд → эскалация (несмотря на класс).
- ≥2 transient в одной волне → следующая волна с 50% параллелизма.
Если subagent возвращает status: NEEDS_INPUT с clarification_request, Orchestrator не классифицирует это как failure. Маршрут отдельный:
- Извлечь
clarification_request. - Показать варианты пользователю через
vscode/askQuestions. - Дождаться выбора.
- Повторить subagent-задачу с добавленным контекстом.
См. docs/agent-engineering/CLARIFICATION-POLICY.md.
Если в плане у фаз есть поле wave:
- Группируем фазы по wave (по возрастанию).
- Внутри волны — параллельное исполнение (до
max_parallel_agents). - Wave N+1 ждёт окончания всех фаз wave N.
- Если какая-то фаза волны упала — оцениваем через failure classification до перехода.
Эти моменты — запрещено игнорировать:
- После одобрения плана.
- После каждого ревью фазы.
- После completion summary.
Нарушение стоп-правила = пропуск гейта = нарушение контракта.
При любом event Orchestrator может опционально дописывать NDJSON-строку в plans/artifacts/observability/<task-id>.ndjson. См. docs/agent-engineering/OBSERVABILITY.md.
trace_id пробрасывается во все subagent-делегирования, что позволяет корреляцию событий через граф вызовов.
- Считать plan_path = approved. Передача плана от Planner не означает одобрения; PLAN_REVIEW всё равно срабатывает по триггерам.
- Пропускать ревью фазы. CodeReviewer обязателен на всех тирах (включая TRIVIAL).
- Игнорировать
validated_blocking_issues. Только эти блокируют, raw CRITICAL — нет. - Не пробрасывать
trace_id. Без него корреляция невозможна. - Силовое продолжение после ABSTAIN. ABSTAIN — это ABSTAIN. Возвращайтесь к пользователю.
- (новичок) Откройте
schemas/orchestrator.gate-event.schema.jsonи перечислите все возможные значенияevent_type. - (новичок) Найдите в
Orchestrator.agent.mdраздел «Stopping Rules». Сколько обязательных точек паузы? - (средний) Откройте
governance/runtime-policy.json→retry_budgets. Какие лимиты для transient/fixable/needs_replan/escalate? - (средний) В каком случае Orchestrator вызывает
vscode/askQuestionsбез предшествующего NEEDS_INPUT от subagent-а? - (продвинутый) План имеет 6 фаз: 3 в wave 1, 2 в wave 2, 1 в wave 3. Сколько approval-промптов покажет Orchestrator пользователю при batch-режиме?
- Перечислите 5 типов gate-event.
- Что такое trace_id и зачем он нужен?
- Как Orchestrator реагирует на
NEEDS_INPUTот subagent-а? - Что такое wave-aware execution?
- Какие 3 действия требуют немедленной паузы?