AI Coding Harness
Что это такое
AI coding harness — это каркас для контроля и проверки, который вы выстраиваете вокруг кодирующего агента, чтобы он мог работать автономно, ничего не ломая. Если guardrail — это привычка, о которой вы должны помнить (запустить тесты, прочитать diff), то harness — это машина, которая помнит за вас: она стоит между намерением агента и реальным миром и на каждом опасном шаге записывает, предупреждает или блокирует. dancinlab/harness — это эталонный движок, не зависящий от конкретного проекта: общее ядро на TypeScript, где каждый репозиторий отличается лишь файлом harness.config.json и несколькими файлами данных .harness/*.json.
Сильные стороны
- Превращает ваши guardrail'ы из необязательных привычек в правила, которые принудительно соблюдаются кодом — агент не может их пропустить.
- Контролирует весь жизненный цикл инструментов: перед запуском команды, перед записью файла, на промпте, при коммите и при push.
- Журналы JSONL, доступные только для добавления, дают защищённую от подделки запись всего, что делал агент, — дёшево писать, тривиально проверять.
- Встраивается в любой репозиторий: поведение задаётся конфигом и данными, а не форком кода.
- Спроектирован так, чтобы молчать, когда всё в порядке, чтобы предупреждения по-прежнему что-то значили.
Компромиссы
- Это сантехника, а не магия: harness делает ошибки дешёвыми для обнаружения, но не делает ИИ правильным.
- Требует первоначальной настройки и конфига, подстроенного под опасные зоны вашего проекта.
- Чрезмерно строгие правила создают трения; дисциплина «bitter-gate» (вывести из строя спящее правило, прежде чем добавлять новое) существует именно для борьбы с этим.
- Наиболее ценен на реальных проектах с реальными пользователями — избыточен для одноразового прототипа.
Лучше всего подходит для
Серьёзного vibe coding, когда вы позволяете агенту вносить многофайловые изменения и запускать команды почти без присмотра, и вам нужно, чтобы цена плохого действия оставалась близкой к нулю.
Пять принципов (H1–H5)
- H1 Успех тихий, провал громкий — никакого шума, который вы научитесь игнорировать.
- H2 Никогда не исправлять автоматически — предлагать, блокировать или предупреждать; решает человек или информированный агент.
- H3 Bitter-gate — вывести из строя спящее правило, прежде чем добавлять новое.
- H4 Управление через конфиг — один движок, свой
harness.config.jsonна каждый проект. - H5 AI-native — журналы JSONL только для добавления, невозможно незаметно переписать.
Как это выглядит
Минимальный набросок конфига:
// harness.config.json
{
"lockedPaths": ["src/auth/**", "infra/**", ".github/**"],
"blockCommands": ["rm -rf", "git push --force", "curl * | sh"],
"verify": ["npm run lint", "npm run typecheck", "npm test"],
"ledger": ".harness/ledger.jsonl"
}
И поток pre/post-хуков вокруг одного действия агента:
agent intends an action
│
┌────▼─────────────┐
│ pre (PreToolUse) │ block dangerous? warn? → else allow
└────┬─────────────┘
│ command runs / file is written
┌────▼──────────────┐
│ post (PostToolUse) │ record to JSONL · warn if a locked file was touched
└────┬──────────────┘
│ at commit / push
┌────▼─────┐
│ verify │ lint · typecheck · tests (parallel) → green or stop
└──────────┘
Агент никогда не может обойти эту преграду — в этом весь смысл.