Принцип разделения ответственности
В Harness действует простое правило: модель принимает смысловые решения, инструменты вычисляют проверяемые факты. Это снижает количество мест, где вероятностный ответ LLM превращается в состояние проекта.
LLM хорошо формулирует требования из человеческого описания, предлагает архитектурные варианты, составляет технический план, меняет код и ищет дефекты. Но она не должна «на глаз» решать, какой переход команды разрешён, совпадает ли hash, чисто ли рабочее дерево или завершилась ли команда с exit code 0.
Что остаётся модели
Требования
Понять пользовательское намерение, выявить противоречия, превратить исходный brief в REQ и существенные OQ.
Архитектура
Сравнить варианты, оценить последствия и сформулировать ADR там, где действительно нужно устойчивое решение.
Планирование и код
Выбрать технический путь внутри STEP contract, реализовать изменение и объяснить решение.
Review
Искать логические, архитектурные, security и product defects, связывая их с конкретным сценарием и evidence.
Что должно вычисляться детерминированно
Командный протокол
Парсинг canonical commands, normalization shorthand и допустимость переходов определяются machine-readable CTS, а не свободной интерпретацией текста.
State и fingerprints
Execution state, context_basis, plan_content_hash, reviewed revision и worktree hash вычисляются воспроизводимо.
Verification
Команды запускаются как команды, а evidence строится из фактического результата: exit code, output summary и hashes.
Git safety
Protected branch, divergence, dirty worktree, remote tracking и разрешённый mutation plan проверяет preflight.
Почему «модель может сама проверить» недостаточно
LLM способна прочитать вывод git status или тестов и обычно правильно его понять. Проблема в том, что «обычно» — слабый контракт для операции, которая меняет durable state. Ошибка в пересказе тестов неприятна; ошибка перед commit, push или migration может оставить проект в неоднозначном состоянии.
Кроме того, детерминированный слой делает одинаковый факт одинаковым для Codex, Claude Code и новой сессии. Если правило существует только в reasoning конкретной модели, оно не является стабильным протоколом.
Semantic handoff вместо скрытой магии
Граница между двумя слоями должна быть явной. Deterministic tool собирает факты и контекст, затем передаёт модели ровно ту часть работы, где нужен смысловой выбор. После ответа модели инструмент снова проверяет структуру, состояние и postconditions.
deterministic facts
↓
semantic task for LLM
↓
structured proposal / result
↓
deterministic validation
↓
durable state mutationТакой цикл особенно важен в STEP PLAN, review, Git operations и recovery после crash.
Даже review требует проверяемого контракта
Review по определению семантичен: дефект нельзя всегда найти регулярным выражением. Но сам результат review можно структурировать. Актуальный Review Contract требует для finding конкретную severity, location, scenario/preconditions, impact, evidence и evidenceBasis. Непроверенная гипотеза не должна автоматически превращаться в finding и запускать FIX.
Immutable review report привязывается к exact repository revision. Поэтому следующая стадия знает не только мнение reviewer, но и какие bytes/state он фактически проверял.
Это ещё и экономия токенов
Каждая механическая задача, которую выполняет скрипт, не требует отдельного reasoning turn модели. Не нужно просить LLM заново вычислять следующий ID, сравнивать hashes, читать всю Git policy или вручную собирать projection. Модель получает уже подготовленный Context Contract и тратит контекст на то, что действительно требует рассуждения.
Практическое правило проектирования
Если результат можно однозначно вычислить из файлов, Git state, схемы или exit code — сначала ищите детерминированное решение. Если нужно понять намерение, компромисс, риск или смысл изменения — это работа модели. А если операция влияет на durable state, полезно строить её как sandwich: deterministic preconditions → semantic decision → deterministic postconditions.
Посмотреть детерминированные инструменты Harness → · Архитектура Harness →