From 98aad7b9855ed6e84e76d3615f550a93e59b2ffd Mon Sep 17 00:00:00 2001 From: bot-backend Date: Mon, 24 Aug 2026 18:59:12 +0300 Subject: [PATCH] =?UTF-8?q?docs(delegation):=20=D0=B1=D1=8E=D0=B4=D0=B6?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BF=D0=B8=D1=88=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B2=20=D0=BF=D1=80=D0=BE=D0=BC=D0=BF=D1=82=20=D1=81=D0=B0?= =?UTF-8?q?=D0=B1=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0,=20=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=B4=D0=B5=D1=80=D0=B6=D0=B8=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B2=20=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Два разведчика без потолка ушли на 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. --- .claude/rules/delegation.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.claude/rules/delegation.md b/.claude/rules/delegation.md index 2483f5a0..1821f007 100644 --- a/.claude/rules/delegation.md +++ b/.claude/rules/delegation.md @@ -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 + +- **Завершившийся прогон ≠ успешный.** Читай `` в уведомлении и `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) -- 2.45.3