@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,373 @@
1
+ id: media_buy_seller/product_signal_targeting
2
+ version: "1.0.0"
3
+ title: "Seller exposes wholesale signal options and honors package-level signal_targeting_groups"
4
+ category: media_buy_seller
5
+ summary: "Verifies that a seller with wholesale products and wholesale get_signals can expose signal targeting eligibility, accept package-level signal_targeting_groups with pricing, reject unknown signals, and echo the applied grouped expression on readback."
6
+ track: media_buy
7
+
8
+ # Gate: this scenario is for sellers that expose the selectable signal menu
9
+ # through the wholesale signals feed. Product-specific inline menus are covered
10
+ # by schema and product-discovery checks; this storyboard exercises the
11
+ # cross-surface wholesale composition path.
12
+ requires_capability:
13
+ path: signals.discovery_modes
14
+ present: true
15
+
16
+ required_tools:
17
+ - get_products
18
+ - get_signals
19
+ - create_media_buy
20
+ - get_media_buys
21
+ - comply_test_controller
22
+
23
+ invariants:
24
+ - status.monotonic
25
+
26
+ narrative: |
27
+ Product-scoped signal targeting connects three surfaces:
28
+
29
+ 1. get_products declares whether the selected product has a package-level
30
+ signal targeting surface through signal_targeting_allowed and optional
31
+ signal_targeting_rules.
32
+ 2. get_signals returns the selectable wholesale signal feed when the
33
+ wholesale product omits inline signal_targeting_options.
34
+ 3. create_media_buy binds the selected signals to the package through
35
+ targeting_overlay.signal_targeting_groups, including the selected
36
+ signal pricing_option_id when the signal has incremental pricing.
37
+
38
+ This scenario verifies the wholesale path: the seller returns a product with
39
+ signal_targeting_allowed: true, returns targetable signals from get_signals,
40
+ accepts a buy with a grouped signal expression, rejects an unknown signal_ref,
41
+ and echoes the applied signal_targeting_groups on get_media_buys so the buyer
42
+ can audit what was actually booked.
43
+
44
+ agent:
45
+ interaction_model: media_buy_seller
46
+ capabilities:
47
+ - sells_media
48
+ - supports_non_guaranteed
49
+ - wholesale_signal_targeting
50
+ examples:
51
+ - "Programmatic sellers exposing audience and key-value targeting as seller-offered signals"
52
+ - "Retail media networks that let buyers apply shopper intent signals to a product"
53
+ - "Audio or video sellers that expose a wholesale signal feed for package composition"
54
+
55
+ caller:
56
+ role: buyer_agent
57
+ example: "Pinnacle Agency (buyer)"
58
+
59
+ prerequisites:
60
+ description: |
61
+ The seller must implement comply_test_controller seeding for products and
62
+ pricing, and must expose a get_signals wholesale feed with at least two
63
+ selectable signals. The seeded product intentionally omits inline
64
+ signal_targeting_options, so the buyer uses get_signals as the selectable
65
+ signal menu.
66
+ test_kit: "test-kits/acme-outdoor.yaml"
67
+ controller_seeding: true
68
+
69
+ fixtures:
70
+ products:
71
+ - product_id: "signal_targeted_display_q2"
72
+ delivery_type: "non_guaranteed"
73
+ channels: ["display"]
74
+ format_ids:
75
+ - id: "display_300x250"
76
+ signal_targeting_allowed: true
77
+ signal_targeting_rules:
78
+ resolution_model: "direct_targeting"
79
+ selection_mode: "optional"
80
+ max_signal_targeting_groups: 2
81
+ max_signals_per_targeting_group: 3
82
+ pricing_options:
83
+ - product_id: "signal_targeted_display_q2"
84
+ pricing_option_id: "auction_cpm"
85
+ pricing_model: "cpm"
86
+ currency: "USD"
87
+ floor_price: 3.00
88
+
89
+ phases:
90
+ - id: discover_wholesale_product
91
+ title: "Discover a wholesale product that allows signal targeting"
92
+ narrative: |
93
+ The buyer starts from wholesale product discovery. The product does not
94
+ need to duplicate the full signal menu inline; signal_targeting_allowed
95
+ tells the buyer that package-level signal_targeting_groups are valid and
96
+ signal_targeting_rules tells the buyer how to compose them.
97
+ steps:
98
+ - id: get_products_wholesale
99
+ title: "Enumerate wholesale products"
100
+ task: get_products
101
+ schema_ref: "media-buy/get-products-request.json"
102
+ response_schema_ref: "media-buy/get-products-response.json"
103
+ doc_ref: "/media-buy/task-reference/get_products"
104
+ stateful: true
105
+ expected: |
106
+ Return a product with signal_targeting_allowed: true and product-scoped
107
+ signal_targeting_rules. Inline signal_targeting_options may be omitted
108
+ because this scenario uses get_signals as the selectable signal feed.
109
+ sample_request:
110
+ buying_mode: "wholesale"
111
+ filters:
112
+ channels: ["display"]
113
+ account:
114
+ brand:
115
+ domain: "acmeoutdoor.example"
116
+ operator: "pinnacle-agency.example"
117
+ sandbox: true
118
+ context:
119
+ correlation_id: "product_signal_targeting--get_products_wholesale"
120
+ context_outputs:
121
+ - key: "product_id"
122
+ path: "products[0].product_id"
123
+ - key: "pricing_option_id"
124
+ path: "products[0].pricing_options[0].pricing_option_id"
125
+ validations:
126
+ - check: response_schema
127
+ description: "Response matches get-products-response.json schema"
128
+ - check: field_value
129
+ path: "products[0].signal_targeting_allowed"
130
+ allowed_values: [true]
131
+ description: "Product declares package-level signal targeting"
132
+ - check: field_present
133
+ path: "products[0].signal_targeting_rules"
134
+ description: "Product declares signal targeting composition rules"
135
+ - check: field_present
136
+ path: "context"
137
+ description: "Response echoes back the context object"
138
+ - check: field_value
139
+ path: "context.correlation_id"
140
+ value: "product_signal_targeting--get_products_wholesale"
141
+ description: "Context correlation_id returned unchanged"
142
+
143
+ - id: discover_wholesale_signals
144
+ title: "Read the selectable signal feed"
145
+ narrative: |
146
+ Because the product did not inline a signal menu, the buyer calls
147
+ get_signals in wholesale mode. The returned signal_ref is the buy-time
148
+ identity, and pricing_options supplies the pricing_option_id used in
149
+ package signal targeting groups.
150
+ steps:
151
+ - id: get_signals_wholesale
152
+ title: "Enumerate wholesale signals"
153
+ task: get_signals
154
+ schema_ref: "signals/get-signals-request.json"
155
+ response_schema_ref: "signals/get-signals-response.json"
156
+ doc_ref: "/signals/tasks/get_signals"
157
+ stateful: false
158
+ expected: |
159
+ Return at least two schema-valid signal entries with signal_ref,
160
+ signal_agent_segment_id, value_type, and pricing_options. The buyer
161
+ will include the first signal and exclude the second.
162
+ sample_request:
163
+ discovery_mode: "wholesale"
164
+ account:
165
+ brand:
166
+ domain: "acmeoutdoor.example"
167
+ operator: "pinnacle-agency.example"
168
+ sandbox: true
169
+ destinations:
170
+ - type: "agent"
171
+ agent_url: "https://wonderstruck.salesagents.example"
172
+ countries: ["US"]
173
+ context:
174
+ correlation_id: "product_signal_targeting--get_signals_wholesale"
175
+ context_outputs:
176
+ - key: "include_signal_ref"
177
+ path: "signals[0].signal_ref"
178
+ - key: "include_signal_pricing_option_id"
179
+ path: "signals[0].pricing_options[0].pricing_option_id"
180
+ - key: "include_signal_agent_segment_id"
181
+ path: "signals[0].signal_agent_segment_id"
182
+ - key: "exclude_signal_ref"
183
+ path: "signals[1].signal_ref"
184
+ - key: "exclude_signal_pricing_option_id"
185
+ path: "signals[1].pricing_options[0].pricing_option_id"
186
+ - key: "exclude_signal_agent_segment_id"
187
+ path: "signals[1].signal_agent_segment_id"
188
+ validations:
189
+ - check: response_schema
190
+ description: "Response matches get-signals-response.json schema"
191
+ - check: field_present
192
+ path: "signals[0].signal_ref.scope"
193
+ description: "First signal carries canonical signal_ref identity"
194
+ - check: field_present
195
+ path: "signals[0].pricing_options[0].pricing_option_id"
196
+ description: "First signal carries a selectable pricing option"
197
+ - check: field_present
198
+ path: "signals[1].signal_ref.scope"
199
+ description: "Second signal carries canonical signal_ref identity for exclusion"
200
+ - check: field_present
201
+ path: "context"
202
+ description: "Response echoes back the context object"
203
+ - check: field_value
204
+ path: "context.correlation_id"
205
+ value: "product_signal_targeting--get_signals_wholesale"
206
+ description: "Context correlation_id returned unchanged"
207
+
208
+ - id: create_with_signal_groups
209
+ title: "Create a media buy with include and exclude signal groups"
210
+ narrative: |
211
+ The buyer selects one signal for inclusion and one for exclusion. The
212
+ top-level operator is always all; child any groups include users matching
213
+ at least one signal, and child none groups exclude users matching any
214
+ listed signal. Binary signal entries use value: true in both groups.
215
+ steps:
216
+ - id: create_media_buy_with_signal_groups
217
+ title: "Create media buy with signal_targeting_groups"
218
+ task: create_media_buy
219
+ schema_ref: "media-buy/create-media-buy-request.json"
220
+ response_schema_ref: "media-buy/create-media-buy-response.json"
221
+ doc_ref: "/media-buy/task-reference/create_media_buy"
222
+ stateful: true
223
+ expected: |
224
+ Create the buy and persist the grouped signal targeting expression.
225
+ The selected signal pricing_option_id values are available for billing
226
+ verification.
227
+ sample_request:
228
+ brand:
229
+ domain: "acmeoutdoor.example"
230
+ account:
231
+ brand:
232
+ domain: "acmeoutdoor.example"
233
+ operator: "pinnacle-agency.example"
234
+ sandbox: true
235
+ start_time: "2026-07-01T00:00:00Z"
236
+ end_time: "2026-07-31T23:59:59Z"
237
+ packages:
238
+ - product_id: "$context.product_id"
239
+ pricing_option_id: "$context.pricing_option_id"
240
+ budget: 12000
241
+ targeting_overlay:
242
+ signal_targeting_groups:
243
+ operator: "all"
244
+ groups:
245
+ - operator: "any"
246
+ signals:
247
+ - signal_ref: "$context.include_signal_ref"
248
+ signal_agent_segment_id: "$context.include_signal_agent_segment_id"
249
+ pricing_option_id: "$context.include_signal_pricing_option_id"
250
+ value_type: "binary"
251
+ value: true
252
+ - operator: "none"
253
+ signals:
254
+ - signal_ref: "$context.exclude_signal_ref"
255
+ signal_agent_segment_id: "$context.exclude_signal_agent_segment_id"
256
+ pricing_option_id: "$context.exclude_signal_pricing_option_id"
257
+ value_type: "binary"
258
+ value: true
259
+ idempotency_key: "$generate:uuid_v4#product_signal_targeting_create_media_buy"
260
+ context:
261
+ correlation_id: "product_signal_targeting--create_media_buy_with_signal_groups"
262
+ context_outputs:
263
+ - key: "media_buy_id"
264
+ path: "media_buy_id"
265
+ validations:
266
+ - check: response_schema
267
+ description: "Response matches create-media-buy-response.json schema"
268
+ - check: field_present
269
+ path: "media_buy_id"
270
+ description: "Seller assigns a media_buy_id"
271
+ - check: field_present
272
+ path: "context"
273
+ description: "Response echoes back the context object"
274
+
275
+ - id: verify_signal_groups_echo
276
+ title: "Verify the applied grouped signal expression is readable"
277
+ narrative: |
278
+ The seller must echo applied signal_targeting_groups on package state so
279
+ the buyer can audit the booked include/exclude expression and selected
280
+ signal pricing options.
281
+ steps:
282
+ - id: get_after_create
283
+ title: "Read back the buy and confirm signal_targeting_groups"
284
+ task: get_media_buys
285
+ schema_ref: "media-buy/get-media-buys-request.json"
286
+ response_schema_ref: "media-buy/get-media-buys-response.json"
287
+ doc_ref: "/media-buy/task-reference/get_media_buys"
288
+ stateful: true
289
+ expected: |
290
+ Return the media buy with the package targeting_overlay carrying the
291
+ same signal_targeting_groups operator structure sent on create.
292
+ sample_request:
293
+ account:
294
+ brand:
295
+ domain: "acmeoutdoor.example"
296
+ operator: "pinnacle-agency.example"
297
+ sandbox: true
298
+ media_buy_ids:
299
+ - "$context.media_buy_id"
300
+ context:
301
+ correlation_id: "product_signal_targeting--get_after_create"
302
+ validations:
303
+ - check: response_schema
304
+ description: "Response matches get-media-buys-response.json schema"
305
+ - check: field_value
306
+ path: "media_buys[0].packages[0].targeting_overlay.signal_targeting_groups.operator"
307
+ value: "all"
308
+ description: "Top-level signal targeting operator is all"
309
+ - check: field_value
310
+ path: "media_buys[0].packages[0].targeting_overlay.signal_targeting_groups.groups[0].operator"
311
+ value: "any"
312
+ description: "Include group is represented as an any group"
313
+ - check: field_value
314
+ path: "media_buys[0].packages[0].targeting_overlay.signal_targeting_groups.groups[1].operator"
315
+ value: "none"
316
+ description: "Exclude group is represented as a none group"
317
+ - check: field_present
318
+ path: "media_buys[0].packages[0].targeting_overlay.signal_targeting_groups.groups[0].signals[0].pricing_option_id"
319
+ description: "Selected signal pricing_option_id is persisted for billing audit"
320
+
321
+ - id: reject_unknown_signal
322
+ title: "Reject a buy that references an unknown signal"
323
+ narrative: |
324
+ Silent acceptance of a signal the seller did not advertise is a facade:
325
+ the seller cannot prove the package was targeted to the buyer's intended
326
+ signal. The seller must reject unknown or ineligible signal_ref values.
327
+ steps:
328
+ - id: create_media_buy_with_unknown_signal
329
+ title: "Submit a buy with an unadvertised product-local signal"
330
+ task: create_media_buy
331
+ schema_ref: "media-buy/create-media-buy-request.json"
332
+ response_schema_ref: "media-buy/create-media-buy-response.json"
333
+ doc_ref: "/media-buy/task-reference/create_media_buy"
334
+ expect_error: true
335
+ negative_path: payload_well_formed
336
+ stateful: false
337
+ expected: |
338
+ Reject with INVALID_REQUEST. error.field points at the offending
339
+ signal_ref path inside signal_targeting_groups.
340
+ sample_request:
341
+ brand:
342
+ domain: "acmeoutdoor.example"
343
+ account:
344
+ brand:
345
+ domain: "acmeoutdoor.example"
346
+ operator: "pinnacle-agency.example"
347
+ sandbox: true
348
+ start_time: "2026-07-01T00:00:00Z"
349
+ end_time: "2026-07-31T23:59:59Z"
350
+ packages:
351
+ - product_id: "$context.product_id"
352
+ pricing_option_id: "$context.pricing_option_id"
353
+ budget: 5000
354
+ targeting_overlay:
355
+ signal_targeting_groups:
356
+ operator: "all"
357
+ groups:
358
+ - operator: "any"
359
+ signals:
360
+ - signal_ref:
361
+ scope: "product"
362
+ signal_id: "phantom_signal_not_advertised"
363
+ value_type: "binary"
364
+ value: true
365
+ idempotency_key: "$generate:uuid_v4#product_signal_targeting_unknown_signal"
366
+ validations:
367
+ - check: error_code
368
+ allowed_values: ["INVALID_REQUEST"]
369
+ description: "Seller rejects the unadvertised signal_ref with INVALID_REQUEST"
370
+ - check: field_value
371
+ path: "errors[0].field"
372
+ value: "packages[0].targeting_overlay.signal_targeting_groups.groups[0].signals[0].signal_ref"
373
+ description: "Error.field points at the offending signal_ref path"