7.8 KiB
7.8 KiB
01 — Business Requirements Document (BRD)
Work Item: ORCH-044 Title: Надёжность запуска агента: preflight ловит auth+битый флаг, --effort фикс Приоритет: Высокий (надёжность конвейера) Автор запроса: Слава, 05.06 («почему перед стартом аналитика не прошла проверка?»)
1. Контекст и инцидент (05.06)
Задача ORCH-17 застряла на стадии Analysis ~30 минут. Аналитик-агент стартовал и
мгновенно «умирал»: run-лог — пустой файл (0 байт), а job в очереди оставался в
состоянии running (вечное зависание без сигнала).
Корневые причины (две, наложились):
claudeNot logged in после ребилда контейнера — токен/сессия не поднялись.- Флаг
--effortв связке с--print --output-format json(CLI 2.1.142) гасил весь stdout — claude завершался с пустым выводом.
Главная системная проблема: preflight-проверка пропустила обе битые задачи в работу — она слепа к авторизации и не ловит «битый флаг → пустой вывод».
2. Проблема (как есть)
- P1. Дыра в preflight (главное).
src/preflight.pyсознательно проверяет только (a)os.path.exists(CLAUDE_BIN)и (b)claude --version(timeout 5s, без токенов). Но--versionотвечает успешно даже когда claude НЕ залогинен (версия — локальная информация). Итог:preflight=ok, а реальный запуск падаетNot logged in. Preflight слеп к авторизации и пропускает заведомо нерабочие задачи в очередь. - P2.
--effortломает вывод. Флаг--effort <low..max>совместно с--print/--output-format jsonв CLI 2.1.142 даёт пустой stdout — агент молча умирает. Сейчас effort отключён в проде хотфиксом (.env:ORCH_AGENT_EFFORT_*=""), но дефолты вsrc/config.pyвсё ещёhigh/medium, а документация (INFRA.md, internals.md, ORCH-41) описывает effort как рабочую фичу. Несоответствие кода/доков/прода. - P3. Пустой лог ≠ провал. Агент с пустым run-логом (0 байт) и
exit 0трактуется как успех (_finalize_job→done, авто-advance стадии) либо вечно виситrunning. Ни watchdog, ни ретрай не срабатывают. Нет сигнала об инциденте.
3. Бизнес-последствия
- Любой сбой авторизации или несовместимости флага → тихое зависание задачи без алерта.
- Блокируется конвейер всех проектов (общий инстанс/очередь, self-hosting) — как было с ORCH-17 (30 мин простоя, ручное вмешательство).
- Деградация доверия к автономности оркестратора: «проверка перед стартом» не работает.
4. Цель
Сделать запуск агента отказоустойчивым по входу и по выходу:
- Preflight ловит отсутствие/протухание авторизации дёшево и без траты токенов до того, как job будет заклеймлен.
- Разобраться с
--effortи привести код/доки/прод к одному непротиворечивому состоянию. - Пустой/невалидный результат запуска трактуется как провал (job →
failed), чтобы сработали watchdog/ретрай и алерт, а не вечное зависание.
5. Заинтересованные стороны
- Owner/Слава — инициатор, требует «проверки перед стартом».
- Все проекты на инстансе (enduro-trails и self-hosting ORCH) — страдают от простоя.
- Агенты конвейера — analyst/architect/... — все запускаются через единый launcher.
6. Объём (Scope)
В объёме:
- Дешёвая token-free проверка авторизации в preflight.
- Расследование и решение по
--effort(вернуть корректно ИЛИ задокументировать как unsupported и убрать из кода/дефолтов/доков). - Детекция «пустой лог / нет валидного result-JSON» как провала job с корректным
переводом в
failedи срабатыванием ретрая/алерта. - Обновление документации (INFRA.md / internals.md / CHANGELOG) в том же PR.
Вне объёма:
- Prompt-ping (ping→pong) — запрещено (жжёт rate limit). Только локальные/дешёвые проверки.
- Реформа circuit breaker / backoff-логики (используем существующие механизмы).
- Изменение схемы стадий/конвейера.
- Автоматический re-login claude (восстановление авторизации) — отдельная задача.
7. Бизнес-правила
- BR-1: Preflight не тратит токены и не делает сетевых вызовов к API модели.
- BR-2: Протухшая/нечитаемая авторизация →
preflight=fail→ job не клеймится (остаётсяqueued), пишется warning, при необходимости — алерт/брейкер. - BR-3: Пустой run-лог ИЛИ отсутствие валидного result-JSON при
exit 0→ jobfailed(никогда неdoneи не вечныйrunning). - BR-4: Никаких
--no-verify/обхода хуков без явного одобрения Owner. - BR-5: Код, дефолты
config.py, прод.envи документация по--effortдолжны быть взаимно непротиворечивы после задачи.
8. Критерии успеха (бизнес-уровень)
- Симуляция «не залогинен» → preflight ловит до клейма, job не стартует впустую.
- Симуляция «пустой лог + exit 0» → job становится
failed, срабатывает ретрай/алерт. - Состояние
--effortоднозначно: либо работает с json-форматом, либо удалён из активного пути и доков (без «мёртвого» флага в дефолтах). - Инцидент класса ORCH-17 больше не приводит к тихому 30-минутному зависанию.
9. Связанные материалы
src/preflight.py,src/queue_worker.py,src/agents/launcher.py,src/config.pydocs/history/LESSONS_ORCH-017.md,docs/history/LESSONS_2026-06-05.md- ORCH-41 (effort/model resolver), ORCH-1 (очередь/resilience), ORCH-7 (watchdog)