Appearance
Оценка 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 decisionyolo-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 правильно отказал».