diff --git a/docs/spec/instrument/specification.md b/docs/spec/instrument/specification.md index 7292a076..d8d3a2d9 100644 --- a/docs/spec/instrument/specification.md +++ b/docs/spec/instrument/specification.md @@ -68,7 +68,7 @@ A worked example appears in [ACS in Action](../../topics/ACS_in_action_example.m | Wrapped methods | `protocols/MCP/*` is the canonical v0.1 namespace for MCP wrapping (e.g. `protocols/MCP/tools/call`). The `wrapped:` prefix is an alternative explicit-version form for deployments that pin a specific protocol version on the wire (e.g. `wrapped:mcp-2025-06-18/tools/call`). Both are valid; `protocols/*` is preferred. A2A wrapping deferred to v0.2. | | Error code range | `-32000` to `-32099` reserved for ACS | | Response shape | Discriminated union: `{ "type": "final", ... }` | -| Forward compat | Accept `X.Y.Z` matching major version; ignore unknown fields | +| Forward compat | Accept `X.Y.Z` with a matching major version. While the major version is 0, require a matching `X.Y` and accept any patch. Ignore unknown fields. | Streaming and notifications are not supported in v0.1.0. Batching is permitted as standard JSON-RPC 2.0 — Guardians SHOULD accept array-shaped requests and return an array of correlated responses, but ACS does not add atomicity, ordering, or cross-request dependency semantics in v0.1. Each request in a batch is evaluated independently, in declared order, with each carrying its own `request_id` and (if signed) its own signature. A Guardian that does not support batching MUST return `-32600 Invalid Request` for array-shaped inputs so the Observed Agent can fall back to sequential requests. @@ -479,7 +479,7 @@ Every mandated refusal maps to a fixed code, so an SDK can branch on the code wi | Code | Name | Raised when | Observed Agent recovery | |---|---|---|---| | `-32000` | `SESSION_REFUSED` | Guardian policy refuses the session and no more specific code applies (for example an `agent_id` the policy does not permit). | Do not retry without a policy or configuration change; read `data.reason`. | -| `-32001` | `UNSUPPORTED_VERSION` | No common `acs_version` at handshake (§4). | Retry the handshake with a version from `data.supported_versions`. | +| `-32001` | `UNSUPPORTED_VERSION` | No common `acs_version` at handshake (§4), or a step whose `params.acs_version` is not the session's `negotiated_version`. | Retry the handshake with a version from `data.supported_versions`, or send the session's `negotiated_version`. | | `-32002` | `PROVENANCE_REQUIRED` | Policy requires provenance but the client declared `provenance_producer: "none"` (§4, §7). | Re-handshake as a `deterministic` producer, or connect to a Guardian that does not require provenance. | | `-32003` | `CAPABILITY_NOT_NEGOTIATED` | A method or profile was exercised that the handshake did not negotiate for this session (§4). | Re-handshake to negotiate the method or profile named in `data.method`. | | `-32004` | `SIGNATURE_INVALID` | A required signature is missing, malformed, or fails verification (§10). | Re-sign the request; if it persists, re-resolve `key_id`. | diff --git a/specification/v0.1.0/handshake.json b/specification/v0.1.0/handshake.json index 819a1e53..69a09c84 100644 --- a/specification/v0.1.0/handshake.json +++ b/specification/v0.1.0/handshake.json @@ -72,7 +72,7 @@ "negotiated_version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$", - "description": "Version selected by the Guardian from the client's acs_versions_supported. MUST match the client's major version." + "description": "Version selected by the Guardian from the client's acs_versions_supported. MUST satisfy the Forward compat rule in Specification §3." }, "methods_evaluated": { "type": "array",