@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
package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
id: media_buy_seller/inventory_list_targeting
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller honors property_list and collection_list targeting on create and update"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that a seller accepts PropertyListReference and CollectionListReference in package targeting on create_media_buy AND update_media_buy, with parity between both paths."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
- update_media_buy
|
|
11
|
+
|
|
12
|
+
narrative: |
|
|
13
|
+
AdCP 3.0 targets inventory through agent-hosted reference lists rather than inline
|
|
14
|
+
property arrays. Buyers point a package's targeting at a `PropertyListReference`
|
|
15
|
+
and/or `CollectionListReference`; the seller resolves the list against its own
|
|
16
|
+
inventory at serve time.
|
|
17
|
+
|
|
18
|
+
A common integration regression is create/update parity: a seller accepts list
|
|
19
|
+
references on create_media_buy but silently drops them on update_media_buy, so a
|
|
20
|
+
buyer who edits a live buy loses their list targeting. This scenario writes both
|
|
21
|
+
list types on create, then swaps both on update, and finally reads the buy back
|
|
22
|
+
to confirm the updated references are what the seller persisted.
|
|
23
|
+
|
|
24
|
+
The buyer references pre-populated inventory lists from the test kit — one for
|
|
25
|
+
matching properties and one for matching collections — so the seller's test
|
|
26
|
+
engine can resolve them without needing a live governance/inventory agent.
|
|
27
|
+
|
|
28
|
+
agent:
|
|
29
|
+
interaction_model: media_buy_seller
|
|
30
|
+
capabilities:
|
|
31
|
+
- sells_media
|
|
32
|
+
- supports_property_list_targeting
|
|
33
|
+
- supports_collection_list_targeting
|
|
34
|
+
examples:
|
|
35
|
+
- "Sellers that accept PropertyListReference / CollectionListReference in package targeting"
|
|
36
|
+
|
|
37
|
+
caller:
|
|
38
|
+
role: buyer_agent
|
|
39
|
+
example: "Pinnacle Agency (buyer)"
|
|
40
|
+
|
|
41
|
+
prerequisites:
|
|
42
|
+
description: |
|
|
43
|
+
The seller must accept PropertyListReference and CollectionListReference in
|
|
44
|
+
package targeting on both create_media_buy and update_media_buy. List contents
|
|
45
|
+
come from test-kits/acme-outdoor.yaml → inventory_targets.
|
|
46
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
47
|
+
|
|
48
|
+
phases:
|
|
49
|
+
- id: discover_product
|
|
50
|
+
title: "Discover a product that supports list targeting"
|
|
51
|
+
steps:
|
|
52
|
+
- id: get_products_brief
|
|
53
|
+
title: "Discover product"
|
|
54
|
+
task: get_products
|
|
55
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
56
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
57
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
58
|
+
comply_scenario: full_sales_flow
|
|
59
|
+
stateful: false
|
|
60
|
+
expected: |
|
|
61
|
+
Return at least one product whose targeting supports property_list and
|
|
62
|
+
collection_list references.
|
|
63
|
+
|
|
64
|
+
sample_request:
|
|
65
|
+
buying_mode: "brief"
|
|
66
|
+
brief: "Video inventory on outdoor lifestyle programming. Q3 flight, $30K budget."
|
|
67
|
+
filters:
|
|
68
|
+
is_fixed_price: true
|
|
69
|
+
account:
|
|
70
|
+
brand:
|
|
71
|
+
domain: "acmeoutdoor.example"
|
|
72
|
+
operator: "pinnacle-agency.example"
|
|
73
|
+
sandbox: true
|
|
74
|
+
|
|
75
|
+
context:
|
|
76
|
+
correlation_id: "inventory_list_targeting--get_products_brief"
|
|
77
|
+
context_outputs:
|
|
78
|
+
- path: "products[0].product_id"
|
|
79
|
+
key: "product_id"
|
|
80
|
+
- path: "products[0].pricing_options[0].pricing_option_id"
|
|
81
|
+
key: "pricing_option_id"
|
|
82
|
+
validations:
|
|
83
|
+
- check: response_schema
|
|
84
|
+
description: "Response matches get-products-response.json schema"
|
|
85
|
+
- check: field_present
|
|
86
|
+
path: "products[0].product_id"
|
|
87
|
+
description: "Product has a product_id"
|
|
88
|
+
- check: field_present
|
|
89
|
+
path: "products[0].pricing_options[0].fixed_price"
|
|
90
|
+
description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
|
|
91
|
+
|
|
92
|
+
- id: create_with_both_lists
|
|
93
|
+
title: "Create media buy with property_list AND collection_list targeting"
|
|
94
|
+
narrative: |
|
|
95
|
+
The buyer references the matching-property list and the matching-collection
|
|
96
|
+
list from the test kit. The seller accepts both references, creates the buy,
|
|
97
|
+
and echoes the resolved targeting back on the package.
|
|
98
|
+
|
|
99
|
+
steps:
|
|
100
|
+
- id: create_buy_with_lists
|
|
101
|
+
title: "create_media_buy with both list references"
|
|
102
|
+
task: create_media_buy
|
|
103
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
104
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
105
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
106
|
+
comply_scenario: create_media_buy
|
|
107
|
+
stateful: true
|
|
108
|
+
expected: |
|
|
109
|
+
The seller accepts the list references without error. The response
|
|
110
|
+
includes a media_buy_id and the package retains both the property_list
|
|
111
|
+
and collection_list targeting fields so subsequent get / update calls
|
|
112
|
+
can read them back.
|
|
113
|
+
|
|
114
|
+
sample_request:
|
|
115
|
+
brand:
|
|
116
|
+
domain: "acmeoutdoor.example"
|
|
117
|
+
account:
|
|
118
|
+
brand:
|
|
119
|
+
domain: "acmeoutdoor.example"
|
|
120
|
+
operator: "pinnacle-agency.example"
|
|
121
|
+
sandbox: true
|
|
122
|
+
idempotency_key: "$generate:uuid_v4#inventory_list_targeting_create_buy"
|
|
123
|
+
start_time: "2026-07-01T00:00:00Z"
|
|
124
|
+
end_time: "2026-09-30T23:59:59Z"
|
|
125
|
+
packages:
|
|
126
|
+
- product_id: "$context.product_id"
|
|
127
|
+
budget: 20000
|
|
128
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
129
|
+
targeting_overlay:
|
|
130
|
+
property_list:
|
|
131
|
+
agent_url: "https://governance.pinnacle-agency.example"
|
|
132
|
+
list_id: "acme_outdoor_allowlist_v1"
|
|
133
|
+
collection_list:
|
|
134
|
+
agent_url: "https://governance.pinnacle-agency.example"
|
|
135
|
+
list_id: "acme_outdoor_collections_v1"
|
|
136
|
+
|
|
137
|
+
context:
|
|
138
|
+
correlation_id: "inventory_list_targeting--create_buy_with_lists"
|
|
139
|
+
context_outputs:
|
|
140
|
+
- path: "media_buy_id"
|
|
141
|
+
key: "media_buy_id"
|
|
142
|
+
- path: "packages[0].package_id"
|
|
143
|
+
key: "package_id"
|
|
144
|
+
validations:
|
|
145
|
+
- check: response_schema
|
|
146
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
147
|
+
- check: field_present
|
|
148
|
+
path: "media_buy_id"
|
|
149
|
+
description: "Seller assigns a media_buy_id"
|
|
150
|
+
- check: field_present
|
|
151
|
+
path: "context"
|
|
152
|
+
description: "Response echoes back the context object"
|
|
153
|
+
|
|
154
|
+
- id: verify_create_persisted
|
|
155
|
+
title: "Verify list targeting persisted after create"
|
|
156
|
+
narrative: |
|
|
157
|
+
Read the buy back to confirm the seller stored both list references — not just
|
|
158
|
+
echoed them back in the create response. This catches sellers that parse list
|
|
159
|
+
references on create but never persist them to their internal package model.
|
|
160
|
+
|
|
161
|
+
steps:
|
|
162
|
+
- id: get_after_create
|
|
163
|
+
title: "get_media_buys after create"
|
|
164
|
+
task: get_media_buys
|
|
165
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
166
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
167
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
168
|
+
comply_scenario: media_buy_lifecycle
|
|
169
|
+
stateful: true
|
|
170
|
+
expected: |
|
|
171
|
+
Return the media buy with packages[0].targeting_overlay.property_list
|
|
172
|
+
and .collection_list populated with the list_id values sent on create.
|
|
173
|
+
|
|
174
|
+
sample_request:
|
|
175
|
+
account:
|
|
176
|
+
brand:
|
|
177
|
+
domain: "acmeoutdoor.example"
|
|
178
|
+
operator: "pinnacle-agency.example"
|
|
179
|
+
sandbox: true
|
|
180
|
+
media_buy_ids:
|
|
181
|
+
- "$context.media_buy_id"
|
|
182
|
+
|
|
183
|
+
context:
|
|
184
|
+
correlation_id: "inventory_list_targeting--get_after_create"
|
|
185
|
+
validations:
|
|
186
|
+
- check: response_schema
|
|
187
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
188
|
+
- check: field_value
|
|
189
|
+
path: "media_buys[0].packages[0].targeting_overlay.property_list.list_id"
|
|
190
|
+
value: "acme_outdoor_allowlist_v1"
|
|
191
|
+
description: "property_list.list_id persisted after create"
|
|
192
|
+
- check: field_value
|
|
193
|
+
path: "media_buys[0].packages[0].targeting_overlay.collection_list.list_id"
|
|
194
|
+
value: "acme_outdoor_collections_v1"
|
|
195
|
+
description: "collection_list.list_id persisted after create"
|
|
196
|
+
|
|
197
|
+
- id: update_swap_lists
|
|
198
|
+
title: "Swap property_list and collection_list via update_media_buy"
|
|
199
|
+
narrative: |
|
|
200
|
+
The buyer swaps both list references. This is the create/update parity check:
|
|
201
|
+
a seller that accepts list references on create but silently drops them on
|
|
202
|
+
update would fail to update the persisted targeting. We exercise update
|
|
203
|
+
explicitly to catch that class of regression.
|
|
204
|
+
|
|
205
|
+
steps:
|
|
206
|
+
- id: update_buy_swap_lists
|
|
207
|
+
title: "update_media_buy replaces both list references"
|
|
208
|
+
task: update_media_buy
|
|
209
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
210
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
211
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
212
|
+
comply_scenario: media_buy_lifecycle
|
|
213
|
+
stateful: true
|
|
214
|
+
expected: |
|
|
215
|
+
The seller acknowledges the updated targeting. Both property_list and
|
|
216
|
+
collection_list are replaced (not merged) with the new list_id values.
|
|
217
|
+
|
|
218
|
+
sample_request:
|
|
219
|
+
account:
|
|
220
|
+
brand:
|
|
221
|
+
domain: "acmeoutdoor.example"
|
|
222
|
+
operator: "pinnacle-agency.example"
|
|
223
|
+
sandbox: true
|
|
224
|
+
media_buy_id: "$context.media_buy_id"
|
|
225
|
+
packages:
|
|
226
|
+
- package_id: "$context.package_id"
|
|
227
|
+
targeting_overlay:
|
|
228
|
+
property_list:
|
|
229
|
+
agent_url: "https://governance.pinnacle-agency.example"
|
|
230
|
+
list_id: "acme_outdoor_no_match_v1"
|
|
231
|
+
collection_list:
|
|
232
|
+
agent_url: "https://governance.pinnacle-agency.example"
|
|
233
|
+
list_id: "acme_outdoor_no_match_collections_v1"
|
|
234
|
+
|
|
235
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_inventory_list_targeting_update_swap_lists_update_buy_swap_lists"
|
|
236
|
+
context:
|
|
237
|
+
correlation_id: "inventory_list_targeting--update_buy_swap_lists"
|
|
238
|
+
validations:
|
|
239
|
+
- check: response_schema
|
|
240
|
+
description: "Response matches update-media-buy-response.json schema"
|
|
241
|
+
|
|
242
|
+
- id: get_after_update
|
|
243
|
+
title: "Confirm swap persisted"
|
|
244
|
+
task: get_media_buys
|
|
245
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
246
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
247
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
248
|
+
comply_scenario: media_buy_lifecycle
|
|
249
|
+
stateful: true
|
|
250
|
+
expected: |
|
|
251
|
+
The persisted package targeting reflects the new list_id values. This is
|
|
252
|
+
the create/update parity guarantee: edits through update_media_buy land
|
|
253
|
+
in persistent state just like fields on create_media_buy.
|
|
254
|
+
|
|
255
|
+
sample_request:
|
|
256
|
+
account:
|
|
257
|
+
brand:
|
|
258
|
+
domain: "acmeoutdoor.example"
|
|
259
|
+
operator: "pinnacle-agency.example"
|
|
260
|
+
sandbox: true
|
|
261
|
+
media_buy_ids:
|
|
262
|
+
- "$context.media_buy_id"
|
|
263
|
+
|
|
264
|
+
context:
|
|
265
|
+
correlation_id: "inventory_list_targeting--get_after_update"
|
|
266
|
+
validations:
|
|
267
|
+
- check: response_schema
|
|
268
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
269
|
+
- check: field_value
|
|
270
|
+
path: "media_buys[0].packages[0].targeting_overlay.property_list.list_id"
|
|
271
|
+
value: "acme_outdoor_no_match_v1"
|
|
272
|
+
description: "property_list.list_id updated after update_media_buy"
|
|
273
|
+
- check: field_value
|
|
274
|
+
path: "media_buys[0].packages[0].targeting_overlay.collection_list.list_id"
|
|
275
|
+
value: "acme_outdoor_no_match_collections_v1"
|
|
276
|
+
description: "collection_list.list_id updated after update_media_buy"
|
package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
id: media_buy_seller/measurement_accountability
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "End-to-end metric accountability through the media buy lifecycle"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Buyer requires specific reporting metrics at discovery; seller filters products to those that can deliver; delivery report exposes any gaps via missing_metrics."
|
|
6
|
+
track: reporting
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
- get_media_buy_delivery
|
|
11
|
+
- comply_test_controller
|
|
12
|
+
|
|
13
|
+
narrative: |
|
|
14
|
+
A buyer that needs `completed_views` for a CTV CPCV buy should be able to
|
|
15
|
+
enforce that requirement at discovery time, carry it through the lifecycle,
|
|
16
|
+
and verify in delivery reporting that the metric was actually produced.
|
|
17
|
+
AdCP supports this contract in three pieces:
|
|
18
|
+
|
|
19
|
+
1. `filters.required_metrics` on `get_products` — buyer declares the
|
|
20
|
+
metric vocabulary they need. Sellers MUST exclude products whose
|
|
21
|
+
`reporting_capabilities.available_metrics` is not a superset
|
|
22
|
+
(filter-not-fail; do not return an error). Derived ratio metrics
|
|
23
|
+
like `completion_rate` are satisfied by their underlying scalars.
|
|
24
|
+
|
|
25
|
+
2. The product's declared `available_metrics` carries forward as the
|
|
26
|
+
reporting contract — no additional field is needed on `create_media_buy`.
|
|
27
|
+
|
|
28
|
+
3. `by_package[].missing_metrics` on `get_media_buy_delivery` — seller
|
|
29
|
+
lists any metrics from the product's `available_metrics` that are
|
|
30
|
+
NOT populated in this report. Empty (or absent) means clean
|
|
31
|
+
delivery; non-empty signals an accountability breach.
|
|
32
|
+
|
|
33
|
+
This storyboard exercises that contract end to end. It uses
|
|
34
|
+
comply_test_controller to inject delivery so reporting has data to
|
|
35
|
+
validate, then asserts the schema-level contract on missing_metrics.
|
|
36
|
+
|
|
37
|
+
agent:
|
|
38
|
+
interaction_model: media_buy_seller
|
|
39
|
+
capabilities:
|
|
40
|
+
- sells_media
|
|
41
|
+
examples:
|
|
42
|
+
- "CTV/streaming sellers with completion-rate reporting"
|
|
43
|
+
- "Any media buy seller that publishes available_metrics"
|
|
44
|
+
|
|
45
|
+
caller:
|
|
46
|
+
role: buyer_agent
|
|
47
|
+
example: "Pinnacle Agency (buyer)"
|
|
48
|
+
|
|
49
|
+
prerequisites:
|
|
50
|
+
description: |
|
|
51
|
+
The seller publishes `reporting_capabilities.available_metrics` on its
|
|
52
|
+
products and supports comply_test_controller's simulate_delivery
|
|
53
|
+
scenario for delivery reporting tests.
|
|
54
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
55
|
+
controller_seeding: true
|
|
56
|
+
|
|
57
|
+
fixtures:
|
|
58
|
+
products:
|
|
59
|
+
- product_id: "ctv_premium_completed_views"
|
|
60
|
+
delivery_type: "guaranteed"
|
|
61
|
+
channels: ["ctv"]
|
|
62
|
+
format_ids:
|
|
63
|
+
- id: "video_15s"
|
|
64
|
+
pricing_options:
|
|
65
|
+
- product_id: "ctv_premium_completed_views"
|
|
66
|
+
pricing_option_id: "cpm_standard"
|
|
67
|
+
pricing_model: "cpm"
|
|
68
|
+
currency: "USD"
|
|
69
|
+
fixed_price: 25.0
|
|
70
|
+
|
|
71
|
+
phases:
|
|
72
|
+
- id: discover_with_required_metrics
|
|
73
|
+
title: "Discover products that commit to reporting completed_views"
|
|
74
|
+
narrative: |
|
|
75
|
+
The buyer needs CTV inventory with `completed_views` reporting for a
|
|
76
|
+
CPCV-priced campaign. They pass `required_metrics: ["completed_views"]`
|
|
77
|
+
in filters. The seller MUST silently exclude products whose
|
|
78
|
+
`available_metrics` doesn't include `completed_views` — this is a
|
|
79
|
+
capability filter, not a guarantee threshold.
|
|
80
|
+
steps:
|
|
81
|
+
- id: sync_accounts
|
|
82
|
+
title: "Establish account"
|
|
83
|
+
task: sync_accounts
|
|
84
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
85
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
86
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
87
|
+
stateful: true
|
|
88
|
+
expected: |
|
|
89
|
+
Return the account with account_id and status active.
|
|
90
|
+
sample_request:
|
|
91
|
+
accounts:
|
|
92
|
+
- brand:
|
|
93
|
+
domain: "acmeoutdoor.example"
|
|
94
|
+
operator: "pinnacle-agency.example"
|
|
95
|
+
billing: "operator"
|
|
96
|
+
payment_terms: "net_30"
|
|
97
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_measurement_accountability_setup_sync_accounts"
|
|
98
|
+
validations:
|
|
99
|
+
- check: response_schema
|
|
100
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
101
|
+
- check: field_present
|
|
102
|
+
path: "accounts[0].account_id"
|
|
103
|
+
description: "Account has a platform-assigned ID"
|
|
104
|
+
|
|
105
|
+
- id: get_products_required_metrics
|
|
106
|
+
title: "Discover with required_metrics filter"
|
|
107
|
+
task: get_products
|
|
108
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
109
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
110
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
111
|
+
comply_scenario: full_sales_flow
|
|
112
|
+
stateful: false
|
|
113
|
+
expected: |
|
|
114
|
+
Return only products whose reporting_capabilities.available_metrics
|
|
115
|
+
includes "completed_views". Products that don't are silently
|
|
116
|
+
excluded; the seller does NOT return an error for unmet metrics.
|
|
117
|
+
sample_request:
|
|
118
|
+
buying_mode: "brief"
|
|
119
|
+
brief: "CTV inventory with completed-view reporting for a Q2 CPCV campaign."
|
|
120
|
+
filters:
|
|
121
|
+
channels: ["ctv"]
|
|
122
|
+
is_fixed_price: true
|
|
123
|
+
required_metrics:
|
|
124
|
+
- "completed_views"
|
|
125
|
+
account:
|
|
126
|
+
brand:
|
|
127
|
+
domain: "acmeoutdoor.example"
|
|
128
|
+
operator: "pinnacle-agency.example"
|
|
129
|
+
context_outputs:
|
|
130
|
+
- path: "products[0].product_id"
|
|
131
|
+
key: "product_id"
|
|
132
|
+
- path: "products[0].pricing_options[0].pricing_option_id"
|
|
133
|
+
key: "pricing_option_id"
|
|
134
|
+
validations:
|
|
135
|
+
- check: response_schema
|
|
136
|
+
description: "Response matches get-products-response.json schema"
|
|
137
|
+
- check: field_present
|
|
138
|
+
path: "products[0].product_id"
|
|
139
|
+
description: "At least one product matched the required metrics"
|
|
140
|
+
- check: field_present
|
|
141
|
+
path: "products[0].reporting_capabilities.available_metrics"
|
|
142
|
+
description: "Matched product declares its available_metrics — schema validation confirms the superset relationship via the closed enum"
|
|
143
|
+
- check: field_present
|
|
144
|
+
path: "products[0].pricing_options[0].fixed_price"
|
|
145
|
+
description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
|
|
146
|
+
|
|
147
|
+
- id: create_media_buy
|
|
148
|
+
title: "Commit the media buy"
|
|
149
|
+
steps:
|
|
150
|
+
- id: create_media_buy
|
|
151
|
+
title: "Create media buy on the matched product"
|
|
152
|
+
task: create_media_buy
|
|
153
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
154
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
155
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
156
|
+
comply_scenario: create_media_buy
|
|
157
|
+
stateful: true
|
|
158
|
+
expected: |
|
|
159
|
+
The buy succeeds. The product's available_metrics carries forward as
|
|
160
|
+
the reporting contract — no additional field is required on the buy.
|
|
161
|
+
sample_request:
|
|
162
|
+
brand:
|
|
163
|
+
domain: "acmeoutdoor.example"
|
|
164
|
+
account:
|
|
165
|
+
brand:
|
|
166
|
+
domain: "acmeoutdoor.example"
|
|
167
|
+
operator: "pinnacle-agency.example"
|
|
168
|
+
start_time: "2026-05-01T00:00:00Z"
|
|
169
|
+
end_time: "2026-05-31T23:59:59Z"
|
|
170
|
+
packages:
|
|
171
|
+
- product_id: "$context.product_id"
|
|
172
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
173
|
+
budget: 25000
|
|
174
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_measurement_accountability_create"
|
|
175
|
+
validations:
|
|
176
|
+
- check: response_schema
|
|
177
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
178
|
+
- check: field_present
|
|
179
|
+
path: "media_buy_id"
|
|
180
|
+
description: "Seller returns a media_buy_id"
|
|
181
|
+
|
|
182
|
+
- id: simulate_and_validate_accountability
|
|
183
|
+
title: "Simulate delivery and validate missing_metrics contract"
|
|
184
|
+
narrative: |
|
|
185
|
+
Inject simulated delivery via the test controller, then call
|
|
186
|
+
get_media_buy_delivery and check that `by_package[].missing_metrics` is
|
|
187
|
+
present and shaped correctly. When the seller has populated all metrics
|
|
188
|
+
it advertised, missing_metrics is empty (or absent). When a metric
|
|
189
|
+
from the product's available_metrics is not present in this report,
|
|
190
|
+
it MUST appear in missing_metrics — except for derived ratios
|
|
191
|
+
(completion_rate, ctr, etc.) which are derivable from scalars and
|
|
192
|
+
never appear in this list.
|
|
193
|
+
steps:
|
|
194
|
+
- id: simulate_delivery
|
|
195
|
+
title: "Inject simulated delivery metrics"
|
|
196
|
+
task: comply_test_controller
|
|
197
|
+
requires_tool: comply_test_controller
|
|
198
|
+
stateful: true
|
|
199
|
+
expected: |
|
|
200
|
+
The test controller acknowledges the simulated delivery data.
|
|
201
|
+
sample_request:
|
|
202
|
+
account:
|
|
203
|
+
sandbox: true
|
|
204
|
+
scenario: "simulate_delivery"
|
|
205
|
+
params:
|
|
206
|
+
media_buy_id: "$context.media_buy_id"
|
|
207
|
+
impressions: 100000
|
|
208
|
+
completed_views: 72000
|
|
209
|
+
reported_spend:
|
|
210
|
+
amount: 2500.00
|
|
211
|
+
currency: "USD"
|
|
212
|
+
validations:
|
|
213
|
+
- check: field_value
|
|
214
|
+
path: "success"
|
|
215
|
+
allowed_values: [true]
|
|
216
|
+
description: "Delivery simulation succeeds"
|
|
217
|
+
|
|
218
|
+
- id: get_delivery_clean
|
|
219
|
+
title: "Get delivery report and assert clean accountability"
|
|
220
|
+
task: get_media_buy_delivery
|
|
221
|
+
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
222
|
+
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
223
|
+
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
224
|
+
comply_scenario: reporting_flow
|
|
225
|
+
stateful: true
|
|
226
|
+
expected: |
|
|
227
|
+
Return delivery metrics with completed_views populated. The
|
|
228
|
+
by_package entry includes `missing_metrics: []` (or omits the
|
|
229
|
+
field entirely) because every metric the product advertised is
|
|
230
|
+
present in this report.
|
|
231
|
+
sample_request:
|
|
232
|
+
account:
|
|
233
|
+
brand:
|
|
234
|
+
domain: "acmeoutdoor.example"
|
|
235
|
+
operator: "pinnacle-agency.example"
|
|
236
|
+
media_buy_ids:
|
|
237
|
+
- "$context.media_buy_id"
|
|
238
|
+
validations:
|
|
239
|
+
- check: response_schema
|
|
240
|
+
description: "Response matches get-media-buy-delivery-response.json schema (validates missing_metrics shape when present)"
|
|
241
|
+
- check: field_value_or_absent
|
|
242
|
+
path: "media_buy_deliveries[0].by_package[0].missing_metrics"
|
|
243
|
+
value: []
|
|
244
|
+
description: "missing_metrics is empty (or absent) — clean delivery against the declared contract, no accountability breach"
|