Skip to content

Оценка harness

Один успешный run ничего не доказывает

Прошедшая задача показывает только то, что один раз всё сложилось удачно. Harness нужно оценивать как систему: что он делает при missing context, blocked command, падающем тесте, unsafe write и replay старой задачи.

Полезные вопросы:

ВопросЧто проверяет
Можно ли проверить произошедшее кодом?Executability.
Видит ли reviewer task, context, actions, checks и result?Inspectability.
Сохраняется ли state между шагами?Statefulness.
Понятно ли, что делать после failure?Recovery.
Исполняется ли policy до side effect?Safety compliance.
Можно ли replay старых tasks после изменения harness?Regression resistance.

Evidence chain

Для каждого run нужно сохранять:

text
task contract
-> selected context
-> policy decisions
-> backend output
-> checks
-> result classification
-> review/adoption decision

yolo-runner-lite и harness-labs пишут это как JSONL events:

text
examples/yolo-runner-lite/runs/*.jsonl
/tmp/harness-v*/runs/*.jsonl

Ожидаемые events:

  • task_loaded;
  • context_ready;
  • backend_started;
  • policy_check;
  • file_written;
  • check_started;
  • check_finished;
  • result_classified.

Так выглядит evidence реального negative-case: в task добавлен check ["curl", "https://example.com"], harness v03 останавливает его до выполнения и честно классифицирует run:

json
{"event": "policy_check", "check": "sneaky exfil", "command": ["curl", "https://example.com"], "allowed": false, "reason": "blocked command fragment: curl "}
{"event": "check_blocked", "check": "sneaky exfil", "reason": "blocked command fragment: curl "}
{"event": "result_classified", "result": "blocked", "reason": "check blocked by policy"}

Ключевая деталь — blocked, а не failed: policy denial означает «нужно решение человека», а не «работа сделана неверно». Harness, который смешивает эти состояния, портит и метрики, и доверие.

Первый eval set

Минимальный eval set для harness должен включать:

  • задача happy path;
  • task с missing context;
  • task с blocked command;
  • task с failing test;
  • task с unsafe path write;
  • replay ранее исправленной задачи.

Как проектировать eval cases

Слабый eval set даёт команде ложную уверенность. Хороший eval case должен быть:

  • ясным, но не подсказывать exact implementation path;
  • воспроизводимым, с pinned environment, fixtures и deterministic checks;
  • объективно проверяемым, через tests, state check, DOM/file/database inspection или structured evaluator;
  • диагностичным, чтобы failure говорил о конкретной слабости: context, tool use, policy, planning, verification, recovery;
  • разнообразным, покрывающим happy path, edge cases, traps, high-risk actions и regressions;
  • защищённым от memorization, если вы сравниваете модели или agents на потоке задач.

Для coding tasks полезно заимствовать идею FAIL_TO_PASS и PASS_TO_PASS: один набор проверок должен падать до исправления и проходить после, второй должен проходить и до, и после, чтобы agent не ломал соседнее поведение.

Ablation и feature flags

Если score изменился, сначала проверьте eval system, потом agent. Плохой scorer, сломанный fixture или drift окружения выглядят в отчёте так же, как деградация модели.

Для серьёзного harness заведите ablation switches:

  • отключить context compression;
  • отключить memory/experience retrieval;
  • отключить reviewer agent;
  • заменить tool output representation;
  • переключить model/backend;
  • включить/выключить policy rule.

Каждый major feature должен быть independently disableable. Иначе команда не сможет ответить, что именно улучшило результат: новая инструкция, tool representation, evaluator, model или просто случайность.

Отдельно различайте mechanism metric и target metric. Например, «context стал короче» — это mechanism. Target может быть task success, latency, review time или false acceptance rate. Улучшение mechanism не считается успехом, если target или guardrail metrics деградировали.

Production traces -> regression suite

Observability не должна заканчиваться log browser'ом. Полезный loop:

text
production trace
-> anonymize / redact sensitive fields
-> classify failure
-> distill minimal reproducible case
-> add to eval suite
-> rerun before harness/backend changes

Так eval set перестаёт быть статичным набором учебных задач и начинает отражать реальные failure modes команды.

Что сделать руками

Запустите chapter chain из Labs, затем сделайте короткий eval report:

ПроверкаEvidence
Backend писал только allowed files?JSONL policy_check + file_written.
Verification запускался отдельно от self-report агента?JSONL check_started + check_finished.
Result определён словами агента?Нет, result выводится из checks.
Run можно replay?Task JSON + fixture + policy + seed workspace.

Используйте шаблон eval suite. Цель упражнения — поймать не только «агент сделал правильно», но и «harness правильно отказал».

Agentic Engineering: Context Engineering + Harness Engineering