Що таке harness
Claude Code у терміналі — це розмова. Ти просиш, він працює, ти читаєш результат і вирішуєш, що далі. Для однієї задачі це чудово. Для двадцяти задач за ніч — ні, бо саме ти та частина, якій доводиться не спати.
Harness займає твоє місце в цій розмові. Це невелика програма, яка знову і знову запускає Claude Code у
headless-режимі (claude -p), дає йому по одному шматку роботи за запуск і перевіряє кожен результат кодом, перш
ніж іти далі. Ти й далі вирішуєш, що будувати, і сам затверджуєш те, що потребує людини. Harness бере на себе
очікування, перевірки й облік.
Слово означає упряж — те, що з'єднує сильну тварину з возом. Упряж не тягне сама. Вона спрямовує силу в один бік і не дає з'їхати з дороги.
Вісім слів
Кожна наступна сторінка вживає ці слова саме в такому значенні.
| Слово | Значення | Де це видно |
|---|---|---|
| задача (task) | Одна річ, яку ти хочеш зробити: Markdown-файл зі статусом у frontmatter. | .harness/tasks/T-007.md |
| юніт (unit) | Один свіжий запуск агента, який просуває одну задачу на один крок. | один процес claude -p |
| корпус (corpus) | Тека з усіма файлами задач. З неї обчислюється черга. | .harness/tasks/ |
| координатор | Агент, якого запускає юніт. Читає задачу, викликає спеціалістів і збирає їхні відповіді. | промпт поточного етапу |
| спеціаліст | Агент з однією роботою, описаний в одному файлі: writer, explorer, planner, designer, tester, implementer, debugger, qa, judge. | agents/*.md |
| вердикт | Фіксований токен, який спеціаліст мусить залишити, щоб код міг прочитати результат. | qa: PASS, judge: CONFIRMED |
| контракт | Правило, яке перевіряє код після юніта, а не агент під час нього. | scope, task file, trace, gate, closing |
| гейт (gate) | Команда, яка має пройти, щоб робота зарахувалась: типи, лінт, тести. | gate: у файлі задачі |
Чотири ідеї, на яких усе тримається
Свіжий контекст на кожен юніт
Кожен юніт запускає новий процес claude -p. Модель нічого не пам'ятає з попереднього юніта. Усе, що потрібно
наступному, записано у файл задачі. Звучить марнотратно, але довгі сесії дрейфують: ранні деталі губляться при
компактизації, а старі здогадки стають «фактами». Свіжий контекст бачить задачу такою, якою вона є зараз.
Стан живе на диску
Увесь стан — у файлах: файли задач, журнал, який пишуть агенти, і тека трейсу. Harness заново обчислює чергу з цих файлів на початку кожного юніта. Нічого важливого не живе лише в пам'яті, тож якщо вбити процес посеред запуску, втратиш рівно один недороблений юніт.
Контракт, а не інструкція
Інструкція — це те, що ти кажеш агенту: «редагуй лише компонент хедера». Контракт — це те, що код перевіряє потім: harness порівнює дерево файлів до і після юніта й валить його, якщо змінився файл поза дозволеним списком. Агенту розповідають про кожен контракт, але ніщо не залежить від того, чи дотримає він слова. У harness агент — найменш довірена частина.
Один координатор, багато спеціалістів
Юніт не запускає одного великого агента, який робить усе. Він запускає координатора, який обирає потрібних задачі спеціалістів, дає кожному вузьку роботу і чекає на їхні вердикти. Кожен спеціаліст володіє однією частиною файлу задачі. Координатор володіє задачею в цілому. Коміти робить сам harness, ніколи не агент.
Частини harness
Harness складається з п'яти частин. Кожна володіє чимось одним, тож кожна може впасти, не потягнувши за собою інші.
| Частина | Чим володіє | У harness-demo |
|---|---|---|
| корпус | файли задач і їхні статуси | <project>/.harness/tasks/T-NNN.md |
| supervisor | політика в часі: батчі, пауза і стоп, коди виходу, очікування лімітів, один лок | harness/supervise.ts |
| runner | один юніт: взяти задачу, зробити знімок, запустити агента, перевірити контракти, записати результат | harness/runner.ts |
| агент | сама робота, у свіжому контексті | claude -p з .claude/agents/*.md |
| watcher | як запуск виглядає ззовні | дашборд на 127.0.0.1:4777 |
Сторінка ролей показує, хто такі спеціалісти. Сторінка циклу показує, як supervisor і runner працюють разом і як їх запустити, поставити на паузу й зупинити.