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