@adcp/sdk 7.11.0 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
  2. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  3. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
  4. package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
  5. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
  6. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
  7. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  8. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
  9. package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
  10. package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
  11. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  12. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
  13. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  14. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
  15. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  16. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  17. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  18. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  19. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
  20. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
  21. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
  22. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  23. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  24. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  25. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
  26. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
  27. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
  28. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  29. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
  30. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  31. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  32. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
  33. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  34. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  35. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  36. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  37. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  38. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  39. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  40. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
  41. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  42. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  43. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  44. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  45. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  46. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  47. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  48. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
  49. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  50. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  51. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  52. package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
  53. package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
  54. package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
  55. package/compliance/cache/3.1.0-rc.2/index.json +356 -0
  56. package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
  57. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  58. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
  59. package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
  60. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
  61. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
  62. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  63. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
  64. package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
  65. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
  66. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  67. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
  68. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  69. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
  70. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  71. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  72. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  73. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  74. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
  75. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
  76. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
  77. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  78. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  79. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  80. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
  81. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
  82. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
  83. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  84. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
  85. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  86. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  87. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
  88. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  89. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  90. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  91. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  92. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  93. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  94. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  95. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
  96. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  97. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  98. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  99. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  100. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  101. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  102. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  103. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  104. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  105. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  106. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  107. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
  108. package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
  109. package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
  110. package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
  111. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
  112. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
  113. package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
  114. package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
  115. package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
  116. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
  117. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
  118. package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
  119. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
  120. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
  121. package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
  122. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
  123. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
  124. package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
  125. package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
  126. package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
  127. package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
  128. package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
  129. package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
  130. package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
  131. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
  132. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
  133. package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
  134. package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
  135. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
  136. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
  137. package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
  138. package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
  139. package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
  140. package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
  141. package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
  142. package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
  143. package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
  144. package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
  145. package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
  146. package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
  147. package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
  148. package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
  149. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  150. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
  151. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  152. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  153. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  154. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  155. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  156. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  157. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  158. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  159. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  160. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
  161. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
  162. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
  163. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  164. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  165. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  166. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  167. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  168. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  169. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  170. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  171. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  172. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  173. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  174. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  175. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  176. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  177. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  178. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  179. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  180. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  181. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  182. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  183. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  184. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  185. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  186. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  187. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  188. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  189. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  190. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
  191. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  192. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  193. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  194. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  195. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  196. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  197. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  198. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  199. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  200. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  201. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  202. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  203. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
  204. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
  205. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  206. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  207. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  208. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  209. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  210. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  211. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  212. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  213. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  214. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  215. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  216. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  217. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  218. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  219. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  220. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  221. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  222. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  223. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  224. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  225. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  226. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  227. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  228. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  229. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  230. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  231. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  232. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  233. package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
  234. package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
  235. package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
  236. package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
  237. package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
  238. package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
  239. package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
  240. package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
  241. package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
  242. package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
  243. package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
  244. package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
  245. package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
  246. package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
  247. package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
  248. package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
  249. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
  250. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
  251. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
  252. package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
  253. package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
  254. package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
  255. package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
  256. package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
  257. package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
  258. package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
  259. package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
  260. package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
  261. package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
  262. package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
  263. package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
  264. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
  265. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
  266. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
  267. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
  268. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
  269. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  270. package/dist/lib/testing/storyboard/default-invariants.js +23 -0
  271. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  272. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  273. package/dist/lib/testing/storyboard/runner.js +84 -21
  274. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  275. package/dist/lib/testing/storyboard/types.d.ts +21 -0
  276. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  277. package/dist/lib/testing/storyboard/types.js.map +1 -1
  278. package/dist/lib/testing/types.d.ts +9 -0
  279. package/dist/lib/testing/types.d.ts.map +1 -1
  280. package/dist/lib/version.d.ts +3 -3
  281. package/dist/lib/version.js +3 -3
  282. package/package.json +1 -1
