docs(delegation): бюджет пишется в промпт сабагента, а не держится в голове
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped

Два разведчика без потолка ушли на 157 и 178 ходов вместо инвентаризации:
один вместо списка веток диффал SQL-миграции и разбирал Caddyfile. Третий
собрал 17 739 байт в один StructuredOutput, получил InputValidationError и
потерял всю работу целиком.

Канон уже говорил «~≤20 tool-calls» и «границы: что НЕ делать» — но как
ориентир для оркестратора. Агент этого не видит: лимит, оставшийся в голове
вызывающего, не ограничивает никого. Отсюда правка — бюджет обязан быть
текстом внутри промпта, вместе со списком запрещённого и правилом деградации
«отдай что есть, допиши в notes что не успел».

Отдельным пунктом — потолок РАЗМЕРА структурированного ответа. Он не следует
из лимита токенов: payload больше ~10k символов не парсится, повтор, и работа
теряется. Схему надо проектировать под краткость, длинные detail-поля
провоцируют ровно этот отказ.

Новая секция «Целость результата workflow»: завершившийся прогон не значит
успешный — упавшие агенты возвращают null, parallel() их молча проглатывает,
а синтез всё равно пишет уверенный текст с числами. Плюс восстановление через
resumeFromRunId, диагностика зависшего агента по возрасту записи в
agent-*.jsonl, и грабля Windows: перезапись скрипта через python даёт CRLF,
запуск отбивается на control characters.
This commit is contained in:
bot-backend 2026-08-24 18:59:12 +03:00
parent 9810ae350f
commit 98aad7b985

View file

@ -20,6 +20,9 @@
Эмпирика 2026-06-27: агент-аудитор на 186k tok / 33 calls упал на StructuredOutput; 5 мелких параллельных прошли.
- Поверхность больше бюджета → **дели на N узких сабагентов** (parallel при непересекающихся файлах, sequential при зависимостях). НЕ один большой.
- Промпт сабагенту: конкретный deliverable + формат ответа + границы («что НЕ делать»). Расплывчатый scope = дубли и мусор.
- **Бюджет живёт В ПРОМПТЕ, а не в голове оркестратора.** Знать лимит недостаточно — агент его не видит. Пиши в промпт явно: потолок вызовов (~20-25) и времени, список «строго запрещено» (типично: не читать исходники приложения, не ходить в git-историю, не диффать смежное), правило деградации «бюджет кончается → отдай что есть, допиши в notes что не успел».
Эмпирика 2026-08-24: два разведчика без потолка ушли на 157 и 178 ходов вместо инвентаризации — один вместо списка веток диффал SQL-миграции и разбирал Caddyfile.
- **`schema:` требует потолка РАЗМЕРА ответа, отдельно от токенов.** Payload `StructuredOutput` >~10k символов не парсится (`InputValidationError`) → повтор → вся работа агента теряется. В промпт: максимум N items, лимит символов на поле, весь ответ ≤~6000 символов, и прямым текстом «неполный ответ несравнимо лучше потерянного». Схему проектируй под краткость: длинные `detail`-поля провоцируют ровно этот отказ.
- Windows: очень длинный промпт субагенту может упасть на лимите командной строки (~8191 символ) — ещё один довод за компактность.
## Эскалация oversized-задачи (worker)
@ -28,6 +31,13 @@ Issue/задача выглядит больше одного захода (эв
- bot-pipeline: комментарий с планом сплита + label `status/needs-analysis`, снять claim
- interactive: вернуть main-сессии план сплита вместо результата
## Целость результата workflow
- **Завершившийся прогон ≠ успешный.** Читай `<failures>` в уведомлении и `journal.jsonl` (по строке `result` на агента). Упавшие агенты возвращают `null`, `parallel()` их молча проглатывает, а стадия синтеза всё равно выдаёт уверенный текст с числами. Прежде чем показывать такой вердикт пользователю — проверь его несущие числа сам.
- **Восстановление:** `TaskStop``Workflow({scriptPath, resumeFromRunId})`. Готовые агенты реплеятся из кэша бесплатно, перезапускаются только упавшие. Правка промпта перезапускает ЭТОТ агент и все последующие (правило префикса) — правь точечно, не переписывай скрипт целиком.
- **Диагностика зависшего агента:** возраст последней записи в `agent-*.jsonl` + тип последнего события. `assistant/tool_use` без ответа при неподвижном журнале = завис. Несколько агентов замолчали одновременно = обрыв соединения, обычно лечится сам повтором — не спеши убивать.
- **Windows: скрипт workflow писать только в LF.** Перезапись через python даёт CRLF → запуск отбивается `script contains control characters`. `io.open(..., 'w', newline='\n')`.
## Единые пороги дробления (analyst / main)
- Estimate S(<2h) / M(2-8h) / **L(>8h) → обязан дробиться дальше** (до S/M)