Skip to main content

What an Adapter Does

The adapter is a governance-to-native-config compiler. It takes r5e’s governed session spec and projects it into whatever format the provider expects:
r5e InputClaude Code OutputCodex OutputAPI Output
Policy grants.claude/settings.json--sandbox flagstool definitions
Context layersCLAUDE.mdsystem promptsystem message
Tool refs.claude/skills/*.mdtool flagstools array
Gateway configMCP server configN/Abase URL
Credential leasesenv vars (v1alpha)env varsauth headers
Workspace claimsgit worktree-C workdirN/A
Same governance. Different projections. Writing a new adapter = writing a new governance projector.

Adapter Classes

Not all adapters have the same fidelity:
ClassEnforcementEvent FidelityExample
opaque-cliPre-flight + observe-and-terminatePartial (post-hoc observation)Claude Code, Codex, Gemini CLI
governed-apiSynchronous per-call enforcementFullDirect API adapters
governed-mcpMCP protocol-native enforcementFullMCP gateway adapters
Downstream governance is aware of the adapter class. An opaque-cli session’s audit trail has lower fidelity — this is an accepted tradeoff, not a hidden gap.

The Adapter Contract

defmodule R5e.Adapter do
  @callback materialize(session_spec) :: {:ok, handle} | {:error, term}
  @callback execute(handle, event_handler) :: :ok | {:error, term}
  @callback interrupt(handle, :graceful | :hard) :: :ok | {:error, term}
  @callback report(handle) :: {:ok, result} | {:error, term}
  @callback adapter_class() :: :opaque_cli | :governed_api | :governed_mcp
end
Adapters are Capability resources — certified through the trust registry, governed by the same admission pipeline as everything else.