@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,358 @@
|
|
|
1
|
+
# Runner Output Contract
|
|
2
|
+
#
|
|
3
|
+
# Defines the failure-result shape that any AdCP compliance runner MUST emit
|
|
4
|
+
# when it reports storyboard results to a user or coding agent. Applies to
|
|
5
|
+
# evaluate_agent_quality, `@adcp/client storyboard run`, and any other harness
|
|
6
|
+
# that executes the storyboards published under /compliance/{version}/.
|
|
7
|
+
#
|
|
8
|
+
# Rationale
|
|
9
|
+
# ---------
|
|
10
|
+
# A failing validation is only actionable if the implementor can see:
|
|
11
|
+
# 1. The exact request the runner sent.
|
|
12
|
+
# 2. The exact response the agent returned.
|
|
13
|
+
# 3. Which field failed (as an RFC 6901 JSON Pointer).
|
|
14
|
+
# 4. What the runner expected vs. what it observed.
|
|
15
|
+
# 5. The identity of the schema applied (so the implementor can re-validate
|
|
16
|
+
# locally against the same artifact).
|
|
17
|
+
#
|
|
18
|
+
# Without these, a buyer building an agent cannot diagnose failures even when
|
|
19
|
+
# their own local validation passes — a mismatch between the schema they tested
|
|
20
|
+
# against and the schema the runner used is indistinguishable from a genuine
|
|
21
|
+
# agent bug.
|
|
22
|
+
#
|
|
23
|
+
# Storyboard AUTHORING is covered in storyboard-schema.yaml. This contract
|
|
24
|
+
# covers runner OUTPUT.
|
|
25
|
+
#
|
|
26
|
+
# --- Schema definition ---
|
|
27
|
+
|
|
28
|
+
id: runner_output_contract
|
|
29
|
+
version: "1.1.0"
|
|
30
|
+
title: "Runner output contract"
|
|
31
|
+
summary: "Required failure-detail shape that AdCP storyboard runners MUST emit so implementors can self-diagnose validation failures."
|
|
32
|
+
|
|
33
|
+
# Conforming implementation: adcp-client PR #611
|
|
34
|
+
# (src/lib/testing/storyboard/types.ts — RunnerRequestRecord,
|
|
35
|
+
# RunnerResponseRecord, ValidationResult, RunnerSkipResult, etc.).
|
|
36
|
+
# The concrete shapes, redaction pattern, and header allowlist below are
|
|
37
|
+
# taken from that implementation.
|
|
38
|
+
|
|
39
|
+
# A storyboard step result is produced per step the runner executes. Each
|
|
40
|
+
# step result carries zero or more validation results — one per `check` in
|
|
41
|
+
# the storyboard's step.validations array, plus any transport-level check
|
|
42
|
+
# the runner performs (e.g., extraction path).
|
|
43
|
+
|
|
44
|
+
step_result:
|
|
45
|
+
description: |
|
|
46
|
+
Runners MUST emit one step result per executed step. Skipped steps MUST
|
|
47
|
+
include a skip result block. Failed steps MUST include at least one
|
|
48
|
+
validation result with passed: false.
|
|
49
|
+
required_fields:
|
|
50
|
+
- storyboard_id # e.g. "capability_discovery"
|
|
51
|
+
- phase_id # e.g. "protocol_discovery"
|
|
52
|
+
- step_id # e.g. "get_capabilities"
|
|
53
|
+
- task # AdCP task name invoked, e.g. "get_adcp_capabilities"
|
|
54
|
+
- passed # boolean — all required validations passed
|
|
55
|
+
- duration_ms # wall-clock time for this step
|
|
56
|
+
- validations # array of validation_result objects (see below)
|
|
57
|
+
- extraction # transport extraction record (see below)
|
|
58
|
+
optional_fields:
|
|
59
|
+
- skip # skip_result block when the step was not run
|
|
60
|
+
- error # transport-level error (no validations attempted)
|
|
61
|
+
- request # exact request the runner sent (see request block)
|
|
62
|
+
- response # exact response observed (see response block)
|
|
63
|
+
|
|
64
|
+
validation_result:
|
|
65
|
+
description: |
|
|
66
|
+
Every validation result — whether passed or failed — MUST carry the fields
|
|
67
|
+
below. Failed validations MUST include request, response, json_pointer,
|
|
68
|
+
expected, and actual unless the failure is transport-level (in which case
|
|
69
|
+
json_pointer, expected, and actual MAY be null and the step-level error
|
|
70
|
+
field carries the transport failure).
|
|
71
|
+
required_fields:
|
|
72
|
+
- check # Validation kind from storyboard-schema.yaml:
|
|
73
|
+
# response_schema | field_present |
|
|
74
|
+
# envelope_field_present | field_value |
|
|
75
|
+
# field_value_or_absent | status_code | http_status |
|
|
76
|
+
# http_status_in | error_code | on_401_require_header |
|
|
77
|
+
# resource_equals_agent_url | any_of | refs_resolve
|
|
78
|
+
- passed # boolean
|
|
79
|
+
- description # human-readable description copied from the
|
|
80
|
+
# storyboard validation entry (so the implementor
|
|
81
|
+
# sees the same text the author wrote)
|
|
82
|
+
required_on_failure:
|
|
83
|
+
- request # exact request the runner sent (see request block)
|
|
84
|
+
- response # exact response observed (see response block)
|
|
85
|
+
- json_pointer # RFC 6901 pointer to the failing field in the
|
|
86
|
+
# response, or the request for input-level
|
|
87
|
+
# failures. Null only when the failure is
|
|
88
|
+
# transport-level and no payload was returned.
|
|
89
|
+
- expected # machine-readable expected value:
|
|
90
|
+
# response_schema → schema $id that was applied
|
|
91
|
+
# field_value → expected value (any JSON type)
|
|
92
|
+
# field_value_or_absent → value or allowed_values array
|
|
93
|
+
# from the storyboard validation
|
|
94
|
+
# field_present → the path that should resolve
|
|
95
|
+
# envelope_field_present → the path that should resolve
|
|
96
|
+
# in the protocol envelope
|
|
97
|
+
# status_code → expected status
|
|
98
|
+
# error_code → expected error code
|
|
99
|
+
# any_of → array of acceptable forms
|
|
100
|
+
- actual # machine-readable actual value observed:
|
|
101
|
+
# response_schema → array of schema errors
|
|
102
|
+
# (each { instance_path,
|
|
103
|
+
# schema_path, keyword,
|
|
104
|
+
# message })
|
|
105
|
+
# field_value → actual value (any JSON type)
|
|
106
|
+
# field_value_or_absent → actual value (any JSON type);
|
|
107
|
+
# null when the field was absent
|
|
108
|
+
# field_present → null (the field was missing)
|
|
109
|
+
# or the observed non-object
|
|
110
|
+
# value
|
|
111
|
+
# envelope_field_present → null (the field was missing)
|
|
112
|
+
# or the observed non-object
|
|
113
|
+
# value (scoped to envelope)
|
|
114
|
+
- schema_id # $id of the response schema applied. Required
|
|
115
|
+
# when check == response_schema, null otherwise.
|
|
116
|
+
- schema_url # Resolvable URL the implementor can fetch to
|
|
117
|
+
# validate locally. Required when
|
|
118
|
+
# check == response_schema, null otherwise.
|
|
119
|
+
optional_fields:
|
|
120
|
+
- remediation # runner-suggested fix when the failure maps to
|
|
121
|
+
# a well-known cause (e.g., "agent did not echo
|
|
122
|
+
# context.correlation_id — see
|
|
123
|
+
# docs/building/implementation/task-lifecycle")
|
|
124
|
+
|
|
125
|
+
request:
|
|
126
|
+
description: |
|
|
127
|
+
Exact request the runner sent, per transport. Runners MUST redact secrets
|
|
128
|
+
before emission — see the `security` block below.
|
|
129
|
+
required_fields:
|
|
130
|
+
- transport # "mcp" | "a2a" | "http"
|
|
131
|
+
- operation # task/tool/skill name actually invoked (matches
|
|
132
|
+
# step.task after any test-kit interpolation)
|
|
133
|
+
- payload # fully-resolved JSON payload after test-kit
|
|
134
|
+
# substitution and context injection, with
|
|
135
|
+
# secret-bearing fields replaced per the
|
|
136
|
+
# redaction policy in the security block.
|
|
137
|
+
optional_fields:
|
|
138
|
+
- headers # Runners SHOULD NOT populate this field by
|
|
139
|
+
# default — see security.request_headers. The
|
|
140
|
+
# field exists for future auth-override captures
|
|
141
|
+
# that carry a fully-redacted form.
|
|
142
|
+
- url # full URL for http/a2a; omit for stdio MCP
|
|
143
|
+
|
|
144
|
+
response:
|
|
145
|
+
description: |
|
|
146
|
+
Exact response observed from the agent, per transport.
|
|
147
|
+
required_fields:
|
|
148
|
+
- transport # "mcp" | "a2a" | "http"
|
|
149
|
+
- payload # MCP: { isError, structuredContent, content }
|
|
150
|
+
# A2A: the Task object — record task.status.state
|
|
151
|
+
# alongside payload. Extract from
|
|
152
|
+
# task.artifacts[0].parts[] DataPart for final
|
|
153
|
+
# states and task.status.message.parts[] for
|
|
154
|
+
# interim states (per
|
|
155
|
+
# docs/building/implementation/a2a-response-extraction.mdx).
|
|
156
|
+
# http: parsed body
|
|
157
|
+
optional_fields:
|
|
158
|
+
- status # HTTP status where applicable
|
|
159
|
+
- headers # observed response headers, filtered through
|
|
160
|
+
# the allowlist in security.response_headers
|
|
161
|
+
- duration_ms # wall-clock time for this request
|
|
162
|
+
|
|
163
|
+
extraction:
|
|
164
|
+
description: |
|
|
165
|
+
Runners MUST follow the MCP response-extraction algorithm at
|
|
166
|
+
docs/building/implementation/mcp-response-extraction.mdx and the A2A
|
|
167
|
+
equivalent. When both structuredContent and content[].text are present,
|
|
168
|
+
structuredContent wins. Recording the path that was actually used lets
|
|
169
|
+
the implementor distinguish a runner extraction bug from an agent bug.
|
|
170
|
+
required_fields:
|
|
171
|
+
- path # "structured_content" | "text_fallback" |
|
|
172
|
+
# "error" | "none"
|
|
173
|
+
optional_fields:
|
|
174
|
+
- note # e.g. "structuredContent contained only
|
|
175
|
+
# adcp_error — treated as error"
|
|
176
|
+
|
|
177
|
+
security:
|
|
178
|
+
description: |
|
|
179
|
+
Runner output is consumed in compliance reports, chat transcripts, and
|
|
180
|
+
shared dashboards where credentials or breadcrumbs a hostile agent plants
|
|
181
|
+
in a response must not surface. A runner claiming contract conformance
|
|
182
|
+
without the rules below could leak tokens through a compliant-looking
|
|
183
|
+
report — defeating the contract's purpose. These rules are normative.
|
|
184
|
+
|
|
185
|
+
payload_redaction:
|
|
186
|
+
description: |
|
|
187
|
+
Runners MUST recursively redact key-value pairs from request.payload
|
|
188
|
+
and response.payload before emitting the step result. Values at keys
|
|
189
|
+
matching the pattern below are replaced with the literal string
|
|
190
|
+
"[redacted]". Matching is case-insensitive and applies at any depth.
|
|
191
|
+
pattern: |
|
|
192
|
+
^(authorization|credentials?|token|api[_-]?key|password|secret|
|
|
193
|
+
client[_-]secret|refresh[_-]token|access[_-]token|bearer|
|
|
194
|
+
session[_-]token|offering[_-]token|cookie|set[_-]cookie)$
|
|
195
|
+
notes: |
|
|
196
|
+
The pattern above is the MINIMUM floor taken from the adcp-client#611
|
|
197
|
+
conforming implementation. Runners MAY extend it for operator-
|
|
198
|
+
specific key names (e.g., internal vendor headers) but MUST NOT
|
|
199
|
+
narrow it. Redaction happens after the payload is serialized for
|
|
200
|
+
the report, not at transport time — the wire request carries real
|
|
201
|
+
credentials; the emitted record does not.
|
|
202
|
+
|
|
203
|
+
response_headers:
|
|
204
|
+
description: |
|
|
205
|
+
Response headers MUST pass through an allowlist before emission. Any
|
|
206
|
+
header not in the allowlist MUST be dropped (not redacted — absent).
|
|
207
|
+
Dropping rather than redacting avoids publishing the set of header
|
|
208
|
+
names a hostile agent added, which itself can be a breadcrumb.
|
|
209
|
+
allowlist:
|
|
210
|
+
- content-type
|
|
211
|
+
- content-length
|
|
212
|
+
- content-encoding
|
|
213
|
+
- www-authenticate
|
|
214
|
+
- location
|
|
215
|
+
- retry-after
|
|
216
|
+
- x-request-id
|
|
217
|
+
- x-correlation-id
|
|
218
|
+
notes: |
|
|
219
|
+
www-authenticate is retained because it's load-bearing for auth-probe
|
|
220
|
+
validations (on_401_require_header). Matching is case-insensitive.
|
|
221
|
+
|
|
222
|
+
request_headers:
|
|
223
|
+
description: |
|
|
224
|
+
Runners SHOULD NOT populate request.headers. A runner that builds
|
|
225
|
+
`Authorization: Bearer <token>` headers in-flight would leak the token
|
|
226
|
+
by echoing the observed request into a shared report. When a runner
|
|
227
|
+
does populate request.headers (e.g., for auth-override probes that
|
|
228
|
+
intentionally send bogus credentials), values at keys matching the
|
|
229
|
+
payload_redaction pattern MUST be replaced with "[redacted]" and all
|
|
230
|
+
other headers MUST pass through the response_headers allowlist.
|
|
231
|
+
|
|
232
|
+
rendered_output_fencing:
|
|
233
|
+
description: |
|
|
234
|
+
Validation `error` and `actual` fields can carry strings the agent
|
|
235
|
+
under test controlled. When a runner renders these into a shared
|
|
236
|
+
surface (chat transcript, markdown report, summary fed to another
|
|
237
|
+
LLM), those strings MUST be fenced with a nonce or otherwise isolated
|
|
238
|
+
so a hostile error message cannot inject instructions into a
|
|
239
|
+
downstream summarizer. This applies to rendered output, not to the
|
|
240
|
+
machine-readable step_result — the raw string stays in the JSON for
|
|
241
|
+
programmatic consumers.
|
|
242
|
+
|
|
243
|
+
skip_result:
|
|
244
|
+
description: |
|
|
245
|
+
When a track, storyboard, phase, or step is skipped, runners MUST
|
|
246
|
+
distinguish between the reasons below so an implementor knows whether
|
|
247
|
+
the skip is informative (the agent did not claim the protocol) or
|
|
248
|
+
masking (the runner could not apply the storyboard even though the
|
|
249
|
+
agent claimed the protocol).
|
|
250
|
+
required_fields:
|
|
251
|
+
- reason # not_applicable | no_phases |
|
|
252
|
+
# prerequisite_failed | missing_tool |
|
|
253
|
+
# missing_test_controller |
|
|
254
|
+
# unsatisfied_contract | peer_branch_taken |
|
|
255
|
+
# peer_substituted
|
|
256
|
+
- detail # human-readable explanation citing the
|
|
257
|
+
# declared supported_protocols / specialisms
|
|
258
|
+
# and, if relevant, the missing tool,
|
|
259
|
+
# prerequisite step id, or contract key.
|
|
260
|
+
reasons:
|
|
261
|
+
not_applicable: |
|
|
262
|
+
The agent did not declare the protocol or specialism this storyboard
|
|
263
|
+
targets. detail MUST cite the agent's declared supported_protocols
|
|
264
|
+
and specialisms.
|
|
265
|
+
|
|
266
|
+
Branch-set grading uses `peer_branch_taken` (see below), not this
|
|
267
|
+
reason — keeping the two distinct lets dashboards filter coverage
|
|
268
|
+
gaps (not_applicable) separately from runtime branch routing
|
|
269
|
+
(peer_branch_taken).
|
|
270
|
+
no_phases: |
|
|
271
|
+
The storyboard is a placeholder with no phases to run (e.g., a
|
|
272
|
+
protocol baseline that has not been populated yet). detail MUST cite
|
|
273
|
+
the storyboard id and version.
|
|
274
|
+
prerequisite_failed: |
|
|
275
|
+
A prior step this one depends on did not pass. detail MUST cite the
|
|
276
|
+
prerequisite step id.
|
|
277
|
+
missing_tool: |
|
|
278
|
+
The agent declared the protocol or specialism but does not expose a
|
|
279
|
+
required tool. detail MUST cite the tool name declared in the
|
|
280
|
+
storyboard's required_tools and the agent's advertised tool list.
|
|
281
|
+
missing_test_controller: |
|
|
282
|
+
The storyboard requires comply_test_controller and the agent did not
|
|
283
|
+
advertise it. Applies only to deterministic_testing phases.
|
|
284
|
+
unsatisfied_contract: |
|
|
285
|
+
A test-kit harness contract (e.g., signed-requests-runner) is not in
|
|
286
|
+
scope for this grading run. detail MUST cite the contract key. Per
|
|
287
|
+
the signed-requests-runner contract, unsatisfied contracts grade as
|
|
288
|
+
FAIL, not SKIP, for the storyboards that declare them — this reason
|
|
289
|
+
applies only where the contract explicitly permits SKIP.
|
|
290
|
+
peer_branch_taken: |
|
|
291
|
+
The step is part of an `any_of` branch set (see storyboard-schema.yaml
|
|
292
|
+
> "Branch sets") whose `branch_set.id` was already contributed by a
|
|
293
|
+
peer optional phase, making this non-chosen branch moot. detail MUST
|
|
294
|
+
follow the shape
|
|
295
|
+
"<branch_set.id> contributed by <peer_phase_id>.<peer_step_id> —
|
|
296
|
+
<this_phase_id> is moot" so downstream tooling can parse which peer
|
|
297
|
+
carried the contribution. Kept distinct from not_applicable: coverage
|
|
298
|
+
gaps (agent doesn't support a protocol) and runtime branch routing
|
|
299
|
+
(agent took the other path) are different signals and must not be
|
|
300
|
+
conflated in dashboards or summaries.
|
|
301
|
+
peer_substituted: |
|
|
302
|
+
The step would otherwise grade `missing_tool` or
|
|
303
|
+
`missing_test_controller`, but a same-phase peer step declared
|
|
304
|
+
`provides_state_for: <this_step_id>` (see storyboard-schema.yaml >
|
|
305
|
+
`provides_state_for`) and passed — the substitute established
|
|
306
|
+
equivalent state for downstream stateful steps, so the cascade is
|
|
307
|
+
waived. detail MUST follow the shape
|
|
308
|
+
"<this_step_id> state provided by <peer_phase_id>.<peer_step_id>"
|
|
309
|
+
so downstream tooling can parse which substitute carried the state.
|
|
310
|
+
Kept distinct from peer_branch_taken (branch-set routing for
|
|
311
|
+
mutually exclusive behaviors) and not_applicable (coverage gap):
|
|
312
|
+
this signal indicates the agent did declare the specialism but
|
|
313
|
+
offers an interchangeable tool that the storyboard accepts as an
|
|
314
|
+
equivalent state contract.
|
|
315
|
+
description: |
|
|
316
|
+
Runners MAY internally track narrower skip reasons (e.g., a grader
|
|
317
|
+
distinguishing `rate_abuse_opt_out` from `live_side_effect_opt_in_required`).
|
|
318
|
+
Such runners MUST still populate `reason` with one of the canonical
|
|
319
|
+
values above and encode the narrower cause in `detail`. Machine-
|
|
320
|
+
readable consumers can then switch on a stable enum; human-readable
|
|
321
|
+
consumers still see the specific cause. See
|
|
322
|
+
DETAILED_SKIP_TO_CANONICAL in the conforming implementation for a
|
|
323
|
+
concrete mapping.
|
|
324
|
+
|
|
325
|
+
run_summary:
|
|
326
|
+
description: |
|
|
327
|
+
Runners MUST expose a top-level summary for every run. UI surfaces
|
|
328
|
+
(Addie, CLI, web) may present a condensed form, but the full summary
|
|
329
|
+
MUST be available in the machine-readable (--json / structuredContent)
|
|
330
|
+
output.
|
|
331
|
+
required_fields:
|
|
332
|
+
- total_steps
|
|
333
|
+
- steps_passed
|
|
334
|
+
- steps_failed
|
|
335
|
+
- steps_skipped
|
|
336
|
+
- tracks # per-track status with the skip distinctions above
|
|
337
|
+
- schemas_used # array of { schema_id, schema_url } so an
|
|
338
|
+
# implementor can re-validate locally against
|
|
339
|
+
# the exact artifacts the runner applied
|
|
340
|
+
|
|
341
|
+
# --- Non-goals ---
|
|
342
|
+
#
|
|
343
|
+
# This contract does NOT specify:
|
|
344
|
+
# - Output formatting (markdown, JSON shape in the outer envelope, colors).
|
|
345
|
+
# - Storage or retention of run artifacts.
|
|
346
|
+
# - Scoring weights or pass/fail thresholds for a "compliant" verdict.
|
|
347
|
+
# - How to render results in conversational interfaces.
|
|
348
|
+
# Runners remain free to add fields, nest them under implementation-specific
|
|
349
|
+
# keys, and render them however best fits the surface. The contract is about
|
|
350
|
+
# minimum actionability.
|
|
351
|
+
|
|
352
|
+
references:
|
|
353
|
+
storyboard_schema: static/compliance/source/universal/storyboard-schema.yaml
|
|
354
|
+
mcp_extraction: docs/building/implementation/mcp-response-extraction.mdx
|
|
355
|
+
a2a_extraction: docs/building/implementation/a2a-response-extraction.mdx
|
|
356
|
+
transport_errors: docs/building/implementation/transport-errors.mdx
|
|
357
|
+
signed_requests_runner: static/compliance/source/test-kits/signed-requests-runner.yaml
|
|
358
|
+
conforming_implementation: https://github.com/adcontextprotocol/adcp-client/pull/611
|