You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
AdCP 3.1 (PR adcontextprotocol/adcp#3906, released as 3.1.0-beta.1)
consolidates the 3.0.5 PERMISSION_DENIED + details.status placeholder
for per-buyer-agent commercial-status rejections into dedicated codes
AGENT_SUSPENDED and AGENT_BLOCKED (recovery="terminal", no details
payload — the code itself is the discriminator, mirroring
BILLING_NOT_PERMITTED_FOR_AGENT).
Wire shape change in _resolve_buyer_agent:
- recognized + suspended: PERMISSION_DENIED + details.status="suspended"
+ recovery="correctable" -> AGENT_SUSPENDED + recovery="terminal"
- recognized + blocked: PERMISSION_DENIED + details.status="blocked"
+ recovery="correctable" -> AGENT_BLOCKED + recovery="terminal"
- unrecognized paths (registry miss / no credential / unknown status):
unchanged - still PERMISSION_DENIED with no details (cross-tenant
onboarding-oracle clamp preserved).
The recovery="correctable" -> "terminal" flip is the spec's corrective
fix: the placeholder inherited PERMISSION_DENIED's correctable hint,
which contradicted the no-retry MUST for commercial-status rejections.
Uses the established KNOWN_NON_SPEC_CODES allowlist pattern (same
precedent as BILLING_NOT_PERMITTED_FOR_AGENT) - ADCP_VERSION stays
pinned at 3.0.7. Allowlist entries carry TODO-on-3.1-bundle-bump
markers so they auto-drop when the SDK eventually bumps to 3.1.
BREAKING (narrow): PermissionDeniedError(status=...) is removed. The
status field is gone from error-details/agent-permission-denied.json
in 3.1. Migrate to: raise AdcpError("AGENT_SUSPENDED", recovery="terminal")
for per-agent commercial status, or PermissionDeniedError(scope="agent",
reason="sandbox_only") for the remaining provisioning gate. Passing
status= now raises TypeError with a migration message; an explicit
**details guard prevents the kwarg from silently landing in
error.details and emitting a wire-invalid response.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0 commit comments