Увидеть реальные сценарии взаимодействия агентов end-to-end. Каждый кейс взят из evals/scenarios/ и показывает, как теория из предыдущих глав работает на практике.
Сценарий: evals/scenarios/planner-idea-interview-trigger.json.
Контекст: пользователь даёт расплывчатый запрос: «Сделай систему уведомлений».
Что происходит:
sequenceDiagram
participant U as User
participant P as Planner
participant V as vscode/askQuestions
U->>P: «Сделай систему уведомлений»
P->>P: Step 0 — Idea Interview Gate
P->>P: Detect: вход недостаточно структурный
P->>P: Idea-to-prompt skill applied
P->>V: Ask: канал? (email/SMS/push)<br/>Аудитория? (admin/user/всех)<br/>Триггеры?
V->>U: Show questions
U->>V: Email + user-level + on-order-ship
V-->>P: Answers
P->>P: Step 1+ — Discovery → Plan
Ключевое:
- Planner не угадывает. До шага 1 — interview gate.
vscode/askQuestionsиспользуется прямо Planner-ом (не через Orchestrator).- Без ответов план не пишется (или пишется со status ABSTAIN).
Что бы пошло не так без этого:
- План бы строился под несуществующую гипотезу.
- Расплата дороже на следующих фазах (replan, undo).
Сценарий: evals/scenarios/planner-orchestrator-handoff.json.
Контекст: Planner закончил план. Передаёт Orchestrator-у.
Поток:
sequenceDiagram
participant P as Planner
participant Plan as "plans/TASK-plan.md"
participant O as Orchestrator
participant U as User
P->>Plan: Write final plan with handoff{target_agent: Orchestrator, prompt}
P-->>O: Handoff via plan_path
O->>O: Read plan: complexity_tier, risk_review
O->>O: Evaluate PLAN_REVIEW triggers
Note over O: triggers met?
alt Triggers met
O->>U: Present plan + risk summary, request approval
else No triggers
O->>U: Light approval ("Approve plan?")
end
Ключевое:
- Plan_path — reviewable input, не implicit approval.
- Orchestrator самостоятельно проверяет триггеры PLAN_REVIEW.
complexity_tierиз плана определяет ревью-pipeline.- Handoff prompt содержит инструкции, а не код.
Что бы пошло не так без этого:
- Если бы Orchestrator принимал план «as-is», LARGE-tier план не получил бы Plan Review.
- AssumptionVerifier и ExecutabilityVerifier пропустились бы.
Сценарии: orchestrator-plan-auditor-integration.json + plan-auditor-adversarial-detection.json.
Контекст: Оркестратор отправил план LARGE-тира на ревью. PlanAuditor нашёл BLOCKING-уязвимость.
Поток:
sequenceDiagram
participant O as Orchestrator
participant PA as PlanAuditor
participant AV as AssumptionVerifier
participant EV as ExecutabilityVerifier
participant P as Planner
par
O->>PA: dispatch (plan_path, iter=1, trace_id)
O->>AV: dispatch (plan_path, iter=1, trace_id)
end
PA-->>O: NEEDS_REVISION<br/>findings: SQL injection in /v1/login plan<br/>severity: BLOCKING
AV-->>O: APPROVED<br/>0 mirages
Note over O: PA blocking → don't dispatch EV yet
O->>P: REPLAN with PA findings
P->>P: Add parameterized query, prepared statements
P-->>O: Updated plan (iter=2)
par
O->>PA: dispatch (plan_path, iter=2)
O->>AV: dispatch (plan_path, iter=2)
end
PA-->>O: APPROVED
AV-->>O: APPROVED
O->>EV: dispatch (plan_path)
EV-->>O: PASS
Note over O: Plan APPROVED, exit loop
Ключевое:
- На итерации 1 — PA + AV параллельно.
- ExecutabilityVerifier dispatchится только если PA approved и AV без BLOCKING (закон шага 4 из §4 Plan Review).
- PA не возвращает
transient— её failure всегда содержательный. - Trace_id и iteration_index пробрасываются.
Regression tracking: на итерации 2 PA получает verified items с итерации 1 как контекст. Если что-то ранее verified теперь fails → automatic BLOCKING.
Сценарий: evals/scenarios/executability-verifier-contract.json.
Контекст: PA approved, AV без mirages. Orchestrator dispatchит ExecutabilityVerifier.
Что делает EV:
- Берёт первые 3 задачи из первой фазы плана.
- Для каждой симулирует холодный старт — «я только сейчас читаю задачу, могу ли я её выполнить?».
- Ищет gaps:
- Нет ссылок на файлы.
- Команды без exact strings.
- Неопределённые термины.
- Implicit предположения о состоянии.
Возможные исходы:
- PASS — все 3 задачи executable.
- WARN — мелкие gaps, не критичные.
- FAIL — задача нельзя выполнить без догадок → routing к Planner.
Пример FAIL:
Task: «Update the parser to handle the new format» EV gap: «"new format" не определён, нет ссылки на спецификацию».
После fix плана task становится: «Update src/parser.py to handle CSV with quoted strings per RFC 4180». Теперь PASS.
Сценарий: evals/scenarios/failure-retry.json.
Контекст: CoreImplementer работает над фазой 4. Fails 3 раза подряд по разным причинам.
Поток:
| Attempt | Failure | Classification | Action |
|---|---|---|---|
| 1 | Test timeout | transient |
Retry identical (1/3) |
| 2 | Test passed; lint: undefined variable | fixable |
Retry with hint (1/1) |
| 3 | Lint passed; build fails: missing dependency in package.json | fixable |
Limit reached (1/1 already used) → escalate |
Что произойдёт: Orchestrator транзит в WAITING_APPROVAL и показывает пользователю накопленные findings. Пользователь выбирает: «добавить зависимость вручную» / «переразложить план» / «остановить задачу».
Ключевое: retry-budget на phase = 5, но классовые лимиты ниже. Fixable исчерпался на attempt 3.
Сценарий: evals/scenarios/needs-input-routing.json.
Контекст: UIImplementer обнаружил архитектурную развилку: «использовать React Context или Redux для shared state?».
Поток:
sequenceDiagram
participant UI as UIImplementer
participant O as Orchestrator
participant V as vscode/askQuestions
participant U as User
UI->>UI: Detect architecture fork
UI-->>O: status: NEEDS_INPUT<br/>clarification_request: {...}
O->>O: Detect clarification_request
O->>V: Present options<br/>Option A: Context (pros/cons/files)<br/>Option B: Redux (pros/cons/files)<br/>Recommended: A
V->>U: Show questions
U->>V: Choose A
V-->>O: Selection
O->>UI: Retry with scope: «Use React Context»
UI-->>O: COMPLETE
Ключевое:
NEEDS_INPUT+clarification_request— отдельный routing path, не failure.- Orchestrator не «угадывает» за пользователя.
- UIImplementer даёт рекомендацию, но решение — за пользователем.
Сценарий: evals/scenarios/code-reviewer-final-scope-drift.json.
Контекст: Все фазы COMPLETE. Активирован Final Review Gate (LARGE-tier).
Что делает CodeReviewer (final mode):
- Получает агрегированный
changed_files[]со всех фаз. - Получает
plan_phases_snapshot[]— какие файлы планировались на какой фазе. - Сверяет: какие файлы изменены, но не планировались?
Пример находки:
- Фаза 3 планировала менять
src/auth.py. - Реально изменились:
src/auth.py,src/user.py,src/db.py. - Файлы
user.pyиdb.pyне были в плане → scope drift. - Severity: MAJOR.
Routing fix:
- Высший phase_id, в чьём
files[]встречалсяuser.py, владеет fix-cycle-ом. - Orchestrator dispatchит этого executor-а с targeted scope: «откатить лишнее или дополнить план/тесты».
- Re-run CodeReviewer (final mode) — max 1 fix cycle.
- Если опять blocking — escalate.
CodeReviewer НИКОГДА не делает fix. Только diagnoses.
Любой scenario JSON в evals/scenarios/ имеет:
name— человеко-читаемое имя.description— что демонстрирует.actors— какие агенты участвуют.events[]— последовательность gate-events / handoffs.expected_outcome— что должно случиться.
Прочитать сценарий = понять «правильное» поведение.
- Считать, что сценарий — реальный run. Это фикстура, не лог.
- Игнорировать iteration_index в событиях. Он показывает регрессионную динамику.
- Не сверяться со схемой. Без схемы поля могут быть прочитаны неверно.
- Считать, что Orchestrator может «пропустить» PLAN_REVIEW по своему усмотрению. Нет, триггеры детерминированы.
- (новичок) Откройте
evals/scenarios/planner-orchestrator-handoff.json. Какойcomplexity_tierв сценарии? - (новичок) Откройте
evals/scenarios/failure-retry.json. Сколько retry attempts описано? - (средний) Сравните
plan-auditor-adversarial-detection.jsonсexecutability-verifier-contract.json. Какие severity present у findings? - (средний) Постройте свой mini-сценарий:
MEDIUM-tier план, PA approved на итерации 1, AV нашёл 1 BLOCKING mirage. Что делает Orchestrator? - (продвинутый) Найдите все сценарии, где включён
final_review_gate. Какой % процент?
- Где Planner вызывает
vscode/askQuestions— на каком шаге? - Когда Orchestrator dispatchит EV?
- В чём разница между
NEEDS_INPUTиFAILEDrouting? - Кто owns fix-cycle при final review BLOCKING?
- Что происходит при regression на итерации 2 PA?