Use this when an SDK inspects first and its registered executor performs the eventual tool effect.
X-Clavenar-Decision-Contract: clavenar.decision/v1 X-Clavenar-Idempotency-Id: 8f1d3a40-7c0e-4d2b-9c9a-3b1d0e6a2c5a
Proxy 0.5.0 and Lite 0.9.0 reject an unselected tool call before authentication mutation, rate limiting, policy, HIL, Ledger, receipt, or upstream work. Upgrade the gateway and client together, then choose exactly one of the two contracts below.
These are the first releases that package the exact clavenar.client-migration/v1 fixture and use explicit request selection.
| Component | Minimum safe version |
|---|---|
| Proxy | 0.5.0 |
| Lite | 0.9.0 |
| Rust SDK | 0.3.0 |
| TypeScript SDK | 1.5.0 |
| Python SDK | 1.4.0 |
| Go SDK | 1.3.0 |
| Java SDK | 1.4.0 |
| .NET SDK | 1.5.0 |
The idempotency value is a canonical lowercase UUID. Decision and server-execution headers are mutually exclusive; the removed legacy execution selector is not accepted.
Use this when an SDK inspects first and its registered executor performs the eventual tool effect.
X-Clavenar-Decision-Contract: clavenar.decision/v1 X-Clavenar-Idempotency-Id: 8f1d3a40-7c0e-4d2b-9c9a-3b1d0e6a2c5a
Use this only when Proxy or Lite owns the upstream call and retained result. Allocate the UUID before any network attempt.
X-Clavenar-Server-Execution-Contract: clavenar.server-execution/v1 X-Clavenar-Idempotency-Id: 8f1d3a40-7c0e-4d2b-9c9a-3b1d0e6a2c5a
Control methods stay unselected. Session negotiation and enumeration such as initialize, notifications/*, ping, and tools/list cannot create a tool effect and do not carry an execution selector.
A staged rollout keeps mixed fleets observable and makes the final rejection predictable.
Classify every POST /mcp caller as an SDK decision client, a gateway server executor, or safe MCP control traffic.
Move to the minimum versions above and verify the decision selector plus canonical idempotency UUID on every tool call.
Allocate one durable UUID before network I/O, send the server-execution selector, and retain that same identity for any operator-driven replay.
Send an unselected tool call and require HTTP 426, executable:false, no Ledger row, and no upstream effect.
Promote Proxy 0.5.0 or Lite 0.9.0 only after the caller inventory is clean.
This response is intentionally non-executable and points back to this guide. It happens before mutable authorization, policy, approval, audit, receipt, or upstream work.
HTTP/1.1 426 Upgrade Required
content-type: application/json
{
"contract": "clavenar.client-migration/v1",
"error": "client_contract_required",
"executable": false,
"migration_guide": "https://clavenar.com/docs/sdk-migration/"
}
A decision request is side-effect free and may use bounded transport retries with its original UUID. A server execution does not enter an automatic transport retry loop. Polling and receipt delivery never resubmit the original tool request.