@adcp/sdk 7.10.2 → 7.11.1
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/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/index.json +356 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
- package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
- package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
- package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
- package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
- package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
- package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
- package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
- package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
- package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
- package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
- package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +9 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +30 -1
- package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +84 -21
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +21 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/types.d.ts +9 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.d.ts +6707 -12040
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +1 -1
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/utils/signal-id-builders.d.ts +19 -0
- package/dist/lib/utils/signal-id-builders.d.ts.map +1 -1
- package/dist/lib/utils/signal-id-builders.js +30 -0
- package/dist/lib/utils/signal-id-builders.js.map +1 -1
- package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -1
- package/dist/lib/utils/tool-request-schemas.js +3 -0
- package/dist/lib/utils/tool-request-schemas.js.map +1 -1
- package/dist/lib/v2/projection/constants.d.ts +28 -0
- package/dist/lib/v2/projection/constants.d.ts.map +1 -0
- package/dist/lib/v2/projection/constants.js +31 -0
- package/dist/lib/v2/projection/constants.js.map +1 -0
- package/dist/lib/v2/projection/registry.d.ts.map +1 -1
- package/dist/lib/v2/projection/registry.js +9 -4
- package/dist/lib/v2/projection/registry.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
- package/skills/SHAPE-GOTCHAS.md +5 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
id: signed_requests
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Signed requests — RFC 9421 transport-layer verification"
|
|
4
|
+
category: signed_requests
|
|
5
|
+
summary: "Agent verifies RFC 9421 HTTP Signatures on incoming AdCP requests per the transport-layer profile. Universal capability-gated storyboard — runs for any agent advertising `request_signing.supported: true` regardless of `supported_protocols`. Graded against conformance vectors covering every checklist step and canonicalization-edge rule."
|
|
6
|
+
track: security_transport
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_adcp_capabilities
|
|
9
|
+
# Additional tool families are exercised transport-layer only — the runner signs
|
|
10
|
+
# requests targeting any mutating AdCP operation (create_media_buy, update_media_buy,
|
|
11
|
+
# acquire_*, activate_signal, sync_creatives) and grades the verifier's response.
|
|
12
|
+
# The runner picks operations available given the agent's `supported_protocols`;
|
|
13
|
+
# operations the agent does not implement are skipped, not failed. Runner
|
|
14
|
+
# implementation tracked at adcontextprotocol/adcp#2331.
|
|
15
|
+
|
|
16
|
+
narrative: |
|
|
17
|
+
Request signing is a transport-layer claim that applies to every AdCP agent regardless
|
|
18
|
+
of which protocols it speaks. RFC 9421 verification behavior is identical whether the
|
|
19
|
+
agent is a media-buy seller, a signals agent, a governance agent, a creative agent, or
|
|
20
|
+
a brand agent. This universal storyboard certifies that an agent correctly implements
|
|
21
|
+
the AdCP RFC 9421 request-signing verifier per
|
|
22
|
+
[`docs/building/by-layer/L1/security.mdx#signed-requests-transport-layer`](/docs/building/by-layer/L1/security#signed-requests-transport-layer).
|
|
23
|
+
|
|
24
|
+
**Gating.** This storyboard runs for any agent advertising `request_signing.supported: true`
|
|
25
|
+
in `get_adcp_capabilities`. Agents that do not advertise support are not tested against
|
|
26
|
+
this storyboard — absence of advertisement is not a failure, it is a declaration that
|
|
27
|
+
the agent does not offer verified signed requests. Same gating model as
|
|
28
|
+
`deterministic_testing` (gated on `compliance_testing.supported: true`).
|
|
29
|
+
|
|
30
|
+
**Backward-compatible specialism claims.** The deprecated `signed-requests` specialism
|
|
31
|
+
enum value remains in the schema for back-compat (see
|
|
32
|
+
[#3075](https://github.com/adcontextprotocol/adcp/issues/3075)). Agents that still
|
|
33
|
+
advertise `specialisms: ["signed-requests"]` are graded via this universal storyboard;
|
|
34
|
+
the runner SHOULD emit the `signed_requests_specialism_deprecated` notice (severity
|
|
35
|
+
`deprecation`, see `runner-output-contract.yaml` > `notice` > `canonical_codes`) advising
|
|
36
|
+
the agent to drop the now-redundant specialism claim and rely solely on
|
|
37
|
+
`request_signing.supported: true`. The notice MUST NOT change `step_result.passed` —
|
|
38
|
+
it is an advisory, not a failure. 4.0 removes the enum value entirely — see
|
|
39
|
+
[#3078](https://github.com/adcontextprotocol/adcp/issues/3078).
|
|
40
|
+
|
|
41
|
+
**Composition with other storyboards.** This storyboard runs independently of any
|
|
42
|
+
specialism a seller also claims. A seller advertising `request_signing.supported: true`
|
|
43
|
+
AND `specialisms: ["sales-guaranteed"]` is graded on both — universal failure does not
|
|
44
|
+
exempt the specialism's pass, and a specialism pass does not paper over universal
|
|
45
|
+
failure. The overall AAO Verified verdict requires all gated storyboards to pass; the
|
|
46
|
+
runner reports per-storyboard outcomes so operators can isolate failures.
|
|
47
|
+
|
|
48
|
+
**Grading.** Observable-behavior only. The runner constructs signed HTTP requests
|
|
49
|
+
exactly as documented in the conformance vectors at
|
|
50
|
+
`/compliance/{version}/test-vectors/request-signing/` and sends them to the agent. The
|
|
51
|
+
agent's responses are compared against the vectors' `expected_outcome`:
|
|
52
|
+
|
|
53
|
+
- Positive vectors MUST produce a non-4xx response — the agent accepted the signed request.
|
|
54
|
+
- Negative vectors MUST produce `401` with `WWW-Authenticate: Signature error="<code>"`,
|
|
55
|
+
where the `<code>` matches the vector's `expected_outcome.error_code` byte-for-byte.
|
|
56
|
+
The checklist step number is informational; grading is on the stable error code only.
|
|
57
|
+
|
|
58
|
+
The runner supplies signed requests; the agent is the verifier. A separate signer-side
|
|
59
|
+
storyboard may follow but is out of scope here — signers are easier to get right, and a
|
|
60
|
+
signer that produces valid signatures is proven correct by a conformant verifier
|
|
61
|
+
accepting them.
|
|
62
|
+
|
|
63
|
+
**Stateful vectors.** Three negative vectors — 016 (replayed nonce), 017 (key revoked),
|
|
64
|
+
and 020 (per-keyid cap) — assert verifier state the runner cannot set from the outside.
|
|
65
|
+
Those vectors declare `requires_contract` and are gated on the `signed_requests_runner`
|
|
66
|
+
test-kit contract at `test-kits/signed-requests-runner.yaml`, which specifies the
|
|
67
|
+
runner's signing keyids, a dedicated pre-revoked keyid (`test-revoked-2026`), and the
|
|
68
|
+
grading-time per-keyid cap the runner will target. Agents advertising
|
|
69
|
+
`request_signing.supported: true` MUST pre-configure their verifier per that contract
|
|
70
|
+
before the negative phase runs. If the agent does not satisfy the contract (e.g., the
|
|
71
|
+
runner can't coordinate the pre-state), the affected vectors grade as FAIL, never as
|
|
72
|
+
SKIP — the contract is a prerequisite for the capability claim, not an optional
|
|
73
|
+
extension.
|
|
74
|
+
|
|
75
|
+
agent:
|
|
76
|
+
interaction_model: request_verifier
|
|
77
|
+
capabilities:
|
|
78
|
+
- verifies_request_signatures
|
|
79
|
+
examples:
|
|
80
|
+
- "Any AdCP agent advertising `request_signing.supported: true` — sales agent, signals agent, governance agent, creative agent, or brand agent"
|
|
81
|
+
|
|
82
|
+
caller:
|
|
83
|
+
role: compliance_runner
|
|
84
|
+
example: "AdCP Verified runner (or equivalent signed-request grader)"
|
|
85
|
+
|
|
86
|
+
prerequisites:
|
|
87
|
+
description: |
|
|
88
|
+
The agent MUST advertise `request_signing.supported: true` in `get_adcp_capabilities`.
|
|
89
|
+
The agent's verifier MUST be configured to accept requests signed by the test keypairs
|
|
90
|
+
published in `keys.json` alongside the conformance vectors — specifically, the runner's
|
|
91
|
+
signing keys (`test-ed25519-2026`, `test-es256-2026`) should be treated as coming from
|
|
92
|
+
a registered test counterparty whose JWKS contains those public keys with
|
|
93
|
+
`adcp_use: "request-signing"`.
|
|
94
|
+
test_kit: "test-kits/signed-requests-runner.yaml"
|
|
95
|
+
|
|
96
|
+
phases:
|
|
97
|
+
- id: capability_discovery
|
|
98
|
+
title: "Capability discovery"
|
|
99
|
+
narrative: |
|
|
100
|
+
Confirm the agent advertises request-signing support before grading the verifier.
|
|
101
|
+
|
|
102
|
+
steps:
|
|
103
|
+
- id: get_capabilities
|
|
104
|
+
title: "Verify the agent declares request_signing.supported"
|
|
105
|
+
narrative: |
|
|
106
|
+
The runner calls `get_adcp_capabilities` and confirms that the agent declares
|
|
107
|
+
support for the request-signing capability. Absence of `request_signing.supported: true`
|
|
108
|
+
means the agent has not opted into this storyboard; the runner SHOULD skip the
|
|
109
|
+
remaining phases.
|
|
110
|
+
task: get_adcp_capabilities
|
|
111
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
112
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
113
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
114
|
+
comply_scenario: capability_discovery
|
|
115
|
+
stateful: false
|
|
116
|
+
expected: |
|
|
117
|
+
Return capabilities declaring request_signing.supported: true. If false or absent,
|
|
118
|
+
this storyboard does not apply and grading skips to a non-applicable outcome.
|
|
119
|
+
sample_request:
|
|
120
|
+
context:
|
|
121
|
+
correlation_id: "signed_requests--get_capabilities"
|
|
122
|
+
validations:
|
|
123
|
+
- check: field_present
|
|
124
|
+
path: "request_signing"
|
|
125
|
+
description: "Agent declares request_signing capability block"
|
|
126
|
+
- check: field_value
|
|
127
|
+
path: "request_signing.supported"
|
|
128
|
+
value: true
|
|
129
|
+
description: "Agent verifies request signatures"
|
|
130
|
+
|
|
131
|
+
- id: positive_vectors
|
|
132
|
+
title: "Positive conformance vectors"
|
|
133
|
+
narrative: |
|
|
134
|
+
The runner sends each positive vector as a signed HTTP request to the agent and
|
|
135
|
+
expects the agent to accept it. Vectors exercise the happy path plus every
|
|
136
|
+
canonicalization-edge rule in the profile:
|
|
137
|
+
|
|
138
|
+
001 basic Ed25519 POST
|
|
139
|
+
002 Ed25519 POST with content-digest covered
|
|
140
|
+
003 ES256 POST (edge-runtime profile)
|
|
141
|
+
004 multiple Signature-Input labels (verifier processes sig1 only)
|
|
142
|
+
005 default-port strip (URL has :443)
|
|
143
|
+
006 dot-segment path normalization
|
|
144
|
+
007 query-string byte preservation (no alphabetization)
|
|
145
|
+
008 percent-encoded path normalization (lowercase → uppercase hex)
|
|
146
|
+
|
|
147
|
+
Vectors and test keys live at
|
|
148
|
+
`/compliance/{version}/test-vectors/request-signing/positive/` and
|
|
149
|
+
`/compliance/{version}/test-vectors/request-signing/keys.json`.
|
|
150
|
+
|
|
151
|
+
$comment: |
|
|
152
|
+
Step-level YAML entries for each positive vector will be generated from the vector
|
|
153
|
+
fixtures at runtime by the compliance runner; we do not duplicate them in this file.
|
|
154
|
+
The runner loads the vector, constructs the HTTP request, sends it to the agent,
|
|
155
|
+
and validates the response against expected_outcome.success. Runner implementation
|
|
156
|
+
tracked at adcontextprotocol/adcp#2331.
|
|
157
|
+
|
|
158
|
+
- id: negative_vectors
|
|
159
|
+
title: "Negative conformance vectors"
|
|
160
|
+
narrative: |
|
|
161
|
+
The runner sends each negative vector and expects the agent to reject with the
|
|
162
|
+
stable error code in `expected_outcome.error_code`. Negative vectors cover every
|
|
163
|
+
failure mode in the verifier checklist (13 numbered steps plus sub-step 9a for
|
|
164
|
+
the per-keyid cap) plus the pre-check:
|
|
165
|
+
|
|
166
|
+
001 unsigned + required_for → request_signature_required
|
|
167
|
+
002 wrong tag → request_signature_tag_invalid
|
|
168
|
+
003 expired signature → request_signature_window_invalid
|
|
169
|
+
004 window > 300s → request_signature_window_invalid
|
|
170
|
+
005 alg not allowed → request_signature_alg_not_allowed
|
|
171
|
+
006 missing covered component → request_signature_components_incomplete
|
|
172
|
+
007 missing content-digest (required) → request_signature_components_incomplete
|
|
173
|
+
008 unknown keyid → request_signature_key_unknown
|
|
174
|
+
009 wrong adcp_use → request_signature_key_purpose_invalid
|
|
175
|
+
010 content-digest mismatch → request_signature_digest_mismatch
|
|
176
|
+
011 malformed Signature-Input → request_signature_header_malformed
|
|
177
|
+
012 missing expires param → request_signature_params_incomplete
|
|
178
|
+
013 expires ≤ created → request_signature_window_invalid
|
|
179
|
+
014 missing nonce param → request_signature_params_incomplete
|
|
180
|
+
015 signature cryptographically invalid → request_signature_invalid
|
|
181
|
+
016 replayed nonce → request_signature_replayed
|
|
182
|
+
017 key revoked → request_signature_key_revoked
|
|
183
|
+
018 content-digest when forbidden → request_signature_components_unexpected
|
|
184
|
+
019 Signature without Signature-Input → request_signature_header_malformed
|
|
185
|
+
020 per-keyid replay cache cap → request_signature_rate_abuse
|
|
186
|
+
028 unsigned tasks/cancel + protocol_methods_required_for → request_signature_required
|
|
187
|
+
|
|
188
|
+
Vector 028 is gated on `request_signing.protocol_methods_required_for`
|
|
189
|
+
being non-empty: the runner skips when the agent does not declare the
|
|
190
|
+
bucket, and FAILs (not SKIPs) when it declares it but doesn't enforce.
|
|
191
|
+
It's the only vector that targets a JSON-RPC protocol method rather
|
|
192
|
+
than a `tools/call` AdCP envelope. Vectors 021-027 (enumerated in the
|
|
193
|
+
negative/ directory but not in the summary above) cover later
|
|
194
|
+
additions to the checklist that share the `tools/call` envelope shape
|
|
195
|
+
with vectors 001-020.
|
|
196
|
+
|
|
197
|
+
Vectors live at `/compliance/{version}/test-vectors/request-signing/negative/`.
|
|
198
|
+
Grading requires byte-for-byte match on the error code; the failed_step value is
|
|
199
|
+
informational. The runner reads the error code from the agent's
|
|
200
|
+
`WWW-Authenticate: Signature error="<code>"` response header on 401.
|
|
201
|
+
|
|
202
|
+
$comment: |
|
|
203
|
+
As with positive_vectors, step-level entries are synthesized by the runner from
|
|
204
|
+
the vector fixtures. Runner implementation at adcontextprotocol/adcp#2331.
|
|
205
|
+
|
|
206
|
+
grading:
|
|
207
|
+
pass_criteria: |
|
|
208
|
+
All vectors in positive/ produce 2xx, and all vectors in negative/ produce 401 with
|
|
209
|
+
the expected error code byte-for-byte. Any single vector's failure to produce its
|
|
210
|
+
expected outcome fails the storyboard. Vectors that declare `requires_contract`
|
|
211
|
+
whose contract the runner cannot satisfy grade as FAIL, never as SKIP — the
|
|
212
|
+
signed-requests-runner contract is a prerequisite for the capability claim, not an
|
|
213
|
+
optional extension.
|
|
214
|
+
report_format: |
|
|
215
|
+
Pass/fail per vector, with the response's error code (if any) and a diff against
|
|
216
|
+
the vector's expected_outcome. Operators receive specific per-vector diagnostics
|
|
217
|
+
so they can debug without re-running the full suite.
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
id: stale_response_advisory
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "STALE_RESPONSE advisory-success wire placement"
|
|
4
|
+
category: stale_response_advisory
|
|
5
|
+
summary: "Validates that STALE_RESPONSE rides in errors[] on a populated success response with transport success preserved, and that STALE_RESPONSE is absent on healthy upstream responses."
|
|
6
|
+
track: error_handling
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
STALE_RESPONSE is a non-fatal advisory emitted when the seller served cached data past its
|
|
12
|
+
freshness target because an upstream dependency failed. It rides in errors[] on a populated
|
|
13
|
+
success response — transport stays success (MCP isError: false, HTTP 200, A2A succeeded),
|
|
14
|
+
the response payload is non-empty, and the advisory is never promoted to adcp_error on the
|
|
15
|
+
envelope.
|
|
16
|
+
|
|
17
|
+
This is easy for implementations to get wrong: returning SERVICE_UNAVAILABLE instead of a
|
|
18
|
+
stale-cache success, flipping transport failure, or emitting an empty payload all fail the
|
|
19
|
+
spec. STALE_RESPONSE is distinct from SERVICE_UNAVAILABLE: STALE_RESPONSE means the seller's
|
|
20
|
+
service is fine but one upstream is temporarily unreachable and the seller chose to honor the
|
|
21
|
+
request from cache. SERVICE_UNAVAILABLE means no usable response is available at all.
|
|
22
|
+
|
|
23
|
+
This storyboard verifies three properties:
|
|
24
|
+
1. Wire placement: STALE_RESPONSE appears in errors[] on a success response with a populated
|
|
25
|
+
payload — not as adcp_error, not with transport failure.
|
|
26
|
+
2. Details shape: error.details conforms to error-details/stale-response.json —
|
|
27
|
+
served_from_cache (required, always true), cache_age_seconds (required).
|
|
28
|
+
3. Non-emission guard: STALE_RESPONSE is NOT emitted when the upstream is healthy (normal
|
|
29
|
+
get_products call against a working upstream).
|
|
30
|
+
|
|
31
|
+
The stale-cache forcing phases require comply_test_controller with the
|
|
32
|
+
force_upstream_unavailable scenario. Steps requiring the controller grade not_applicable for
|
|
33
|
+
agents that do not advertise it. The non-emission guard (Phase 3) runs for all agents.
|
|
34
|
+
|
|
35
|
+
agent:
|
|
36
|
+
interaction_model: media_buy_seller
|
|
37
|
+
capabilities:
|
|
38
|
+
- sells_media
|
|
39
|
+
examples:
|
|
40
|
+
- "Any AdCP seller agent that caches upstream responses"
|
|
41
|
+
|
|
42
|
+
caller:
|
|
43
|
+
role: buyer_agent
|
|
44
|
+
example: "Compliance test harness"
|
|
45
|
+
|
|
46
|
+
prerequisites:
|
|
47
|
+
description: |
|
|
48
|
+
Phase 2 (stale-cache forcing) requires comply_test_controller with
|
|
49
|
+
force_upstream_unavailable support. Phase 3 (non-emission guard) runs for all agents.
|
|
50
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
51
|
+
|
|
52
|
+
phases:
|
|
53
|
+
- id: capability_discovery
|
|
54
|
+
title: "Capability discovery"
|
|
55
|
+
narrative: |
|
|
56
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports media buying before
|
|
57
|
+
testing STALE_RESPONSE wire placement.
|
|
58
|
+
|
|
59
|
+
steps:
|
|
60
|
+
- id: get_capabilities
|
|
61
|
+
title: "Check agent capabilities"
|
|
62
|
+
narrative: |
|
|
63
|
+
Verify that the agent declares the expected protocol support before
|
|
64
|
+
proceeding with domain-specific operations.
|
|
65
|
+
task: get_adcp_capabilities
|
|
66
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
67
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
68
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
69
|
+
comply_scenario: capability_discovery
|
|
70
|
+
stateful: false
|
|
71
|
+
expected: |
|
|
72
|
+
Return capabilities declaring media_buy in supported_protocols.
|
|
73
|
+
sample_request:
|
|
74
|
+
context:
|
|
75
|
+
correlation_id: "stale_response_advisory--get_capabilities"
|
|
76
|
+
validations:
|
|
77
|
+
- check: response_schema
|
|
78
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
79
|
+
- check: field_present
|
|
80
|
+
path: "supported_protocols"
|
|
81
|
+
description: "Agent declares supported protocols"
|
|
82
|
+
- check: field_present
|
|
83
|
+
path: "context"
|
|
84
|
+
description: "Response echoes back the context object"
|
|
85
|
+
- check: field_value
|
|
86
|
+
path: "context.correlation_id"
|
|
87
|
+
value: "stale_response_advisory--get_capabilities"
|
|
88
|
+
description: "Context correlation_id returned unchanged"
|
|
89
|
+
|
|
90
|
+
- id: stale_response_forcing
|
|
91
|
+
title: "Force stale-cache condition and verify advisory-success wire placement"
|
|
92
|
+
narrative: |
|
|
93
|
+
The test controller forces an upstream dependency unavailable while a stale cache entry
|
|
94
|
+
exists. The seller must respond to get_products with a populated payload from cache and
|
|
95
|
+
emit STALE_RESPONSE in errors[], while keeping transport success.
|
|
96
|
+
|
|
97
|
+
All steps in this phase require comply_test_controller with force_upstream_unavailable
|
|
98
|
+
support. Steps grade not_applicable for agents that do not advertise the controller.
|
|
99
|
+
Validations in this phase carry severity: advisory — a seller that has the controller
|
|
100
|
+
but whose runner contract does not yet support force_upstream_unavailable will fail
|
|
101
|
+
advisory rather than blocking compliance, consistent with the acceptance criteria in
|
|
102
|
+
issue #4934.
|
|
103
|
+
|
|
104
|
+
steps:
|
|
105
|
+
- id: force_upstream_unavailable
|
|
106
|
+
title: "Force upstream dependency unavailable (seed stale-cache condition)"
|
|
107
|
+
narrative: |
|
|
108
|
+
The compliance harness calls comply_test_controller with force_upstream_unavailable
|
|
109
|
+
to signal that the seller's upstream dependency is currently unreachable. The seller
|
|
110
|
+
is expected to have (or synthesize) a stale cache entry for the subsequent
|
|
111
|
+
get_products call. On receipt, the seller MUST mark the named upstream as unavailable
|
|
112
|
+
for the duration of the compliance session (or until explicitly reset), so that the
|
|
113
|
+
next get_products request falls back to the cache entry.
|
|
114
|
+
task: comply_test_controller
|
|
115
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
116
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
117
|
+
doc_ref: "/building/by-layer/L3/comply-test-controller"
|
|
118
|
+
comply_scenario: force_upstream_unavailable
|
|
119
|
+
requires_tool: comply_test_controller
|
|
120
|
+
stateful: true
|
|
121
|
+
expected: |
|
|
122
|
+
Controller acknowledges the upstream-unavailable state transition. The seller
|
|
123
|
+
confirms the named upstream is now marked unreachable for subsequent calls.
|
|
124
|
+
sample_request:
|
|
125
|
+
scenario: force_upstream_unavailable
|
|
126
|
+
params:
|
|
127
|
+
tool: "get_products"
|
|
128
|
+
upstream_name: "inventory-service"
|
|
129
|
+
account:
|
|
130
|
+
sandbox: true
|
|
131
|
+
context:
|
|
132
|
+
correlation_id: "stale_response_advisory--force_upstream_unavailable"
|
|
133
|
+
validations:
|
|
134
|
+
- check: response_schema
|
|
135
|
+
description: "Controller response matches comply-test-controller-response.json"
|
|
136
|
+
severity: advisory
|
|
137
|
+
permanent_advisory:
|
|
138
|
+
reason: "Gated on force_upstream_unavailable being advertised in the seller's comply_test_controller scenarios. Promote to required when force_upstream_unavailable is widely adopted — remove the permanent_advisory block and set severity: required (or remove severity to use the default). See issue #4934."
|
|
139
|
+
- check: field_present
|
|
140
|
+
path: "context"
|
|
141
|
+
description: "Response echoes back the context object"
|
|
142
|
+
severity: advisory
|
|
143
|
+
permanent_advisory:
|
|
144
|
+
reason: "Gated on force_upstream_unavailable being advertised in the seller's comply_test_controller scenarios. Promote to required when force_upstream_unavailable is widely adopted. See issue #4934."
|
|
145
|
+
- check: field_value
|
|
146
|
+
path: "context.correlation_id"
|
|
147
|
+
value: "stale_response_advisory--force_upstream_unavailable"
|
|
148
|
+
description: "Context correlation_id returned unchanged"
|
|
149
|
+
severity: advisory
|
|
150
|
+
permanent_advisory:
|
|
151
|
+
reason: "Gated on force_upstream_unavailable being advertised in the seller's comply_test_controller scenarios. Promote to required when force_upstream_unavailable is widely adopted. See issue #4934."
|
|
152
|
+
|
|
153
|
+
- id: stale_response_wire_placement
|
|
154
|
+
title: "STALE_RESPONSE in errors[] on populated success response"
|
|
155
|
+
narrative: |
|
|
156
|
+
With the upstream forced unavailable and a stale cache entry present, the seller
|
|
157
|
+
responds to get_products with a populated payload and STALE_RESPONSE in errors[].
|
|
158
|
+
Transport MUST stay success (isError: false, no adcp_error envelope) — the advisory
|
|
159
|
+
rides in the payload's errors[] and MUST NOT be promoted to a transport-level error.
|
|
160
|
+
|
|
161
|
+
The seller MUST include the required details fields: served_from_cache: true and
|
|
162
|
+
cache_age_seconds (integer >= 0). Optionally: freshness_target_seconds, upstream
|
|
163
|
+
(name and/or url of the failed dependency), original_error (code/message of the
|
|
164
|
+
underlying failure).
|
|
165
|
+
task: get_products
|
|
166
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
167
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
168
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
169
|
+
comply_scenario: stale_response_advisory
|
|
170
|
+
requires_tool: comply_test_controller
|
|
171
|
+
stateful: true
|
|
172
|
+
expected: |
|
|
173
|
+
Return a populated product list from stale cache with:
|
|
174
|
+
- errors[] containing a STALE_RESPONSE entry
|
|
175
|
+
- errors[0].details.served_from_cache: true
|
|
176
|
+
- errors[0].details.cache_age_seconds present (integer >= 0)
|
|
177
|
+
- Transport success: no adcp_error on the envelope (isError: false)
|
|
178
|
+
- Response payload non-empty (products[] with at least one entry)
|
|
179
|
+
|
|
180
|
+
sample_request:
|
|
181
|
+
buying_mode: "brief"
|
|
182
|
+
brief: "Display advertising"
|
|
183
|
+
account:
|
|
184
|
+
brand:
|
|
185
|
+
domain: "acmeoutdoor.example"
|
|
186
|
+
operator: "pinnacle-agency.example"
|
|
187
|
+
context:
|
|
188
|
+
correlation_id: "stale_response_advisory--stale_response_wire_placement"
|
|
189
|
+
validations:
|
|
190
|
+
- check: response_schema
|
|
191
|
+
description: "Response matches get-products-response.json schema even under stale cache"
|
|
192
|
+
severity: advisory
|
|
193
|
+
permanent_advisory:
|
|
194
|
+
reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted — remove permanent_advisory and severity fields. See issue #4934."
|
|
195
|
+
- check: field_present
|
|
196
|
+
path: "errors"
|
|
197
|
+
description: "errors[] is present on a stale-cache response"
|
|
198
|
+
severity: advisory
|
|
199
|
+
permanent_advisory:
|
|
200
|
+
reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
|
|
201
|
+
- check: field_value
|
|
202
|
+
path: "errors[0].code"
|
|
203
|
+
value: "STALE_RESPONSE"
|
|
204
|
+
description: "First errors[] entry carries STALE_RESPONSE code"
|
|
205
|
+
severity: advisory
|
|
206
|
+
permanent_advisory:
|
|
207
|
+
reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
|
|
208
|
+
- check: field_value
|
|
209
|
+
path: "errors[0].details.served_from_cache"
|
|
210
|
+
value: true
|
|
211
|
+
description: "details.served_from_cache is true per error-details/stale-response.json"
|
|
212
|
+
severity: advisory
|
|
213
|
+
permanent_advisory:
|
|
214
|
+
reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
|
|
215
|
+
- check: field_present
|
|
216
|
+
path: "errors[0].details.cache_age_seconds"
|
|
217
|
+
description: "details.cache_age_seconds is present (required details field)"
|
|
218
|
+
severity: advisory
|
|
219
|
+
permanent_advisory:
|
|
220
|
+
reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
|
|
221
|
+
- check: field_present
|
|
222
|
+
path: "context"
|
|
223
|
+
description: "Response echoes back the context object on stale-cache advisory"
|
|
224
|
+
severity: advisory
|
|
225
|
+
permanent_advisory:
|
|
226
|
+
reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
|
|
227
|
+
- check: field_value
|
|
228
|
+
path: "context.correlation_id"
|
|
229
|
+
value: "stale_response_advisory--stale_response_wire_placement"
|
|
230
|
+
description: "Context correlation_id returned unchanged"
|
|
231
|
+
severity: advisory
|
|
232
|
+
permanent_advisory:
|
|
233
|
+
reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
|
|
234
|
+
- check: field_present
|
|
235
|
+
path: "products[0]"
|
|
236
|
+
description: "Response payload is non-empty (products[] has at least one entry from stale cache)"
|
|
237
|
+
severity: advisory
|
|
238
|
+
permanent_advisory:
|
|
239
|
+
reason: "Gated on force_upstream_unavailable runner support. Promote to required when widely adopted. See issue #4934."
|
|
240
|
+
|
|
241
|
+
- id: non_emission_guard
|
|
242
|
+
title: "No STALE_RESPONSE on healthy upstream response"
|
|
243
|
+
narrative: |
|
|
244
|
+
STALE_RESPONSE MUST NOT be emitted when the upstream is healthy. Per the normative
|
|
245
|
+
error-code description, sellers MUST NOT emit STALE_RESPONSE when the cache hit is
|
|
246
|
+
within freshness target or when no cached payload exists — the correct code for a
|
|
247
|
+
completely unavailable upstream with no cache is SERVICE_UNAVAILABLE.
|
|
248
|
+
|
|
249
|
+
This phase sends a normal get_products request and verifies no STALE_RESPONSE appears.
|
|
250
|
+
Runs for all agents — no controller required.
|
|
251
|
+
|
|
252
|
+
steps:
|
|
253
|
+
- id: no_stale_on_healthy_upstream
|
|
254
|
+
title: "STALE_RESPONSE absent on healthy upstream response"
|
|
255
|
+
narrative: |
|
|
256
|
+
A normal get_products request against a healthy upstream MUST NOT emit
|
|
257
|
+
STALE_RESPONSE. Sellers that unconditionally emit STALE_RESPONSE on every
|
|
258
|
+
get_products response are non-conformant — the code is only valid when a
|
|
259
|
+
specific cache-fallback condition is active.
|
|
260
|
+
|
|
261
|
+
NOTE: No machine-enforced absence check for STALE_RESPONSE exists today — the
|
|
262
|
+
`field_absent` primitive rejects errors[] entirely, but other error codes are
|
|
263
|
+
valid. The schema and correlation_id checks below prove conformance for
|
|
264
|
+
non-STALE_RESPONSE flows; a dedicated `error_code_absent` check kind would
|
|
265
|
+
close this gap. TODO: add check primitive when runner contract supports it.
|
|
266
|
+
task: get_products
|
|
267
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
268
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
269
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
270
|
+
comply_scenario: stale_response_non_emission
|
|
271
|
+
stateful: false
|
|
272
|
+
expected: |
|
|
273
|
+
Return products normally. errors[] may be absent or present with codes other
|
|
274
|
+
than STALE_RESPONSE. STALE_RESPONSE MUST NOT appear unless the seller is
|
|
275
|
+
actively serving from a stale cache entry past its freshness target.
|
|
276
|
+
|
|
277
|
+
sample_request:
|
|
278
|
+
buying_mode: "brief"
|
|
279
|
+
brief: "Display advertising for outdoor lifestyle campaign"
|
|
280
|
+
account:
|
|
281
|
+
brand:
|
|
282
|
+
domain: "acmeoutdoor.example"
|
|
283
|
+
operator: "pinnacle-agency.example"
|
|
284
|
+
context:
|
|
285
|
+
correlation_id: "stale_response_advisory--no_stale_on_healthy"
|
|
286
|
+
validations:
|
|
287
|
+
- check: response_schema
|
|
288
|
+
description: "Response matches get-products-response.json schema on healthy upstream"
|
|
289
|
+
- check: field_present
|
|
290
|
+
path: "context"
|
|
291
|
+
description: "Response echoes back the context object"
|
|
292
|
+
- check: field_value
|
|
293
|
+
path: "context.correlation_id"
|
|
294
|
+
value: "stale_response_advisory--no_stale_on_healthy"
|
|
295
|
+
description: "Context correlation_id returned unchanged"
|