An agent orchestration system for Claude Code. This repo IS the harness.
The harness is a collection of skills, agents, hooks, and state files that enable Claude Code to operate autonomously on any codebase. It provides:
- Intent routing (
/do) that dispatches tasks to the right tool - Campaign persistence across sessions
- Parallel agent coordination with discovery sharing
- Automated quality enforcement through lifecycle hooks
- Skills live in
skills/. Each skill is a directoryskills/{name}/SKILL.md. - Agents live in
agents/. They spawn as sub-processes with their own context. - Hooks live in
hooks_src/. Installed per-project viascripts/install-hooks.js. - The
init-projecthook auto-scaffolds per-project state on session start:.planning/— campaign state, fleet sessions, intake, telemetry.citadel/scripts/— utility scripts (telemetry, coordination, compression).claude/agent-context/— rules injected into sub-agents
- Campaign state lives in
.planning/campaigns/(per-project). - Fleet session state lives in
.planning/fleet/(per-project). - Templates live in
.planning/_templates/(copied from plugin on init). - Configuration lives in
.claude/harness.json(generated by/do setup, per-project).
Always run tests after modifying hooks or skills. Five levels:
| Command | What it checks | When to run |
|---|---|---|
node scripts/test-all.js |
Hooks + skill structure (fast, no LLM) | After any change |
node hooks_src/smoke-test.js |
Hooks only | After hook changes |
node scripts/verify-hooks.js |
Hook install + runtime (synthetic payloads, no LLM) | After hook changes |
node scripts/integration-test.js |
Full Pre→tool→Post pipeline sequences (no LLM) | After hook changes |
node scripts/skill-lint.js |
All SKILL.md structure | After skill changes |
node scripts/skill-bench.js |
Scenario file validity | After adding benchmarks |
node scripts/skill-bench.js --execute |
Live scenario execution | Before shipping |
node scripts/skill-bench.js --execute --verify-hooks |
Live execution + confirms hooks fired | Before shipping |
Adding a new skill: create skills/{name}/SKILL.md, then run node scripts/skill-lint.js {name} to verify structure.
Adding a benchmark scenario: create skills/{name}/__benchmarks__/{scenario}.md, then run node scripts/skill-bench.js --skill {name} to validate.
CI: node scripts/test-all.js exits non-zero on any failure. Use --strict to treat WARNs as failures.
After completing any task, output a HANDOFF block:
---HANDOFF---
- What was built or changed
- Key decisions and tradeoffs
- Unresolved items or next steps
---
3-5 bullets, under 150 words.