@adcp/sdk 7.11.0 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
  2. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  3. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
  4. package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
  5. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
  6. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
  7. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  8. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
  9. package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
  10. package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
  11. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  12. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
  13. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  14. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
  15. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  16. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  17. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  18. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  19. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
  20. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
  21. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
  22. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  23. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  24. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  25. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
  26. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
  27. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
  28. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  29. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
  30. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  31. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  32. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
  33. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  34. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  35. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  36. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  37. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  38. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  39. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  40. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
  41. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  42. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  43. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  44. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  45. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  46. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  47. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  48. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
  49. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  50. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  51. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  52. package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
  53. package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
  54. package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
  55. package/compliance/cache/3.1.0-rc.2/index.json +356 -0
  56. package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
  57. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  58. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
  59. package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
  60. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
  61. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
  62. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  63. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
  64. package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
  65. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
  66. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  67. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
  68. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  69. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
  70. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  71. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  72. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  73. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  74. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
  75. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
  76. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
  77. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  78. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  79. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  80. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
  81. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
  82. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
  83. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  84. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
  85. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  86. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  87. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
  88. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  89. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  90. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  91. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  92. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  93. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  94. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  95. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
  96. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  97. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  98. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  99. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  100. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  101. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  102. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  103. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  104. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  105. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  106. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  107. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
  108. package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
  109. package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
  110. package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
  111. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
  112. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
  113. package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
  114. package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
  115. package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
  116. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
  117. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
  118. package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
  119. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
  120. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
  121. package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
  122. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
  123. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
  124. package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
  125. package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
  126. package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
  127. package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
  128. package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
  129. package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
  130. package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
  131. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
  132. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
  133. package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
  134. package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
  135. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
  136. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
  137. package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
  138. package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
  139. package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
  140. package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
  141. package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
  142. package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
  143. package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
  144. package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
  145. package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
  146. package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
  147. package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
  148. package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
  149. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  150. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
  151. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  152. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  153. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  154. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  155. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  156. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  157. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  158. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  159. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  160. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
  161. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
  162. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
  163. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  164. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  165. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  166. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  167. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  168. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  169. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  170. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  171. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  172. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  173. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  174. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  175. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  176. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  177. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  178. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  179. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  180. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  181. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  182. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  183. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  184. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  185. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  186. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  187. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  188. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  189. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  190. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
  191. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  192. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  193. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  194. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  195. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  196. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  197. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  198. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  199. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  200. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  201. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  202. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  203. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
  204. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
  205. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  206. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  207. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  208. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  209. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  210. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  211. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  212. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  213. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  214. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  215. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  216. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  217. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  218. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  219. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  220. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  221. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  222. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  223. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  224. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  225. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  226. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  227. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  228. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  229. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  230. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  231. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  232. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  233. package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
  234. package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
  235. package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
  236. package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
  237. package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
  238. package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
  239. package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
  240. package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
  241. package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
  242. package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
  243. package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
  244. package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
  245. package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
  246. package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
  247. package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
  248. package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
  249. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
  250. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
  251. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
  252. package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
  253. package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
  254. package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
  255. package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
  256. package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
  257. package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
  258. package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
  259. package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
  260. package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
  261. package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
  262. package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
  263. package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
  264. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
  265. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
  266. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
  267. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
  268. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
  269. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  270. package/dist/lib/testing/storyboard/default-invariants.js +23 -0
  271. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  272. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  273. package/dist/lib/testing/storyboard/runner.js +84 -21
  274. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  275. package/dist/lib/testing/storyboard/types.d.ts +21 -0
  276. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  277. package/dist/lib/testing/storyboard/types.js.map +1 -1
  278. package/dist/lib/testing/types.d.ts +9 -0
  279. package/dist/lib/testing/types.d.ts.map +1 -1
  280. package/dist/lib/version.d.ts +3 -3
  281. package/dist/lib/version.js +3 -3
  282. package/package.json +1 -1
@@ -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"