@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,428 @@
|
|
|
1
|
+
id: media_buy_seller/performance_buy_flow
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller fulfills a performance (event-kind goal) media buy with a CPA target"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that a seller advertising conversion_tracking can bind an event source, accept a media buy with an event-kind optimization_goal targeting CPA, reject malformed performance briefs, ingest conversion events, and report conversion-attributed delivery including per-creative breakdown. ROAS / maximize_value goals are out of scope — see media_buy_seller/performance_buy_flow_roas (separate scenario, gated on the supported_target_kinds capability bit from #4639)."
|
|
6
|
+
track: media_buy
|
|
7
|
+
|
|
8
|
+
# Gate: scenario runs only when the seller declares conversion_tracking.
|
|
9
|
+
# Sellers without it (pure brand/audience sellers — broadcast TV, signal-only)
|
|
10
|
+
# grade `not_applicable`, not failing. Requires runner support for the
|
|
11
|
+
# `present:` matcher (adcp-client >= 7.6.0).
|
|
12
|
+
requires_capability:
|
|
13
|
+
path: media_buy.conversion_tracking
|
|
14
|
+
present: true
|
|
15
|
+
|
|
16
|
+
required_tools:
|
|
17
|
+
- get_products
|
|
18
|
+
- sync_event_sources
|
|
19
|
+
- create_media_buy
|
|
20
|
+
- log_event
|
|
21
|
+
- get_media_buy_delivery
|
|
22
|
+
- comply_test_controller
|
|
23
|
+
|
|
24
|
+
invariants:
|
|
25
|
+
- status.monotonic
|
|
26
|
+
|
|
27
|
+
narrative: |
|
|
28
|
+
A "performance buy" is a media buy whose optimization_goal is event-kind: the
|
|
29
|
+
buyer commits to a target_cpa and binds the buy to one or more conversion
|
|
30
|
+
event sources registered via sync_event_sources. The seller owns optimization
|
|
31
|
+
toward the goal; the buyer feeds back conversions via log_event and reads
|
|
32
|
+
attributed delivery via get_media_buy_delivery.
|
|
33
|
+
|
|
34
|
+
This scenario is a buy-mode contract test, not a parent specialism. A DSP or
|
|
35
|
+
social platform may run audience buys AND performance buys against the same
|
|
36
|
+
agent; this scenario certifies that the performance path connects end-to-end
|
|
37
|
+
when the seller advertises conversion_tracking.
|
|
38
|
+
|
|
39
|
+
Discriminating behaviors this scenario verifies:
|
|
40
|
+
1. sync_event_sources returns an event_source_id that is then valid as the
|
|
41
|
+
binding target on optimization_goals[].event_sources[].event_source_id.
|
|
42
|
+
2. create_media_buy with an event-kind goal (CPA target) pointing at the
|
|
43
|
+
registered source is accepted.
|
|
44
|
+
3. create_media_buy with an event-kind goal pointing at an unregistered
|
|
45
|
+
source is rejected (INVALID_REQUEST with error.field set to the goal's
|
|
46
|
+
event_source_id path) — silent acceptance would mean the seller cannot
|
|
47
|
+
actually optimize against that source.
|
|
48
|
+
4. log_event flows conversions back, scoped to the registered event_source_id.
|
|
49
|
+
5. get_media_buy_delivery returns first-class conversion metrics —
|
|
50
|
+
conversions and cost_per_acquisition — at the buy level. Per-creative
|
|
51
|
+
conversion attribution is deliberately deferred to a follow-up scenario
|
|
52
|
+
(gated on a separate sub-capability bit) because real adopters report
|
|
53
|
+
attribution at differing granularities (per-creative, per-line,
|
|
54
|
+
per-campaign, per-placement); requiring per-creative here would fail
|
|
55
|
+
honest retail-media / MMP-mediated / broadcast-CTV implementations.
|
|
56
|
+
|
|
57
|
+
ROAS (target.kind = per_ad_spend) and value-max (target.kind = maximize_value)
|
|
58
|
+
are deliberately NOT asserted here. Many sellers — broadcast TV, upper-funnel
|
|
59
|
+
video, signal-only — declare conversion_tracking honestly but don't compute
|
|
60
|
+
return-on-ad-spend. Gating the CPA path on conversion_tracking presence is
|
|
61
|
+
safe; gating ROAS the same way would over-claim. ROAS gets its own scenario
|
|
62
|
+
(performance_buy_flow_roas) gated on the supported_target_kinds capability
|
|
63
|
+
bit proposed in #4639.
|
|
64
|
+
|
|
65
|
+
agent:
|
|
66
|
+
interaction_model: media_buy_seller
|
|
67
|
+
capabilities:
|
|
68
|
+
- sells_media
|
|
69
|
+
- supports_non_guaranteed
|
|
70
|
+
- conversion_tracking
|
|
71
|
+
examples:
|
|
72
|
+
- "Performance-mode DSPs (open web + social)"
|
|
73
|
+
- "Meta / TikTok / Snap performance buying surfaces"
|
|
74
|
+
- "Retail-media performance products"
|
|
75
|
+
- "Agentic optimizers wrapping multiple buying surfaces"
|
|
76
|
+
|
|
77
|
+
caller:
|
|
78
|
+
role: buyer_agent
|
|
79
|
+
example: "Pinnacle Agency (buyer)"
|
|
80
|
+
|
|
81
|
+
prerequisites:
|
|
82
|
+
description: |
|
|
83
|
+
The seller must implement comply_test_controller with simulate_delivery
|
|
84
|
+
(already required for delivery_reporting). simulate_delivery's `conversions`
|
|
85
|
+
param injects attributed conversion counts so get_media_buy_delivery has
|
|
86
|
+
something to return.
|
|
87
|
+
|
|
88
|
+
The buyer fixture supplies a brand, an operator, a conversion event source
|
|
89
|
+
definition, and a small creative set sufficient to exercise per-creative
|
|
90
|
+
breakdown.
|
|
91
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
92
|
+
controller_seeding: true
|
|
93
|
+
|
|
94
|
+
fixtures:
|
|
95
|
+
products:
|
|
96
|
+
- product_id: "performance_native_q2"
|
|
97
|
+
delivery_type: "non_guaranteed"
|
|
98
|
+
channels: ["display", "native"]
|
|
99
|
+
format_ids:
|
|
100
|
+
- id: "native_feed_1x1"
|
|
101
|
+
- id: "display_300x250"
|
|
102
|
+
pricing_options:
|
|
103
|
+
- product_id: "performance_native_q2"
|
|
104
|
+
pricing_option_id: "auction_cpm"
|
|
105
|
+
pricing_model: "cpm"
|
|
106
|
+
currency: "USD"
|
|
107
|
+
floor_price: 1.50
|
|
108
|
+
|
|
109
|
+
phases:
|
|
110
|
+
|
|
111
|
+
- id: setup
|
|
112
|
+
title: "Establish account and discover products"
|
|
113
|
+
steps:
|
|
114
|
+
- id: sync_accounts
|
|
115
|
+
title: "Establish account"
|
|
116
|
+
task: sync_accounts
|
|
117
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
118
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
119
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
120
|
+
stateful: true
|
|
121
|
+
expected: |
|
|
122
|
+
Return the account with account_id and status active.
|
|
123
|
+
sample_request:
|
|
124
|
+
accounts:
|
|
125
|
+
- brand:
|
|
126
|
+
domain: "acmeoutdoor.example"
|
|
127
|
+
operator: "pinnacle-agency.example"
|
|
128
|
+
billing: "operator"
|
|
129
|
+
idempotency_key: "$generate:uuid_v4#performance_buy_flow_setup_sync_accounts"
|
|
130
|
+
validations:
|
|
131
|
+
- check: response_schema
|
|
132
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
133
|
+
- check: field_present
|
|
134
|
+
path: "accounts[0].account_id"
|
|
135
|
+
description: "Account has a platform-assigned ID"
|
|
136
|
+
|
|
137
|
+
- id: get_products_for_performance
|
|
138
|
+
title: "Discover products that support performance optimization"
|
|
139
|
+
task: get_products
|
|
140
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
141
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
142
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
143
|
+
stateful: false
|
|
144
|
+
expected: |
|
|
145
|
+
Return at least one product whose conversion_tracking capabilities
|
|
146
|
+
indicate event-kind goals are accepted.
|
|
147
|
+
sample_request:
|
|
148
|
+
buying_mode: "brief"
|
|
149
|
+
brief: "Performance native + display, US, adults 25-54. Target CPA $35 on purchase events from acmeoutdoor.example."
|
|
150
|
+
required_capabilities:
|
|
151
|
+
- "conversion_tracking"
|
|
152
|
+
account:
|
|
153
|
+
brand:
|
|
154
|
+
domain: "acmeoutdoor.example"
|
|
155
|
+
operator: "pinnacle-agency.example"
|
|
156
|
+
validations:
|
|
157
|
+
- check: response_schema
|
|
158
|
+
description: "Response matches get-products-response.json schema"
|
|
159
|
+
- check: field_present
|
|
160
|
+
path: "products"
|
|
161
|
+
description: "Response contains products"
|
|
162
|
+
|
|
163
|
+
- id: event_source_binding
|
|
164
|
+
title: "Register the conversion event source"
|
|
165
|
+
narrative: |
|
|
166
|
+
The performance buy cannot be created without a registered event source.
|
|
167
|
+
This phase exercises the binding — sync_event_sources returns an
|
|
168
|
+
event_source_id that subsequent create_media_buy calls reference.
|
|
169
|
+
|
|
170
|
+
steps:
|
|
171
|
+
- id: sync_event_sources
|
|
172
|
+
title: "Register a website conversion source"
|
|
173
|
+
task: sync_event_sources
|
|
174
|
+
schema_ref: "media-buy/sync-event-sources-request.json"
|
|
175
|
+
response_schema_ref: "media-buy/sync-event-sources-response.json"
|
|
176
|
+
doc_ref: "/media-buy/task-reference/sync_event_sources"
|
|
177
|
+
stateful: true
|
|
178
|
+
expected: |
|
|
179
|
+
Return event_sources with event_source_id, setup.snippet,
|
|
180
|
+
and action: created. The id is captured for the create_media_buy phase.
|
|
181
|
+
sample_request:
|
|
182
|
+
account:
|
|
183
|
+
brand:
|
|
184
|
+
domain: "acmeoutdoor.example"
|
|
185
|
+
operator: "pinnacle-agency.example"
|
|
186
|
+
event_sources:
|
|
187
|
+
- event_source_id: "acmeoutdoor_website"
|
|
188
|
+
name: "Acme Outdoor Website"
|
|
189
|
+
event_types: ["purchase", "add_to_cart"]
|
|
190
|
+
allowed_domains: ["acmeoutdoor.example"]
|
|
191
|
+
idempotency_key: "$generate:uuid_v4#performance_buy_flow_event_source_binding_sync_event_sources"
|
|
192
|
+
validations:
|
|
193
|
+
- check: response_schema
|
|
194
|
+
description: "Response matches sync-event-sources-response.json schema"
|
|
195
|
+
- check: field_present
|
|
196
|
+
path: "event_sources[0].event_source_id"
|
|
197
|
+
description: "Event source has a platform-assigned ID"
|
|
198
|
+
- check: field_present
|
|
199
|
+
path: "event_sources[0].setup.snippet"
|
|
200
|
+
description: "Event source returns integration code"
|
|
201
|
+
|
|
202
|
+
- id: create_performance_buy_cpa
|
|
203
|
+
title: "Create a performance buy with a CPA goal"
|
|
204
|
+
narrative: |
|
|
205
|
+
The buyer creates a media buy whose package carries an event-kind
|
|
206
|
+
optimization_goal binding to the registered event source. The target
|
|
207
|
+
is target_cpa $35 on purchase events.
|
|
208
|
+
|
|
209
|
+
steps:
|
|
210
|
+
- id: create_media_buy_cpa
|
|
211
|
+
title: "Create media buy with event-kind goal (CPA)"
|
|
212
|
+
task: create_media_buy
|
|
213
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
214
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
215
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
216
|
+
stateful: true
|
|
217
|
+
expected: |
|
|
218
|
+
Create the media buy. Response carries a media_buy_id used for
|
|
219
|
+
subsequent log_event and get_media_buy_delivery calls.
|
|
220
|
+
sample_request:
|
|
221
|
+
brand:
|
|
222
|
+
domain: "acmeoutdoor.example"
|
|
223
|
+
account:
|
|
224
|
+
brand:
|
|
225
|
+
domain: "acmeoutdoor.example"
|
|
226
|
+
operator: "pinnacle-agency.example"
|
|
227
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
228
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
229
|
+
packages:
|
|
230
|
+
- product_id: "performance_native_q2"
|
|
231
|
+
budget: 25000
|
|
232
|
+
pricing_option_id: "auction_cpm"
|
|
233
|
+
optimization_goals:
|
|
234
|
+
- kind: "event"
|
|
235
|
+
event_sources:
|
|
236
|
+
- event_source_id: "acmeoutdoor_website"
|
|
237
|
+
event_type: "purchase"
|
|
238
|
+
value_field: "order_total"
|
|
239
|
+
target:
|
|
240
|
+
kind: "cost_per"
|
|
241
|
+
value: 35.00
|
|
242
|
+
priority: 1
|
|
243
|
+
idempotency_key: "$generate:uuid_v4#performance_buy_flow_create_performance_buy_cpa_create_media_buy"
|
|
244
|
+
validations:
|
|
245
|
+
- check: response_schema
|
|
246
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
247
|
+
- check: field_present
|
|
248
|
+
path: "media_buy_id"
|
|
249
|
+
description: "Media buy has a platform-assigned ID"
|
|
250
|
+
|
|
251
|
+
- id: rejection_unbound_event_source
|
|
252
|
+
title: "Reject a buy referencing an unregistered event source"
|
|
253
|
+
narrative: |
|
|
254
|
+
Silent acceptance of an unregistered event_source_id is a façade — the
|
|
255
|
+
seller cannot optimize against a source it doesn't know about. The
|
|
256
|
+
seller MUST reject with INVALID_REQUEST and set error.field to the
|
|
257
|
+
offending event_source_id path.
|
|
258
|
+
|
|
259
|
+
steps:
|
|
260
|
+
- id: create_media_buy_with_phantom_source
|
|
261
|
+
title: "Submit a buy whose goal references a non-existent event_source_id"
|
|
262
|
+
task: create_media_buy
|
|
263
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
264
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
265
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
266
|
+
expect_error: true
|
|
267
|
+
negative_path: payload_well_formed
|
|
268
|
+
stateful: false
|
|
269
|
+
expected: |
|
|
270
|
+
Reject with INVALID_REQUEST. error.field points at the goal's
|
|
271
|
+
event_sources[].event_source_id path. media_buy_id is not allocated.
|
|
272
|
+
sample_request:
|
|
273
|
+
brand:
|
|
274
|
+
domain: "acmeoutdoor.example"
|
|
275
|
+
account:
|
|
276
|
+
brand:
|
|
277
|
+
domain: "acmeoutdoor.example"
|
|
278
|
+
operator: "pinnacle-agency.example"
|
|
279
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
280
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
281
|
+
packages:
|
|
282
|
+
- product_id: "performance_native_q2"
|
|
283
|
+
budget: 5000
|
|
284
|
+
pricing_option_id: "auction_cpm"
|
|
285
|
+
optimization_goals:
|
|
286
|
+
- kind: "event"
|
|
287
|
+
event_sources:
|
|
288
|
+
- event_source_id: "does_not_exist_phantom_source"
|
|
289
|
+
event_type: "purchase"
|
|
290
|
+
target:
|
|
291
|
+
kind: "cost_per"
|
|
292
|
+
value: 35.00
|
|
293
|
+
idempotency_key: "$generate:uuid_v4#performance_buy_flow_rejection_unbound_event_source"
|
|
294
|
+
validations:
|
|
295
|
+
- check: error_code
|
|
296
|
+
allowed_values: ["INVALID_REQUEST"]
|
|
297
|
+
description: "Seller rejects the unbound event_source_id with INVALID_REQUEST"
|
|
298
|
+
- check: field_value
|
|
299
|
+
path: "errors[0].field"
|
|
300
|
+
value: "packages[0].optimization_goals[0].event_sources[0].event_source_id"
|
|
301
|
+
description: "Error.field points at the offending event_source_id path (core/error.json defines field as deterministic JSONPath-lite — literal equality)"
|
|
302
|
+
|
|
303
|
+
- id: conversion_event_logging
|
|
304
|
+
title: "Log conversion events against the bound source"
|
|
305
|
+
narrative: |
|
|
306
|
+
The buyer logs purchase events tied to the registered event_source_id.
|
|
307
|
+
These flow into the seller's attribution pipeline and surface in
|
|
308
|
+
delivery reporting in the next phase.
|
|
309
|
+
|
|
310
|
+
steps:
|
|
311
|
+
- id: log_purchase_event
|
|
312
|
+
title: "Log a purchase event with value"
|
|
313
|
+
task: log_event
|
|
314
|
+
schema_ref: "media-buy/log-event-request.json"
|
|
315
|
+
response_schema_ref: "media-buy/log-event-response.json"
|
|
316
|
+
doc_ref: "/media-buy/task-reference/log_event"
|
|
317
|
+
stateful: true
|
|
318
|
+
expected: |
|
|
319
|
+
Acknowledge the event with accepted status.
|
|
320
|
+
sample_request:
|
|
321
|
+
account:
|
|
322
|
+
brand:
|
|
323
|
+
domain: "acmeoutdoor.example"
|
|
324
|
+
operator: "pinnacle-agency.example"
|
|
325
|
+
event_source_id: "acmeoutdoor_website"
|
|
326
|
+
events:
|
|
327
|
+
- event_type: "purchase"
|
|
328
|
+
event_id: "evt_perf_buy_flow_001"
|
|
329
|
+
event_time: "2026-06-05T14:30:00Z"
|
|
330
|
+
user_match:
|
|
331
|
+
hashed_email: "a000000000000000000000000000000000000000000000000000000000000001"
|
|
332
|
+
custom_data:
|
|
333
|
+
order_total: 149.99
|
|
334
|
+
currency: "USD"
|
|
335
|
+
idempotency_key: "$generate:uuid_v4#performance_buy_flow_conversion_event_logging_log_event"
|
|
336
|
+
validations:
|
|
337
|
+
- check: response_schema
|
|
338
|
+
description: "Response matches log-event-response.json schema"
|
|
339
|
+
- check: upstream_traffic
|
|
340
|
+
description: "log_event forwards the event to the seller's upstream conversion endpoint"
|
|
341
|
+
min_count: 1
|
|
342
|
+
endpoint_pattern: "POST *"
|
|
343
|
+
identifier_paths:
|
|
344
|
+
- "events[*].user_match.hashed_email"
|
|
345
|
+
|
|
346
|
+
- id: attributed_delivery_reporting
|
|
347
|
+
title: "Delivery reporting carries conversion-attributed metrics and per-creative breakdown"
|
|
348
|
+
narrative: |
|
|
349
|
+
The discriminating assertion of the performance buy mode: delivery
|
|
350
|
+
reporting MUST surface conversion metrics, not just impressions.
|
|
351
|
+
The runner injects simulated impressions + conversions via the test
|
|
352
|
+
controller, then verifies get_media_buy_delivery returns conversions,
|
|
353
|
+
cost_per_acquisition, and a per-creative breakdown whose entries
|
|
354
|
+
carry conversion attribution.
|
|
355
|
+
|
|
356
|
+
Optional metrics (conversion_value, roas) are validated against schema
|
|
357
|
+
shape when present but not required — sellers that don't compute
|
|
358
|
+
return-on-ad-spend simply omit them.
|
|
359
|
+
|
|
360
|
+
steps:
|
|
361
|
+
- id: simulate_performance_delivery
|
|
362
|
+
title: "Inject impressions + conversions + spend"
|
|
363
|
+
task: comply_test_controller
|
|
364
|
+
requires_tool: comply_test_controller
|
|
365
|
+
stateful: true
|
|
366
|
+
expected: |
|
|
367
|
+
The test controller acknowledges the simulated delivery.
|
|
368
|
+
sample_request:
|
|
369
|
+
account:
|
|
370
|
+
sandbox: true
|
|
371
|
+
scenario: "simulate_delivery"
|
|
372
|
+
params:
|
|
373
|
+
media_buy_id: "$context.media_buy_id"
|
|
374
|
+
impressions: 200000
|
|
375
|
+
clicks: 4500
|
|
376
|
+
conversions: 90
|
|
377
|
+
reported_spend:
|
|
378
|
+
amount: 3000.00
|
|
379
|
+
currency: "USD"
|
|
380
|
+
validations:
|
|
381
|
+
- check: field_value
|
|
382
|
+
path: "success"
|
|
383
|
+
allowed_values: [true]
|
|
384
|
+
description: "Delivery simulation succeeds"
|
|
385
|
+
|
|
386
|
+
- id: get_attributed_delivery
|
|
387
|
+
title: "Get delivery and verify conversion-attributed metrics"
|
|
388
|
+
task: get_media_buy_delivery
|
|
389
|
+
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
390
|
+
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
391
|
+
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
392
|
+
stateful: true
|
|
393
|
+
expected: |
|
|
394
|
+
Delivery response includes:
|
|
395
|
+
- conversions (>= simulated)
|
|
396
|
+
- cost_per_acquisition (effective CPA — required for this scenario)
|
|
397
|
+
|
|
398
|
+
Per-creative conversion attribution (by_package[].by_creative[].conversions)
|
|
399
|
+
is intentionally NOT asserted here. Honest implementations vary widely:
|
|
400
|
+
social platforms surface per-ad attribution natively, retail-media
|
|
401
|
+
networks (Criteo, Amazon Ads) often expose conversions at the line
|
|
402
|
+
level with creative rotation opaque, MMP-mediated mobile (post-iOS-14)
|
|
403
|
+
attributes at the campaign/ad-set level, and broadcast/CTV performance
|
|
404
|
+
products attribute at the placement. Per-creative attribution will
|
|
405
|
+
land as its own gated scenario behind a sub-capability bit in a
|
|
406
|
+
follow-up.
|
|
407
|
+
|
|
408
|
+
Optional but validated-if-present (sellers that compute ROAS will
|
|
409
|
+
carry these; sellers that don't simply omit them):
|
|
410
|
+
- conversion_value
|
|
411
|
+
- roas
|
|
412
|
+
sample_request:
|
|
413
|
+
account:
|
|
414
|
+
brand:
|
|
415
|
+
domain: "acmeoutdoor.example"
|
|
416
|
+
operator: "pinnacle-agency.example"
|
|
417
|
+
media_buy_ids:
|
|
418
|
+
- "$context.media_buy_id"
|
|
419
|
+
include_package_daily_breakdown: true
|
|
420
|
+
validations:
|
|
421
|
+
- check: response_schema
|
|
422
|
+
description: "Response matches get-media-buy-delivery-response.json schema"
|
|
423
|
+
- check: field_present
|
|
424
|
+
path: "media_buy_deliveries[0].totals.conversions"
|
|
425
|
+
description: "Conversion count surfaced at the buy level"
|
|
426
|
+
- check: field_present
|
|
427
|
+
path: "media_buy_deliveries[0].totals.cost_per_acquisition"
|
|
428
|
+
description: "Effective CPA computed and returned"
|