Multi-Agent Harness Design
Источники:
- Anthropic Engineering — "Harness design for long-running apps"
- OpenClaw-RL paper (arxiv 2603.10165) — personal agent verification
- DenisSergeevitch/repo-task-proof-loop — execution protocol with durable proof
См. также: references/proof-loop-research.md — детали paper + repo mapping
Когда нужен harness, а когда хватит solo agent
| Сигнал |
Solo agent |
Harness |
| Scope |
Одна фича, bug fix, refactor |
Full-stack app, multi-feature product |
| Длительность |
Bounded work with direct evidence |
Work that needs durable state, resumes, or independent evaluation |
| Качество |
Baseline достаточно |
Нужен polish, originality, craft |
| Стоимость |
В рамках явного бюджета задачи |
Бюджет и stop condition фиксируются для этой задачи |
| Проверка |
Прямой task-appropriate proof |
Независимая проверка и runtime proof, если требуются контрактом |
Правило: Evaluator оправдан когда задача за пределами reliable solo performance. Не фиксированное yes/no — зависит от complexity tier.
Архитектура: Three-Agent System
1. Planner (Планировщик)
- Превращает запрос пользователя в детальную, проверяемую спецификацию
- Сохраняет утверждённый scope, явные non-goals и существующие границы продукта
- Не добавляет AI-фичи, миграции стека или новые deliverables без запроса пользователя либо подтверждённой причинной необходимости
- НЕ over-specify реализацию — только what, не how
- Если AI-фичи уже входят в утверждённый scope, вписывает их в продукт органично
2. Generator (Генератор)
- Реализует фичи итеративно
- Включает self-evaluation перед handoff (но она ненадёжна — см. ниже)
- Работает в рамках Sprint Contract
3. Evaluator (Оценщик)
- Независимый от генератора — отдельный контекст, отдельный промпт
- Выбирает проверку по acceptance contract: unit/integration/runtime probe для сервисов, browser/UI проверку только для затронутого пользовательского пути
- Откалиброван через few-shot примеры
- Ловит то, что self-evaluation пропускает
Sprint Contract Pattern
Перед каждой итерацией:
1. Planner определяет фичу и user story
2. Generator и Evaluator ДОГОВАРИВАЮТСЯ о:
- Что значит "done" для этой фичи
- Конкретные testable success criteria
- Что НЕ входит в scope
3. Generator реализует
4. Evaluator валидирует по контракту
5. Если конкретный критерий не пройден → конкретный feedback → повтор с п.3 только для этого критерия
Контракт = мост между user stories и implementation. Без него evaluator судит по своим критериям, generator не знает что проверять.
Останавливай цикл, когда все утверждённые criteria имеют требуемое доказательство. Не назначай число раундов заранее; продолжай только при наблюдаемом незакрытом критерии или новом опровергающем evidence.
Generator-Evaluator: Почему раздельно
Self-evaluation bias
Модели уверенно хвалят свою работу — даже когда качество посредственное. Это не баг модели, а свойство: генератор оптимизирован на producing, не на judging.
Решение: Independent evaluator
- Другой system prompt с calibrated skepticism
- Few-shot примеры с детальными score breakdowns
- Проверяет исполнимую поверхность acceptance contract: browser только для затронутого UI journey; native/API/worker задачи — их unit, integration, CLI или runtime probe, а не browser по умолчанию
- Конкретные failure criteria, а не общие "looks good"
Калибровка оценщика (QA Tuning Loop)
1. Evaluator выдаёт оценку
2. Ты проверяешь: согласен ли с оценкой?
3. Расхождение → обновляешь QA промпт
4. Типичные проблемы:
- Superficial testing, пропускает edge cases
- Premature approval посредственной работы
- Слишком строгие критерии → бесконечные итерации
5. Повторяешь пока evaluator judgment ≈ твой judgment
Quality Criteria Framework (для фронтенда)
4 измерения, каждое 0-10:
1. Design Quality — Целостность
Дизайн ощущается как единое целое, а не коллекция частей?
- Интеграция color, typography, layout, imagery
- Consistent visual language
2. Originality — Уникальность
Штраф за:
- Template layouts, library defaults
- AI slop patterns: purple gradients over white cards
- "Telltale signs of AI generation"
- Cookie-cutter структуры
3. Craft — Техническое мастерство
- Typography hierarchy
- Spacing consistency
- Color harmony, contrast ratios
- Pixel-perfect alignment
4. Functionality — Работоспособность
Пользователь завершает задачу без угадывания?
- Все интерактивные элементы работают
- Нет stub features
- Error states обработаны
Влияние формулировок на генерацию
Фразы в criteria прямо влияют на вывод генератора:
- "museum quality" → visual convergence к одному стилю
- "best designs" → перфекционизм за счёт creativity
- Тестируй формулировки — они стируют модель ДО оценки
Контекст-менеджмент
Context Degradation
Модели теряют coherence по мере заполнения context window.
Context reset > Compaction:
- Compaction сохраняет continuity, но не даёт чистый лист
- Reset + structured handoff artifact = лучший баланс
- Handoff artifact = документ с state, decisions, progress
Context Anxiety
Модели могут сворачивать работу раньше времени из-за роста контекста.
- Решение: clean context resets, когда они уменьшают риск потери важных ограничений
Structured Handoff
При context reset передавать:
- Что уже сделано (с конкретными файлами/строками)
- Какие решения приняты и почему
- Что осталось сделать
- Текущие проблемы и blockers
- Sprint contract для текущей итерации
Assumption Testing
"Every component in a harness encodes an assumption about what the model can't do on its own"
Принцип: предположения устаревают
- Возможности моделей меняются, поэтому необходимость каждого harness-компонента должна подтверждаться наблюдаемым риском
- Стратегия: при наличии безопасного измеримого эксперимента убирать компоненты по одному, измерять влияние и откатывать ухудшение
Simplification Loop
1. Текущий harness работает? Да →
2. Убери один компонент (напр. sprint decomposition)
3. Качество упало? Да → верни. Нет →
4. Повтори с другим компонентом
5. Остановись на минимальном harness для текущей задачи
Реальные failure modes (пойманные evaluator'ом)
- Rectangle fill tool ставит тайлы только на endpoints drag, вместо заполнения области
- Delete key handler требует два условия, когда нужно одно
- FastAPI route matching: "reorder" матчится как integer frame_id
- Audio recording: stub без mic capture
- Missing clip resize/split operations
- Effect visualizations как числовые слайдеры вместо графики
- Display-only features без интерактивности
- Missing instrument panels
- Unimplemented recording functionality
Инструментарий
Claude Agent SDK
- Handles agent orchestration + compaction автоматически
- Manages context growth across long sessions
- Рекомендуемый стек для production harnesses
Проверочные инструменты
- Для UI: browser automation и screenshots проверяют реальный затронутый user journey
- Для API, очередей и данных: contract/integration tests, health/runtime probes и проверка нужных persistent states
- Используй инструменты, уже поддержанные проектом; не меняй стек ради соответствия этой skill
Иллюстративные технологии
React/Vite, Nuxt/Vue, FastAPI/Fastify, SQLite/PostgreSQL и Playwright — примеры веб-проектов на момент написания, а не default, требование или инструкция к миграции. Выбирай технологии по существующей архитектуре, пользовательскому запросу и текущей документации.
Gotchas
- Language shapes output: формулировки в criteria сдвигают генератор ДО обратной связи от оценщика. "Museum quality" → convergence, "experimental" → divergence
- Не обосновывай продолжение цикла номером итерации: новая итерация нужна только при незакрытом criterion или новом evidence
- Cost/time figures are dated examples, not gates: если бюджет нужен, согласуй task-specific limit и не понижай acceptance ради формального PASS
- Evaluator may need tuning: меняй QA prompt только в ответ на конкретный false positive/negative и повторно проверяй затронутый criterion
- Self-evaluation is seductive: генератор БУДЕТ говорить "всё отлично" — не верь, проверяй через independent evaluator
Troubleshooting
| Симптом |
Причина |
Решение |
| Evaluator всё одобряет |
Промпт слишком мягкий |
Добавь few-shot с detailed score breakdowns, конкретные failure criteria |
| Generator не улучшается |
Feedback слишком абстрактный |
Evaluator должен давать конкретные файлы/строки/проблемы |
| Бесконечные итерации |
Criteria невыполнимы или feedback не связан с ними |
Пересмотри контракт; сохраняй требуемую safety/runtime планку, а несовместимый scope split только с явным решением пользователя |
| Context degradation |
Длинная сессия без reset |
Structured handoff + clean context reset |
| Все итерации выглядят одинаково |
Criteria слишком узкие |
Расширь пространство, убери "museum quality" формулировки |
| Evaluator ловит мелочи, пропускает крупное |
Wrong priority в промпте |
Restructure: critical → high → medium → cosmetic |
1---2name: harness-design3description: Design a scoped multi-agent harness for a requested long-running AI workflow. Preserve the user-approved product boundary while using Generator-Evaluator separation, testable sprint contracts, context management, and task-appropriate validation. Based on Anthropic Engineering patterns. Use when: "build a harness", "multi-agent architecture", "agent orchestration", "generator-evaluator", "long-running app", "harness design", "agent pipeline", "quality evaluation loop", "sprint contract", "build app with agents", "Claude Agent SDK architecture", or when building complex full-stack apps that need planning → generation → evaluation cycles. Also use when discussing context degradation, self-evaluation bias, or assumption testing in AI workflows. Do NOT use to stress-test or critique an already-written plan document; use plan-swarm-review for that (this skill designs the harness, it does not review plans).4---56# Multi-Agent Harness Design78Источники:9- Anthropic Engineering — "Harness design for long-running apps"10- OpenClaw-RL paper (arxiv 2603.10165) — personal agent verification11- DenisSergeevitch/repo-task-proof-loop — execution protocol with durable proof1213См. также: `references/proof-loop-research.md` — детали paper + repo mapping1415## Когда нужен harness, а когда хватит solo agent1617| Сигнал | Solo agent | Harness |18|--------|-----------|---------|19| Scope | Одна фича, bug fix, refactor | Full-stack app, multi-feature product |20| Длительность | Bounded work with direct evidence | Work that needs durable state, resumes, or independent evaluation |21| Качество | Baseline достаточно | Нужен polish, originality, craft |22| Стоимость | В рамках явного бюджета задачи | Бюджет и stop condition фиксируются для этой задачи |23| Проверка | Прямой task-appropriate proof | Независимая проверка и runtime proof, если требуются контрактом |2425**Правило:** Evaluator оправдан когда задача **за пределами reliable solo performance**. Не фиксированное yes/no — зависит от complexity tier.2627---2829## Архитектура: Three-Agent System3031### 1. Planner (Планировщик)32- Превращает запрос пользователя в **детальную, проверяемую спецификацию**33- Сохраняет утверждённый scope, явные non-goals и существующие границы продукта34- Не добавляет AI-фичи, миграции стека или новые deliverables без запроса пользователя либо подтверждённой причинной необходимости35- **НЕ** over-specify реализацию — только what, не how36- Если AI-фичи уже входят в утверждённый scope, вписывает их в продукт органично3738### 2. Generator (Генератор)39- Реализует фичи итеративно40- Включает **self-evaluation** перед handoff (но она ненадёжна — см. ниже)41- Работает в рамках Sprint Contract4243### 3. Evaluator (Оценщик)44- **Независимый** от генератора — отдельный контекст, отдельный промпт45- Выбирает проверку по acceptance contract: unit/integration/runtime probe для сервисов, browser/UI проверку только для затронутого пользовательского пути46- Откалиброван через few-shot примеры47- Ловит то, что self-evaluation пропускает4849---5051## Sprint Contract Pattern5253Перед каждой итерацией:5455```561. Planner определяет фичу и user story572. Generator и Evaluator ДОГОВАРИВАЮТСЯ о:58 - Что значит "done" для этой фичи59 - Конкретные testable success criteria60 - Что НЕ входит в scope613. Generator реализует624. Evaluator валидирует по контракту635. Если конкретный критерий не пройден → конкретный feedback → повтор с п.3 только для этого критерия64```6566**Контракт = мост** между user stories и implementation. Без него evaluator судит по своим критериям, generator не знает что проверять.6768Останавливай цикл, когда все утверждённые criteria имеют требуемое доказательство. Не назначай число раундов заранее; продолжай только при наблюдаемом незакрытом критерии или новом опровергающем evidence.6970---7172## Generator-Evaluator: Почему раздельно7374### Self-evaluation bias75Модели **уверенно хвалят свою работу** — даже когда качество посредственное. Это не баг модели, а свойство: генератор оптимизирован на producing, не на judging.7677### Решение: Independent evaluator78- Другой system prompt с calibrated skepticism79- Few-shot примеры с **детальными score breakdowns**80- Проверяет исполнимую поверхность acceptance contract: browser только для затронутого UI journey; native/API/worker задачи — их unit, integration, CLI или runtime probe, а не browser по умолчанию81- Конкретные failure criteria, а не общие "looks good"8283### Калибровка оценщика (QA Tuning Loop)84```851. Evaluator выдаёт оценку862. Ты проверяешь: согласен ли с оценкой?873. Расхождение → обновляешь QA промпт884. Типичные проблемы:89 - Superficial testing, пропускает edge cases90 - Premature approval посредственной работы91 - Слишком строгие критерии → бесконечные итерации925. Повторяешь пока evaluator judgment ≈ твой judgment93```9495---9697## Quality Criteria Framework (для фронтенда)9899### 4 измерения, каждое 0-10:100101**1. Design Quality** — Целостность102> Дизайн ощущается как единое целое, а не коллекция частей?103- Интеграция color, typography, layout, imagery104- Consistent visual language105106**2. Originality** — Уникальность107> Штраф за:108- Template layouts, library defaults109- AI slop patterns: purple gradients over white cards110- "Telltale signs of AI generation"111- Cookie-cutter структуры112113**3. Craft** — Техническое мастерство114- Typography hierarchy115- Spacing consistency116- Color harmony, contrast ratios117- Pixel-perfect alignment118119**4. Functionality** — Работоспособность120> Пользователь завершает задачу без угадывания?121- Все интерактивные элементы работают122- Нет stub features123- Error states обработаны124125### Влияние формулировок на генерацию126Фразы в criteria **прямо влияют** на вывод генератора:127- "museum quality" → visual convergence к одному стилю128- "best designs" → перфекционизм за счёт creativity129- **Тестируй формулировки** — они стируют модель ДО оценки130131---132133## Контекст-менеджмент134135### Context Degradation136Модели теряют coherence по мере заполнения context window.137138**Context reset > Compaction:**139- Compaction сохраняет continuity, но не даёт чистый лист140- Reset + structured handoff artifact = лучший баланс141- Handoff artifact = документ с state, decisions, progress142143### Context Anxiety144Модели могут **сворачивать работу раньше времени** из-за роста контекста.145- Решение: clean context resets, когда они уменьшают риск потери важных ограничений146147### Structured Handoff148При context reset передавать:149```150- Что уже сделано (с конкретными файлами/строками)151- Какие решения приняты и почему152- Что осталось сделать153- Текущие проблемы и blockers154- Sprint contract для текущей итерации155```156157---158159## Assumption Testing160161> "Every component in a harness encodes an assumption about what the model can't do on its own"162163### Принцип: предположения устаревают164- Возможности моделей меняются, поэтому необходимость каждого harness-компонента должна подтверждаться наблюдаемым риском165- **Стратегия**: при наличии безопасного измеримого эксперимента убирать компоненты по одному, измерять влияние и откатывать ухудшение166167### Simplification Loop168```1691. Текущий harness работает? Да →1702. Убери один компонент (напр. sprint decomposition)1713. Качество упало? Да → верни. Нет →1724. Повтори с другим компонентом1735. Остановись на минимальном harness для текущей задачи174```175176---177178## Реальные failure modes (пойманные evaluator'ом)179180- Rectangle fill tool ставит тайлы только на endpoints drag, вместо заполнения области181- Delete key handler требует два условия, когда нужно одно182- FastAPI route matching: "reorder" матчится как integer frame_id183- Audio recording: stub без mic capture184- Missing clip resize/split operations185- Effect visualizations как числовые слайдеры вместо графики186- Display-only features без интерактивности187- Missing instrument panels188- Unimplemented recording functionality189190---191192## Инструментарий193194### Claude Agent SDK195- Handles agent orchestration + compaction автоматически196- Manages context growth across long sessions197- Рекомендуемый стек для production harnesses198199### Проверочные инструменты200- Для UI: browser automation и screenshots проверяют реальный затронутый user journey201- Для API, очередей и данных: contract/integration tests, health/runtime probes и проверка нужных persistent states202- Используй инструменты, уже поддержанные проектом; не меняй стек ради соответствия этой skill203204### Иллюстративные технологии205React/Vite, Nuxt/Vue, FastAPI/Fastify, SQLite/PostgreSQL и Playwright — примеры веб-проектов на момент написания, а не default, требование или инструкция к миграции. Выбирай технологии по существующей архитектуре, пользовательскому запросу и текущей документации.206207---208209## Gotchas210211- **Language shapes output**: формулировки в criteria сдвигают генератор ДО обратной связи от оценщика. "Museum quality" → convergence, "experimental" → divergence212- **Не обосновывай продолжение цикла номером итерации**: новая итерация нужна только при незакрытом criterion или новом evidence213- **Cost/time figures are dated examples, not gates**: если бюджет нужен, согласуй task-specific limit и не понижай acceptance ради формального PASS214- **Evaluator may need tuning**: меняй QA prompt только в ответ на конкретный false positive/negative и повторно проверяй затронутый criterion215- **Self-evaluation is seductive**: генератор БУДЕТ говорить "всё отлично" — не верь, проверяй через independent evaluator216217## Troubleshooting218219| Симптом | Причина | Решение |220|---------|---------|---------|221| Evaluator всё одобряет | Промпт слишком мягкий | Добавь few-shot с detailed score breakdowns, конкретные failure criteria |222| Generator не улучшается | Feedback слишком абстрактный | Evaluator должен давать конкретные файлы/строки/проблемы |223| Бесконечные итерации | Criteria невыполнимы или feedback не связан с ними | Пересмотри контракт; сохраняй требуемую safety/runtime планку, а несовместимый scope split только с явным решением пользователя |224| Context degradation | Длинная сессия без reset | Structured handoff + clean context reset |225| Все итерации выглядят одинаково | Criteria слишком узкие | Расширь пространство, убери "museum quality" формулировки |226| Evaluator ловит мелочи, пропускает крупное | Wrong priority в промпте | Restructure: critical → high → medium → cosmetic |