@@ -0,0 +1,576 @@
1
+ id: media_buy_seller/vendor_metric_optimization_flow
2
+ version: "1.0.0"
3
+ title: "Vendor-metric optimization-goal: acceptance and rejection"
4
+ category: media_buy_seller
5
+ summary: "Verifies that a seller supporting vendor_metric_optimization accepts a media buy whose optimization_goal has kind 'vendor_metric' when all preconditions are met, and rejects goals that fail either the capability check or the reporting-coherence check."
6
+ track: media_buy
7
+ introduced_in: "3.1"
8
+
9
+ # Gate: scenario runs only when the seller declares vendor-metric
10
+ # optimization support. The product-level vendor_metric_optimization block
11
+ # remains the authoritative per-product capability, including target-kind
12
+ # support on the seeded product.
13
+ requires_capability:
14
+ path: media_buy.vendor_metric_optimization
15
+ present: true
16
+
17
+ required_tools:
18
+ - get_products
19
+ - create_media_buy
20
+ - comply_test_controller
21
+
22
+ narrative: |
23
+ AdCP 3.1 adds optimization_goals[].kind: "vendor_metric" — a goal that steers
24
+ the seller's bidding stack toward a specific vendor's measurement metric (e.g.,
25
+ attention, emissions, brand lift). Three runtime preconditions govern
26
+ acceptance:
27
+
28
+ 1. Capability — the (vendor, metric_id) pair MUST appear in the product's
29
+ vendor_metric_optimization.supported_metrics[], and the goal's target.kind
30
+ MUST appear in that entry's supported_targets.
31
+
32
+ 2. Reporting coherence — the package's committed_metrics[] MUST include a
33
+ matching { scope: "vendor", vendor, metric_id } entry. Optimization without
34
+ committed reporting is unverifiable and is rejected at the wire level.
35
+
36
+ 3. Discovery (SHOULD) — the metric_id SHOULD be discoverable in the vendor's
37
+ published measurement.metrics[] catalog. This check is SHOULD-level in 3.1
38
+ while measurement-vendor adoption of AdCP-conformant capability publication
39
+ catches up; it tightens to MUST at the next minor. Sellers MAY reject with
40
+ TERMS_REJECTED on a catalog miss; sellers that accept do not fail this
41
+ storyboard.
42
+
43
+ This storyboard covers:
44
+ - Positive path: goal accepted when all preconditions are met, including
45
+ the target-less maximize-within-budget form
46
+ - Negative path A: goal rejected when (vendor, metric_id) not in supported_metrics
47
+ - Negative path B: goal rejected when target.kind is not in supported_targets
48
+ - Negative path C: goal rejected when package committed_metrics lacks vendor-scope entry
49
+ - Negative path D: goal rejected when the metric is optimizable but not reportable
50
+
51
+ The existing vendor_metric_accountability storyboard (declaration → filter →
52
+ delivery emission) is unchanged and exercises a separate contract.
53
+
54
+ agent:
55
+ interaction_model: media_buy_seller
56
+ capabilities:
57
+ - sells_media
58
+ examples:
59
+ - "Premium publishers with attention measurement optimization"
60
+ - "Sustainability-focused sellers with emissions-metric steering"
61
+ - "Sellers integrating brand-lift vendors into their bidding stack"
62
+
63
+ caller:
64
+ role: buyer_agent
65
+ example: "Pinnacle Agency (buyer)"
66
+
67
+ prerequisites:
68
+ description: |
69
+ The seller supports comply_test_controller and can seed products with
70
+ vendor_metric_optimization.supported_metrics[]. The seeded product must
71
+ appear in get_products responses. The seller enforces the three preconditions
72
+ for vendor_metric goals at create_media_buy time.
73
+ test_kit: "test-kits/acme-outdoor.yaml"
74
+ controller_seeding: true
75
+
76
+ fixtures:
77
+ products:
78
+ - product_id: "display_vendor_metric_opt"
79
+ delivery_type: "non_guaranteed"
80
+ channels: ["display"]
81
+ format_ids:
82
+ - id: "display_300x250"
83
+ reporting_capabilities:
84
+ available_metrics:
85
+ - impressions
86
+ - clicks
87
+ - spend
88
+ vendor_metrics:
89
+ - vendor:
90
+ domain: "attentionvendor.example"
91
+ metric_id: "attention_score"
92
+ - vendor:
93
+ domain: "attentionvendor.example"
94
+ metric_id: "attention_units"
95
+ vendor_metric_optimization:
96
+ supported_metrics:
97
+ - vendor:
98
+ domain: "attentionvendor.example"
99
+ metric_id: "attention_score"
100
+ supported_targets:
101
+ - threshold_rate
102
+ - product_id: "display_vendor_metric_unreportable"
103
+ delivery_type: "non_guaranteed"
104
+ channels: ["display"]
105
+ format_ids:
106
+ - id: "display_300x250"
107
+ reporting_capabilities:
108
+ available_metrics:
109
+ - impressions
110
+ - clicks
111
+ - spend
112
+ vendor_metric_optimization:
113
+ supported_metrics:
114
+ - vendor:
115
+ domain: "attentionvendor.example"
116
+ metric_id: "attention_score"
117
+ supported_targets:
118
+ - threshold_rate
119
+ pricing_options:
120
+ - product_id: "display_vendor_metric_opt"
121
+ pricing_option_id: "cpm_vendor_opt"
122
+ pricing_model: "cpm"
123
+ currency: "USD"
124
+ fixed_price: 14.0
125
+ - product_id: "display_vendor_metric_unreportable"
126
+ pricing_option_id: "cpm_vendor_opt_unreportable"
127
+ pricing_model: "cpm"
128
+ currency: "USD"
129
+ fixed_price: 14.0
130
+
131
+ phases:
132
+ - id: discover_vendor_metric_optimization
133
+ title: "Discover a product that declares vendor_metric_optimization"
134
+ narrative: |
135
+ The buyer looks for display inventory that can steer delivery toward an
136
+ attention vendor's metric. The product response includes
137
+ vendor_metric_optimization.supported_metrics[] listing the
138
+ attentionvendor.example attention_score with threshold_rate as a supported
139
+ target kind.
140
+ steps:
141
+ - id: sync_accounts
142
+ title: "Establish account"
143
+ task: sync_accounts
144
+ schema_ref: "account/sync-accounts-request.json"
145
+ response_schema_ref: "account/sync-accounts-response.json"
146
+ doc_ref: "/accounts/tasks/sync_accounts"
147
+ stateful: true
148
+ expected: |
149
+ Return the account with account_id and status active.
150
+ sample_request:
151
+ accounts:
152
+ - brand:
153
+ domain: "acmeoutdoor.example"
154
+ operator: "pinnacle-agency.example"
155
+ billing: "operator"
156
+ payment_terms: "net_30"
157
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_setup_sync_accounts"
158
+ validations:
159
+ - check: response_schema
160
+ description: "Response matches sync-accounts-response.json schema"
161
+ - check: field_present
162
+ path: "accounts[0].account_id"
163
+ description: "Account has a platform-assigned ID"
164
+
165
+ - id: get_products_vendor_metric_opt
166
+ title: "Discover product with vendor_metric_optimization capability"
167
+ task: get_products
168
+ schema_ref: "media-buy/get-products-request.json"
169
+ response_schema_ref: "media-buy/get-products-response.json"
170
+ doc_ref: "/media-buy/task-reference/get_products"
171
+ comply_scenario: full_sales_flow
172
+ stateful: false
173
+ expected: |
174
+ Return at least one product whose vendor_metric_optimization.supported_metrics[]
175
+ includes an entry for attentionvendor.example / attention_score. The
176
+ supported_targets on that entry includes threshold_rate.
177
+ sample_request:
178
+ buying_mode: "brief"
179
+ brief: "Display inventory with attention-score optimization from attentionvendor."
180
+ filters:
181
+ channels: ["display"]
182
+ account:
183
+ brand:
184
+ domain: "acmeoutdoor.example"
185
+ operator: "pinnacle-agency.example"
186
+ context_outputs:
187
+ - path: "products[0].product_id"
188
+ name: "product_id"
189
+ - path: "products[0].pricing_options[0].pricing_option_id"
190
+ name: "pricing_option_id"
191
+ validations:
192
+ - check: response_schema
193
+ description: "Response matches get-products-response.json schema"
194
+ - check: field_present
195
+ path: "products[0].product_id"
196
+ description: "At least one product returned"
197
+ - check: field_present
198
+ path: "products[0].vendor_metric_optimization.supported_metrics"
199
+ description: "Product declares vendor_metric_optimization.supported_metrics[]"
200
+ - check: field_value
201
+ path: "products[0].vendor_metric_optimization.supported_metrics[0].vendor.domain"
202
+ value: "attentionvendor.example"
203
+ description: "Capability binds the optimization metric to the declared vendor"
204
+ - check: field_value
205
+ path: "products[0].vendor_metric_optimization.supported_metrics[0].metric_id"
206
+ value: "attention_score"
207
+ description: "Capability lists the attention_score metric_id"
208
+ - check: field_value
209
+ path: "products[0].vendor_metric_optimization.supported_metrics[0].supported_targets[0]"
210
+ value: "threshold_rate"
211
+ description: "Capability lists threshold_rate as a supported target kind"
212
+
213
+ - id: create_positive_path
214
+ title: "Accept vendor_metric goal when all preconditions are satisfied"
215
+ narrative: |
216
+ The buyer submits a create_media_buy with an optimization_goal of kind
217
+ vendor_metric, targeting attention_score with a threshold_rate of 70. The
218
+ package also includes a vendor-scope committed_metrics[] entry for the same
219
+ (vendor, metric_id) pair — satisfying the reporting-coherence precondition.
220
+ The seller accepts and returns a media_buy_id.
221
+ steps:
222
+ - id: create_media_buy_positive
223
+ title: "Create media buy with valid vendor_metric optimization goal"
224
+ task: create_media_buy
225
+ schema_ref: "media-buy/create-media-buy-request.json"
226
+ response_schema_ref: "media-buy/create-media-buy-response.json"
227
+ doc_ref: "/media-buy/task-reference/create_media_buy"
228
+ comply_scenario: create_media_buy
229
+ auth:
230
+ type: api_key
231
+ from_test_kit: true
232
+ stateful: true
233
+ expected: |
234
+ Accept the buy. The optimization goal is valid: attention_score is in
235
+ supported_metrics for attentionvendor.example, threshold_rate is in
236
+ supported_targets, and committed_metrics[] carries the vendor-scope entry.
237
+ Seller returns a media_buy_id.
238
+ sample_request:
239
+ brand:
240
+ domain: "acmeoutdoor.example"
241
+ account:
242
+ brand:
243
+ domain: "acmeoutdoor.example"
244
+ operator: "pinnacle-agency.example"
245
+ start_time: "2026-06-01T00:00:00Z"
246
+ end_time: "2026-06-30T23:59:59Z"
247
+ packages:
248
+ - product_id: "$context.product_id"
249
+ pricing_option_id: "$context.pricing_option_id"
250
+ budget: 5000
251
+ optimization_goals:
252
+ - kind: "vendor_metric"
253
+ vendor:
254
+ domain: "attentionvendor.example"
255
+ metric_id: "attention_score"
256
+ target:
257
+ kind: "threshold_rate"
258
+ value: 70
259
+ priority: 1
260
+ committed_metrics:
261
+ - scope: "vendor"
262
+ vendor:
263
+ domain: "attentionvendor.example"
264
+ metric_id: "attention_score"
265
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_positive"
266
+ context_outputs:
267
+ - path: "media_buy_id"
268
+ name: "media_buy_id"
269
+ validations:
270
+ - check: response_schema
271
+ description: "Response matches create-media-buy-response.json schema"
272
+ - check: field_present
273
+ path: "media_buy_id"
274
+ description: "Seller returns a media_buy_id — buy accepted"
275
+
276
+ - id: create_targetless_positive_path
277
+ title: "Accept target-less vendor_metric goal as maximize-within-budget"
278
+ narrative: |
279
+ A buyer may omit target on a vendor_metric optimization goal. In that
280
+ form, the seller maximizes the vendor metric within the package budget.
281
+ The capability precondition still applies to the (vendor, metric_id)
282
+ pair, and reporting coherence still requires a matching vendor-scope
283
+ committed_metrics[] entry.
284
+ steps:
285
+ - id: create_media_buy_targetless_positive
286
+ title: "Create media buy with target-less vendor_metric optimization goal"
287
+ task: create_media_buy
288
+ schema_ref: "media-buy/create-media-buy-request.json"
289
+ response_schema_ref: "media-buy/create-media-buy-response.json"
290
+ doc_ref: "/media-buy/task-reference/create_media_buy"
291
+ comply_scenario: create_media_buy
292
+ auth:
293
+ type: api_key
294
+ from_test_kit: true
295
+ stateful: true
296
+ expected: |
297
+ Accept the buy. The optimization goal has no target, so supported_targets
298
+ does not need to be consulted; attention_score is in supported_metrics
299
+ and committed_metrics[] carries the vendor-scope entry.
300
+ sample_request:
301
+ brand:
302
+ domain: "acmeoutdoor.example"
303
+ account:
304
+ brand:
305
+ domain: "acmeoutdoor.example"
306
+ operator: "pinnacle-agency.example"
307
+ start_time: "2026-06-01T00:00:00Z"
308
+ end_time: "2026-06-30T23:59:59Z"
309
+ packages:
310
+ - product_id: "$context.product_id"
311
+ pricing_option_id: "$context.pricing_option_id"
312
+ budget: 5000
313
+ optimization_goals:
314
+ - kind: "vendor_metric"
315
+ vendor:
316
+ domain: "attentionvendor.example"
317
+ metric_id: "attention_score"
318
+ priority: 1
319
+ committed_metrics:
320
+ - scope: "vendor"
321
+ vendor:
322
+ domain: "attentionvendor.example"
323
+ metric_id: "attention_score"
324
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_targetless_positive"
325
+ validations:
326
+ - check: response_schema
327
+ description: "Response matches create-media-buy-response.json schema"
328
+ - check: field_present
329
+ path: "media_buy_id"
330
+ description: "Seller returns a media_buy_id — target-less goal accepted"
331
+
332
+ - id: reject_unsupported_capability
333
+ title: "Reject vendor_metric goal when (vendor, metric_id) not in supported_metrics"
334
+ narrative: |
335
+ The buyer sends a goal for attention_units from attentionvendor.example —
336
+ a reportable (vendor, metric_id) pair that does not appear in the product's
337
+ vendor_metric_optimization.supported_metrics[]. Per the spec, the seller
338
+ MUST reject such goals. The correct code is TERMS_REJECTED; error.field
339
+ should point at the offending goal's metric_id path.
340
+ steps:
341
+ - id: create_media_buy_unsupported_metric
342
+ title: "Submit goal with (vendor, metric_id) not in supported_metrics"
343
+ task: create_media_buy
344
+ schema_ref: "media-buy/create-media-buy-request.json"
345
+ response_schema_ref: "media-buy/create-media-buy-response.json"
346
+ doc_ref: "/media-buy/task-reference/create_media_buy"
347
+ comply_scenario: create_media_buy
348
+ expect_error: true
349
+ negative_path: payload_well_formed
350
+ auth:
351
+ type: api_key
352
+ from_test_kit: true
353
+ stateful: false
354
+ expected: |
355
+ Reject with TERMS_REJECTED. The goal references attention_units for
356
+ attentionvendor.example, which is reportable but not in
357
+ vendor_metric_optimization.supported_metrics — the optimization
358
+ capability precondition fails. media_buy_id is not allocated.
359
+ sample_request:
360
+ brand:
361
+ domain: "acmeoutdoor.example"
362
+ account:
363
+ brand:
364
+ domain: "acmeoutdoor.example"
365
+ operator: "pinnacle-agency.example"
366
+ start_time: "2026-06-01T00:00:00Z"
367
+ end_time: "2026-06-30T23:59:59Z"
368
+ packages:
369
+ - product_id: "$context.product_id"
370
+ pricing_option_id: "$context.pricing_option_id"
371
+ budget: 5000
372
+ optimization_goals:
373
+ - kind: "vendor_metric"
374
+ vendor:
375
+ domain: "attentionvendor.example"
376
+ metric_id: "attention_units"
377
+ priority: 1
378
+ committed_metrics:
379
+ - scope: "vendor"
380
+ vendor:
381
+ domain: "attentionvendor.example"
382
+ metric_id: "attention_units"
383
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_bad_capability"
384
+ validations:
385
+ - check: error_code
386
+ allowed_values: ["TERMS_REJECTED"]
387
+ description: "Seller rejects unsupported (vendor, metric_id) with TERMS_REJECTED"
388
+ - check: field_value
389
+ path: "errors[0].field"
390
+ value: "packages[0].optimization_goals[0].metric_id"
391
+ description: "Error.field points at the offending metric_id path"
392
+
393
+ - id: reject_unsupported_target_kind
394
+ title: "Reject vendor_metric goal when target.kind is not in supported_targets"
395
+ narrative: |
396
+ The buyer sends a goal for attention_score (a supported vendor metric)
397
+ but asks for cost_per when the product only declares threshold_rate in
398
+ vendor_metric_optimization.supported_metrics[].supported_targets. Per the
399
+ spec, the seller MUST reject such goals with TERMS_REJECTED and point at
400
+ the unsupported target kind.
401
+ steps:
402
+ - id: create_media_buy_unsupported_target
403
+ title: "Submit goal with target.kind not in supported_targets"
404
+ task: create_media_buy
405
+ schema_ref: "media-buy/create-media-buy-request.json"
406
+ response_schema_ref: "media-buy/create-media-buy-response.json"
407
+ doc_ref: "/media-buy/task-reference/create_media_buy"
408
+ comply_scenario: create_media_buy
409
+ expect_error: true
410
+ negative_path: payload_well_formed
411
+ auth:
412
+ type: api_key
413
+ from_test_kit: true
414
+ stateful: false
415
+ expected: |
416
+ Reject with TERMS_REJECTED. The goal references a supported vendor
417
+ metric, but target.kind cost_per is not declared in supported_targets.
418
+ media_buy_id is not allocated.
419
+ sample_request:
420
+ brand:
421
+ domain: "acmeoutdoor.example"
422
+ account:
423
+ brand:
424
+ domain: "acmeoutdoor.example"
425
+ operator: "pinnacle-agency.example"
426
+ start_time: "2026-06-01T00:00:00Z"
427
+ end_time: "2026-06-30T23:59:59Z"
428
+ packages:
429
+ - product_id: "$context.product_id"
430
+ pricing_option_id: "$context.pricing_option_id"
431
+ budget: 5000
432
+ optimization_goals:
433
+ - kind: "vendor_metric"
434
+ vendor:
435
+ domain: "attentionvendor.example"
436
+ metric_id: "attention_score"
437
+ target:
438
+ kind: "cost_per"
439
+ value: 0.20
440
+ priority: 1
441
+ committed_metrics:
442
+ - scope: "vendor"
443
+ vendor:
444
+ domain: "attentionvendor.example"
445
+ metric_id: "attention_score"
446
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_bad_target"
447
+ validations:
448
+ - check: error_code
449
+ allowed_values: ["TERMS_REJECTED"]
450
+ description: "Seller rejects unsupported target.kind with TERMS_REJECTED"
451
+ - check: field_value
452
+ path: "errors[0].field"
453
+ value: "packages[0].optimization_goals[0].target.kind"
454
+ description: "Error.field points at the offending target.kind path"
455
+
456
+ - id: reject_missing_committed_metric
457
+ title: "Reject vendor_metric goal when package lacks vendor-scope committed_metrics entry"
458
+ narrative: |
459
+ The buyer submits a goal for attention_score (a valid capability on the
460
+ product) but omits the vendor-scope committed_metrics[] entry from the
461
+ package. Per the spec, optimization without committed reporting is
462
+ unverifiable and MUST be rejected with TERMS_REJECTED.
463
+ steps:
464
+ - id: create_media_buy_missing_committed
465
+ title: "Submit goal without matching vendor-scope committed_metrics entry"
466
+ task: create_media_buy
467
+ schema_ref: "media-buy/create-media-buy-request.json"
468
+ response_schema_ref: "media-buy/create-media-buy-response.json"
469
+ doc_ref: "/media-buy/task-reference/create_media_buy"
470
+ comply_scenario: create_media_buy
471
+ expect_error: true
472
+ negative_path: payload_well_formed
473
+ auth:
474
+ type: api_key
475
+ from_test_kit: true
476
+ stateful: false
477
+ expected: |
478
+ Reject with TERMS_REJECTED. The optimization goal targets attention_score
479
+ but the package's committed_metrics[] has no vendor-scope entry for
480
+ (attentionvendor.example, attention_score). Optimizing for a metric the
481
+ seller will not commit to reporting is disallowed. media_buy_id is not allocated.
482
+ sample_request:
483
+ brand:
484
+ domain: "acmeoutdoor.example"
485
+ account:
486
+ brand:
487
+ domain: "acmeoutdoor.example"
488
+ operator: "pinnacle-agency.example"
489
+ start_time: "2026-06-01T00:00:00Z"
490
+ end_time: "2026-06-30T23:59:59Z"
491
+ packages:
492
+ - product_id: "$context.product_id"
493
+ pricing_option_id: "$context.pricing_option_id"
494
+ budget: 5000
495
+ optimization_goals:
496
+ - kind: "vendor_metric"
497
+ vendor:
498
+ domain: "attentionvendor.example"
499
+ metric_id: "attention_score"
500
+ target:
501
+ kind: "threshold_rate"
502
+ value: 70
503
+ priority: 1
504
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_no_committed"
505
+ validations:
506
+ - check: error_code
507
+ allowed_values: ["TERMS_REJECTED"]
508
+ description: "Seller rejects goal missing reporting-coherence with TERMS_REJECTED"
509
+ - check: field_value
510
+ path: "errors[0].field"
511
+ value: "packages[0].committed_metrics"
512
+ description: "Error.field points at the missing committed_metrics pairing"
513
+
514
+ - id: reject_unreportable_vendor_metric
515
+ title: "Reject vendor_metric goal when optimizable metric is not reportable"
516
+ narrative: |
517
+ The buyer submits a goal for attention_score on a product whose bidding
518
+ stack can optimize to that metric but whose reporting_capabilities do not
519
+ declare the same vendor metric. The seller MUST reject because the
520
+ committed_metrics[] entry would over-promise a metric the product does not
521
+ publish as reportable.
522
+ steps:
523
+ - id: create_media_buy_unreportable_metric
524
+ title: "Submit goal whose committed vendor metric is not reportable"
525
+ task: create_media_buy
526
+ schema_ref: "media-buy/create-media-buy-request.json"
527
+ response_schema_ref: "media-buy/create-media-buy-response.json"
528
+ doc_ref: "/media-buy/task-reference/create_media_buy"
529
+ comply_scenario: create_media_buy
530
+ expect_error: true
531
+ negative_path: payload_well_formed
532
+ auth:
533
+ type: api_key
534
+ from_test_kit: true
535
+ stateful: false
536
+ expected: |
537
+ Reject with TERMS_REJECTED. The product can optimize toward
538
+ attention_score, but reporting_capabilities.vendor_metrics does not
539
+ include the same (attentionvendor.example, attention_score) pair, so
540
+ the seller cannot honor the requested vendor-scope committed metric.
541
+ sample_request:
542
+ brand:
543
+ domain: "acmeoutdoor.example"
544
+ account:
545
+ brand:
546
+ domain: "acmeoutdoor.example"
547
+ operator: "pinnacle-agency.example"
548
+ start_time: "2026-06-01T00:00:00Z"
549
+ end_time: "2026-06-30T23:59:59Z"
550
+ packages:
551
+ - product_id: "display_vendor_metric_unreportable"
552
+ pricing_option_id: "cpm_vendor_opt_unreportable"
553
+ budget: 5000
554
+ optimization_goals:
555
+ - kind: "vendor_metric"
556
+ vendor:
557
+ domain: "attentionvendor.example"
558
+ metric_id: "attention_score"
559
+ target:
560
+ kind: "threshold_rate"
561
+ value: 70
562
+ priority: 1
563
+ committed_metrics:
564
+ - scope: "vendor"
565
+ vendor:
566
+ domain: "attentionvendor.example"
567
+ metric_id: "attention_score"
568
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_unreportable"
569
+ validations:
570
+ - check: error_code
571
+ allowed_values: ["TERMS_REJECTED"]
572
+ description: "Seller rejects unreportable committed vendor metric with TERMS_REJECTED"
573
+ - check: field_value
574
+ path: "errors[0].field"
575
+ value: "packages[0].committed_metrics"
576
+ description: "Error.field points at the unsupported committed metric"