@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,380 @@
|
|
|
1
|
+
id: media_buy_seller/audience_buy_flow
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller fulfills a media buy with audience targeting from a synced CRM audience"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that a seller advertising audience_targeting can ingest a CRM audience via sync_audiences, accept a media buy whose targeting_overlay references the bound audience_id, reject malformed audience references, and report delivery for the audience-targeted buy. Sibling to media_buy_seller/performance_buy_flow on the audience side: the unbound-id rejection is the discriminating assertion."
|
|
6
|
+
track: media_buy
|
|
7
|
+
|
|
8
|
+
# Gate: scenario runs only when the seller declares audience_targeting.
|
|
9
|
+
# Sellers without it (broadcast TV, signal-only, pure brand-suitability) grade
|
|
10
|
+
# `not_applicable`, not failing. Audience targeting and the audience-sync
|
|
11
|
+
# specialism are separate concerns — a seller can support audience_include /
|
|
12
|
+
# audience_exclude on a buy without claiming the full audience-sync lifecycle
|
|
13
|
+
# (e.g., a DSP that accepts buyer-uploaded CRM lists but doesn't expose
|
|
14
|
+
# discovery/deletion semantics). Requires runner support for the `present:`
|
|
15
|
+
# matcher (adcp-client >= 7.6.0).
|
|
16
|
+
requires_capability:
|
|
17
|
+
path: media_buy.audience_targeting
|
|
18
|
+
present: true
|
|
19
|
+
|
|
20
|
+
required_tools:
|
|
21
|
+
- get_products
|
|
22
|
+
- sync_audiences
|
|
23
|
+
- create_media_buy
|
|
24
|
+
- get_media_buy_delivery
|
|
25
|
+
- comply_test_controller
|
|
26
|
+
|
|
27
|
+
invariants:
|
|
28
|
+
- status.monotonic
|
|
29
|
+
|
|
30
|
+
narrative: |
|
|
31
|
+
An "audience buy" is a media buy whose packages restrict delivery to
|
|
32
|
+
members of a first-party CRM audience. The buyer pushes hashed
|
|
33
|
+
identifiers to the seller via sync_audiences, the seller matches them
|
|
34
|
+
against its user graph, and the buyer references the resulting
|
|
35
|
+
audience_id in targeting_overlay.audience_include[] or audience_exclude[]
|
|
36
|
+
on a create_media_buy.
|
|
37
|
+
|
|
38
|
+
This scenario is a buy-mode contract test, not a parent specialism. A DSP
|
|
39
|
+
may run audience buys AND performance buys against the same agent; this
|
|
40
|
+
scenario certifies that the audience path connects end-to-end when the
|
|
41
|
+
seller advertises audience_targeting. The full audience lifecycle
|
|
42
|
+
(discovery, deletion, status polling) lives on the audience-sync
|
|
43
|
+
specialism — what this scenario asserts is the buy-side wiring.
|
|
44
|
+
|
|
45
|
+
Discriminating behaviors this scenario verifies:
|
|
46
|
+
1. sync_audiences returns an audience_id that is then valid as the
|
|
47
|
+
binding target on targeting_overlay.audience_include[].
|
|
48
|
+
2. create_media_buy with a package whose targeting_overlay references the
|
|
49
|
+
registered audience is accepted.
|
|
50
|
+
3. create_media_buy with targeting_overlay.audience_include referencing
|
|
51
|
+
an unregistered audience_id is rejected (INVALID_REQUEST with
|
|
52
|
+
error.field set to the offending audience_include[k] path) — silent
|
|
53
|
+
acceptance would mean the seller cannot actually restrict delivery to
|
|
54
|
+
the buyer's intended audience.
|
|
55
|
+
4. get_media_buy_delivery returns standard delivery totals for the
|
|
56
|
+
audience-targeted buy. Per-audience delivery breakdown
|
|
57
|
+
(impressions / spend split per audience_id) is deliberately NOT
|
|
58
|
+
asserted here — it isn't a first-class field in
|
|
59
|
+
get-media-buy-delivery-response.json today. A follow-up scenario gated
|
|
60
|
+
on a sub-capability bit will land per-audience attribution.
|
|
61
|
+
|
|
62
|
+
Audience suppression via audience_exclude follows the same binding
|
|
63
|
+
contract (rejected if the audience_id wasn't registered) but is not
|
|
64
|
+
exercised twice here — one positive + one negative on audience_include is
|
|
65
|
+
the discriminating signal.
|
|
66
|
+
|
|
67
|
+
agent:
|
|
68
|
+
interaction_model: media_buy_seller
|
|
69
|
+
capabilities:
|
|
70
|
+
- sells_media
|
|
71
|
+
- supports_non_guaranteed
|
|
72
|
+
- audience_targeting
|
|
73
|
+
examples:
|
|
74
|
+
- "DSPs accepting buyer-uploaded CRM audiences"
|
|
75
|
+
- "Retail-media networks matching first-party identifiers"
|
|
76
|
+
- "Social platforms (Meta / TikTok / Snap audience-targeted buying)"
|
|
77
|
+
- "CTV platforms with audience overlay support"
|
|
78
|
+
|
|
79
|
+
caller:
|
|
80
|
+
role: buyer_agent
|
|
81
|
+
example: "Pinnacle Agency (buyer)"
|
|
82
|
+
|
|
83
|
+
prerequisites:
|
|
84
|
+
description: |
|
|
85
|
+
The seller must implement comply_test_controller with simulate_delivery
|
|
86
|
+
(already required for delivery_reporting). simulate_delivery injects
|
|
87
|
+
impressions and spend so get_media_buy_delivery has something to return
|
|
88
|
+
for the audience-targeted buy.
|
|
89
|
+
|
|
90
|
+
The buyer fixture supplies a brand, an operator, and a small CRM
|
|
91
|
+
audience definition with hashed_email identifiers sufficient to
|
|
92
|
+
exercise the audience binding contract.
|
|
93
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
94
|
+
controller_seeding: true
|
|
95
|
+
|
|
96
|
+
fixtures:
|
|
97
|
+
products:
|
|
98
|
+
- product_id: "audience_display_q2"
|
|
99
|
+
delivery_type: "non_guaranteed"
|
|
100
|
+
channels: ["display"]
|
|
101
|
+
format_ids:
|
|
102
|
+
- id: "display_300x250"
|
|
103
|
+
pricing_options:
|
|
104
|
+
- product_id: "audience_display_q2"
|
|
105
|
+
pricing_option_id: "auction_cpm"
|
|
106
|
+
pricing_model: "cpm"
|
|
107
|
+
currency: "USD"
|
|
108
|
+
floor_price: 2.00
|
|
109
|
+
|
|
110
|
+
phases:
|
|
111
|
+
|
|
112
|
+
- id: setup
|
|
113
|
+
title: "Establish account and discover products"
|
|
114
|
+
steps:
|
|
115
|
+
- id: sync_accounts
|
|
116
|
+
title: "Establish account"
|
|
117
|
+
task: sync_accounts
|
|
118
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
119
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
120
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
121
|
+
stateful: true
|
|
122
|
+
expected: |
|
|
123
|
+
Return the account with account_id and status active.
|
|
124
|
+
sample_request:
|
|
125
|
+
accounts:
|
|
126
|
+
- brand:
|
|
127
|
+
domain: "acmeoutdoor.example"
|
|
128
|
+
operator: "pinnacle-agency.example"
|
|
129
|
+
billing: "operator"
|
|
130
|
+
idempotency_key: "$generate:uuid_v4#audience_buy_flow_setup_sync_accounts"
|
|
131
|
+
validations:
|
|
132
|
+
- check: response_schema
|
|
133
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
134
|
+
- check: field_present
|
|
135
|
+
path: "accounts[0].account_id"
|
|
136
|
+
description: "Account has a platform-assigned ID"
|
|
137
|
+
|
|
138
|
+
- id: get_products_for_audience
|
|
139
|
+
title: "Discover products that support audience targeting"
|
|
140
|
+
task: get_products
|
|
141
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
142
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
143
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
144
|
+
stateful: false
|
|
145
|
+
expected: |
|
|
146
|
+
Return at least one product whose audience_targeting capabilities
|
|
147
|
+
indicate audience_include / audience_exclude overlays are accepted.
|
|
148
|
+
sample_request:
|
|
149
|
+
buying_mode: "brief"
|
|
150
|
+
brief: "Display inventory, US adults 25-54, restricted to a first-party CRM audience. Q2 flight, ~$15K budget."
|
|
151
|
+
required_capabilities:
|
|
152
|
+
- "audience_targeting"
|
|
153
|
+
account:
|
|
154
|
+
brand:
|
|
155
|
+
domain: "acmeoutdoor.example"
|
|
156
|
+
operator: "pinnacle-agency.example"
|
|
157
|
+
validations:
|
|
158
|
+
- check: response_schema
|
|
159
|
+
description: "Response matches get-products-response.json schema"
|
|
160
|
+
- check: field_present
|
|
161
|
+
path: "products"
|
|
162
|
+
description: "Response contains products"
|
|
163
|
+
|
|
164
|
+
- id: audience_binding
|
|
165
|
+
title: "Register the CRM audience"
|
|
166
|
+
narrative: |
|
|
167
|
+
The audience-targeted buy cannot be created without a registered
|
|
168
|
+
audience_id. This phase exercises the binding — sync_audiences returns
|
|
169
|
+
an audience_id (echoing the buyer's submitted id) that subsequent
|
|
170
|
+
create_media_buy calls reference in targeting_overlay.
|
|
171
|
+
|
|
172
|
+
steps:
|
|
173
|
+
- id: sync_audience
|
|
174
|
+
title: "Push a CRM audience with hashed email identifiers"
|
|
175
|
+
task: sync_audiences
|
|
176
|
+
schema_ref: "media-buy/sync-audiences-request.json"
|
|
177
|
+
response_schema_ref: "media-buy/sync-audiences-response.json"
|
|
178
|
+
doc_ref: "/media-buy/task-reference/sync_audiences"
|
|
179
|
+
stateful: true
|
|
180
|
+
expected: |
|
|
181
|
+
Accept the audience and return:
|
|
182
|
+
- audience_id: matches the submitted ID
|
|
183
|
+
- action: created (first sync) or updated (re-sync)
|
|
184
|
+
- status: processing, ready, or too_small per match outcome
|
|
185
|
+
sample_request:
|
|
186
|
+
account:
|
|
187
|
+
brand:
|
|
188
|
+
domain: "acmeoutdoor.example"
|
|
189
|
+
operator: "pinnacle-agency.example"
|
|
190
|
+
audiences:
|
|
191
|
+
- audience_id: "acmeoutdoor-loyal-customers"
|
|
192
|
+
name: "Acme Outdoor loyal customers"
|
|
193
|
+
audience_type: "crm"
|
|
194
|
+
add:
|
|
195
|
+
- external_id: "acme-cust-0001"
|
|
196
|
+
hashed_email: "a000000000000000000000000000000000000000000000000000000000000001"
|
|
197
|
+
- external_id: "acme-cust-0002"
|
|
198
|
+
hashed_email: "a000000000000000000000000000000000000000000000000000000000000002"
|
|
199
|
+
- external_id: "acme-cust-0003"
|
|
200
|
+
hashed_email: "a000000000000000000000000000000000000000000000000000000000000003"
|
|
201
|
+
idempotency_key: "$generate:uuid_v4#audience_buy_flow_audience_binding_sync_audiences"
|
|
202
|
+
validations:
|
|
203
|
+
- check: response_schema
|
|
204
|
+
description: "Response matches sync-audiences-response.json schema"
|
|
205
|
+
- check: field_present
|
|
206
|
+
path: "audiences[0].audience_id"
|
|
207
|
+
description: "Audience has an audience_id (echo of the buyer's submitted id)"
|
|
208
|
+
- check: field_present
|
|
209
|
+
path: "audiences[0].action"
|
|
210
|
+
description: "Audience has an action (created or updated)"
|
|
211
|
+
# Anti-façade: an adapter that returns a shape-valid sync_audiences
|
|
212
|
+
# response without forwarding the hashed identifiers to its upstream
|
|
213
|
+
# user-graph fails this check. Adopters who don't advertise
|
|
214
|
+
# query_upstream_traffic in list_scenarios grade not_applicable.
|
|
215
|
+
- check: upstream_traffic
|
|
216
|
+
description: "sync_audiences caused upstream traffic carrying the supplied hashed identifiers"
|
|
217
|
+
min_count: 1
|
|
218
|
+
endpoint_pattern: "POST *"
|
|
219
|
+
identifier_paths:
|
|
220
|
+
- "audiences[*].add[*].hashed_email"
|
|
221
|
+
- "audiences[*].add[*].external_id"
|
|
222
|
+
|
|
223
|
+
- id: create_buy_with_audience
|
|
224
|
+
title: "Create a buy whose targeting binds to the registered audience"
|
|
225
|
+
narrative: |
|
|
226
|
+
The buyer creates a media buy whose package targeting_overlay carries
|
|
227
|
+
audience_include referencing the registered audience_id. The seller
|
|
228
|
+
should accept and return a media_buy_id used for subsequent delivery
|
|
229
|
+
checks.
|
|
230
|
+
|
|
231
|
+
steps:
|
|
232
|
+
- id: create_media_buy_with_audience
|
|
233
|
+
title: "Create media buy with audience_include in targeting_overlay"
|
|
234
|
+
task: create_media_buy
|
|
235
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
236
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
237
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
238
|
+
stateful: true
|
|
239
|
+
expected: |
|
|
240
|
+
Create the media buy. Response carries a media_buy_id used for
|
|
241
|
+
subsequent get_media_buy_delivery calls.
|
|
242
|
+
sample_request:
|
|
243
|
+
brand:
|
|
244
|
+
domain: "acmeoutdoor.example"
|
|
245
|
+
account:
|
|
246
|
+
brand:
|
|
247
|
+
domain: "acmeoutdoor.example"
|
|
248
|
+
operator: "pinnacle-agency.example"
|
|
249
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
250
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
251
|
+
packages:
|
|
252
|
+
- product_id: "audience_display_q2"
|
|
253
|
+
budget: 15000
|
|
254
|
+
pricing_option_id: "auction_cpm"
|
|
255
|
+
targeting_overlay:
|
|
256
|
+
audience_include:
|
|
257
|
+
- "acmeoutdoor-loyal-customers"
|
|
258
|
+
idempotency_key: "$generate:uuid_v4#audience_buy_flow_create_buy_with_audience_create_media_buy"
|
|
259
|
+
context_outputs:
|
|
260
|
+
- name: media_buy_id
|
|
261
|
+
path: "media_buy_id"
|
|
262
|
+
validations:
|
|
263
|
+
- check: response_schema
|
|
264
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
265
|
+
- check: field_present
|
|
266
|
+
path: "media_buy_id"
|
|
267
|
+
description: "Media buy has a platform-assigned ID"
|
|
268
|
+
|
|
269
|
+
- id: rejection_unbound_audience
|
|
270
|
+
title: "Reject a buy referencing an unregistered audience"
|
|
271
|
+
narrative: |
|
|
272
|
+
Silent acceptance of an unregistered audience_id is a façade — the
|
|
273
|
+
seller cannot restrict delivery to an audience it doesn't know about.
|
|
274
|
+
The seller MUST reject with INVALID_REQUEST and set error.field to the
|
|
275
|
+
offending audience_include path. Sibling contract to the
|
|
276
|
+
event_source_id binding asserted in performance_buy_flow.
|
|
277
|
+
|
|
278
|
+
steps:
|
|
279
|
+
- id: create_media_buy_with_phantom_audience
|
|
280
|
+
title: "Submit a buy whose targeting_overlay references a non-existent audience_id"
|
|
281
|
+
task: create_media_buy
|
|
282
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
283
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
284
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
285
|
+
expect_error: true
|
|
286
|
+
negative_path: payload_well_formed
|
|
287
|
+
stateful: false
|
|
288
|
+
expected: |
|
|
289
|
+
Reject with INVALID_REQUEST. error.field points at the offending
|
|
290
|
+
audience_include[k] path. media_buy_id is not allocated.
|
|
291
|
+
sample_request:
|
|
292
|
+
brand:
|
|
293
|
+
domain: "acmeoutdoor.example"
|
|
294
|
+
account:
|
|
295
|
+
brand:
|
|
296
|
+
domain: "acmeoutdoor.example"
|
|
297
|
+
operator: "pinnacle-agency.example"
|
|
298
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
299
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
300
|
+
packages:
|
|
301
|
+
- product_id: "audience_display_q2"
|
|
302
|
+
budget: 5000
|
|
303
|
+
pricing_option_id: "auction_cpm"
|
|
304
|
+
targeting_overlay:
|
|
305
|
+
audience_include:
|
|
306
|
+
- "does_not_exist_phantom_audience"
|
|
307
|
+
idempotency_key: "$generate:uuid_v4#audience_buy_flow_rejection_unbound_audience"
|
|
308
|
+
validations:
|
|
309
|
+
- check: error_code
|
|
310
|
+
allowed_values: ["INVALID_REQUEST"]
|
|
311
|
+
description: "Seller rejects the unbound audience_id with INVALID_REQUEST"
|
|
312
|
+
- check: field_value
|
|
313
|
+
path: "errors[0].field"
|
|
314
|
+
value: "packages[0].targeting_overlay.audience_include[0]"
|
|
315
|
+
description: "Error.field points at the offending audience_include[0] path (core/error.json defines field as deterministic JSONPath-lite — literal equality)"
|
|
316
|
+
|
|
317
|
+
- id: delivery_check
|
|
318
|
+
title: "Delivery reporting for the audience-targeted buy"
|
|
319
|
+
narrative: |
|
|
320
|
+
The discriminating assertion of the audience buy mode is the binding
|
|
321
|
+
contract proven above. Delivery reporting here verifies the
|
|
322
|
+
audience-targeted buy is a real, observable buy in the seller's
|
|
323
|
+
system — totals.impressions surfaces under standard delivery shape.
|
|
324
|
+
|
|
325
|
+
Per-audience delivery breakdown (impressions / spend split per
|
|
326
|
+
audience_id within media_buy_deliveries[].totals) is deliberately
|
|
327
|
+
NOT asserted: that field isn't first-class in delivery-metrics.json
|
|
328
|
+
today. A follow-up scenario gated on a sub-capability bit will land
|
|
329
|
+
per-audience attribution once the breakdown shape is in spec.
|
|
330
|
+
|
|
331
|
+
steps:
|
|
332
|
+
- id: simulate_audience_delivery
|
|
333
|
+
title: "Inject impressions + spend for the audience-targeted buy"
|
|
334
|
+
task: comply_test_controller
|
|
335
|
+
requires_tool: comply_test_controller
|
|
336
|
+
stateful: true
|
|
337
|
+
expected: |
|
|
338
|
+
The test controller acknowledges the simulated delivery.
|
|
339
|
+
sample_request:
|
|
340
|
+
account:
|
|
341
|
+
sandbox: true
|
|
342
|
+
scenario: "simulate_delivery"
|
|
343
|
+
params:
|
|
344
|
+
media_buy_id: "$context.media_buy_id"
|
|
345
|
+
impressions: 80000
|
|
346
|
+
clicks: 1200
|
|
347
|
+
reported_spend:
|
|
348
|
+
amount: 1800.00
|
|
349
|
+
currency: "USD"
|
|
350
|
+
validations:
|
|
351
|
+
- check: field_value
|
|
352
|
+
path: "success"
|
|
353
|
+
allowed_values: [true]
|
|
354
|
+
description: "Delivery simulation succeeds"
|
|
355
|
+
|
|
356
|
+
- id: get_audience_delivery
|
|
357
|
+
title: "Get delivery and verify totals for the audience-targeted buy"
|
|
358
|
+
task: get_media_buy_delivery
|
|
359
|
+
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
360
|
+
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
361
|
+
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
362
|
+
stateful: true
|
|
363
|
+
expected: |
|
|
364
|
+
Delivery response includes totals.impressions for the audience-
|
|
365
|
+
targeted buy. Per-audience attribution is not asserted (see
|
|
366
|
+
phase narrative).
|
|
367
|
+
sample_request:
|
|
368
|
+
account:
|
|
369
|
+
brand:
|
|
370
|
+
domain: "acmeoutdoor.example"
|
|
371
|
+
operator: "pinnacle-agency.example"
|
|
372
|
+
media_buy_ids:
|
|
373
|
+
- "$context.media_buy_id"
|
|
374
|
+
include_package_daily_breakdown: true
|
|
375
|
+
validations:
|
|
376
|
+
- check: response_schema
|
|
377
|
+
description: "Response matches get-media-buy-delivery-response.json schema"
|
|
378
|
+
- check: field_present
|
|
379
|
+
path: "media_buy_deliveries[0].totals.impressions"
|
|
380
|
+
description: "Impression count surfaced at the buy level"
|