@adcp/sdk 6.9.0 → 6.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/adcp.js +285 -5
- package/compliance/cache/3.0.6.previous/domains/brand/index.yaml +163 -0
- package/compliance/cache/3.0.6.previous/domains/creative/index.yaml +412 -0
- package/compliance/cache/3.0.6.previous/domains/governance/index.yaml +683 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.6.previous/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.0.6.previous/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.6.previous/index.json +324 -0
- package/compliance/cache/3.0.6.previous/protocols/brand/index.yaml +163 -0
- package/compliance/cache/3.0.6.previous/protocols/creative/index.yaml +412 -0
- package/compliance/cache/3.0.6.previous/protocols/governance/index.yaml +683 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.6.previous/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.0.6.previous/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.6.previous/specialisms/audience-sync/index.yaml +280 -0
- package/compliance/cache/3.0.6.previous/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.0.6.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.0.6.previous/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.0.6.previous/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-ad-server/index.yaml +383 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-generative/index.yaml +746 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-template/index.yaml +413 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-aware-seller/index.yaml +136 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.0.6.previous/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-guaranteed/index.yaml +504 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-social/index.yaml +584 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/index.yaml +415 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-owned/index.yaml +316 -0
- package/compliance/cache/3.0.6.previous/test-kits/acme-outdoor.yaml +210 -0
- package/compliance/cache/3.0.6.previous/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.0.6.previous/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.0.6.previous/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.0.6.previous/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.0.6.previous/test-kits/substitution-observer-runner.yaml +690 -0
- package/compliance/cache/3.0.6.previous/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.0.6.previous/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/README.md +219 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.0.6.previous/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.0.6.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.0.6.previous/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.0.6.previous/universal/deterministic-testing.yaml +1343 -0
- package/compliance/cache/3.0.6.previous/universal/error-compliance.yaml +474 -0
- package/compliance/cache/3.0.6.previous/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.0.6.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.0.6.previous/universal/get-signals-pagination-integrity.yaml +211 -0
- package/compliance/cache/3.0.6.previous/universal/idempotency.yaml +593 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.0.6.previous/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.0.6.previous/universal/runner-output-contract.yaml +358 -0
- package/compliance/cache/3.0.6.previous/universal/schema-validation.yaml +526 -0
- package/compliance/cache/3.0.6.previous/universal/security.yaml +431 -0
- package/compliance/cache/3.0.6.previous/universal/signed-requests.yaml +205 -0
- package/compliance/cache/3.0.6.previous/universal/storyboard-schema.yaml +1176 -0
- package/compliance/cache/3.0.6.previous/universal/v3-envelope-integrity.yaml +106 -0
- package/compliance/cache/3.0.6.previous/universal/webhook-emission.yaml +337 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/create-adcp-server.d.ts +33 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +127 -1
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/credential-policy.d.ts +221 -0
- package/dist/lib/server/credential-policy.d.ts.map +1 -0
- package/dist/lib/server/credential-policy.js +260 -0
- package/dist/lib/server/credential-policy.js.map +1 -0
- package/dist/lib/server/dynamic-registry.d.ts +219 -0
- package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
- package/dist/lib/server/dynamic-registry.js +245 -0
- package/dist/lib/server/dynamic-registry.js.map +1 -0
- package/dist/lib/server/index.d.ts +8 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +15 -4
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/operational-platform.d.ts +239 -0
- package/dist/lib/server/operational-platform.d.ts.map +1 -0
- package/dist/lib/server/operational-platform.js +94 -0
- package/dist/lib/server/operational-platform.js.map +1 -0
- package/dist/lib/server/wire-safe.d.ts +211 -0
- package/dist/lib/server/wire-safe.d.ts.map +1 -0
- package/dist/lib/server/wire-safe.js +231 -0
- package/dist/lib/server/wire-safe.js.map +1 -0
- package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
- package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
- package/dist/lib/server/wire-spec-fields.generated.js +172 -0
- package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
- package/dist/lib/testing/compliance/index.d.ts +2 -0
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js +6 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/summary.d.ts +77 -0
- package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
- package/dist/lib/testing/compliance/summary.js +176 -0
- package/dist/lib/testing/compliance/summary.js.map +1 -0
- package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
- package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/compliance.js +51 -0
- package/dist/lib/testing/storyboard/compliance.js.map +1 -1
- package/dist/lib/testing/storyboard/index.d.ts +2 -2
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/index.js +4 -2
- package/dist/lib/testing/storyboard/index.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +58 -5
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
id: error_compliance
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Error handling and compliance"
|
|
4
|
+
category: error_compliance
|
|
5
|
+
summary: "Validates that agents return properly structured AdCP errors with correct codes, recovery hints, and transport bindings."
|
|
6
|
+
track: error_handling
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
Every AdCP agent must handle invalid input gracefully. When a buyer sends a negative budget,
|
|
12
|
+
a nonexistent product ID, or a malformed request, the agent should return a structured error
|
|
13
|
+
response — not a stack trace or a generic 500.
|
|
14
|
+
|
|
15
|
+
AdCP defines three compliance levels for error responses:
|
|
16
|
+
- L1: isError flag set on the MCP response
|
|
17
|
+
- L2: JSON text fallback with adcp_error object in content
|
|
18
|
+
- L3: structuredContent.adcp_error binding (full compliance)
|
|
19
|
+
|
|
20
|
+
This storyboard sends intentionally bad input and validates that the agent rejects it with
|
|
21
|
+
the correct error code, recovery classification, and transport binding. Agents that use the
|
|
22
|
+
adcpError() helper from @adcp/client get L3 compliance automatically.
|
|
23
|
+
|
|
24
|
+
Context echo is required on error responses — the correlation ID is even more important for
|
|
25
|
+
error diagnosis than for success cases. Every error response must include the caller's context
|
|
26
|
+
object unchanged. This contract applies to application-level errors (your tool handler returns
|
|
27
|
+
an error). MCP transport errors (unknown tool, malformed request) are outside the agent's
|
|
28
|
+
control and do not carry AdCP context.
|
|
29
|
+
|
|
30
|
+
agent:
|
|
31
|
+
interaction_model: media_buy_seller
|
|
32
|
+
capabilities:
|
|
33
|
+
- sells_media
|
|
34
|
+
examples:
|
|
35
|
+
- "Any AdCP seller agent"
|
|
36
|
+
|
|
37
|
+
caller:
|
|
38
|
+
role: buyer_agent
|
|
39
|
+
example: "Compliance test harness"
|
|
40
|
+
|
|
41
|
+
prerequisites:
|
|
42
|
+
description: |
|
|
43
|
+
No special prerequisites. The storyboard sends intentionally invalid requests
|
|
44
|
+
to test error handling.
|
|
45
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
46
|
+
|
|
47
|
+
phases:
|
|
48
|
+
- id: capability_discovery
|
|
49
|
+
title: "Capability discovery"
|
|
50
|
+
narrative: |
|
|
51
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports media buying before testing error handling.
|
|
52
|
+
|
|
53
|
+
steps:
|
|
54
|
+
- id: get_capabilities
|
|
55
|
+
title: "Check agent capabilities"
|
|
56
|
+
narrative: |
|
|
57
|
+
Verify that the agent declares the expected protocol support before
|
|
58
|
+
proceeding with domain-specific operations.
|
|
59
|
+
task: get_adcp_capabilities
|
|
60
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
61
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
62
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
63
|
+
comply_scenario: capability_discovery
|
|
64
|
+
stateful: false
|
|
65
|
+
expected: |
|
|
66
|
+
Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
|
|
67
|
+
sample_request:
|
|
68
|
+
context:
|
|
69
|
+
correlation_id: "error_compliance--get_capabilities"
|
|
70
|
+
validations:
|
|
71
|
+
- check: response_schema
|
|
72
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
73
|
+
- check: field_present
|
|
74
|
+
path: "supported_protocols"
|
|
75
|
+
description: "Agent declares supported protocols"
|
|
76
|
+
|
|
77
|
+
- check: field_present
|
|
78
|
+
path: "context"
|
|
79
|
+
description: "Response echoes back the context object"
|
|
80
|
+
- check: field_value
|
|
81
|
+
path: "context.correlation_id"
|
|
82
|
+
value: "error_compliance--get_capabilities"
|
|
83
|
+
description: "Context correlation_id returned unchanged"
|
|
84
|
+
- id: error_responses
|
|
85
|
+
title: "Error responses for invalid input"
|
|
86
|
+
narrative: |
|
|
87
|
+
The buyer sends requests with intentionally invalid data — negative budgets, missing
|
|
88
|
+
required fields, nonexistent product IDs. Each request should be rejected with a
|
|
89
|
+
structured error containing an appropriate AdCP error code.
|
|
90
|
+
|
|
91
|
+
steps:
|
|
92
|
+
- id: negative_budget
|
|
93
|
+
title: "Reject negative budget"
|
|
94
|
+
narrative: |
|
|
95
|
+
A negative budget is never valid. The agent must reject this with a structured
|
|
96
|
+
AdCP error — VALIDATION_ERROR is the canonical code for business-rule violations
|
|
97
|
+
that pass schema validation (a number is present, it just can't be negative).
|
|
98
|
+
INVALID_REQUEST is accepted as a reasonable alternative.
|
|
99
|
+
task: create_media_buy
|
|
100
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
101
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
102
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
103
|
+
comply_scenario: error_handling
|
|
104
|
+
expect_error: true
|
|
105
|
+
negative_path: schema_invalid
|
|
106
|
+
stateful: false
|
|
107
|
+
expected: |
|
|
108
|
+
Reject the request with an error containing:
|
|
109
|
+
- code: VALIDATION_ERROR or INVALID_REQUEST
|
|
110
|
+
- recovery: correctable
|
|
111
|
+
- field: packages[0].budget (optional but recommended)
|
|
112
|
+
|
|
113
|
+
sample_request:
|
|
114
|
+
brand:
|
|
115
|
+
domain: "acmeoutdoor.example"
|
|
116
|
+
account:
|
|
117
|
+
brand:
|
|
118
|
+
domain: "acmeoutdoor.example"
|
|
119
|
+
operator: "pinnacle-agency.example"
|
|
120
|
+
idempotency_key: "error-test-negative-budget"
|
|
121
|
+
start_time: "2026-05-01T00:00:00Z"
|
|
122
|
+
end_time: "2026-05-31T23:59:59Z"
|
|
123
|
+
packages:
|
|
124
|
+
- product_id: "test-product"
|
|
125
|
+
budget: -500
|
|
126
|
+
pricing_option_id: "test-pricing"
|
|
127
|
+
|
|
128
|
+
context:
|
|
129
|
+
correlation_id: "error_compliance--negative_budget"
|
|
130
|
+
validations:
|
|
131
|
+
- check: error_code
|
|
132
|
+
allowed_values: ["VALIDATION_ERROR", "INVALID_REQUEST", "BUDGET_TOO_LOW"]
|
|
133
|
+
description: "Error code is VALIDATION_ERROR, INVALID_REQUEST, or BUDGET_TOO_LOW"
|
|
134
|
+
|
|
135
|
+
- check: field_present
|
|
136
|
+
path: "context"
|
|
137
|
+
description: "Response echoes back the context object"
|
|
138
|
+
- check: field_value
|
|
139
|
+
path: "context.correlation_id"
|
|
140
|
+
value: "error_compliance--negative_budget"
|
|
141
|
+
description: "Context correlation_id returned unchanged"
|
|
142
|
+
- id: nonexistent_product
|
|
143
|
+
title: "Reject nonexistent product ID"
|
|
144
|
+
narrative: |
|
|
145
|
+
The buyer references a product ID that does not exist on this platform.
|
|
146
|
+
The agent should return PRODUCT_NOT_FOUND, PRODUCT_UNAVAILABLE, or INVALID_REQUEST
|
|
147
|
+
— any of these signals "this product is not sellable."
|
|
148
|
+
task: create_media_buy
|
|
149
|
+
expect_error: true
|
|
150
|
+
negative_path: payload_well_formed
|
|
151
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
152
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
153
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
154
|
+
comply_scenario: error_handling
|
|
155
|
+
stateful: false
|
|
156
|
+
expected: |
|
|
157
|
+
Reject the request with:
|
|
158
|
+
- code: PRODUCT_NOT_FOUND, PRODUCT_UNAVAILABLE, or INVALID_REQUEST
|
|
159
|
+
- recovery: correctable
|
|
160
|
+
|
|
161
|
+
sample_request:
|
|
162
|
+
brand:
|
|
163
|
+
domain: "acmeoutdoor.example"
|
|
164
|
+
account:
|
|
165
|
+
brand:
|
|
166
|
+
domain: "acmeoutdoor.example"
|
|
167
|
+
operator: "pinnacle-agency.example"
|
|
168
|
+
idempotency_key: "error-test-nonexistent-product"
|
|
169
|
+
start_time: "2026-05-01T00:00:00Z"
|
|
170
|
+
end_time: "2026-05-31T23:59:59Z"
|
|
171
|
+
packages:
|
|
172
|
+
- product_id: "nonexistent-product-id-xyz"
|
|
173
|
+
budget: 10000
|
|
174
|
+
pricing_option_id: "test-pricing"
|
|
175
|
+
|
|
176
|
+
context:
|
|
177
|
+
correlation_id: "error_compliance--nonexistent_product"
|
|
178
|
+
validations:
|
|
179
|
+
- check: error_code
|
|
180
|
+
allowed_values: ["PRODUCT_NOT_FOUND", "PRODUCT_UNAVAILABLE", "INVALID_REQUEST"]
|
|
181
|
+
description: "Error code identifies the missing/unavailable product"
|
|
182
|
+
|
|
183
|
+
- check: field_present
|
|
184
|
+
path: "context"
|
|
185
|
+
description: "Response echoes back the context object"
|
|
186
|
+
- check: field_value
|
|
187
|
+
path: "context.correlation_id"
|
|
188
|
+
value: "error_compliance--nonexistent_product"
|
|
189
|
+
description: "Context correlation_id returned unchanged"
|
|
190
|
+
- id: missing_fields
|
|
191
|
+
title: "Reject empty get_products request"
|
|
192
|
+
narrative: |
|
|
193
|
+
Send a get_products request with no brief and no buying_mode. The agent should
|
|
194
|
+
either return products (treating it as a catalog browse) or return an error
|
|
195
|
+
requesting the missing brief.
|
|
196
|
+
task: get_products
|
|
197
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
198
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
199
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
200
|
+
comply_scenario: error_handling
|
|
201
|
+
stateful: false
|
|
202
|
+
# The test value of this step is that buying_mode is missing — do not
|
|
203
|
+
# schema-validate the sample_request, or the lint would reject the
|
|
204
|
+
# very shape the step exists to exercise.
|
|
205
|
+
sample_request_skip_schema: true
|
|
206
|
+
expected: |
|
|
207
|
+
Either return products (treating empty request as browse) or return a
|
|
208
|
+
structured error requesting the missing brief. Both are valid.
|
|
209
|
+
|
|
210
|
+
sample_request:
|
|
211
|
+
account:
|
|
212
|
+
brand:
|
|
213
|
+
domain: "acmeoutdoor.example"
|
|
214
|
+
operator: "pinnacle-agency.example"
|
|
215
|
+
|
|
216
|
+
context:
|
|
217
|
+
correlation_id: "error_compliance--missing_fields"
|
|
218
|
+
validations:
|
|
219
|
+
- check: response_schema
|
|
220
|
+
description: "Response is either valid products or a structured error"
|
|
221
|
+
|
|
222
|
+
- check: field_present
|
|
223
|
+
path: "context"
|
|
224
|
+
description: "Response echoes back the context object"
|
|
225
|
+
- check: field_value
|
|
226
|
+
path: "context.correlation_id"
|
|
227
|
+
value: "error_compliance--missing_fields"
|
|
228
|
+
description: "Context correlation_id returned unchanged"
|
|
229
|
+
- id: reversed_dates_error
|
|
230
|
+
title: "Reject reversed dates with error code"
|
|
231
|
+
narrative: |
|
|
232
|
+
Send a create_media_buy with end_time before start_time. This is a business-rule
|
|
233
|
+
violation — both fields are valid ISO timestamps, but their relationship is not
|
|
234
|
+
coherent. The canonical code is VALIDATION_ERROR; INVALID_REQUEST is accepted.
|
|
235
|
+
task: create_media_buy
|
|
236
|
+
expect_error: true
|
|
237
|
+
negative_path: payload_well_formed
|
|
238
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
239
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
240
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
241
|
+
comply_scenario: error_handling
|
|
242
|
+
stateful: false
|
|
243
|
+
expected: |
|
|
244
|
+
Reject with:
|
|
245
|
+
- code: VALIDATION_ERROR or INVALID_REQUEST
|
|
246
|
+
- recovery: correctable
|
|
247
|
+
|
|
248
|
+
sample_request:
|
|
249
|
+
brand:
|
|
250
|
+
domain: "acmeoutdoor.example"
|
|
251
|
+
account:
|
|
252
|
+
brand:
|
|
253
|
+
domain: "acmeoutdoor.example"
|
|
254
|
+
operator: "pinnacle-agency.example"
|
|
255
|
+
idempotency_key: "error-test-reversed-dates"
|
|
256
|
+
start_time: "2026-12-31T00:00:00Z"
|
|
257
|
+
end_time: "2026-01-01T00:00:00Z"
|
|
258
|
+
packages:
|
|
259
|
+
- product_id: "test-product"
|
|
260
|
+
budget: 10000
|
|
261
|
+
pricing_option_id: "test-pricing"
|
|
262
|
+
|
|
263
|
+
context:
|
|
264
|
+
correlation_id: "error_compliance--reversed_dates_error"
|
|
265
|
+
validations:
|
|
266
|
+
- check: error_code
|
|
267
|
+
allowed_values: ["VALIDATION_ERROR", "INVALID_REQUEST"]
|
|
268
|
+
description: "Error code is VALIDATION_ERROR or INVALID_REQUEST"
|
|
269
|
+
|
|
270
|
+
- check: field_present
|
|
271
|
+
path: "context"
|
|
272
|
+
description: "Response echoes back the context object"
|
|
273
|
+
- check: field_value
|
|
274
|
+
path: "context.correlation_id"
|
|
275
|
+
value: "error_compliance--reversed_dates_error"
|
|
276
|
+
description: "Context correlation_id returned unchanged"
|
|
277
|
+
- id: error_structure
|
|
278
|
+
title: "Error structure compliance"
|
|
279
|
+
narrative: |
|
|
280
|
+
Validates that error responses follow the AdCP error structure with required
|
|
281
|
+
and optional fields.
|
|
282
|
+
|
|
283
|
+
steps:
|
|
284
|
+
- id: validate_error_shape
|
|
285
|
+
title: "Validate error response structure"
|
|
286
|
+
narrative: |
|
|
287
|
+
Trigger an error and inspect the response structure. The adcp_error object
|
|
288
|
+
must have code and message. Optional fields include recovery, retry_after,
|
|
289
|
+
field, and suggestion.
|
|
290
|
+
task: create_media_buy
|
|
291
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
292
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
293
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
294
|
+
comply_scenario: error_codes
|
|
295
|
+
expect_error: true
|
|
296
|
+
negative_path: schema_invalid
|
|
297
|
+
stateful: false
|
|
298
|
+
expected: |
|
|
299
|
+
Error response with:
|
|
300
|
+
- code: a recognized AdCP error code
|
|
301
|
+
- message: human-readable description
|
|
302
|
+
- recovery: correctable, transient, or fatal (optional)
|
|
303
|
+
|
|
304
|
+
sample_request:
|
|
305
|
+
brand:
|
|
306
|
+
domain: "acmeoutdoor.example"
|
|
307
|
+
account:
|
|
308
|
+
brand:
|
|
309
|
+
domain: "acmeoutdoor.example"
|
|
310
|
+
operator: "pinnacle-agency.example"
|
|
311
|
+
idempotency_key: "error-structure-test"
|
|
312
|
+
start_time: "2026-12-31T00:00:00Z"
|
|
313
|
+
end_time: "2026-01-01T00:00:00Z"
|
|
314
|
+
packages:
|
|
315
|
+
- product_id: "test-product"
|
|
316
|
+
budget: -1
|
|
317
|
+
pricing_option_id: "test-pricing"
|
|
318
|
+
|
|
319
|
+
context:
|
|
320
|
+
correlation_id: "error_compliance--validate_error_shape"
|
|
321
|
+
validations:
|
|
322
|
+
- check: error_code
|
|
323
|
+
description: "Response surfaces a typed error code via either adcp_error (envelope) or errors[] (payload)"
|
|
324
|
+
- check: field_present
|
|
325
|
+
path: "context"
|
|
326
|
+
description: "Response echoes back the context object even on errors"
|
|
327
|
+
- check: field_value
|
|
328
|
+
path: "context.correlation_id"
|
|
329
|
+
value: "error_compliance--validate_error_shape"
|
|
330
|
+
description: "Context correlation_id returned unchanged"
|
|
331
|
+
|
|
332
|
+
- id: version_negotiation
|
|
333
|
+
title: "Protocol version validation"
|
|
334
|
+
narrative: |
|
|
335
|
+
Every AdCP request may carry adcp_major_version. Sellers validate against their
|
|
336
|
+
declared supported_major_versions (from get_adcp_capabilities) and return
|
|
337
|
+
VERSION_UNSUPPORTED when the buyer asks for a version the seller does not speak.
|
|
338
|
+
When omitted, the seller assumes its highest supported version — so version
|
|
339
|
+
validation only fires when the buyer explicitly declares an unsupported number.
|
|
340
|
+
|
|
341
|
+
steps:
|
|
342
|
+
- id: unsupported_major_version
|
|
343
|
+
title: "Reject unsupported adcp_major_version"
|
|
344
|
+
narrative: |
|
|
345
|
+
Send a get_products request asserting a future major version the seller cannot
|
|
346
|
+
support. The seller must reject with VERSION_UNSUPPORTED and indicate which
|
|
347
|
+
versions are supported so the buyer can retry.
|
|
348
|
+
task: get_products
|
|
349
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
350
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
351
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
352
|
+
comply_scenario: error_handling
|
|
353
|
+
expect_error: true
|
|
354
|
+
negative_path: payload_well_formed
|
|
355
|
+
stateful: false
|
|
356
|
+
expected: |
|
|
357
|
+
Reject with:
|
|
358
|
+
- code: VERSION_UNSUPPORTED
|
|
359
|
+
- recovery: fatal
|
|
360
|
+
- message referencing the buyer's requested version and the seller's supported set
|
|
361
|
+
|
|
362
|
+
sample_request:
|
|
363
|
+
adcp_major_version: 99
|
|
364
|
+
buying_mode: "brief"
|
|
365
|
+
brief: "Version negotiation probe"
|
|
366
|
+
account:
|
|
367
|
+
brand:
|
|
368
|
+
domain: "acmeoutdoor.example"
|
|
369
|
+
operator: "pinnacle-agency.example"
|
|
370
|
+
|
|
371
|
+
context:
|
|
372
|
+
correlation_id: "error_compliance--unsupported_major_version"
|
|
373
|
+
validations:
|
|
374
|
+
- check: error_code
|
|
375
|
+
value: "VERSION_UNSUPPORTED"
|
|
376
|
+
description: "Error code is VERSION_UNSUPPORTED"
|
|
377
|
+
- check: field_present
|
|
378
|
+
path: "context"
|
|
379
|
+
description: "Response echoes back the context object even on errors"
|
|
380
|
+
- check: field_value
|
|
381
|
+
path: "context.correlation_id"
|
|
382
|
+
value: "error_compliance--unsupported_major_version"
|
|
383
|
+
description: "Context correlation_id returned unchanged"
|
|
384
|
+
|
|
385
|
+
- id: supported_major_version
|
|
386
|
+
title: "Accept supported adcp_major_version"
|
|
387
|
+
narrative: |
|
|
388
|
+
Send a get_products request with the current major version (3). The seller
|
|
389
|
+
must accept the request normally — version negotiation only rejects mismatched
|
|
390
|
+
versions, not explicit declarations of a supported one.
|
|
391
|
+
task: get_products
|
|
392
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
393
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
394
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
395
|
+
comply_scenario: full_sales_flow
|
|
396
|
+
stateful: false
|
|
397
|
+
expected: |
|
|
398
|
+
Return products normally — adcp_major_version: 3 is a supported version.
|
|
399
|
+
|
|
400
|
+
sample_request:
|
|
401
|
+
adcp_major_version: 3
|
|
402
|
+
buying_mode: "brief"
|
|
403
|
+
brief: "Display advertising for outdoor lifestyle campaign"
|
|
404
|
+
account:
|
|
405
|
+
brand:
|
|
406
|
+
domain: "acmeoutdoor.example"
|
|
407
|
+
operator: "pinnacle-agency.example"
|
|
408
|
+
|
|
409
|
+
context:
|
|
410
|
+
correlation_id: "error_compliance--supported_major_version"
|
|
411
|
+
validations:
|
|
412
|
+
- check: response_schema
|
|
413
|
+
description: "Response matches get-products-response.json schema"
|
|
414
|
+
- check: field_present
|
|
415
|
+
path: "context"
|
|
416
|
+
description: "Response echoes back the context object"
|
|
417
|
+
- check: field_value
|
|
418
|
+
path: "context.correlation_id"
|
|
419
|
+
value: "error_compliance--supported_major_version"
|
|
420
|
+
description: "Context correlation_id returned unchanged"
|
|
421
|
+
|
|
422
|
+
- id: error_transport
|
|
423
|
+
title: "Error transport bindings"
|
|
424
|
+
narrative: |
|
|
425
|
+
Validates that errors are transported correctly via MCP. The isError flag must
|
|
426
|
+
be set, and the error should be available in both JSON text content (L2) and
|
|
427
|
+
structuredContent (L3) bindings.
|
|
428
|
+
|
|
429
|
+
steps:
|
|
430
|
+
- id: validate_transport_binding
|
|
431
|
+
title: "Validate error transport binding"
|
|
432
|
+
narrative: |
|
|
433
|
+
Trigger an error and verify the MCP transport binding: isError flag must be
|
|
434
|
+
set to true, and the error content should include the adcp_error object.
|
|
435
|
+
task: create_media_buy
|
|
436
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
437
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
438
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
439
|
+
comply_scenario: error_transport
|
|
440
|
+
expect_error: true
|
|
441
|
+
negative_path: schema_invalid
|
|
442
|
+
stateful: false
|
|
443
|
+
expected: |
|
|
444
|
+
MCP response with:
|
|
445
|
+
- isError: true
|
|
446
|
+
- content containing adcp_error (L2: JSON text, L3: structuredContent)
|
|
447
|
+
|
|
448
|
+
sample_request:
|
|
449
|
+
brand:
|
|
450
|
+
domain: "acmeoutdoor.example"
|
|
451
|
+
account:
|
|
452
|
+
brand:
|
|
453
|
+
domain: "acmeoutdoor.example"
|
|
454
|
+
operator: "pinnacle-agency.example"
|
|
455
|
+
idempotency_key: "error-transport-test"
|
|
456
|
+
start_time: "2026-12-31T00:00:00Z"
|
|
457
|
+
end_time: "2026-01-01T00:00:00Z"
|
|
458
|
+
packages:
|
|
459
|
+
- product_id: "nonexistent"
|
|
460
|
+
budget: -1
|
|
461
|
+
pricing_option_id: "bad-pricing"
|
|
462
|
+
|
|
463
|
+
context:
|
|
464
|
+
correlation_id: "error_compliance--validate_transport_binding"
|
|
465
|
+
validations:
|
|
466
|
+
- check: error_code
|
|
467
|
+
description: "Transport binding surfaces a typed error code via either adcp_error (envelope) or errors[] (payload)"
|
|
468
|
+
- check: field_present
|
|
469
|
+
path: "context"
|
|
470
|
+
description: "Response echoes back the context object even on errors"
|
|
471
|
+
- check: field_value
|
|
472
|
+
path: "context.correlation_id"
|
|
473
|
+
value: "error_compliance--validate_transport_binding"
|
|
474
|
+
description: "Context correlation_id returned unchanged"
|