@adcp/sdk 7.10.2 → 7.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/index.json +356 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
- package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
- package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
- package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
- package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
- package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
- package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
- package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
- package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
- package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
- package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
- package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +9 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +30 -1
- package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +84 -21
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +21 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/types.d.ts +9 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.d.ts +6707 -12040
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +1 -1
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/utils/signal-id-builders.d.ts +19 -0
- package/dist/lib/utils/signal-id-builders.d.ts.map +1 -1
- package/dist/lib/utils/signal-id-builders.js +30 -0
- package/dist/lib/utils/signal-id-builders.js.map +1 -1
- package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -1
- package/dist/lib/utils/tool-request-schemas.js +3 -0
- package/dist/lib/utils/tool-request-schemas.js.map +1 -1
- package/dist/lib/v2/projection/constants.d.ts +28 -0
- package/dist/lib/v2/projection/constants.d.ts.map +1 -0
- package/dist/lib/v2/projection/constants.js +31 -0
- package/dist/lib/v2/projection/constants.js.map +1 -0
- package/dist/lib/v2/projection/registry.d.ts.map +1 -1
- package/dist/lib/v2/projection/registry.js +9 -4
- package/dist/lib/v2/projection/registry.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
- package/skills/SHAPE-GOTCHAS.md +5 -0
|
@@ -0,0 +1,861 @@
|
|
|
1
|
+
id: media_buy_seller/canonical_formats
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Canonical formats producer scenarios"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Validates that get_products can expose seeded canonical-format products through dual, v1-only, v2-only, custom, experimental, and divergent declaration shapes."
|
|
6
|
+
track: products
|
|
7
|
+
introduced_in: "3.1"
|
|
8
|
+
required_tools:
|
|
9
|
+
- get_products
|
|
10
|
+
- create_media_buy
|
|
11
|
+
- comply_test_controller
|
|
12
|
+
|
|
13
|
+
narrative: |
|
|
14
|
+
AdCP 3.1 introduces canonical product-bound format declarations on
|
|
15
|
+
`products[].format_options[]` while preserving the v1 `format_ids[]`
|
|
16
|
+
fallback during the migration window. Producers that dual-emit both shapes
|
|
17
|
+
MUST describe the same underlying creative requirement in each path.
|
|
18
|
+
|
|
19
|
+
This scenario is an opt-in canonical-format track, not a universal 3.x
|
|
20
|
+
requirement: 3.x products may still carry `format_ids`, `format_options`, or
|
|
21
|
+
both. It exercises the dual-emission contract only after the runner seeds a
|
|
22
|
+
product that deliberately carries both shapes.
|
|
23
|
+
|
|
24
|
+
The scenario seeds deterministic display products that declare unique vendor
|
|
25
|
+
metrics so the buyer can isolate each product with a structured filter. The
|
|
26
|
+
buyer requests the wholesale product feed and verifies that the seeded
|
|
27
|
+
products cover the migration shapes from the canonical-formats conformance
|
|
28
|
+
track: agreeing dual emission, v1-only emission, v2-only emission, custom
|
|
29
|
+
v2-only emission, experimental declarations, and divergent dual-emission
|
|
30
|
+
advisories.
|
|
31
|
+
|
|
32
|
+
After discovery, the buyer creates media buys against the seeded fixed-size
|
|
33
|
+
product to validate create-time format satisfaction: a legacy fixed MREC
|
|
34
|
+
selector satisfies the canonical declaration after normalization, while a
|
|
35
|
+
bare canonical image selector without dimensions does not satisfy a fixed
|
|
36
|
+
300x250 product.
|
|
37
|
+
|
|
38
|
+
agent:
|
|
39
|
+
interaction_model: media_buy_seller
|
|
40
|
+
capabilities:
|
|
41
|
+
- sells_media
|
|
42
|
+
- exposes_canonical_formats
|
|
43
|
+
examples:
|
|
44
|
+
- "Any media-buy seller adopting canonical product format declarations"
|
|
45
|
+
|
|
46
|
+
caller:
|
|
47
|
+
role: buyer_agent
|
|
48
|
+
example: "Compliance test harness"
|
|
49
|
+
|
|
50
|
+
prerequisites:
|
|
51
|
+
description: |
|
|
52
|
+
The runner seeds a canonical-format product before the product feed read.
|
|
53
|
+
Agents without deterministic seeding support skip this storyboard until
|
|
54
|
+
they expose a test surface that can merge seeded catalog entries.
|
|
55
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
56
|
+
controller_seeding: true
|
|
57
|
+
|
|
58
|
+
fixtures:
|
|
59
|
+
products:
|
|
60
|
+
- product_id: "canonical_formats_mrec_display"
|
|
61
|
+
name: "Canonical Formats MREC Display"
|
|
62
|
+
description: "Seeded wholesale product for canonical image dual-emission validation."
|
|
63
|
+
publisher_properties:
|
|
64
|
+
- publisher_domain: "outdoormagazine.example"
|
|
65
|
+
selection_type: "all"
|
|
66
|
+
channels: ["display"]
|
|
67
|
+
delivery_type: "guaranteed"
|
|
68
|
+
format_ids:
|
|
69
|
+
- agent_url: "https://creative.adcontextprotocol.org/"
|
|
70
|
+
id: "display_300x250_image"
|
|
71
|
+
format_options:
|
|
72
|
+
- format_kind: "image"
|
|
73
|
+
format_option_id: "canonical_formats_image_mrec"
|
|
74
|
+
display_name: "Canonical Formats Image MREC"
|
|
75
|
+
v1_format_ref:
|
|
76
|
+
- agent_url: "https://creative.adcontextprotocol.org/"
|
|
77
|
+
id: "display_300x250_image"
|
|
78
|
+
params:
|
|
79
|
+
width: 300
|
|
80
|
+
height: 250
|
|
81
|
+
max_file_size_kb: 200
|
|
82
|
+
image_formats: ["jpg", "png"]
|
|
83
|
+
ssl_required: true
|
|
84
|
+
asset_source: "buyer_uploaded"
|
|
85
|
+
buyer_asset_acceptance: "accepted"
|
|
86
|
+
composition_model: "deterministic"
|
|
87
|
+
slots:
|
|
88
|
+
- asset_group_id: "image_main"
|
|
89
|
+
asset_type: "image"
|
|
90
|
+
required: true
|
|
91
|
+
pricing_options:
|
|
92
|
+
- pricing_option_id: "canonical_formats_mrec_cpm"
|
|
93
|
+
pricing_model: "cpm"
|
|
94
|
+
currency: "USD"
|
|
95
|
+
fixed_price: 12
|
|
96
|
+
reporting_capabilities:
|
|
97
|
+
available_reporting_frequencies: ["daily"]
|
|
98
|
+
expected_delay_minutes: 60
|
|
99
|
+
timezone: "UTC"
|
|
100
|
+
supports_webhooks: false
|
|
101
|
+
available_metrics: ["impressions", "clicks", "spend"]
|
|
102
|
+
vendor_metrics:
|
|
103
|
+
- vendor:
|
|
104
|
+
domain: "prism.example"
|
|
105
|
+
metric_id: "canonical_format_storyboard_probe"
|
|
106
|
+
date_range_support: "date_range"
|
|
107
|
+
- product_id: "canonical_formats_ids_only_display"
|
|
108
|
+
name: "Canonical Formats IDs Only Display"
|
|
109
|
+
description: "Seeded wholesale product for v1-only format declaration validation."
|
|
110
|
+
publisher_properties:
|
|
111
|
+
- publisher_domain: "outdoormagazine.example"
|
|
112
|
+
selection_type: "all"
|
|
113
|
+
channels: ["display"]
|
|
114
|
+
delivery_type: "guaranteed"
|
|
115
|
+
format_ids:
|
|
116
|
+
- agent_url: "https://creative.adcontextprotocol.org/"
|
|
117
|
+
id: "display_728x90_image"
|
|
118
|
+
pricing_options:
|
|
119
|
+
- pricing_option_id: "canonical_formats_ids_only_cpm"
|
|
120
|
+
pricing_model: "cpm"
|
|
121
|
+
currency: "USD"
|
|
122
|
+
fixed_price: 10
|
|
123
|
+
reporting_capabilities:
|
|
124
|
+
available_reporting_frequencies: ["daily"]
|
|
125
|
+
expected_delay_minutes: 60
|
|
126
|
+
timezone: "UTC"
|
|
127
|
+
supports_webhooks: false
|
|
128
|
+
available_metrics: ["impressions", "clicks", "spend"]
|
|
129
|
+
vendor_metrics:
|
|
130
|
+
- vendor:
|
|
131
|
+
domain: "prism.example"
|
|
132
|
+
metric_id: "canonical_format_storyboard_probe_ids_only"
|
|
133
|
+
date_range_support: "date_range"
|
|
134
|
+
- product_id: "canonical_formats_options_only_display"
|
|
135
|
+
name: "Canonical Formats Options Only Display"
|
|
136
|
+
description: "Seeded wholesale product for v2-only canonical image declaration validation."
|
|
137
|
+
publisher_properties:
|
|
138
|
+
- publisher_domain: "outdoormagazine.example"
|
|
139
|
+
selection_type: "all"
|
|
140
|
+
channels: ["display"]
|
|
141
|
+
delivery_type: "guaranteed"
|
|
142
|
+
format_options:
|
|
143
|
+
- format_kind: "image"
|
|
144
|
+
format_option_id: "canonical_formats_image_leaderboard"
|
|
145
|
+
display_name: "Canonical Formats Image Leaderboard"
|
|
146
|
+
params:
|
|
147
|
+
width: 728
|
|
148
|
+
height: 90
|
|
149
|
+
max_file_size_kb: 200
|
|
150
|
+
image_formats: ["jpg", "png"]
|
|
151
|
+
ssl_required: true
|
|
152
|
+
asset_source: "buyer_uploaded"
|
|
153
|
+
buyer_asset_acceptance: "accepted"
|
|
154
|
+
composition_model: "deterministic"
|
|
155
|
+
slots:
|
|
156
|
+
- asset_group_id: "image_main"
|
|
157
|
+
asset_type: "image"
|
|
158
|
+
required: true
|
|
159
|
+
pricing_options:
|
|
160
|
+
- pricing_option_id: "canonical_formats_options_only_cpm"
|
|
161
|
+
pricing_model: "cpm"
|
|
162
|
+
currency: "USD"
|
|
163
|
+
fixed_price: 11
|
|
164
|
+
reporting_capabilities:
|
|
165
|
+
available_reporting_frequencies: ["daily"]
|
|
166
|
+
expected_delay_minutes: 60
|
|
167
|
+
timezone: "UTC"
|
|
168
|
+
supports_webhooks: false
|
|
169
|
+
available_metrics: ["impressions", "clicks", "spend"]
|
|
170
|
+
vendor_metrics:
|
|
171
|
+
- vendor:
|
|
172
|
+
domain: "prism.example"
|
|
173
|
+
metric_id: "canonical_format_storyboard_probe_options_only"
|
|
174
|
+
date_range_support: "date_range"
|
|
175
|
+
- product_id: "canonical_formats_custom_takeover"
|
|
176
|
+
name: "Canonical Formats Custom Takeover"
|
|
177
|
+
description: "Seeded wholesale product for custom v2-only format_schema declaration validation."
|
|
178
|
+
publisher_properties:
|
|
179
|
+
- publisher_domain: "outdoormagazine.example"
|
|
180
|
+
selection_type: "all"
|
|
181
|
+
channels: ["display"]
|
|
182
|
+
delivery_type: "guaranteed"
|
|
183
|
+
format_options:
|
|
184
|
+
- format_kind: "custom"
|
|
185
|
+
format_option_id: "canonical_formats_custom_takeover"
|
|
186
|
+
display_name: "Canonical Formats Custom Takeover"
|
|
187
|
+
canonical_formats_only: true
|
|
188
|
+
experimental: true
|
|
189
|
+
format_shape: "multi_placement_takeover"
|
|
190
|
+
format_schema:
|
|
191
|
+
uri: "https://creative.adcontextprotocol.org/translated/acme-outdoor/schemas/custom_takeover_v1"
|
|
192
|
+
digest: "sha256:a3f5b7c9d8e2f1a4b6c8d0e2f4a6b8c0d2e4f6a8b0c2d4e6f8a0b2c4d6e8f0a2"
|
|
193
|
+
params:
|
|
194
|
+
placements:
|
|
195
|
+
- slot_id: "homepage_billboard"
|
|
196
|
+
width: 970
|
|
197
|
+
height: 250
|
|
198
|
+
required: true
|
|
199
|
+
- slot_id: "article_mrec"
|
|
200
|
+
width: 300
|
|
201
|
+
height: 250
|
|
202
|
+
required: true
|
|
203
|
+
asset_source: "buyer_uploaded"
|
|
204
|
+
buyer_asset_acceptance: "accepted"
|
|
205
|
+
composition_model: "deterministic"
|
|
206
|
+
pricing_options:
|
|
207
|
+
- pricing_option_id: "canonical_formats_custom_takeover_cpm"
|
|
208
|
+
pricing_model: "cpm"
|
|
209
|
+
currency: "USD"
|
|
210
|
+
fixed_price: 35
|
|
211
|
+
reporting_capabilities:
|
|
212
|
+
available_reporting_frequencies: ["daily"]
|
|
213
|
+
expected_delay_minutes: 60
|
|
214
|
+
timezone: "UTC"
|
|
215
|
+
supports_webhooks: false
|
|
216
|
+
available_metrics: ["impressions", "clicks", "spend"]
|
|
217
|
+
vendor_metrics:
|
|
218
|
+
- vendor:
|
|
219
|
+
domain: "prism.example"
|
|
220
|
+
metric_id: "canonical_format_storyboard_probe_custom"
|
|
221
|
+
date_range_support: "date_range"
|
|
222
|
+
- product_id: "canonical_formats_experimental_display"
|
|
223
|
+
name: "Canonical Formats Experimental Display"
|
|
224
|
+
description: "Seeded wholesale product for experimental canonical declaration visibility."
|
|
225
|
+
publisher_properties:
|
|
226
|
+
- publisher_domain: "outdoormagazine.example"
|
|
227
|
+
selection_type: "all"
|
|
228
|
+
channels: ["display"]
|
|
229
|
+
delivery_type: "guaranteed"
|
|
230
|
+
format_ids:
|
|
231
|
+
- agent_url: "https://creative.adcontextprotocol.org/"
|
|
232
|
+
id: "display_300x250_image"
|
|
233
|
+
format_options:
|
|
234
|
+
- format_kind: "image"
|
|
235
|
+
format_option_id: "canonical_formats_experimental_image_mrec"
|
|
236
|
+
display_name: "Canonical Formats Experimental Image MREC"
|
|
237
|
+
experimental: true
|
|
238
|
+
v1_format_ref:
|
|
239
|
+
- agent_url: "https://creative.adcontextprotocol.org/"
|
|
240
|
+
id: "display_300x250_image"
|
|
241
|
+
params:
|
|
242
|
+
width: 300
|
|
243
|
+
height: 250
|
|
244
|
+
max_file_size_kb: 200
|
|
245
|
+
image_formats: ["jpg", "png"]
|
|
246
|
+
ssl_required: true
|
|
247
|
+
asset_source: "buyer_uploaded"
|
|
248
|
+
buyer_asset_acceptance: "accepted"
|
|
249
|
+
composition_model: "deterministic"
|
|
250
|
+
slots:
|
|
251
|
+
- asset_group_id: "image_main"
|
|
252
|
+
asset_type: "image"
|
|
253
|
+
required: true
|
|
254
|
+
pricing_options:
|
|
255
|
+
- pricing_option_id: "canonical_formats_experimental_cpm"
|
|
256
|
+
pricing_model: "cpm"
|
|
257
|
+
currency: "USD"
|
|
258
|
+
fixed_price: 9
|
|
259
|
+
reporting_capabilities:
|
|
260
|
+
available_reporting_frequencies: ["daily"]
|
|
261
|
+
expected_delay_minutes: 60
|
|
262
|
+
timezone: "UTC"
|
|
263
|
+
supports_webhooks: false
|
|
264
|
+
available_metrics: ["impressions", "clicks", "spend"]
|
|
265
|
+
vendor_metrics:
|
|
266
|
+
- vendor:
|
|
267
|
+
domain: "prism.example"
|
|
268
|
+
metric_id: "canonical_format_storyboard_probe_experimental"
|
|
269
|
+
date_range_support: "date_range"
|
|
270
|
+
- product_id: "canonical_formats_divergent_display"
|
|
271
|
+
name: "Canonical Formats Divergent Display"
|
|
272
|
+
description: "Seeded wholesale product with intentionally divergent v1 and v2 references."
|
|
273
|
+
publisher_properties:
|
|
274
|
+
- publisher_domain: "outdoormagazine.example"
|
|
275
|
+
selection_type: "all"
|
|
276
|
+
channels: ["display"]
|
|
277
|
+
delivery_type: "guaranteed"
|
|
278
|
+
format_ids:
|
|
279
|
+
- agent_url: "https://creative.adcontextprotocol.org/"
|
|
280
|
+
id: "display_300x250_image"
|
|
281
|
+
format_options:
|
|
282
|
+
- format_kind: "image"
|
|
283
|
+
format_option_id: "canonical_formats_divergent_image"
|
|
284
|
+
display_name: "Canonical Formats Divergent Image"
|
|
285
|
+
v1_format_ref:
|
|
286
|
+
- agent_url: "https://creative.adcontextprotocol.org/"
|
|
287
|
+
id: "display_728x90_image"
|
|
288
|
+
params:
|
|
289
|
+
width: 728
|
|
290
|
+
height: 90
|
|
291
|
+
max_file_size_kb: 200
|
|
292
|
+
image_formats: ["jpg", "png"]
|
|
293
|
+
ssl_required: true
|
|
294
|
+
asset_source: "buyer_uploaded"
|
|
295
|
+
buyer_asset_acceptance: "accepted"
|
|
296
|
+
composition_model: "deterministic"
|
|
297
|
+
slots:
|
|
298
|
+
- asset_group_id: "image_main"
|
|
299
|
+
asset_type: "image"
|
|
300
|
+
required: true
|
|
301
|
+
pricing_options:
|
|
302
|
+
- pricing_option_id: "canonical_formats_divergent_cpm"
|
|
303
|
+
pricing_model: "cpm"
|
|
304
|
+
currency: "USD"
|
|
305
|
+
fixed_price: 8
|
|
306
|
+
reporting_capabilities:
|
|
307
|
+
available_reporting_frequencies: ["daily"]
|
|
308
|
+
expected_delay_minutes: 60
|
|
309
|
+
timezone: "UTC"
|
|
310
|
+
supports_webhooks: false
|
|
311
|
+
available_metrics: ["impressions", "clicks", "spend"]
|
|
312
|
+
vendor_metrics:
|
|
313
|
+
- vendor:
|
|
314
|
+
domain: "prism.example"
|
|
315
|
+
metric_id: "canonical_format_storyboard_probe_divergent"
|
|
316
|
+
date_range_support: "date_range"
|
|
317
|
+
|
|
318
|
+
phases:
|
|
319
|
+
- id: canonical_product_discovery
|
|
320
|
+
title: "Canonical product discovery"
|
|
321
|
+
narrative: |
|
|
322
|
+
The buyer reads the wholesale product feed with a vendor-metric filter
|
|
323
|
+
that isolates the seeded product. The returned product MUST be present
|
|
324
|
+
with both v1 and v2 format declarations: `format_ids[]` for legacy
|
|
325
|
+
buyers, `format_options[]` for canonical-format buyers.
|
|
326
|
+
|
|
327
|
+
steps:
|
|
328
|
+
- id: get_seeded_canonical_product
|
|
329
|
+
title: "Read products with canonical format declarations"
|
|
330
|
+
narrative: |
|
|
331
|
+
Request the wholesale product feed so seeded catalog entries are
|
|
332
|
+
returned without brief-mode ranking or curation. A required vendor
|
|
333
|
+
metric filter narrows the response to the seeded product. The
|
|
334
|
+
response schema validates the full product shape, while the field
|
|
335
|
+
checks verify the canonical declaration and its v1 projection link.
|
|
336
|
+
task: get_products
|
|
337
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
338
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
339
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
340
|
+
comply_scenario: schema_compliance
|
|
341
|
+
stateful: true
|
|
342
|
+
expected: |
|
|
343
|
+
Return products including the seeded canonical_formats_mrec_display
|
|
344
|
+
product with:
|
|
345
|
+
- format_ids[] containing the display_300x250_image v1 fallback from https://creative.adcontextprotocol.org/
|
|
346
|
+
- format_options[] containing an image declaration
|
|
347
|
+
- v1_format_ref[] linking the image declaration back to that fallback
|
|
348
|
+
- params.width = 300 and params.height = 250
|
|
349
|
+
|
|
350
|
+
sample_request:
|
|
351
|
+
buying_mode: "wholesale"
|
|
352
|
+
filters:
|
|
353
|
+
channels: ["display"]
|
|
354
|
+
delivery_type: "guaranteed"
|
|
355
|
+
required_vendor_metrics:
|
|
356
|
+
- vendor:
|
|
357
|
+
domain: "prism.example"
|
|
358
|
+
metric_id: "canonical_format_storyboard_probe"
|
|
359
|
+
account:
|
|
360
|
+
brand:
|
|
361
|
+
domain: "acmeoutdoor.example"
|
|
362
|
+
operator: "pinnacle-agency.example"
|
|
363
|
+
sandbox: true
|
|
364
|
+
context:
|
|
365
|
+
correlation_id: "canonical_formats--get_seeded_canonical_product"
|
|
366
|
+
|
|
367
|
+
validations:
|
|
368
|
+
- check: response_schema
|
|
369
|
+
description: "Response matches get-products-response.json schema"
|
|
370
|
+
- check: field_value
|
|
371
|
+
path: "products[0].product_id"
|
|
372
|
+
value: "canonical_formats_mrec_display"
|
|
373
|
+
description: "The vendor-metric filter isolates the seeded canonical-format product"
|
|
374
|
+
- check: field_value
|
|
375
|
+
path: "products[0].reporting_capabilities.vendor_metrics[0].vendor.domain"
|
|
376
|
+
value: "prism.example"
|
|
377
|
+
description: "Matched product declares the filtering vendor metric"
|
|
378
|
+
- check: field_value
|
|
379
|
+
path: "products[0].reporting_capabilities.vendor_metrics[0].metric_id"
|
|
380
|
+
value: "canonical_format_storyboard_probe"
|
|
381
|
+
description: "Matched product declares the filtering metric id"
|
|
382
|
+
- check: field_value
|
|
383
|
+
path: "products[0].format_ids[0].agent_url"
|
|
384
|
+
value: "https://creative.adcontextprotocol.org/"
|
|
385
|
+
description: "v1 fallback format_id names the AAO creative-format catalog"
|
|
386
|
+
- check: field_value
|
|
387
|
+
path: "products[0].format_ids[0].id"
|
|
388
|
+
value: "display_300x250_image"
|
|
389
|
+
description: "v1 fallback format_id is present"
|
|
390
|
+
- check: field_value
|
|
391
|
+
path: "products[0].format_options[0].format_kind"
|
|
392
|
+
value: "image"
|
|
393
|
+
description: "Seeded product advertises the image canonical"
|
|
394
|
+
- check: field_value
|
|
395
|
+
path: "products[0].format_options[0].format_option_id"
|
|
396
|
+
value: "canonical_formats_image_mrec"
|
|
397
|
+
description: "Seeded canonical declaration carries a stable format_option_id"
|
|
398
|
+
- check: field_value
|
|
399
|
+
path: "products[0].format_options[0].v1_format_ref[0].agent_url"
|
|
400
|
+
value: "https://creative.adcontextprotocol.org/"
|
|
401
|
+
description: "Canonical declaration links back to the AAO creative-format catalog"
|
|
402
|
+
- check: field_value
|
|
403
|
+
path: "products[0].format_options[0].v1_format_ref[0].id"
|
|
404
|
+
value: "display_300x250_image"
|
|
405
|
+
description: "Canonical declaration links back to the same v1 format identifier"
|
|
406
|
+
- check: field_value
|
|
407
|
+
path: "products[0].format_options[0].params.width"
|
|
408
|
+
value: 300
|
|
409
|
+
description: "Canonical image params include the expected width"
|
|
410
|
+
- check: field_value
|
|
411
|
+
path: "products[0].format_options[0].params.height"
|
|
412
|
+
value: 250
|
|
413
|
+
description: "Canonical image params include the expected height"
|
|
414
|
+
- check: refs_resolve
|
|
415
|
+
description: "Every v1_format_ref advertised by the returned product's format_options resolves to a format_id on that product"
|
|
416
|
+
source:
|
|
417
|
+
from: current_step
|
|
418
|
+
path: "products[0].format_options[*].v1_format_ref[*]"
|
|
419
|
+
target:
|
|
420
|
+
from: current_step
|
|
421
|
+
path: "products[0].format_ids[*]"
|
|
422
|
+
match_keys: [agent_url, id]
|
|
423
|
+
on_out_of_scope: fail
|
|
424
|
+
- check: field_present
|
|
425
|
+
path: "context"
|
|
426
|
+
description: "Response echoes back the context object"
|
|
427
|
+
- check: field_value
|
|
428
|
+
path: "context.correlation_id"
|
|
429
|
+
value: "canonical_formats--get_seeded_canonical_product"
|
|
430
|
+
description: "Context correlation_id returned unchanged"
|
|
431
|
+
|
|
432
|
+
- id: get_seeded_v1_only_product
|
|
433
|
+
title: "Read v1-only format declarations"
|
|
434
|
+
narrative: |
|
|
435
|
+
Request the seeded product that intentionally publishes only
|
|
436
|
+
`format_ids[]` on the producer side. This remains a valid 3.x
|
|
437
|
+
product shape during the canonical-format migration window; this
|
|
438
|
+
producer storyboard MUST NOT require the seller to synthesize
|
|
439
|
+
`format_options[]` for that product.
|
|
440
|
+
task: get_products
|
|
441
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
442
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
443
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
444
|
+
comply_scenario: schema_compliance
|
|
445
|
+
stateful: true
|
|
446
|
+
expected: |
|
|
447
|
+
Return the seeded canonical_formats_ids_only_display product with a
|
|
448
|
+
v1 fallback format_id. No producer-side `format_options[]` projection
|
|
449
|
+
is required for v1-only products.
|
|
450
|
+
sample_request:
|
|
451
|
+
buying_mode: "wholesale"
|
|
452
|
+
filters:
|
|
453
|
+
channels: ["display"]
|
|
454
|
+
delivery_type: "guaranteed"
|
|
455
|
+
required_vendor_metrics:
|
|
456
|
+
- vendor:
|
|
457
|
+
domain: "prism.example"
|
|
458
|
+
metric_id: "canonical_format_storyboard_probe_ids_only"
|
|
459
|
+
account:
|
|
460
|
+
brand:
|
|
461
|
+
domain: "acmeoutdoor.example"
|
|
462
|
+
operator: "pinnacle-agency.example"
|
|
463
|
+
sandbox: true
|
|
464
|
+
context:
|
|
465
|
+
correlation_id: "canonical_formats--get_seeded_v1_only_product"
|
|
466
|
+
|
|
467
|
+
validations:
|
|
468
|
+
- check: response_schema
|
|
469
|
+
description: "Response matches get-products-response.json schema"
|
|
470
|
+
- check: field_value
|
|
471
|
+
path: "products[0].product_id"
|
|
472
|
+
value: "canonical_formats_ids_only_display"
|
|
473
|
+
description: "The vendor-metric filter isolates the v1-only seeded product"
|
|
474
|
+
- check: field_value
|
|
475
|
+
path: "products[0].format_ids[0].agent_url"
|
|
476
|
+
value: "https://creative.adcontextprotocol.org/"
|
|
477
|
+
description: "v1-only product names the AAO creative-format catalog"
|
|
478
|
+
- check: field_value
|
|
479
|
+
path: "products[0].format_ids[0].id"
|
|
480
|
+
value: "display_728x90_image"
|
|
481
|
+
description: "v1-only product carries the expected named format"
|
|
482
|
+
|
|
483
|
+
- id: get_seeded_v2_only_product
|
|
484
|
+
title: "Read v2-only format declarations"
|
|
485
|
+
narrative: |
|
|
486
|
+
Request the seeded product that intentionally publishes only
|
|
487
|
+
`format_options[]`. Producers can expose canonical product-bound
|
|
488
|
+
declarations without also carrying v1 named-format fallbacks.
|
|
489
|
+
task: get_products
|
|
490
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
491
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
492
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
493
|
+
comply_scenario: schema_compliance
|
|
494
|
+
stateful: true
|
|
495
|
+
expected: |
|
|
496
|
+
Return the seeded canonical_formats_options_only_display product with
|
|
497
|
+
an image canonical declaration and no format_ids fallback.
|
|
498
|
+
sample_request:
|
|
499
|
+
buying_mode: "wholesale"
|
|
500
|
+
filters:
|
|
501
|
+
channels: ["display"]
|
|
502
|
+
delivery_type: "guaranteed"
|
|
503
|
+
required_vendor_metrics:
|
|
504
|
+
- vendor:
|
|
505
|
+
domain: "prism.example"
|
|
506
|
+
metric_id: "canonical_format_storyboard_probe_options_only"
|
|
507
|
+
account:
|
|
508
|
+
brand:
|
|
509
|
+
domain: "acmeoutdoor.example"
|
|
510
|
+
operator: "pinnacle-agency.example"
|
|
511
|
+
sandbox: true
|
|
512
|
+
context:
|
|
513
|
+
correlation_id: "canonical_formats--get_seeded_v2_only_product"
|
|
514
|
+
|
|
515
|
+
validations:
|
|
516
|
+
- check: field_value
|
|
517
|
+
path: "products[0].product_id"
|
|
518
|
+
value: "canonical_formats_options_only_display"
|
|
519
|
+
description: "The vendor-metric filter isolates the v2-only seeded product"
|
|
520
|
+
- check: field_absent
|
|
521
|
+
path: "products[0].format_ids"
|
|
522
|
+
description: "v2-only product does not invent v1 named-format fallbacks"
|
|
523
|
+
- check: field_value
|
|
524
|
+
path: "products[0].format_options[0].format_kind"
|
|
525
|
+
value: "image"
|
|
526
|
+
description: "v2-only product advertises the image canonical"
|
|
527
|
+
- check: field_value
|
|
528
|
+
path: "products[0].format_options[0].format_option_id"
|
|
529
|
+
value: "canonical_formats_image_leaderboard"
|
|
530
|
+
description: "v2-only product carries a stable format_option_id"
|
|
531
|
+
- check: field_value
|
|
532
|
+
path: "products[0].format_options[0].params.width"
|
|
533
|
+
value: 728
|
|
534
|
+
description: "Canonical image params include the expected width"
|
|
535
|
+
- check: field_value
|
|
536
|
+
path: "products[0].format_options[0].params.height"
|
|
537
|
+
value: 90
|
|
538
|
+
description: "Canonical image params include the expected height"
|
|
539
|
+
|
|
540
|
+
- id: get_seeded_custom_v2_only_product
|
|
541
|
+
title: "Read custom v2-only declarations"
|
|
542
|
+
narrative: |
|
|
543
|
+
Request the seeded product that publishes a custom canonical
|
|
544
|
+
declaration with `canonical_formats_only: true`, `format_shape`, and
|
|
545
|
+
a digest-pinned `format_schema` reference.
|
|
546
|
+
task: get_products
|
|
547
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
548
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
549
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
550
|
+
comply_scenario: schema_compliance
|
|
551
|
+
stateful: true
|
|
552
|
+
expected: |
|
|
553
|
+
Return the seeded canonical_formats_custom_takeover product with a
|
|
554
|
+
custom v2-only declaration and digest-pinned format_schema reference.
|
|
555
|
+
sample_request:
|
|
556
|
+
buying_mode: "wholesale"
|
|
557
|
+
filters:
|
|
558
|
+
channels: ["display"]
|
|
559
|
+
delivery_type: "guaranteed"
|
|
560
|
+
required_vendor_metrics:
|
|
561
|
+
- vendor:
|
|
562
|
+
domain: "prism.example"
|
|
563
|
+
metric_id: "canonical_format_storyboard_probe_custom"
|
|
564
|
+
account:
|
|
565
|
+
brand:
|
|
566
|
+
domain: "acmeoutdoor.example"
|
|
567
|
+
operator: "pinnacle-agency.example"
|
|
568
|
+
sandbox: true
|
|
569
|
+
context:
|
|
570
|
+
correlation_id: "canonical_formats--get_seeded_custom_v2_only_product"
|
|
571
|
+
|
|
572
|
+
validations:
|
|
573
|
+
- check: field_value
|
|
574
|
+
path: "products[0].product_id"
|
|
575
|
+
value: "canonical_formats_custom_takeover"
|
|
576
|
+
description: "The vendor-metric filter isolates the custom seeded product"
|
|
577
|
+
- check: field_absent
|
|
578
|
+
path: "products[0].format_ids"
|
|
579
|
+
description: "Custom v2-only product does not invent v1 named-format fallbacks"
|
|
580
|
+
- check: field_value
|
|
581
|
+
path: "products[0].format_options[0].format_kind"
|
|
582
|
+
value: "custom"
|
|
583
|
+
description: "Custom declaration uses the custom format_kind discriminator"
|
|
584
|
+
- check: field_value
|
|
585
|
+
path: "products[0].format_options[0].canonical_formats_only"
|
|
586
|
+
value: true
|
|
587
|
+
description: "Custom declaration explicitly marks itself as v2-only"
|
|
588
|
+
- check: field_value
|
|
589
|
+
path: "products[0].format_options[0].experimental"
|
|
590
|
+
value: true
|
|
591
|
+
description: "Custom declaration is surfaced as experimental instead of using runtime_status"
|
|
592
|
+
- check: field_value
|
|
593
|
+
path: "products[0].format_options[0].format_shape"
|
|
594
|
+
value: "multi_placement_takeover"
|
|
595
|
+
description: "Custom declaration declares the shared format-shape vocabulary term"
|
|
596
|
+
- check: field_value
|
|
597
|
+
path: "products[0].format_options[0].format_schema.uri"
|
|
598
|
+
value: "https://creative.adcontextprotocol.org/translated/acme-outdoor/schemas/custom_takeover_v1"
|
|
599
|
+
description: "Custom declaration carries a fetchable format_schema URI"
|
|
600
|
+
- check: field_value
|
|
601
|
+
path: "products[0].format_options[0].format_schema.digest"
|
|
602
|
+
value: "sha256:a3f5b7c9d8e2f1a4b6c8d0e2f4a6b8c0d2e4f6a8b0c2d4e6f8a0b2c4d6e8f0a2"
|
|
603
|
+
description: "Custom declaration carries a digest-pinned format_schema reference"
|
|
604
|
+
|
|
605
|
+
- id: get_seeded_experimental_product
|
|
606
|
+
title: "Read experimental declarations"
|
|
607
|
+
narrative: |
|
|
608
|
+
Request the seeded product that dual-emits an image declaration and
|
|
609
|
+
marks the v2 declaration `experimental: true`. This replaces the
|
|
610
|
+
earlier runtime_status skip-gate model.
|
|
611
|
+
task: get_products
|
|
612
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
613
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
614
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
615
|
+
comply_scenario: schema_compliance
|
|
616
|
+
stateful: true
|
|
617
|
+
expected: |
|
|
618
|
+
Return the seeded canonical_formats_experimental_display product with
|
|
619
|
+
both v1 and v2 declarations and an experimental v2 marker.
|
|
620
|
+
sample_request:
|
|
621
|
+
buying_mode: "wholesale"
|
|
622
|
+
filters:
|
|
623
|
+
channels: ["display"]
|
|
624
|
+
delivery_type: "guaranteed"
|
|
625
|
+
required_vendor_metrics:
|
|
626
|
+
- vendor:
|
|
627
|
+
domain: "prism.example"
|
|
628
|
+
metric_id: "canonical_format_storyboard_probe_experimental"
|
|
629
|
+
account:
|
|
630
|
+
brand:
|
|
631
|
+
domain: "acmeoutdoor.example"
|
|
632
|
+
operator: "pinnacle-agency.example"
|
|
633
|
+
sandbox: true
|
|
634
|
+
context:
|
|
635
|
+
correlation_id: "canonical_formats--get_seeded_experimental_product"
|
|
636
|
+
|
|
637
|
+
validations:
|
|
638
|
+
- check: response_schema
|
|
639
|
+
description: "Response matches get-products-response.json schema"
|
|
640
|
+
- check: field_value
|
|
641
|
+
path: "products[0].product_id"
|
|
642
|
+
value: "canonical_formats_experimental_display"
|
|
643
|
+
description: "The vendor-metric filter isolates the experimental seeded product"
|
|
644
|
+
- check: field_value
|
|
645
|
+
path: "products[0].format_ids[0].id"
|
|
646
|
+
value: "display_300x250_image"
|
|
647
|
+
description: "Experimental declaration still exposes its v1 fallback"
|
|
648
|
+
- check: field_value
|
|
649
|
+
path: "products[0].format_options[0].format_kind"
|
|
650
|
+
value: "image"
|
|
651
|
+
description: "Experimental declaration still carries the canonical format_kind"
|
|
652
|
+
- check: field_value
|
|
653
|
+
path: "products[0].format_options[0].experimental"
|
|
654
|
+
value: true
|
|
655
|
+
description: "Experimental marker replaces the obsolete runtime_status field"
|
|
656
|
+
- check: refs_resolve
|
|
657
|
+
description: "The experimental declaration's v1_format_ref still resolves to a product format_id"
|
|
658
|
+
source:
|
|
659
|
+
from: current_step
|
|
660
|
+
path: "products[0].format_options[*].v1_format_ref[*]"
|
|
661
|
+
target:
|
|
662
|
+
from: current_step
|
|
663
|
+
path: "products[0].format_ids[*]"
|
|
664
|
+
match_keys: [agent_url, id]
|
|
665
|
+
on_out_of_scope: fail
|
|
666
|
+
|
|
667
|
+
- id: get_seeded_divergent_product
|
|
668
|
+
title: "Flag divergent dual-emission"
|
|
669
|
+
narrative: |
|
|
670
|
+
Request the seeded product whose `format_ids[]` and
|
|
671
|
+
`format_options[].v1_format_ref[]` intentionally disagree. Producers
|
|
672
|
+
that self-detect this drift surface a non-fatal advisory on
|
|
673
|
+
`errors[]` so consumers do not silently lose inventory.
|
|
674
|
+
task: get_products
|
|
675
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
676
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
677
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
678
|
+
comply_scenario: schema_compliance
|
|
679
|
+
auth:
|
|
680
|
+
type: api_key
|
|
681
|
+
from_test_kit: true
|
|
682
|
+
stateful: true
|
|
683
|
+
expected: |
|
|
684
|
+
Return the seeded canonical_formats_divergent_display product and
|
|
685
|
+
flag the divergent declarations with a non-fatal
|
|
686
|
+
FORMAT_DECLARATION_DIVERGENT advisory in `errors[]`.
|
|
687
|
+
sample_request:
|
|
688
|
+
buying_mode: "wholesale"
|
|
689
|
+
filters:
|
|
690
|
+
channels: ["display"]
|
|
691
|
+
delivery_type: "guaranteed"
|
|
692
|
+
required_vendor_metrics:
|
|
693
|
+
- vendor:
|
|
694
|
+
domain: "prism.example"
|
|
695
|
+
metric_id: "canonical_format_storyboard_probe_divergent"
|
|
696
|
+
account:
|
|
697
|
+
brand:
|
|
698
|
+
domain: "acmeoutdoor.example"
|
|
699
|
+
operator: "pinnacle-agency.example"
|
|
700
|
+
sandbox: true
|
|
701
|
+
context:
|
|
702
|
+
correlation_id: "canonical_formats--get_seeded_divergent_product"
|
|
703
|
+
|
|
704
|
+
validations:
|
|
705
|
+
- check: response_schema
|
|
706
|
+
description: "Divergent dual-emission remains a populated get_products success response"
|
|
707
|
+
- check: field_value
|
|
708
|
+
path: "products[0].product_id"
|
|
709
|
+
value: "canonical_formats_divergent_display"
|
|
710
|
+
description: "Success response still returns the matching seeded product"
|
|
711
|
+
- check: field_value
|
|
712
|
+
path: "errors[0].code"
|
|
713
|
+
value: "FORMAT_DECLARATION_DIVERGENT"
|
|
714
|
+
description: "Producer flags divergent dual-emission with the canonical advisory code"
|
|
715
|
+
- check: field_value
|
|
716
|
+
path: "errors[0].source"
|
|
717
|
+
value: "producer"
|
|
718
|
+
description: "Advisory is attributed to the producer declaration"
|
|
719
|
+
|
|
720
|
+
- id: canonical_create_satisfaction
|
|
721
|
+
title: "Canonical create-time format satisfaction"
|
|
722
|
+
narrative: |
|
|
723
|
+
The buyer rereads the fixed-size seeded product so the runner's product
|
|
724
|
+
context points at `canonical_formats_mrec_display`, then submits two
|
|
725
|
+
create_media_buy requests. The first uses the legacy
|
|
726
|
+
`display_300x250_image` selector and MUST be accepted after v1-to-canonical
|
|
727
|
+
normalization. The second uses a bare canonical `format_kind: image`
|
|
728
|
+
selector with no dimensions and MUST be rejected because it under-specifies
|
|
729
|
+
the product's 300x250 constraint.
|
|
730
|
+
|
|
731
|
+
steps:
|
|
732
|
+
- id: get_canonical_product_for_create_satisfaction
|
|
733
|
+
title: "Read the fixed-size canonical product before create"
|
|
734
|
+
task: get_products
|
|
735
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
736
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
737
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
738
|
+
comply_scenario: schema_compliance
|
|
739
|
+
stateful: true
|
|
740
|
+
expected: |
|
|
741
|
+
Return the seeded canonical_formats_mrec_display product so create-time
|
|
742
|
+
validations can compare package format selectors against the product's
|
|
743
|
+
canonical format_options[] declaration.
|
|
744
|
+
sample_request:
|
|
745
|
+
buying_mode: "wholesale"
|
|
746
|
+
filters:
|
|
747
|
+
channels: ["display"]
|
|
748
|
+
delivery_type: "guaranteed"
|
|
749
|
+
required_vendor_metrics:
|
|
750
|
+
- vendor:
|
|
751
|
+
domain: "prism.example"
|
|
752
|
+
metric_id: "canonical_format_storyboard_probe"
|
|
753
|
+
account:
|
|
754
|
+
brand:
|
|
755
|
+
domain: "acmeoutdoor.example"
|
|
756
|
+
operator: "pinnacle-agency.example"
|
|
757
|
+
sandbox: true
|
|
758
|
+
context:
|
|
759
|
+
correlation_id: "canonical_formats--get_canonical_product_for_create_satisfaction"
|
|
760
|
+
|
|
761
|
+
validations:
|
|
762
|
+
- check: response_schema
|
|
763
|
+
description: "Response matches get-products-response.json schema"
|
|
764
|
+
- check: field_value
|
|
765
|
+
path: "products[0].product_id"
|
|
766
|
+
value: "canonical_formats_mrec_display"
|
|
767
|
+
description: "The create-time satisfaction phase targets the fixed-size seeded product"
|
|
768
|
+
- check: field_value
|
|
769
|
+
path: "products[0].format_options[0].params.width"
|
|
770
|
+
value: 300
|
|
771
|
+
description: "Product fixes image width at 300"
|
|
772
|
+
- check: field_value
|
|
773
|
+
path: "products[0].format_options[0].params.height"
|
|
774
|
+
value: 250
|
|
775
|
+
description: "Product fixes image height at 250"
|
|
776
|
+
|
|
777
|
+
- id: create_media_buy_with_legacy_mrec_format
|
|
778
|
+
title: "Accept legacy fixed MREC selector after canonical normalization"
|
|
779
|
+
task: create_media_buy
|
|
780
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
781
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
782
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
783
|
+
stateful: true
|
|
784
|
+
expected: |
|
|
785
|
+
Accept the buy. The package uses the legacy display_300x250_image
|
|
786
|
+
format_id; canonical satisfaction validates that the legacy selector
|
|
787
|
+
normalizes to the product's image format_options[] declaration.
|
|
788
|
+
sample_request:
|
|
789
|
+
brand:
|
|
790
|
+
domain: "acmeoutdoor.example"
|
|
791
|
+
account:
|
|
792
|
+
brand:
|
|
793
|
+
domain: "acmeoutdoor.example"
|
|
794
|
+
operator: "pinnacle-agency.example"
|
|
795
|
+
sandbox: true
|
|
796
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
797
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
798
|
+
packages:
|
|
799
|
+
- product_id: "canonical_formats_mrec_display"
|
|
800
|
+
budget: 1000
|
|
801
|
+
pricing_option_id: "canonical_formats_mrec_cpm"
|
|
802
|
+
format_ids:
|
|
803
|
+
- agent_url: "https://creative.adcontextprotocol.org/"
|
|
804
|
+
id: "display_300x250_image"
|
|
805
|
+
context:
|
|
806
|
+
buyer_ref: "canonical_formats_legacy_mrec_positive"
|
|
807
|
+
context:
|
|
808
|
+
correlation_id: "canonical_formats--create_media_buy_with_legacy_mrec_format"
|
|
809
|
+
idempotency_key: "$generate:uuid_v4#canonical_formats_create_media_buy_with_legacy_mrec_format"
|
|
810
|
+
|
|
811
|
+
validations:
|
|
812
|
+
- check: response_schema
|
|
813
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
814
|
+
- check: field_present
|
|
815
|
+
path: "media_buy_id"
|
|
816
|
+
description: "Accepted create allocates a media_buy_id"
|
|
817
|
+
- check: canonical_format_satisfaction
|
|
818
|
+
value: true
|
|
819
|
+
description: "Legacy display_300x250_image selector satisfies the fixed canonical image declaration after normalization"
|
|
820
|
+
|
|
821
|
+
- id: reject_bare_image_selector_for_fixed_mrec
|
|
822
|
+
title: "Reject bare canonical image selector for fixed-size product"
|
|
823
|
+
task: create_media_buy
|
|
824
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
825
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
826
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
827
|
+
expect_error: true
|
|
828
|
+
negative_path: payload_well_formed
|
|
829
|
+
stateful: true
|
|
830
|
+
expected: |
|
|
831
|
+
Reject with UNSUPPORTED_FEATURE. The bare canonical image selector
|
|
832
|
+
does not include width and height, so it does not satisfy the product's
|
|
833
|
+
fixed 300x250 declaration.
|
|
834
|
+
sample_request:
|
|
835
|
+
brand:
|
|
836
|
+
domain: "acmeoutdoor.example"
|
|
837
|
+
account:
|
|
838
|
+
brand:
|
|
839
|
+
domain: "acmeoutdoor.example"
|
|
840
|
+
operator: "pinnacle-agency.example"
|
|
841
|
+
sandbox: true
|
|
842
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
843
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
844
|
+
packages:
|
|
845
|
+
- product_id: "canonical_formats_mrec_display"
|
|
846
|
+
budget: 1000
|
|
847
|
+
pricing_option_id: "canonical_formats_mrec_cpm"
|
|
848
|
+
format_kind: "image"
|
|
849
|
+
context:
|
|
850
|
+
buyer_ref: "canonical_formats_bare_image_negative"
|
|
851
|
+
context:
|
|
852
|
+
correlation_id: "canonical_formats--reject_bare_image_selector_for_fixed_mrec"
|
|
853
|
+
idempotency_key: "$generate:uuid_v4#canonical_formats_reject_bare_image_selector_for_fixed_mrec"
|
|
854
|
+
|
|
855
|
+
validations:
|
|
856
|
+
- check: error_code
|
|
857
|
+
allowed_values: ["UNSUPPORTED_FEATURE"]
|
|
858
|
+
description: "Seller rejects an under-specified format selector as unsupported for the product"
|
|
859
|
+
- check: canonical_format_satisfaction
|
|
860
|
+
value: false
|
|
861
|
+
description: "Bare canonical image selector lacks the dimensions required by the fixed canonical image declaration"
|