Agent Harness
You are a harness operator, not a hero. The loop — not your optimism — decides when work
is done. Your job: compile the goal into tasks with checks, execute one task at a time,
let the controller adjudicate verification, and stop when the state machine says stop.
The contract
GOAL → goal_compiler → PLAN → loop_controller: [execute → verify]* → CLOSE
↑______retry (≤ max_attempts, changed approach)
└── ESCALATE on exhausted budgets — never fake success
Three layers, all JSON: a committed per-domain manifest (what skills/tools/checks
exist), a per-goal plan (which tasks, which verifications, what "done" means), and a
per-run state file (the single source of truth; a fresh session resumes from it alone).
Quick start
# 0. Pick the domain manifest (18 committed under assets/harnesses/, e.g. engineering-team.json)
ls assets/harnesses/
# 1. Compile the goal (refuses vague goals with exit 3 + forcing questions)
python3 scripts/goal_compiler.py \
--goal "audit the payments service and design an SLO with an error budget" \
--manifest assets/harnesses/engineering.json --out plan.json
# 2. Initialize the loop state
python3 scripts/loop_controller.py init --plan plan.json --state .agent-harness/state.json
# 3. Drive the loop — repeat until directive is "close" or "escalate"
python3 scripts/loop_controller.py next --state .agent-harness/state.json
# → {"action": "execute", "task": "T1", ...}: open the task's skill (SKILL.md at
# skill_path), do the work with its tools, then:
python3 scripts/loop_controller.py record --state .agent-harness/state.json \
--task T1 --phase execute --exit-code 0
# → the controller runs the task's checks ITSELF (subprocess, timeout, evidence log):
python3 scripts/loop_controller.py verify --state .agent-harness/state.json --task T1 --cwd <repo-root>
# 4. Close — refused (exit 4) while any task is unverified and unwaived
python3 scripts/loop_controller.py close --state .agent-harness/state.json
Regenerate a manifest after skills change (diff-stable, CI-checkable):
python3 scripts/harness_manifest_builder.py --domain engineering-team \
--repo-root <repo-root> --out-dir assets/harnesses --no-timestamp
Hard rules
- Never adjudicate your own verification.
verify runs the checks via subprocess;
a passing record --phase verify without --evidence is rejected (exit 6). You do not
get to declare a task verified.
- Never modify a gate you are judged by. Check commands come from the manifest/plan.
Editing a check to make it pass is the reward-hacking failure mode
(see references/verification_discipline.md) — same
invariant as autoresearch-agent's locked evaluator.
- One task at a time, writes serialized. Parallelize reading and judging, never two
tasks writing the same artifact (references/agentic_loop_canon.md).
- Retry means a changed approach. Same command + same input = same failure. The retry
directive says so; honor it.
- Budgets are terminal states, not suggestions.
max_attempts_per_task → escalated
(exit 2); max_loop_iterations → escalate (exit 5). Exhausted budgets are never
reported as success — a human waives (close --waive T3 --reason "..."), you don't.
- Fresh context beats long context. Every
next directive is executable by a new
session reading only the plan + state files. Long-running goals: run each iteration as
its own session against the durable state.
- State lives in
.agent-harness/ — never in .agenthub/, .autoresearch/, or
docs/TC/ (those belong to sibling skills).
- Plan and state files are a trust boundary.
verify shell-executes each task's
check command; only run the harness on plan/state files you or goal_compiler.py
produced, never on files from untrusted input (see
references/verification_discipline.md).
Forcing questions (ask before compiling; one per turn, with a recommended answer)
| # |
Question |
Recommended answer |
Why (canon) |
| 1 |
What single observable outcome means DONE? |
A named artifact + a command that exits 0 against it |
Verifier's law: invest in verifiability first |
| 2 |
Which domain harness applies? |
The domain whose skills name the deliverable; if two, run two sequential loops |
Orchestrator-workers: scoped objectives beat mega-goals |
| 3 |
What must NOT change? |
List no-touch paths; put them in the goal text so the compiler's plan inherits them |
Boundaries are part of a subagent spec |
| 4 |
Who reviews escalations, and how fast? |
A named human; escalations block the loop by design |
Approval-required is a terminal state, not a nuisance |
| 5 |
What is the iteration budget? |
Default 12 loop iterations / 3 attempts per task; raise only with a reason |
Caps are runtime errors, not advice (OpenAI SDK max_turns) |
Exit codes (branch on these mechanically)
| Code |
Tool |
Meaning |
| 0 |
all |
OK / directive emitted |
| 2 |
loop_controller |
Escalation required — a human must review the evidence log |
| 3 |
goal_compiler |
Goal too vague — answer the forcing questions, recompile |
| 4 |
goal_compiler / loop_controller |
No skill matched / close refused (unverified tasks) |
| 5 |
loop_controller |
Global iteration cap reached |
| 6 |
loop_controller |
Invalid transition (recording on verified task, evidence missing, unknown task) |
Verifiable success
python3 scripts/harness_manifest_builder.py --sample, scripts/goal_compiler.py --sample,
and scripts/loop_controller.py --sample all exit 0.
- A vague goal (
--goal "make it better") exits 3 and prints forcing questions.
loop_controller.py close on a state with an unverified task exits 4.
- The demo loop in
loop_controller.py --sample shows a verify failure consuming an attempt
and the loop still closing only after a passing verify with evidence.
Related skills
- workflow-builder: authoring deterministic
.js scripts for Claude Code's Workflow
tool. NOT for goal-to-close loop state (this skill).
- agenthub: N parallel agents competing on ONE task in git worktrees. Use it inside a
harness task that wants competing attempts.
- autoresearch-agent: metric optimization of a single file against a locked evaluator.
Use it when a task's done_when is "metric improves".
- tc-tracker: per-code-change lifecycle records. Use for change bookkeeping; the harness
state file is per-goal, not per-change.
- loop-library: discover/audit published loop recipes conversationally. This skill is the
executable enforcement of that vocabulary.
- ship-gate / self-eval / spec-driven-workflow: plug in as close-time checks inside a
task's
verification[].
See references/domain_harness_design.md for the
three-layer architecture, the reuse map, and how to raise a domain's harness quality.
Source: alirezarezvani/claude-skills → engineering/agent-harness/skills/agent-harness/SKILL.md
1---2name: agent-harness3description: Turn any domain folder of skills into a bounded agentic loop: compile a goal into a verifiable task plan, execute tasks with the domain's own tools, verify every task with machine-run checks, retry with caps, escalate to a human when budgets exhaust, and refuse to close until everything is verified or explicitly waived. Use when you want an agent or subagent to pick up a goal and drive it to a verified close across one of this repo's 18 domains ('run this goal through the engineering harness', 'set up an agentic loop for marketing work', 'make the finance domain self-verifying'). NOT for authoring Claude Code Workflow-tool .js scripts (workflow-builder), N-agent tournaments on one task (agenthub), single-file metric optimization (autoresearch-agent), or discovering published loop recipes (loop-library).4---5
6
7# Agent Harness
8
9You are a harness operator, not a hero. The loop — not your optimism — decides when work
10is done. Your job: compile the goal into tasks with checks, execute one task at a time,
11let the controller adjudicate verification, and stop when the state machine says stop.
12
13## The contract
14
15```
16GOAL → goal_compiler → PLAN → loop_controller: [execute → verify]* → CLOSE
17 ↑______retry (≤ max_attempts, changed approach)
18 └── ESCALATE on exhausted budgets — never fake success
19```
20
21Three layers, all JSON: a committed per-domain **manifest** (what skills/tools/checks
22exist), a per-goal **plan** (which tasks, which verifications, what "done" means), and a
23per-run **state file** (the single source of truth; a fresh session resumes from it alone).
24
25## Quick start
26
27```bash
28# 0. Pick the domain manifest (18 committed under assets/harnesses/, e.g. engineering-team.json)
29ls assets/harnesses/
30
31# 1. Compile the goal (refuses vague goals with exit 3 + forcing questions)
32python3 scripts/goal_compiler.py \
33 --goal "audit the payments service and design an SLO with an error budget" \
34 --manifest assets/harnesses/engineering.json --out plan.json
35
36# 2. Initialize the loop state
37python3 scripts/loop_controller.py init --plan plan.json --state .agent-harness/state.json
38
39# 3. Drive the loop — repeat until directive is "close" or "escalate"
40python3 scripts/loop_controller.py next --state .agent-harness/state.json
41# → {"action": "execute", "task": "T1", ...}: open the task's skill (SKILL.md at
42# skill_path), do the work with its tools, then:
43python3 scripts/loop_controller.py record --state .agent-harness/state.json \
44 --task T1 --phase execute --exit-code 0
45# → the controller runs the task's checks ITSELF (subprocess, timeout, evidence log):
46python3 scripts/loop_controller.py verify --state .agent-harness/state.json --task T1 --cwd <repo-root>
47
48# 4. Close — refused (exit 4) while any task is unverified and unwaived
49python3 scripts/loop_controller.py close --state .agent-harness/state.json
50```
51
52Regenerate a manifest after skills change (diff-stable, CI-checkable):
53
54```bash
55python3 scripts/harness_manifest_builder.py --domain engineering-team \
56 --repo-root <repo-root> --out-dir assets/harnesses --no-timestamp
57```
58
59## Hard rules
60
611. **Never adjudicate your own verification.** `verify` runs the checks via subprocess;
62 a passing `record --phase verify` without `--evidence` is rejected (exit 6). You do not
63 get to declare a task verified.
642. **Never modify a gate you are judged by.** Check commands come from the manifest/plan.
65 Editing a check to make it pass is the reward-hacking failure mode
66 (see [references/verification_discipline.md](references/verification_discipline.md)) — same
67 invariant as autoresearch-agent's locked evaluator.
683. **One task at a time, writes serialized.** Parallelize reading and judging, never two
69 tasks writing the same artifact ([references/agentic_loop_canon.md](references/agentic_loop_canon.md)).
704. **Retry means a changed approach.** Same command + same input = same failure. The retry
71 directive says so; honor it.
725. **Budgets are terminal states, not suggestions.** `max_attempts_per_task` → escalated
73 (exit 2); `max_loop_iterations` → escalate (exit 5). Exhausted budgets are never
74 reported as success — a human waives (`close --waive T3 --reason "..."`), you don't.
756. **Fresh context beats long context.** Every `next` directive is executable by a new
76 session reading only the plan + state files. Long-running goals: run each iteration as
77 its own session against the durable state.
787. **State lives in `.agent-harness/`** — never in `.agenthub/`, `.autoresearch/`, or
79 `docs/TC/` (those belong to sibling skills).
808. **Plan and state files are a trust boundary.** `verify` shell-executes each task's
81 check command; only run the harness on plan/state files you or `goal_compiler.py`
82 produced, never on files from untrusted input (see
83 [references/verification_discipline.md](references/verification_discipline.md)).
84
85## Forcing questions (ask before compiling; one per turn, with a recommended answer)
86
87| # | Question | Recommended answer | Why (canon) |
88|---|---|---|---|
89| 1 | What single observable outcome means DONE? | A named artifact + a command that exits 0 against it | Verifier's law: invest in verifiability first |
90| 2 | Which domain harness applies? | The domain whose skills name the deliverable; if two, run two sequential loops | Orchestrator-workers: scoped objectives beat mega-goals |
91| 3 | What must NOT change? | List no-touch paths; put them in the goal text so the compiler's plan inherits them | Boundaries are part of a subagent spec |
92| 4 | Who reviews escalations, and how fast? | A named human; escalations block the loop by design | Approval-required is a terminal state, not a nuisance |
93| 5 | What is the iteration budget? | Default 12 loop iterations / 3 attempts per task; raise only with a reason | Caps are runtime errors, not advice (OpenAI SDK `max_turns`) |
94
95## Exit codes (branch on these mechanically)
96
97| Code | Tool | Meaning |
98|---|---|---|
99| 0 | all | OK / directive emitted |
100| 2 | loop_controller | Escalation required — a human must review the evidence log |
101| 3 | goal_compiler | Goal too vague — answer the forcing questions, recompile |
102| 4 | goal_compiler / loop_controller | No skill matched / close refused (unverified tasks) |
103| 5 | loop_controller | Global iteration cap reached |
104| 6 | loop_controller | Invalid transition (recording on verified task, evidence missing, unknown task) |
105
106## Verifiable success
107
108- `python3 scripts/harness_manifest_builder.py --sample`, `scripts/goal_compiler.py --sample`,
109 and `scripts/loop_controller.py --sample` all exit 0.
110- A vague goal (`--goal "make it better"`) exits 3 and prints forcing questions.
111- `loop_controller.py close` on a state with an unverified task exits 4.
112- The demo loop in `loop_controller.py --sample` shows a verify failure consuming an attempt
113 and the loop still closing only after a passing verify with evidence.
114
115## Related skills
116
117- **workflow-builder**: authoring deterministic `.js` scripts for Claude Code's Workflow
118 tool. NOT for goal-to-close loop state (this skill).
119- **agenthub**: N parallel agents competing on ONE task in git worktrees. Use it *inside* a
120 harness task that wants competing attempts.
121- **autoresearch-agent**: metric optimization of a single file against a locked evaluator.
122 Use it when a task's done_when is "metric improves".
123- **tc-tracker**: per-code-change lifecycle records. Use for change bookkeeping; the harness
124 state file is per-goal, not per-change.
125- **loop-library**: discover/audit published loop recipes conversationally. This skill is the
126 executable enforcement of that vocabulary.
127- **ship-gate / self-eval / spec-driven-workflow**: plug in as close-time checks inside a
128 task's `verification[]`.
129
130See [references/domain_harness_design.md](references/domain_harness_design.md) for the
131three-layer architecture, the reuse map, and how to raise a domain's harness quality.
132
133---
134
135**Source:** [`alirezarezvani/claude-skills`](https://github.com/alirezarezvani/claude-skills) → `engineering/agent-harness/skills/agent-harness/SKILL.md`