@adcp/sdk 7.11.0 → 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/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +23 -0
- 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/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
id: capability_discovery
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Capability discovery"
|
|
4
|
+
category: capability_discovery
|
|
5
|
+
summary: "Buyer calls get_adcp_capabilities to discover what an agent supports before making any buying or creative decisions."
|
|
6
|
+
track: core
|
|
7
|
+
|
|
8
|
+
narrative: |
|
|
9
|
+
Before doing anything else, a buyer agent calls get_adcp_capabilities to learn what your
|
|
10
|
+
platform supports. This is the first call in any new relationship — the buyer needs to know
|
|
11
|
+
your protocol version, supported domains (media buy, creative, governance, signals, SI),
|
|
12
|
+
pricing models, targeting capabilities, and creative specs.
|
|
13
|
+
|
|
14
|
+
The response shapes every subsequent call. If you declare media_buy support, the buyer knows
|
|
15
|
+
it can send briefs and create media buys. If you declare creative support, the buyer knows
|
|
16
|
+
it can sync or build creatives. The buyer uses this to decide which storyboards apply to your
|
|
17
|
+
agent and what flows to attempt.
|
|
18
|
+
|
|
19
|
+
agent:
|
|
20
|
+
interaction_model: media_buy_seller
|
|
21
|
+
capabilities:
|
|
22
|
+
- sells_media
|
|
23
|
+
examples:
|
|
24
|
+
- "Any AdCP-compliant agent"
|
|
25
|
+
- "Publisher platforms"
|
|
26
|
+
- "Creative ad servers"
|
|
27
|
+
- "DSPs"
|
|
28
|
+
|
|
29
|
+
caller:
|
|
30
|
+
role: buyer_agent
|
|
31
|
+
example: "Scope3 (DSP)"
|
|
32
|
+
|
|
33
|
+
prerequisites:
|
|
34
|
+
description: |
|
|
35
|
+
No prerequisites. This is the very first call a buyer makes to any agent.
|
|
36
|
+
The test kit provides brand context but it is not required for this storyboard.
|
|
37
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
38
|
+
|
|
39
|
+
phases:
|
|
40
|
+
- id: protocol_discovery
|
|
41
|
+
title: "Protocol and capability discovery"
|
|
42
|
+
narrative: |
|
|
43
|
+
The buyer calls get_adcp_capabilities to learn what your agent supports. This call
|
|
44
|
+
takes no required arguments — it is a read-only introspection of the agent's
|
|
45
|
+
capabilities. The buyer may optionally filter by protocol domain or major version.
|
|
46
|
+
|
|
47
|
+
steps:
|
|
48
|
+
- id: get_capabilities
|
|
49
|
+
title: "Discover agent capabilities"
|
|
50
|
+
narrative: |
|
|
51
|
+
The buyer calls get_adcp_capabilities with no arguments. Your agent returns its
|
|
52
|
+
full capability declaration: protocol version, supported domains, pricing models,
|
|
53
|
+
targeting options, creative specs, and any extensions.
|
|
54
|
+
|
|
55
|
+
This response is the source of truth for what the buyer can do with your agent.
|
|
56
|
+
Every field the buyer reads here determines which tasks it will call next.
|
|
57
|
+
task: get_adcp_capabilities
|
|
58
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
59
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
60
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
61
|
+
comply_scenario: capability_discovery
|
|
62
|
+
stateful: false
|
|
63
|
+
expected: |
|
|
64
|
+
Return your agent's full capability declaration:
|
|
65
|
+
- adcp.major_versions: which protocol versions you support (e.g., [3])
|
|
66
|
+
- supported_protocols: which domains are available (media_buy, creative, governance, signals, sponsored_intelligence)
|
|
67
|
+
- media_buy: pricing models, delivery types, targeting, reporting features
|
|
68
|
+
- creative: library support, generation, transformation capabilities
|
|
69
|
+
- governance: property and creative features the governance agent can evaluate
|
|
70
|
+
- account: auth model, billing support, sandbox mode
|
|
71
|
+
|
|
72
|
+
sample_request:
|
|
73
|
+
context:
|
|
74
|
+
correlation_id: "capability_discovery--get_capabilities"
|
|
75
|
+
|
|
76
|
+
validations:
|
|
77
|
+
- check: response_schema
|
|
78
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
79
|
+
- check: field_present
|
|
80
|
+
path: "adcp.major_versions"
|
|
81
|
+
description: "Agent declares supported protocol versions"
|
|
82
|
+
- check: field_present
|
|
83
|
+
path: "supported_protocols"
|
|
84
|
+
description: "Agent declares which protocol domains it supports"
|
|
85
|
+
|
|
86
|
+
- check: field_present
|
|
87
|
+
path: "context"
|
|
88
|
+
description: "Response echoes back the context object"
|
|
89
|
+
- check: field_value
|
|
90
|
+
path: "context.correlation_id"
|
|
91
|
+
value: "capability_discovery--get_capabilities"
|
|
92
|
+
description: "Context correlation_id returned unchanged"
|
|
93
|
+
- id: get_capabilities_filtered
|
|
94
|
+
title: "Discover capabilities filtered by protocol"
|
|
95
|
+
narrative: |
|
|
96
|
+
The buyer calls get_adcp_capabilities again, this time filtering for a specific
|
|
97
|
+
protocol domain. This is useful when the buyer already knows what it wants and
|
|
98
|
+
only needs details for one domain (e.g., just media_buy capabilities).
|
|
99
|
+
task: get_adcp_capabilities
|
|
100
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
101
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
102
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
103
|
+
comply_scenario: capability_discovery
|
|
104
|
+
stateful: false
|
|
105
|
+
expected: |
|
|
106
|
+
Return capabilities filtered to the requested protocol domain. The response
|
|
107
|
+
should include the same structure but only the requested domain details.
|
|
108
|
+
|
|
109
|
+
sample_request:
|
|
110
|
+
protocols:
|
|
111
|
+
- "media_buy"
|
|
112
|
+
|
|
113
|
+
context:
|
|
114
|
+
correlation_id: "capability_discovery--get_capabilities_filtered"
|
|
115
|
+
validations:
|
|
116
|
+
- check: response_schema
|
|
117
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
118
|
+
|
|
119
|
+
- check: field_present
|
|
120
|
+
path: "context"
|
|
121
|
+
description: "Response echoes back the context object"
|
|
122
|
+
- check: field_value
|
|
123
|
+
path: "context.correlation_id"
|
|
124
|
+
value: "capability_discovery--get_capabilities_filtered"
|
|
125
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
id: pagination_integrity_collection_lists
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Pagination cursor integrity — list_collection_lists"
|
|
4
|
+
category: schema_validation
|
|
5
|
+
summary: "Validates the cursor↔has_more invariant by walking a paginated list_collection_lists response from a continuation page to a terminal page."
|
|
6
|
+
track: core
|
|
7
|
+
required_tools:
|
|
8
|
+
- list_collection_lists
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
Pagination is cursor-based across AdCP. Every response carrying a
|
|
12
|
+
`pagination` block satisfies a single invariant: when `has_more` is true the
|
|
13
|
+
`cursor` MUST be present (callers need it to fetch the next page); when
|
|
14
|
+
`has_more` is false the `cursor` MUST be absent (a stale token on a terminal
|
|
15
|
+
page invites callers to follow it into undefined behavior).
|
|
16
|
+
|
|
17
|
+
The invariant is documented in prose on
|
|
18
|
+
`static/schemas/source/core/pagination-response.json` but JSON Schema does
|
|
19
|
+
not gate the two fields against each other. This storyboard exercises both
|
|
20
|
+
sides of the invariant on `list_collection_lists` in a single run.
|
|
21
|
+
|
|
22
|
+
The runner bootstraps three collection lists via `create_collection_list`,
|
|
23
|
+
then lists them back with `max_results=2`. The first page MUST cap at two
|
|
24
|
+
lists and signal continuation with `has_more=true` plus a cursor. The runner
|
|
25
|
+
then follows that cursor; the second call MUST return the terminal page with
|
|
26
|
+
`has_more=false` and no cursor. An agent that hides the third list by
|
|
27
|
+
reporting `has_more=false` on the first page fails the first-page assertion.
|
|
28
|
+
An agent that carries a stale cursor onto the terminal page fails the
|
|
29
|
+
second-page assertion.
|
|
30
|
+
|
|
31
|
+
The `total_count` field is allowed to be absent (some backends cannot
|
|
32
|
+
compute it cheaply per the pagination-response schema) but when an agent
|
|
33
|
+
volunteers it, the value MUST match the seeded count of three.
|
|
34
|
+
|
|
35
|
+
agent:
|
|
36
|
+
interaction_model: stateful_preloaded
|
|
37
|
+
capabilities: []
|
|
38
|
+
examples:
|
|
39
|
+
- "Any AdCP agent that exposes a paginated list_collection_lists"
|
|
40
|
+
|
|
41
|
+
caller:
|
|
42
|
+
role: buyer_agent
|
|
43
|
+
example: "Compliance test harness"
|
|
44
|
+
|
|
45
|
+
prerequisites:
|
|
46
|
+
description: |
|
|
47
|
+
The storyboard bootstraps three collection lists in the setup phase via
|
|
48
|
+
`create_collection_list`. The seed-DAG does not include collection lists,
|
|
49
|
+
so this storyboard uses the create-then-list pattern to keep itself
|
|
50
|
+
self-contained without extending the seed taxonomy.
|
|
51
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
52
|
+
controller_seeding: false
|
|
53
|
+
|
|
54
|
+
phases:
|
|
55
|
+
- id: capability_discovery
|
|
56
|
+
title: "Capability discovery"
|
|
57
|
+
narrative: |
|
|
58
|
+
Confirm the agent responds to get_adcp_capabilities before
|
|
59
|
+
exercising list_collection_lists.
|
|
60
|
+
steps:
|
|
61
|
+
- id: get_capabilities
|
|
62
|
+
title: "Check agent capabilities"
|
|
63
|
+
narrative: |
|
|
64
|
+
Verify that the agent declares supported protocols before
|
|
65
|
+
driving paginated list_collection_lists.
|
|
66
|
+
task: get_adcp_capabilities
|
|
67
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
68
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
69
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
70
|
+
comply_scenario: pagination_integrity_collection_lists
|
|
71
|
+
stateful: false
|
|
72
|
+
expected: |
|
|
73
|
+
Return capabilities declaring supported protocols.
|
|
74
|
+
|
|
75
|
+
sample_request:
|
|
76
|
+
context:
|
|
77
|
+
correlation_id: "pagination_integrity_collection_lists--get_capabilities"
|
|
78
|
+
validations:
|
|
79
|
+
- check: response_schema
|
|
80
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
81
|
+
- check: field_present
|
|
82
|
+
path: "supported_protocols"
|
|
83
|
+
description: "Agent declares supported protocols"
|
|
84
|
+
- check: field_present
|
|
85
|
+
path: "context"
|
|
86
|
+
description: "Response echoes back the context object"
|
|
87
|
+
- check: field_value
|
|
88
|
+
path: "context.correlation_id"
|
|
89
|
+
value: "pagination_integrity_collection_lists--get_capabilities"
|
|
90
|
+
description: "Context correlation_id returned unchanged"
|
|
91
|
+
|
|
92
|
+
- id: setup
|
|
93
|
+
title: "Bootstrap three collection lists"
|
|
94
|
+
narrative: |
|
|
95
|
+
Create three collection lists so the pagination walk has a deterministic
|
|
96
|
+
set of three items to page through with max_results=2.
|
|
97
|
+
steps:
|
|
98
|
+
- id: create_list_1
|
|
99
|
+
title: "Create first collection list"
|
|
100
|
+
narrative: |
|
|
101
|
+
Create a collection list for primetime drama programs. The agent MUST
|
|
102
|
+
accept this and return a list_id.
|
|
103
|
+
task: create_collection_list
|
|
104
|
+
schema_ref: "collection/create-collection-list-request.json"
|
|
105
|
+
response_schema_ref: "collection/create-collection-list-response.json"
|
|
106
|
+
doc_ref: "/governance/task-reference/create_collection_list"
|
|
107
|
+
comply_scenario: pagination_integrity_collection_lists
|
|
108
|
+
stateful: true
|
|
109
|
+
expected: |
|
|
110
|
+
Accept the collection list and return a list.list_id.
|
|
111
|
+
|
|
112
|
+
sample_request:
|
|
113
|
+
account:
|
|
114
|
+
brand:
|
|
115
|
+
domain: "acmeoutdoor.example"
|
|
116
|
+
operator: "pinnacle-agency.example"
|
|
117
|
+
name: "Primetime Drama Allowlist"
|
|
118
|
+
description: "Collection of approved primetime drama programs."
|
|
119
|
+
idempotency_key: "$generate:uuid_v4#pagination_integrity_collection_lists_setup_create_list_1"
|
|
120
|
+
context:
|
|
121
|
+
correlation_id: "pagination_integrity_collection_lists--setup_1"
|
|
122
|
+
validations:
|
|
123
|
+
- check: response_schema
|
|
124
|
+
description: "Response matches create-collection-list-response.json schema"
|
|
125
|
+
- check: field_present
|
|
126
|
+
path: "list.list_id"
|
|
127
|
+
description: "Response contains list.list_id"
|
|
128
|
+
|
|
129
|
+
- id: create_list_2
|
|
130
|
+
title: "Create second collection list"
|
|
131
|
+
narrative: |
|
|
132
|
+
Create a collection list for news programs.
|
|
133
|
+
task: create_collection_list
|
|
134
|
+
schema_ref: "collection/create-collection-list-request.json"
|
|
135
|
+
response_schema_ref: "collection/create-collection-list-response.json"
|
|
136
|
+
doc_ref: "/governance/task-reference/create_collection_list"
|
|
137
|
+
comply_scenario: pagination_integrity_collection_lists
|
|
138
|
+
stateful: true
|
|
139
|
+
expected: |
|
|
140
|
+
Accept the collection list and return a list.list_id.
|
|
141
|
+
|
|
142
|
+
sample_request:
|
|
143
|
+
account:
|
|
144
|
+
brand:
|
|
145
|
+
domain: "acmeoutdoor.example"
|
|
146
|
+
operator: "pinnacle-agency.example"
|
|
147
|
+
name: "News Programs Allowlist"
|
|
148
|
+
description: "Approved national news broadcast programs."
|
|
149
|
+
idempotency_key: "$generate:uuid_v4#pagination_integrity_collection_lists_setup_create_list_2"
|
|
150
|
+
context:
|
|
151
|
+
correlation_id: "pagination_integrity_collection_lists--setup_2"
|
|
152
|
+
validations:
|
|
153
|
+
- check: response_schema
|
|
154
|
+
description: "Response matches create-collection-list-response.json schema"
|
|
155
|
+
- check: field_present
|
|
156
|
+
path: "list.list_id"
|
|
157
|
+
description: "Response contains list.list_id"
|
|
158
|
+
|
|
159
|
+
- id: create_list_3
|
|
160
|
+
title: "Create third collection list"
|
|
161
|
+
narrative: |
|
|
162
|
+
Create a collection list for sports programs.
|
|
163
|
+
task: create_collection_list
|
|
164
|
+
schema_ref: "collection/create-collection-list-request.json"
|
|
165
|
+
response_schema_ref: "collection/create-collection-list-response.json"
|
|
166
|
+
doc_ref: "/governance/task-reference/create_collection_list"
|
|
167
|
+
comply_scenario: pagination_integrity_collection_lists
|
|
168
|
+
stateful: true
|
|
169
|
+
expected: |
|
|
170
|
+
Accept the collection list and return a list.list_id.
|
|
171
|
+
|
|
172
|
+
sample_request:
|
|
173
|
+
account:
|
|
174
|
+
brand:
|
|
175
|
+
domain: "acmeoutdoor.example"
|
|
176
|
+
operator: "pinnacle-agency.example"
|
|
177
|
+
name: "Sports Programs Allowlist"
|
|
178
|
+
description: "Approved live sports broadcasts."
|
|
179
|
+
idempotency_key: "$generate:uuid_v4#pagination_integrity_collection_lists_setup_create_list_3"
|
|
180
|
+
context:
|
|
181
|
+
correlation_id: "pagination_integrity_collection_lists--setup_3"
|
|
182
|
+
validations:
|
|
183
|
+
- check: response_schema
|
|
184
|
+
description: "Response matches create-collection-list-response.json schema"
|
|
185
|
+
- check: field_present
|
|
186
|
+
path: "list.list_id"
|
|
187
|
+
description: "Response contains list.list_id"
|
|
188
|
+
|
|
189
|
+
- id: pagination_walk
|
|
190
|
+
title: "Walk pages with a small max_results"
|
|
191
|
+
narrative: |
|
|
192
|
+
With three collection lists seeded and `max_results: 2`, the first call
|
|
193
|
+
MUST return a continuation page (has_more=true with a cursor). The runner
|
|
194
|
+
then follows the cursor; the second call MUST return the terminal page
|
|
195
|
+
(has_more=false with no cursor).
|
|
196
|
+
|
|
197
|
+
steps:
|
|
198
|
+
- id: first_page
|
|
199
|
+
title: "Request the first page with max_results=2"
|
|
200
|
+
narrative: |
|
|
201
|
+
The buyer asks for up to two collection lists. The agent has three
|
|
202
|
+
matching lists, so the request is non-terminal: callers expect
|
|
203
|
+
`has_more=true` and a `cursor` they can follow to retrieve the
|
|
204
|
+
remaining list.
|
|
205
|
+
|
|
206
|
+
The runner captures `pagination.cursor` into `$context.next_cursor`
|
|
207
|
+
for the follow-up step. If the agent reports `has_more=false` on
|
|
208
|
+
this page (hiding the seeded third list behind a dishonest terminal
|
|
209
|
+
signal), the field_value check on `pagination.has_more` fails.
|
|
210
|
+
task: list_collection_lists
|
|
211
|
+
schema_ref: "collection/list-collection-lists-request.json"
|
|
212
|
+
response_schema_ref: "collection/list-collection-lists-response.json"
|
|
213
|
+
doc_ref: "/governance/task-reference/list_collection_lists"
|
|
214
|
+
comply_scenario: pagination_integrity_collection_lists
|
|
215
|
+
stateful: true
|
|
216
|
+
context_outputs:
|
|
217
|
+
- name: next_cursor
|
|
218
|
+
path: "pagination.cursor"
|
|
219
|
+
expected: |
|
|
220
|
+
Return up to two collection lists with:
|
|
221
|
+
- pagination.has_more = true
|
|
222
|
+
- pagination.cursor present (an opaque continuation token)
|
|
223
|
+
|
|
224
|
+
sample_request:
|
|
225
|
+
account:
|
|
226
|
+
brand:
|
|
227
|
+
domain: "acmeoutdoor.example"
|
|
228
|
+
operator: "pinnacle-agency.example"
|
|
229
|
+
pagination:
|
|
230
|
+
max_results: 2
|
|
231
|
+
|
|
232
|
+
context:
|
|
233
|
+
correlation_id: "pagination_integrity_collection_lists--first_page"
|
|
234
|
+
validations:
|
|
235
|
+
- check: response_schema
|
|
236
|
+
description: "Response matches list-collection-lists-response.json schema"
|
|
237
|
+
- check: field_value
|
|
238
|
+
path: "pagination.has_more"
|
|
239
|
+
value: true
|
|
240
|
+
description: "Three lists seeded with max_results=2 → first page is non-terminal"
|
|
241
|
+
- check: field_present
|
|
242
|
+
path: "pagination.cursor"
|
|
243
|
+
description: "has_more=true requires a cursor — without one the caller cannot continue"
|
|
244
|
+
- check: field_value_or_absent
|
|
245
|
+
path: "pagination.total_count"
|
|
246
|
+
allowed_values: [3]
|
|
247
|
+
description: "If volunteered, total_count MUST equal the seeded set size"
|
|
248
|
+
- check: field_present
|
|
249
|
+
path: "context"
|
|
250
|
+
description: "Response echoes back the context object"
|
|
251
|
+
- check: field_value
|
|
252
|
+
path: "context.correlation_id"
|
|
253
|
+
value: "pagination_integrity_collection_lists--first_page"
|
|
254
|
+
description: "Context correlation_id returned unchanged"
|
|
255
|
+
|
|
256
|
+
- id: terminal_page
|
|
257
|
+
title: "Follow the cursor to the terminal page"
|
|
258
|
+
narrative: |
|
|
259
|
+
The buyer follows the captured cursor. With at most one remaining
|
|
260
|
+
list the agent MUST return a terminal page: `has_more=false` with no
|
|
261
|
+
`cursor` field. A cursor on `has_more=false` is a stale token that
|
|
262
|
+
invites callers to follow it past the end of results.
|
|
263
|
+
task: list_collection_lists
|
|
264
|
+
schema_ref: "collection/list-collection-lists-request.json"
|
|
265
|
+
response_schema_ref: "collection/list-collection-lists-response.json"
|
|
266
|
+
doc_ref: "/governance/task-reference/list_collection_lists"
|
|
267
|
+
comply_scenario: pagination_integrity_collection_lists
|
|
268
|
+
stateful: true
|
|
269
|
+
expected: |
|
|
270
|
+
Return the remaining list(s) with:
|
|
271
|
+
- pagination.has_more = false
|
|
272
|
+
- pagination.cursor absent
|
|
273
|
+
|
|
274
|
+
sample_request:
|
|
275
|
+
account:
|
|
276
|
+
brand:
|
|
277
|
+
domain: "acmeoutdoor.example"
|
|
278
|
+
operator: "pinnacle-agency.example"
|
|
279
|
+
pagination:
|
|
280
|
+
cursor: "$context.next_cursor"
|
|
281
|
+
max_results: 2
|
|
282
|
+
|
|
283
|
+
context:
|
|
284
|
+
correlation_id: "pagination_integrity_collection_lists--terminal_page"
|
|
285
|
+
validations:
|
|
286
|
+
- check: response_schema
|
|
287
|
+
description: "Response matches list-collection-lists-response.json schema"
|
|
288
|
+
- check: field_value
|
|
289
|
+
path: "pagination.has_more"
|
|
290
|
+
value: false
|
|
291
|
+
description: "After two pages of two items the seeded set is exhausted"
|
|
292
|
+
- check: field_value_or_absent
|
|
293
|
+
path: "pagination.cursor"
|
|
294
|
+
allowed_values: [null]
|
|
295
|
+
description: "Terminal page MUST omit cursor (null also accepted for clients that explicitly clear the field)"
|
|
296
|
+
- check: field_value_or_absent
|
|
297
|
+
path: "pagination.total_count"
|
|
298
|
+
allowed_values: [3]
|
|
299
|
+
description: "total_count (when volunteered) MUST stay stable across pages and equal the seeded set size"
|
|
300
|
+
- check: field_present
|
|
301
|
+
path: "context"
|
|
302
|
+
description: "Response echoes back the context object"
|
|
303
|
+
- check: field_value
|
|
304
|
+
path: "context.correlation_id"
|
|
305
|
+
value: "pagination_integrity_collection_lists--terminal_page"
|
|
306
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
id: comply_controller_mode_gate
|
|
2
|
+
version: '1.0.0'
|
|
3
|
+
title: 'Comply test controller — live-account denial gate'
|
|
4
|
+
category: deterministic_testing
|
|
5
|
+
summary: 'Verifies that a seller exposing comply_test_controller refuses calls from live-mode (non-sandbox) accounts with FORBIDDEN.'
|
|
6
|
+
track: security
|
|
7
|
+
required_tools:
|
|
8
|
+
- comply_test_controller
|
|
9
|
+
|
|
10
|
+
requires:
|
|
11
|
+
- controller
|
|
12
|
+
|
|
13
|
+
narrative: |
|
|
14
|
+
Sellers that expose comply_test_controller MUST gate dispatch against the calling
|
|
15
|
+
account's mode. When a buyer agent authenticates as a live-mode (non-sandbox)
|
|
16
|
+
account and calls comply_test_controller, the seller MUST refuse with
|
|
17
|
+
error: FORBIDDEN before dispatching any scenario.
|
|
18
|
+
|
|
19
|
+
This storyboard exercises the denial path by sending a well-formed
|
|
20
|
+
force_creative_status request from a live-mode principal (test-kit:
|
|
21
|
+
acme-outdoor-live, sandbox: false) and asserting FORBIDDEN is returned.
|
|
22
|
+
|
|
23
|
+
The live_account_denial phase is optional for two-deployment sellers whose
|
|
24
|
+
sandbox endpoint admits all authenticated principals regardless of account mode.
|
|
25
|
+
Those sellers rely on their production endpoint simply not advertising
|
|
26
|
+
comply_test_controller. Single-endpoint sellers that expose the controller on
|
|
27
|
+
their main endpoint MUST implement per-account gating and MUST pass this phase.
|
|
28
|
+
|
|
29
|
+
This storyboard is the keystone for the (Sandbox) AAO Verified tier — a seller
|
|
30
|
+
claiming that badge must prove its compliance infrastructure correctly refuses
|
|
31
|
+
live-mode callers from the controller surface, confirming the sandbox/production
|
|
32
|
+
boundary is enforced in both directions.
|
|
33
|
+
|
|
34
|
+
agent:
|
|
35
|
+
interaction_model: media_buy_seller
|
|
36
|
+
capabilities:
|
|
37
|
+
- sells_media
|
|
38
|
+
- supports_test_controller
|
|
39
|
+
examples:
|
|
40
|
+
- 'Any single-endpoint seller with comply_test_controller'
|
|
41
|
+
|
|
42
|
+
caller:
|
|
43
|
+
role: buyer_agent
|
|
44
|
+
example: 'Comply test harness'
|
|
45
|
+
|
|
46
|
+
prerequisites:
|
|
47
|
+
description: |
|
|
48
|
+
The seller must expose comply_test_controller (verified by requires: [controller]
|
|
49
|
+
at storyboard load time). The live-mode test kit (acme-outdoor-live, sandbox: false)
|
|
50
|
+
provides an API key whose associated account resolves as live/production mode.
|
|
51
|
+
Conformant sellers resolve the account, detect mode: live, and return FORBIDDEN
|
|
52
|
+
without dispatching the scenario.
|
|
53
|
+
test_kit: 'test-kits/acme-outdoor-live.yaml'
|
|
54
|
+
|
|
55
|
+
phases:
|
|
56
|
+
- id: live_account_denial
|
|
57
|
+
title: 'Live-account caller is denied'
|
|
58
|
+
narrative: |
|
|
59
|
+
A buyer authenticates as the live-mode Acme Outdoor principal (sandbox: false)
|
|
60
|
+
and calls comply_test_controller with a well-formed force_creative_status request.
|
|
61
|
+
|
|
62
|
+
Sellers that implement per-account gating MUST detect mode: live and return
|
|
63
|
+
ControllerError with error: FORBIDDEN before any scenario dispatch occurs.
|
|
64
|
+
|
|
65
|
+
This phase is optional: two-deployment sellers whose sandbox endpoint
|
|
66
|
+
has no per-account gate will return a successful state transition rather than
|
|
67
|
+
FORBIDDEN, which would fail this phase. Those sellers correctly prevent
|
|
68
|
+
live-mode misuse by not advertising the tool on their production endpoint
|
|
69
|
+
at all, so an optional result here does not indicate non-conformance.
|
|
70
|
+
|
|
71
|
+
optional: true
|
|
72
|
+
|
|
73
|
+
steps:
|
|
74
|
+
- id: deny_live_caller
|
|
75
|
+
title: 'comply_test_controller returns FORBIDDEN for a live-mode account'
|
|
76
|
+
narrative: |
|
|
77
|
+
Send a valid force_creative_status request authenticated as the live-mode
|
|
78
|
+
principal. The creative_id comply-live-mode-probe-000 is a stable probe
|
|
79
|
+
value that will not exist on any real seller; the scenario is benign —
|
|
80
|
+
the seller's gate fires before entity lookup, so NOT_FOUND is not a
|
|
81
|
+
conformant response here.
|
|
82
|
+
|
|
83
|
+
The seller MUST resolve the calling account, detect that account.mode
|
|
84
|
+
is live (not sandbox), and return FORBIDDEN. Returning UNKNOWN_SCENARIO,
|
|
85
|
+
NOT_FOUND, or a success response are all non-conformant for a
|
|
86
|
+
single-endpoint seller that implements the gate.
|
|
87
|
+
task: comply_test_controller
|
|
88
|
+
schema_ref: 'compliance/comply-test-controller-request.json'
|
|
89
|
+
response_schema_ref: 'compliance/comply-test-controller-response.json'
|
|
90
|
+
doc_ref: '/building/implementation/comply-test-controller'
|
|
91
|
+
comply_scenario: comply_controller_mode_gate
|
|
92
|
+
stateful: false
|
|
93
|
+
auth:
|
|
94
|
+
type: api_key
|
|
95
|
+
from_test_kit: true
|
|
96
|
+
expect_error: true
|
|
97
|
+
negative_path: payload_well_formed
|
|
98
|
+
expected: |
|
|
99
|
+
Seller refuses with:
|
|
100
|
+
- success: false
|
|
101
|
+
- error: FORBIDDEN
|
|
102
|
+
- error_detail (optional): human-readable explanation such as
|
|
103
|
+
"comply_test_controller requires a sandbox account; resolved
|
|
104
|
+
account is in live mode"
|
|
105
|
+
|
|
106
|
+
sample_request:
|
|
107
|
+
scenario: 'force_creative_status'
|
|
108
|
+
params:
|
|
109
|
+
creative_id: 'comply-live-mode-probe-000'
|
|
110
|
+
status: 'approved'
|
|
111
|
+
# account.sandbox is a caller-side declaration of intent (schema const: true).
|
|
112
|
+
# The denial here comes from the seller resolving the auth principal to a
|
|
113
|
+
# live-mode account in its persisted records — not from the payload claim.
|
|
114
|
+
# The payload still MUST be schema-valid, otherwise it never reaches the
|
|
115
|
+
# per-account gate (schema rejection happens first as defense-in-depth).
|
|
116
|
+
account:
|
|
117
|
+
sandbox: true
|
|
118
|
+
context:
|
|
119
|
+
correlation_id: "comply_controller_mode_gate--deny_live_caller"
|
|
120
|
+
|
|
121
|
+
validations:
|
|
122
|
+
- check: response_schema
|
|
123
|
+
description: 'Response matches comply-test-controller-response.json schema (ControllerError branch)'
|
|
124
|
+
- check: field_value
|
|
125
|
+
path: 'success'
|
|
126
|
+
allowed_values:
|
|
127
|
+
- false
|
|
128
|
+
description: 'Request is rejected — seller refused live-mode controller dispatch'
|
|
129
|
+
- check: field_value
|
|
130
|
+
path: 'error'
|
|
131
|
+
allowed_values:
|
|
132
|
+
- 'FORBIDDEN'
|
|
133
|
+
description: 'Error code is FORBIDDEN — seller detected live-mode account and denied dispatch before scenario execution'
|
|
134
|
+
|
|
135
|
+
- check: field_present
|
|
136
|
+
path: "context"
|
|
137
|
+
description: "Response echoes back the context object"
|
|
138
|
+
- check: field_value
|
|
139
|
+
path: "context.correlation_id"
|
|
140
|
+
value: "comply_controller_mode_gate--deny_live_caller"
|
|
141
|
+
description: "Context correlation_id returned unchanged"
|