@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
package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
id: media_buy_seller/measurement_terms_rejected
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller rejects unworkable measurement_terms"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Buyer proposes measurement_terms the seller will not accept; seller returns TERMS_REJECTED; buyer retries with seller-compatible terms."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
|
|
11
|
+
narrative: |
|
|
12
|
+
measurement_terms negotiation is a round-trip. The buyer proposes a measurement vendor,
|
|
13
|
+
window, and variance tolerance on each package; the seller either accepts (returning
|
|
14
|
+
measurement_terms echoed in the response) or rejects with TERMS_REJECTED and a message
|
|
15
|
+
explaining what is unacceptable. The buyer mints a fresh idempotency_key and retries
|
|
16
|
+
create_media_buy with the adjusted payload — reusing the prior key against a different
|
|
17
|
+
body MUST be rejected with IDEMPOTENCY_CONFLICT per spec.
|
|
18
|
+
|
|
19
|
+
This scenario sends an intentionally aggressive first proposal (max_variance_percent: 0
|
|
20
|
+
with a window the seller does not guarantee), verifies the seller rejects with
|
|
21
|
+
TERMS_REJECTED, then retries with a relaxed proposal that falls inside the seller's
|
|
22
|
+
stated tolerance and expects a successful create_media_buy.
|
|
23
|
+
|
|
24
|
+
agent:
|
|
25
|
+
interaction_model: media_buy_seller
|
|
26
|
+
capabilities:
|
|
27
|
+
- sells_media
|
|
28
|
+
- measurement_terms
|
|
29
|
+
examples:
|
|
30
|
+
- "Broadcast sellers"
|
|
31
|
+
- "CTV sellers with C3/C7 guarantees"
|
|
32
|
+
- "Any seller that negotiates measurement terms"
|
|
33
|
+
|
|
34
|
+
caller:
|
|
35
|
+
role: buyer_agent
|
|
36
|
+
example: "Pinnacle Agency (buyer)"
|
|
37
|
+
|
|
38
|
+
prerequisites:
|
|
39
|
+
description: |
|
|
40
|
+
Seller supports measurement_terms on create_media_buy packages. Buyer knows the
|
|
41
|
+
seller's declared measurement capabilities from get_adcp_capabilities.
|
|
42
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
43
|
+
|
|
44
|
+
phases:
|
|
45
|
+
- id: discover_products
|
|
46
|
+
title: "Discover products"
|
|
47
|
+
steps:
|
|
48
|
+
- id: get_products_brief
|
|
49
|
+
title: "Find a product that supports measurement_terms"
|
|
50
|
+
task: get_products
|
|
51
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
52
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
53
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
54
|
+
comply_scenario: full_sales_flow
|
|
55
|
+
stateful: false
|
|
56
|
+
expected: |
|
|
57
|
+
Return products with pricing_options. At least one product should advertise
|
|
58
|
+
measurement support in the response.
|
|
59
|
+
sample_request:
|
|
60
|
+
buying_mode: "brief"
|
|
61
|
+
brief: "Premium video inventory with measurement guarantees. Q3 flight, $50K."
|
|
62
|
+
filters:
|
|
63
|
+
is_fixed_price: true
|
|
64
|
+
account:
|
|
65
|
+
brand:
|
|
66
|
+
domain: "acmeoutdoor.example"
|
|
67
|
+
operator: "pinnacle-agency.example"
|
|
68
|
+
context_outputs:
|
|
69
|
+
- path: "products[0].product_id"
|
|
70
|
+
key: "product_id"
|
|
71
|
+
- path: "products[0].pricing_options[0].pricing_option_id"
|
|
72
|
+
key: "pricing_option_id"
|
|
73
|
+
validations:
|
|
74
|
+
- check: response_schema
|
|
75
|
+
description: "Response matches get-products-response.json schema"
|
|
76
|
+
- check: field_present
|
|
77
|
+
path: "products[0].product_id"
|
|
78
|
+
description: "At least one product returned"
|
|
79
|
+
- check: field_present
|
|
80
|
+
path: "products[0].pricing_options[0].fixed_price"
|
|
81
|
+
description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
|
|
82
|
+
|
|
83
|
+
- id: reject_terms
|
|
84
|
+
title: "Seller rejects unworkable terms"
|
|
85
|
+
narrative: |
|
|
86
|
+
The buyer proposes max_variance_percent: 0 — a tolerance almost no seller can
|
|
87
|
+
honor against third-party measurement. The seller must reject with TERMS_REJECTED
|
|
88
|
+
and indicate what would be acceptable.
|
|
89
|
+
|
|
90
|
+
steps:
|
|
91
|
+
- id: create_media_buy_aggressive_terms
|
|
92
|
+
title: "Propose aggressive measurement_terms"
|
|
93
|
+
task: create_media_buy
|
|
94
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
95
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
96
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
97
|
+
comply_scenario: create_media_buy
|
|
98
|
+
expect_error: true
|
|
99
|
+
negative_path: payload_well_formed
|
|
100
|
+
stateful: false
|
|
101
|
+
expected: |
|
|
102
|
+
Reject with:
|
|
103
|
+
- code: TERMS_REJECTED
|
|
104
|
+
- recovery: correctable
|
|
105
|
+
- message indicating which terms are unworkable (vendor, window, or variance)
|
|
106
|
+
|
|
107
|
+
sample_request:
|
|
108
|
+
brand:
|
|
109
|
+
domain: "acmeoutdoor.example"
|
|
110
|
+
account:
|
|
111
|
+
brand:
|
|
112
|
+
domain: "acmeoutdoor.example"
|
|
113
|
+
operator: "pinnacle-agency.example"
|
|
114
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_measurement_terms_rejected_reject_terms_create_media_buy_aggressive_terms"
|
|
115
|
+
start_time: "2026-07-01T00:00:00Z"
|
|
116
|
+
end_time: "2026-09-30T23:59:59Z"
|
|
117
|
+
packages:
|
|
118
|
+
- product_id: "$context.product_id"
|
|
119
|
+
budget: 25000
|
|
120
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
121
|
+
measurement_terms:
|
|
122
|
+
billing_measurement:
|
|
123
|
+
vendor:
|
|
124
|
+
domain: "videoamp.example"
|
|
125
|
+
measurement_window: "c28"
|
|
126
|
+
max_variance_percent: 0
|
|
127
|
+
makegood_policy:
|
|
128
|
+
available_remedies: ["credit"]
|
|
129
|
+
|
|
130
|
+
context:
|
|
131
|
+
correlation_id: "measurement_terms_rejected--aggressive"
|
|
132
|
+
validations:
|
|
133
|
+
- check: error_code
|
|
134
|
+
value: "TERMS_REJECTED"
|
|
135
|
+
description: "Error code is TERMS_REJECTED"
|
|
136
|
+
- check: field_present
|
|
137
|
+
path: "context"
|
|
138
|
+
description: "Response echoes back the context object even on errors"
|
|
139
|
+
- check: field_value
|
|
140
|
+
path: "context.correlation_id"
|
|
141
|
+
value: "measurement_terms_rejected--aggressive"
|
|
142
|
+
description: "Context correlation_id returned unchanged"
|
|
143
|
+
|
|
144
|
+
- id: accept_terms
|
|
145
|
+
title: "Buyer retries with acceptable terms"
|
|
146
|
+
narrative: |
|
|
147
|
+
The buyer relaxes measurement_terms to match the seller's stated capability
|
|
148
|
+
(c7 window, 10% variance, makegood remedies) and retries. The seller accepts and
|
|
149
|
+
returns the confirmed terms echoed in the response.
|
|
150
|
+
|
|
151
|
+
steps:
|
|
152
|
+
- id: create_media_buy_relaxed_terms
|
|
153
|
+
title: "Propose seller-compatible measurement_terms"
|
|
154
|
+
task: create_media_buy
|
|
155
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
156
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
157
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
158
|
+
comply_scenario: create_media_buy
|
|
159
|
+
stateful: true
|
|
160
|
+
expected: |
|
|
161
|
+
The buy succeeds. The response echoes the accepted measurement_terms (possibly
|
|
162
|
+
normalized by the seller).
|
|
163
|
+
|
|
164
|
+
sample_request:
|
|
165
|
+
brand:
|
|
166
|
+
domain: "acmeoutdoor.example"
|
|
167
|
+
account:
|
|
168
|
+
brand:
|
|
169
|
+
domain: "acmeoutdoor.example"
|
|
170
|
+
operator: "pinnacle-agency.example"
|
|
171
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_measurement_terms_rejected_reject_terms_create_media_buy_aggressive_terms"
|
|
172
|
+
start_time: "2026-07-01T00:00:00Z"
|
|
173
|
+
end_time: "2026-09-30T23:59:59Z"
|
|
174
|
+
packages:
|
|
175
|
+
- product_id: "$context.product_id"
|
|
176
|
+
budget: 25000
|
|
177
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
178
|
+
measurement_terms:
|
|
179
|
+
billing_measurement:
|
|
180
|
+
vendor:
|
|
181
|
+
domain: "videoamp.example"
|
|
182
|
+
measurement_window: "c7"
|
|
183
|
+
max_variance_percent: 10
|
|
184
|
+
makegood_policy:
|
|
185
|
+
available_remedies: ["additional_delivery", "credit"]
|
|
186
|
+
|
|
187
|
+
context:
|
|
188
|
+
correlation_id: "measurement_terms_rejected--relaxed"
|
|
189
|
+
validations:
|
|
190
|
+
- check: response_schema
|
|
191
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
192
|
+
- check: field_present
|
|
193
|
+
path: "media_buy_id"
|
|
194
|
+
description: "Seller returns a media_buy_id after accepting terms"
|
|
195
|
+
- check: field_present
|
|
196
|
+
path: "context"
|
|
197
|
+
description: "Response echoes back the context object"
|
|
198
|
+
- check: field_value
|
|
199
|
+
path: "context.correlation_id"
|
|
200
|
+
value: "measurement_terms_rejected--relaxed"
|
|
201
|
+
description: "Context correlation_id returned unchanged"
|
|
202
|
+
reviewer_checks:
|
|
203
|
+
- "Reviewer MUST confirm the seller releases the idempotency claim after a TERMS_REJECTED response. Probe: send the aggressive-terms request (same key, step 1), then retry with the same key and corrected terms (this step) — the seller MUST return a fresh media_buy_id, not IDEMPOTENCY_CONFLICT. A seller that caches rejected requests would make this two-step retry pattern impossible. See security.mdx#idempotency rule 3 ('Only successful responses are cached')."
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
id: media_buy_seller/package_correlation_legacy_fallback
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Legacy package correlation fallback without product_id"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Models the mixed-seller compatibility path where a legacy package response omits product_id and buyers correlate by package context.buyer_ref."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_media_buys
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
Current sellers MUST echo package product_id for explicit create_media_buy
|
|
12
|
+
package requests. Legacy sellers may still return package objects without
|
|
13
|
+
product_id. Buyers and SDKs targeting mixed seller populations need an
|
|
14
|
+
executable compatibility vector for that legacy response shape: correlate the
|
|
15
|
+
seller-assigned package_id back to the requested line item through package
|
|
16
|
+
context, commonly context.buyer_ref.
|
|
17
|
+
|
|
18
|
+
This storyboard is a compatibility fixture, not the current seller
|
|
19
|
+
conformance path. The runner seeds a legacy-shaped media buy whose package
|
|
20
|
+
intentionally omits product_id, then verifies get_media_buys still surfaces
|
|
21
|
+
package-level context so a buyer can recover the mapping.
|
|
22
|
+
|
|
23
|
+
agent:
|
|
24
|
+
interaction_model: stateful_preloaded
|
|
25
|
+
capabilities:
|
|
26
|
+
- sells_media
|
|
27
|
+
examples:
|
|
28
|
+
- "Compatibility test harnesses validating buyer-side package correlation"
|
|
29
|
+
|
|
30
|
+
caller:
|
|
31
|
+
role: buyer_agent
|
|
32
|
+
example: "Pinnacle Agency (buyer)"
|
|
33
|
+
|
|
34
|
+
prerequisites:
|
|
35
|
+
description: |
|
|
36
|
+
The runner seeds a legacy-shaped media buy via seed_media_buy. Sellers or
|
|
37
|
+
SDK test harnesses that do not implement seed_media_buy grade this scenario
|
|
38
|
+
not_applicable rather than failing current seller conformance.
|
|
39
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
40
|
+
controller_seeding: true
|
|
41
|
+
|
|
42
|
+
fixtures:
|
|
43
|
+
media_buys:
|
|
44
|
+
- media_buy_id: "legacy_package_correlation_buy"
|
|
45
|
+
status: "active"
|
|
46
|
+
currency: "USD"
|
|
47
|
+
total_budget: 5000
|
|
48
|
+
confirmed_at: "2026-04-01T00:00:00Z"
|
|
49
|
+
revision: 1
|
|
50
|
+
context:
|
|
51
|
+
correlation_id: "legacy-package-correlation-media-buy"
|
|
52
|
+
packages:
|
|
53
|
+
- package_id: "pkg_legacy_context_only"
|
|
54
|
+
budget: 5000
|
|
55
|
+
currency: "USD"
|
|
56
|
+
context:
|
|
57
|
+
buyer_ref: "legacy-line-001"
|
|
58
|
+
|
|
59
|
+
phases:
|
|
60
|
+
- id: read_legacy_package
|
|
61
|
+
title: "Read a legacy package shape"
|
|
62
|
+
narrative: |
|
|
63
|
+
The buyer reads a seeded media buy whose package intentionally has no
|
|
64
|
+
product_id. The response must still include package context.buyer_ref,
|
|
65
|
+
giving the buyer a stable fallback mapping from package_id to the line
|
|
66
|
+
item it submitted.
|
|
67
|
+
steps:
|
|
68
|
+
- id: get_seeded_legacy_buy
|
|
69
|
+
title: "Get seeded legacy media buy"
|
|
70
|
+
task: get_media_buys
|
|
71
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
72
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
73
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
74
|
+
comply_scenario: package_correlation_legacy_fallback
|
|
75
|
+
stateful: true
|
|
76
|
+
expected: |
|
|
77
|
+
Return the seeded media buy with:
|
|
78
|
+
- media_buys[0].packages[0].package_id present
|
|
79
|
+
- media_buys[0].packages[0].product_id absent, modeling the legacy response
|
|
80
|
+
- media_buys[0].packages[0].context.buyer_ref preserved for fallback correlation
|
|
81
|
+
|
|
82
|
+
sample_request:
|
|
83
|
+
account:
|
|
84
|
+
brand:
|
|
85
|
+
domain: "acmeoutdoor.example"
|
|
86
|
+
operator: "pinnacle-agency.example"
|
|
87
|
+
media_buy_ids:
|
|
88
|
+
- "legacy_package_correlation_buy"
|
|
89
|
+
context:
|
|
90
|
+
correlation_id: "package_correlation_legacy_fallback--get_seeded_legacy_buy"
|
|
91
|
+
|
|
92
|
+
validations:
|
|
93
|
+
- check: response_schema
|
|
94
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
95
|
+
- check: field_value
|
|
96
|
+
path: "media_buys[0].media_buy_id"
|
|
97
|
+
value: "legacy_package_correlation_buy"
|
|
98
|
+
description: "The seeded legacy media buy is returned"
|
|
99
|
+
- check: field_value
|
|
100
|
+
path: "media_buys[0].packages[0].package_id"
|
|
101
|
+
value: "pkg_legacy_context_only"
|
|
102
|
+
description: "Package has the seller-assigned package_id buyers must persist"
|
|
103
|
+
- check: field_absent
|
|
104
|
+
path: "media_buys[0].packages[0].product_id"
|
|
105
|
+
description: "Legacy-shaped package omits product_id; this scenario verifies fallback behavior, not current seller conformance"
|
|
106
|
+
- check: field_value
|
|
107
|
+
path: "media_buys[0].packages[0].context.buyer_ref"
|
|
108
|
+
value: "legacy-line-001"
|
|
109
|
+
description: "Package context preserves buyer_ref for buyer-side fallback correlation"
|
|
110
|
+
- check: field_value
|
|
111
|
+
path: "context.correlation_id"
|
|
112
|
+
value: "package_correlation_legacy_fallback--get_seeded_legacy_buy"
|
|
113
|
+
description: "Response context correlation_id returned unchanged"
|
package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
id: media_buy_seller/pending_creatives_to_start
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Creative sync unblocks pending_creatives → pending_start"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that a media buy created without creatives sits in pending_creatives until sync_creatives completes, then transitions to pending_start."
|
|
6
|
+
track: media_buy
|
|
7
|
+
|
|
8
|
+
# This scenario requires an explicit auto-approval declaration. Sellers that
|
|
9
|
+
# declare `require_human`, or omit the field because approval behavior is
|
|
10
|
+
# legacy-unspecified, grade not_applicable rather than false-failing on a
|
|
11
|
+
# manual-review workflow.
|
|
12
|
+
requires_capability:
|
|
13
|
+
path: media_buy.creative_approval_mode
|
|
14
|
+
equals: auto_approve
|
|
15
|
+
|
|
16
|
+
required_tools:
|
|
17
|
+
- get_products
|
|
18
|
+
- create_media_buy
|
|
19
|
+
- sync_creatives
|
|
20
|
+
- get_media_buys
|
|
21
|
+
|
|
22
|
+
narrative: |
|
|
23
|
+
When a buyer creates a media buy without creative_assignments, the seller cannot start
|
|
24
|
+
delivery until creatives are supplied. The seller must report status: pending_creatives
|
|
25
|
+
and, after sync_creatives attaches the required assets, transition the buy to
|
|
26
|
+
pending_start (awaiting flight start) or active (if already in flight).
|
|
27
|
+
|
|
28
|
+
This scenario walks the transition end-to-end: create the buy, confirm pending_creatives,
|
|
29
|
+
sync a creative, and confirm the status advances to pending_start. The transition
|
|
30
|
+
proves that the creative pipeline and the buy state machine are wired together — a
|
|
31
|
+
common integration gap when creative and media buy systems live on different backends.
|
|
32
|
+
Sellers with manual creative review declare media_buy.creative_approval_mode:
|
|
33
|
+
require_human and skip this auto-approval-dependent scenario as not_applicable.
|
|
34
|
+
|
|
35
|
+
agent:
|
|
36
|
+
interaction_model: media_buy_seller
|
|
37
|
+
capabilities:
|
|
38
|
+
- sells_media
|
|
39
|
+
- accepts_creatives
|
|
40
|
+
examples:
|
|
41
|
+
- "Any seller that requires creatives before starting delivery"
|
|
42
|
+
|
|
43
|
+
caller:
|
|
44
|
+
role: buyer_agent
|
|
45
|
+
example: "Pinnacle Agency (buyer)"
|
|
46
|
+
|
|
47
|
+
prerequisites:
|
|
48
|
+
description: |
|
|
49
|
+
Seller supports create_media_buy without creative_assignments and honors the
|
|
50
|
+
pending_creatives → pending_start transition when creatives are synced.
|
|
51
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
52
|
+
|
|
53
|
+
phases:
|
|
54
|
+
- id: setup
|
|
55
|
+
title: "Discover products and formats"
|
|
56
|
+
steps:
|
|
57
|
+
- id: get_products_brief
|
|
58
|
+
title: "Discover a product"
|
|
59
|
+
task: get_products
|
|
60
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
61
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
62
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
63
|
+
comply_scenario: full_sales_flow
|
|
64
|
+
stateful: false
|
|
65
|
+
expected: |
|
|
66
|
+
Return at least one product with format_ids and pricing options.
|
|
67
|
+
sample_request:
|
|
68
|
+
buying_mode: "brief"
|
|
69
|
+
brief: "Display inventory on outdoor lifestyle content. Q3 flight."
|
|
70
|
+
filters:
|
|
71
|
+
is_fixed_price: true
|
|
72
|
+
account:
|
|
73
|
+
brand:
|
|
74
|
+
domain: "acmeoutdoor.example"
|
|
75
|
+
operator: "pinnacle-agency.example"
|
|
76
|
+
context_outputs:
|
|
77
|
+
- path: "products[0].product_id"
|
|
78
|
+
key: "product_id"
|
|
79
|
+
- path: "products[0].pricing_options[0].pricing_option_id"
|
|
80
|
+
key: "pricing_option_id"
|
|
81
|
+
- path: "products[0].format_ids[0]"
|
|
82
|
+
key: "format_id"
|
|
83
|
+
validations:
|
|
84
|
+
- check: response_schema
|
|
85
|
+
description: "Response matches get-products-response.json schema"
|
|
86
|
+
- check: field_present
|
|
87
|
+
path: "products[0].format_ids[0].id"
|
|
88
|
+
description: "Product declares a format_id for creative sync"
|
|
89
|
+
- check: field_present
|
|
90
|
+
path: "products[0].pricing_options[0].fixed_price"
|
|
91
|
+
description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
|
|
92
|
+
|
|
93
|
+
- id: create_without_creatives
|
|
94
|
+
title: "Create media buy without creative_assignments"
|
|
95
|
+
narrative: |
|
|
96
|
+
The buyer intentionally omits creative_assignments. The seller must accept the
|
|
97
|
+
buy, persist it, and return status: pending_creatives with valid_actions
|
|
98
|
+
including sync_creatives.
|
|
99
|
+
|
|
100
|
+
steps:
|
|
101
|
+
- id: create_buy_no_creatives
|
|
102
|
+
title: "Create buy in pending_creatives"
|
|
103
|
+
task: create_media_buy
|
|
104
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
105
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
106
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
107
|
+
comply_scenario: create_media_buy
|
|
108
|
+
stateful: true
|
|
109
|
+
expected: |
|
|
110
|
+
Media buy created with:
|
|
111
|
+
- media_buy_id assigned
|
|
112
|
+
- status: pending_creatives
|
|
113
|
+
- valid_actions including sync_creatives
|
|
114
|
+
|
|
115
|
+
sample_request:
|
|
116
|
+
brand:
|
|
117
|
+
domain: "acmeoutdoor.example"
|
|
118
|
+
account:
|
|
119
|
+
brand:
|
|
120
|
+
domain: "acmeoutdoor.example"
|
|
121
|
+
operator: "pinnacle-agency.example"
|
|
122
|
+
idempotency_key: "$generate:uuid_v4#pending_creatives_to_start_create_buy_no_creatives"
|
|
123
|
+
start_time: "2026-08-01T00:00:00Z"
|
|
124
|
+
end_time: "2026-08-31T23:59:59Z"
|
|
125
|
+
packages:
|
|
126
|
+
- product_id: "$context.product_id"
|
|
127
|
+
budget: 10000
|
|
128
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
129
|
+
context:
|
|
130
|
+
buyer_ref: "pending-creatives-line-001"
|
|
131
|
+
|
|
132
|
+
context:
|
|
133
|
+
correlation_id: "pending_creatives_to_start--create_buy_no_creatives"
|
|
134
|
+
context_outputs:
|
|
135
|
+
- path: "media_buy_id"
|
|
136
|
+
key: "media_buy_id"
|
|
137
|
+
- path: "packages[0].package_id"
|
|
138
|
+
key: "package_id"
|
|
139
|
+
validations:
|
|
140
|
+
- check: response_schema
|
|
141
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
142
|
+
- check: field_present
|
|
143
|
+
path: "media_buy_id"
|
|
144
|
+
description: "Seller assigns a media_buy_id"
|
|
145
|
+
- check: field_value
|
|
146
|
+
path: "media_buy_status"
|
|
147
|
+
value: "pending_creatives"
|
|
148
|
+
description: "media_buy_status is pending_creatives because no creatives supplied"
|
|
149
|
+
- check: field_value_or_absent
|
|
150
|
+
path: "status"
|
|
151
|
+
value: "pending_creatives"
|
|
152
|
+
description: "Legacy status, when present alongside media_buy_status, MUST carry the same value (3.1 deprecation window — see #4908)"
|
|
153
|
+
- check: field_present
|
|
154
|
+
path: "context"
|
|
155
|
+
description: "Response echoes back the context object"
|
|
156
|
+
- check: field_value
|
|
157
|
+
path: "context.correlation_id"
|
|
158
|
+
value: "pending_creatives_to_start--create_buy_no_creatives"
|
|
159
|
+
description: "Context correlation_id returned unchanged"
|
|
160
|
+
- check: field_equals_context
|
|
161
|
+
path: "packages[0].product_id"
|
|
162
|
+
context_key: "product_id"
|
|
163
|
+
description: "Created package echoes the requested product_id for package-to-product correlation"
|
|
164
|
+
- check: field_value
|
|
165
|
+
path: "packages[0].context.buyer_ref"
|
|
166
|
+
value: "pending-creatives-line-001"
|
|
167
|
+
description: "Created package echoes package-level context for legacy package correlation"
|
|
168
|
+
|
|
169
|
+
- id: supply_creatives
|
|
170
|
+
title: "Supply creatives and assign to the package"
|
|
171
|
+
narrative: |
|
|
172
|
+
The buyer syncs a creative with the format the product requires, then updates the
|
|
173
|
+
media buy with creative_assignments so the seller can attach the asset to the
|
|
174
|
+
package and advance state.
|
|
175
|
+
|
|
176
|
+
steps:
|
|
177
|
+
- id: sync_creative
|
|
178
|
+
title: "Sync the creative asset"
|
|
179
|
+
task: sync_creatives
|
|
180
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
181
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
182
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
183
|
+
comply_scenario: creative_lifecycle
|
|
184
|
+
stateful: true
|
|
185
|
+
expected: |
|
|
186
|
+
The seller ingests the creative and returns status active (or approved).
|
|
187
|
+
sample_request:
|
|
188
|
+
account:
|
|
189
|
+
brand:
|
|
190
|
+
domain: "acmeoutdoor.example"
|
|
191
|
+
operator: "pinnacle-agency.example"
|
|
192
|
+
creatives:
|
|
193
|
+
- creative_id: "acme-outdoor-display-q3"
|
|
194
|
+
name: "Acme Outdoor Q3 display"
|
|
195
|
+
format_id: "$context.format_id"
|
|
196
|
+
assets:
|
|
197
|
+
image:
|
|
198
|
+
asset_type: "image"
|
|
199
|
+
url: "https://creative.acmeoutdoor.example/q3/display-300x250.jpg"
|
|
200
|
+
width: 300
|
|
201
|
+
height: 250
|
|
202
|
+
mime_type: "image/jpeg"
|
|
203
|
+
|
|
204
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_pending_creatives_to_start_supply_creatives_sync_creative"
|
|
205
|
+
context:
|
|
206
|
+
correlation_id: "pending_creatives_to_start--sync_creative"
|
|
207
|
+
validations:
|
|
208
|
+
- check: response_schema
|
|
209
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
210
|
+
|
|
211
|
+
- id: assign_creative_to_package
|
|
212
|
+
title: "Assign the creative to the package"
|
|
213
|
+
task: update_media_buy
|
|
214
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
215
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
216
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
217
|
+
comply_scenario: media_buy_lifecycle
|
|
218
|
+
stateful: true
|
|
219
|
+
expected: |
|
|
220
|
+
The seller acknowledges the assignment and advances the buy state. The response
|
|
221
|
+
status should be pending_start (or active if the flight has started).
|
|
222
|
+
|
|
223
|
+
sample_request:
|
|
224
|
+
account:
|
|
225
|
+
brand:
|
|
226
|
+
domain: "acmeoutdoor.example"
|
|
227
|
+
operator: "pinnacle-agency.example"
|
|
228
|
+
media_buy_id: "$context.media_buy_id"
|
|
229
|
+
packages:
|
|
230
|
+
- package_id: "$context.package_id"
|
|
231
|
+
creative_assignments:
|
|
232
|
+
- creative_id: "acme-outdoor-display-q3"
|
|
233
|
+
|
|
234
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_pending_creatives_to_start_supply_creatives_assign_creative_to_package"
|
|
235
|
+
context:
|
|
236
|
+
correlation_id: "pending_creatives_to_start--assign_creative_to_package"
|
|
237
|
+
validations:
|
|
238
|
+
- check: response_schema
|
|
239
|
+
description: "Response matches update-media-buy-response.json schema"
|
|
240
|
+
- check: field_value
|
|
241
|
+
path: "media_buy_status"
|
|
242
|
+
allowed_values: ["pending_start", "active"]
|
|
243
|
+
description: "media_buy_status advances out of pending_creatives once creatives attached"
|
|
244
|
+
- check: field_value_or_absent
|
|
245
|
+
path: "status"
|
|
246
|
+
allowed_values: ["pending_start", "active"]
|
|
247
|
+
description: "Legacy status, when present alongside media_buy_status, MUST carry the same value (3.1 deprecation window — see #4908)"
|
|
248
|
+
|
|
249
|
+
- id: verify_transition
|
|
250
|
+
title: "Verify the status transition"
|
|
251
|
+
narrative: |
|
|
252
|
+
Independently of the update_media_buy response, call get_media_buys to confirm the
|
|
253
|
+
seller's stored state has advanced. This protects against sellers that return the
|
|
254
|
+
updated status in response but do not persist it.
|
|
255
|
+
|
|
256
|
+
steps:
|
|
257
|
+
- id: get_media_buy_after_sync
|
|
258
|
+
title: "Confirm pending_start after creative sync"
|
|
259
|
+
task: get_media_buys
|
|
260
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
261
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
262
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
263
|
+
comply_scenario: media_buy_lifecycle
|
|
264
|
+
stateful: true
|
|
265
|
+
expected: |
|
|
266
|
+
The media buy's persisted status is pending_start (or active). valid_actions
|
|
267
|
+
no longer includes sync_creatives as a required next step.
|
|
268
|
+
sample_request:
|
|
269
|
+
account:
|
|
270
|
+
brand:
|
|
271
|
+
domain: "acmeoutdoor.example"
|
|
272
|
+
operator: "pinnacle-agency.example"
|
|
273
|
+
media_buy_ids:
|
|
274
|
+
- "$context.media_buy_id"
|
|
275
|
+
|
|
276
|
+
context:
|
|
277
|
+
correlation_id: "pending_creatives_to_start--get_media_buy_after_sync"
|
|
278
|
+
validations:
|
|
279
|
+
- check: response_schema
|
|
280
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
281
|
+
- check: field_value
|
|
282
|
+
path: "media_buys[0].status"
|
|
283
|
+
allowed_values: ["pending_start", "active"]
|
|
284
|
+
description: "Persisted status is past pending_creatives"
|
|
285
|
+
- check: field_equals_context
|
|
286
|
+
path: "media_buys[0].packages[0].product_id"
|
|
287
|
+
context_key: "product_id"
|
|
288
|
+
description: "Read package retains the product_id from the explicit create request"
|
|
289
|
+
- check: field_value
|
|
290
|
+
path: "media_buys[0].packages[0].context.buyer_ref"
|
|
291
|
+
value: "pending-creatives-line-001"
|
|
292
|
+
description: "Read package includes persisted package context for legacy package correlation"
|