The claude adapter
Pinned to 2.1.240. Adapter class: harness — the vendor keeps its loop, its sessions, its
tools, its authentication and its credential custody; metaharness drives its documented outside
surface.
metaharness run claude --hermetic -p "…"
metaharness conformance claude # 20 vectors, no model / no network / no credential
metaharness doctor claude
What a run does
- Spawns
claudeinto a scratch config home. - Installs a blocking
PreToolUsehook and answers its calls per call. - Streams the session out as protocol events on stdout; takes steering on stdin.
- Retains the raw transcript.
- Exits on the hermetic floor's verdict.
Declared capabilities
| Tier | Status |
|---|---|
registration | delivered |
call | delivered |
turn | unverified |
kill | delivered |
More columns: swipe horizontally, or focus the table and use the arrow keys.
| Command | Support |
|---|---|
tool.decide | honoured |
interrupt | honoured |
halt | honoured |
frame.set, message.inject, steer, permission.set | refused — UNSUPPORTED_CONTROL |
More columns: swipe horizontally, or focus the table and use the arrow keys.
steer is refused because Claude Code headless has no mid-turn tier. That is a property of
the surface, not an omission in the adapter.
Operation rendering
| Neutral operation | Vendor tool |
|---|---|
file.read | Read |
file.write | Write |
file.edit | Edit |
dir.list | Glob |
search | Grep |
shell | Bash |
web.read | WebFetch |
skill.load | Skill |
subagent.spawn | Task |
task.todo | TodoWrite |
mcp.call | (none) |
More columns: swipe horizontally, or focus the table and use the arrow keys.
Print it yourself: metaharness capabilities claude --render.
Three things this crate deliberately does not do
| It spawns nothing. | plan_launch returns the command line, the child environment, the settings document, the hook definition and the copy list as values — because a consumer asserts its own argv rather than trusting it, "because every one of the failures would be silent". The hook program is the same rule applied to the seam's executable. |
| It reads no clock. | Every event's timestamp is the one the vendor recorded, passed through — or absent. |
| It drops nothing. | An unmappable record becomes opaque with the vendor's type, subtype, a digest and its 1-based source line. An unrecognised field is ignored in silence; an unrecognised record is preserved. |
More columns: swipe horizontally, or focus the table and use the arrow keys.
The live proof
A frame that admitted no shell met a prompt that asked for one.
- metaharness denied the call at the hook.
- The call did not run.
- The vendor's own terminal record listed
Bashinpermission_denials.
Two defects that only a paid run could find
Both were metaharness's, and neither was reachable without a real session:
- The hermetic floor read the wrong field for "was an API key in use".
- It treated "this run pinned no documents" as "nobody found out whether the documents
moved" — which made
--hermetic strictunpassable.
Both are fixed, both are regression-tested, and both are recorded as design amendment a4.
Evidence discipline
Every claim this adapter makes about the binary is either read from the design document's § 2.7 — where each row carries its own method — or labelled unverified at the point of use, with the open question that would close it.
A string in a binary is weaker than a driven call, and this crate says which it has.