Provider adapters translate SDK-specific configuration, messages, state, usage, and errors into harness events and outcomes. They should share tests and lifecycle semantics, not force feature equivalence. OpenAI interruptions/handoffs and Claude permissions/subagents remain typed native extensions while business tools, policy, budgets, checkpoints, and evaluation stay portable.
You will map each SDK to normalized events, define a capability manifest, and avoid the lowest-common-denominator trap.
Confirm exact APIs against current docs and installed versions.
It does not own business authorization or database side effects.
Orchestration requests capabilities; routing selects only compatible adapters.
Run shared contract cases: read-only task, structured output, denied tool, approval pause, resume, limit, cancellation, provider error, and usage capture. Assert domain outcomes and normalized lifecycle, not identical hidden steps or wording.
Failure injection: Make one adapter map budget exhaustion to succeeded. The shared contract test must reject it.
Implement fake OpenAI/Claude adapters that replay recorded sanitized event fixtures. Use them to test routing and resume without network calls.