About adapters
Adapters translate between the generic process contract and the systems your team already uses: a tracker, an agent, a code host, a Log destination.
Every operation an adapter performs names its target and the authority it acts under. Authorization, idempotency and reconciliation stay with the harness.
How it works
An adapter performs or observes an operation the harness has already authorized. It never authorizes one itself.
Capability configuration states whether a hook is advisory, or enforced by the forge.
The seven adapter kinds
| Adapter | Responsibility | Implementation |
|---|---|---|
| Intent source | Read work from a tracker, manifest, planner, API or direct input | GitHub Issues and Milestones. A state-source contract with a forge adapter and a file adapter, one of which is selected |
| Agent runtime | Start, resume, cancel, stream and normalize an Execution | Vendor CLIs (claude, codex) dispatched as subprocesses. The task-tools MCP server is registered for Claude (in .mcp.json) and for Codex (as [mcp_servers] TOML), with the same command |
| Code host | Resolve revisions, diffs, checks, reviews and publications | GitHub, through gh |
| Evidence producer | Run or import checks; verify attestations against trust roots | The check registry and the checks registered in config, run at the hooks and in CI |
| Reviewer | Turn a human, agent or tool assessment into a Review | Fresh Reviewer and Security agent dispatches |
| Code host and tracker effects | Perform and observe operations the harness authorized | An effect executor. See Effects are never posted twice |
| Log destination | Deliver validated events to storage or export | A folder or a server URL, with a reference log server. See Delivery |
Effects are never posted twice
The effect executor records an effect's identity before posting it. Before retrying, it reconciles any earlier started record. If it cannot tell whether an effect happened, it records uncertain rather than posting again.
Agents
- Subscription login only. Every agent authenticates by subscription login. There is no API key and no fallback.
- Same enforcement for Claude Code and Codex. Both are held to the same enforcement. A dispatch starts only when that agent's required controls are active.
- Same semantics everywhere. The same process semantics must hold across every supported adapter. See Conformance.
Configuration
| Key | Adapter it selects |
|---|---|
dispatch.agent | The default agent runtime: claude or codex. --agent overrides it |
logs | The Log destination: folder or url |
tokens.collect | A second usage-collection route, for a host other than Claude Code |
managed.agents | Which agent-native entry points init wrote: skills, claude, gemini |
Example: make Codex the default agent.
{
"dispatch": {
"agent": "codex"
}
}