@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,293 @@
1
+ id: media_buy_seller/vendor_metric_accountability
2
+ version: "1.0.0"
3
+ title: "End-to-end vendor-metric accountability: declaration → filter → emission"
4
+ category: media_buy_seller
5
+ summary: "Buyer discovers products that declare a vendor metric, creates a media buy, and verifies vendor-metric values appear in the delivery report."
6
+ track: reporting
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+ - get_media_buy_delivery
11
+ - comply_test_controller
12
+
13
+ narrative: |
14
+ Vendor-defined metrics (attention scores, emissions, panel demographics) must
15
+ flow through the full media buy lifecycle — declared at discovery, carried
16
+ through the buy, and emitted in delivery reporting. AdCP supports this in
17
+ three pieces:
18
+
19
+ 1. `reporting_capabilities.vendor_metrics` on the product — each entry is a
20
+ pointer `{ vendor, metric_id }` into the vendor's metric catalog (category,
21
+ methodology, and documentation live at the vendor's `brand.json`).
22
+
23
+ 2. `filters.required_vendor_metrics` on `get_products` — buyer declares which
24
+ vendor metric it needs. Sellers MUST silently exclude products that don't
25
+ match (filter-not-fail; do not return an error). At least one of `vendor`
26
+ or `metric_id` must be pinned per entry.
27
+
28
+ 3. `by_package[].vendor_metric_values` on `get_media_buy_delivery` — reported
29
+ values for each declared vendor metric. One row per `(vendor.domain,
30
+ vendor.brand_id, metric_id)` per reporting period. Sellers MUST
31
+ de-duplicate before emission.
32
+
33
+ This storyboard exercises that contract end to end. It uses
34
+ comply_test_controller to seed a product with vendor metrics declared and to
35
+ inject delivery data with vendor_metric_values, then asserts the schema-level
36
+ contract on the delivery response.
37
+
38
+ Item 3 of the originating issue (#3501) — whether vendor-metric emission
39
+ failures need a dedicated hint kind — is deferred to a follow-up adcp-client PR.
40
+
41
+ agent:
42
+ interaction_model: media_buy_seller
43
+ capabilities:
44
+ - sells_media
45
+ examples:
46
+ - "Any media buy seller that declares vendor_metrics on its products"
47
+
48
+ caller:
49
+ role: buyer_agent
50
+ example: "Pinnacle Agency (buyer)"
51
+
52
+ prerequisites:
53
+ description: |
54
+ The seller supports comply_test_controller and can seed products with
55
+ `reporting_capabilities.vendor_metrics`. The seeded product must appear in
56
+ `get_products` responses when filtered by the declared vendor.
57
+ test_kit: "test-kits/acme-outdoor.yaml"
58
+ controller_seeding: true
59
+
60
+ fixtures:
61
+ products:
62
+ - product_id: "display_premium_vendor_metrics"
63
+ delivery_type: "guaranteed"
64
+ channels: ["display"]
65
+ format_ids:
66
+ - id: "display_300x250"
67
+ reporting_capabilities:
68
+ available_metrics:
69
+ - impressions
70
+ - clicks
71
+ - spend
72
+ vendor_metrics:
73
+ - vendor:
74
+ domain: "attentionvendor.example"
75
+ metric_id: "attention_units"
76
+ pricing_options:
77
+ - product_id: "display_premium_vendor_metrics"
78
+ pricing_option_id: "cpm_standard_vendor"
79
+ pricing_model: "cpm"
80
+ currency: "USD"
81
+ fixed_price: 12.0
82
+
83
+ phases:
84
+ - id: discover_with_required_vendor_metrics
85
+ title: "Discover products that declare an attention vendor metric"
86
+ narrative: |
87
+ The buyer needs display inventory that declares attention measurement from
88
+ a specific vendor. They pass `required_vendor_metrics: [{ vendor: { domain:
89
+ "attentionvendor.example" } }]` in filters. The seller MUST silently exclude
90
+ products whose `reporting_capabilities.vendor_metrics` doesn't satisfy the
91
+ filter — same filter-not-fail convention as `required_metrics`.
92
+ steps:
93
+ - id: sync_accounts
94
+ title: "Establish account"
95
+ task: sync_accounts
96
+ schema_ref: "account/sync-accounts-request.json"
97
+ response_schema_ref: "account/sync-accounts-response.json"
98
+ doc_ref: "/accounts/tasks/sync_accounts"
99
+ stateful: true
100
+ expected: |
101
+ Return the account with account_id and status active.
102
+ sample_request:
103
+ accounts:
104
+ - brand:
105
+ domain: "acmeoutdoor.example"
106
+ operator: "pinnacle-agency.example"
107
+ billing: "operator"
108
+ payment_terms: "net_30"
109
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_accountability_setup_sync_accounts"
110
+ validations:
111
+ - check: response_schema
112
+ description: "Response matches sync-accounts-response.json schema"
113
+ - check: field_present
114
+ path: "accounts[0].account_id"
115
+ description: "Account has a platform-assigned ID"
116
+
117
+ - id: get_products_required_vendor_metrics
118
+ title: "Discover with required_vendor_metrics filter"
119
+ task: get_products
120
+ schema_ref: "media-buy/get-products-request.json"
121
+ response_schema_ref: "media-buy/get-products-response.json"
122
+ doc_ref: "/media-buy/task-reference/get_products"
123
+ comply_scenario: full_sales_flow
124
+ stateful: false
125
+ expected: |
126
+ Return only products whose reporting_capabilities.vendor_metrics
127
+ includes an entry for vendor domain "attentionvendor.example". Products
128
+ that don't declare this vendor are silently excluded — the seller does
129
+ NOT return an error for unmet vendor metric requirements.
130
+ sample_request:
131
+ buying_mode: "brief"
132
+ brief: "Display inventory with attention measurement from attentionvendor."
133
+ filters:
134
+ channels: ["display"]
135
+ is_fixed_price: true
136
+ required_vendor_metrics:
137
+ - vendor:
138
+ domain: "attentionvendor.example"
139
+ account:
140
+ brand:
141
+ domain: "acmeoutdoor.example"
142
+ operator: "pinnacle-agency.example"
143
+ context_outputs:
144
+ - path: "products[0].product_id"
145
+ key: "product_id"
146
+ - path: "products[0].pricing_options[0].pricing_option_id"
147
+ key: "pricing_option_id"
148
+ validations:
149
+ - check: response_schema
150
+ description: "Response matches get-products-response.json schema"
151
+ - check: field_present
152
+ path: "products[0].product_id"
153
+ description: "At least one product matched the required_vendor_metrics filter"
154
+ - check: field_present
155
+ path: "products[0].reporting_capabilities.vendor_metrics"
156
+ description: "Matched product declares vendor_metrics in reporting_capabilities"
157
+ - check: field_present
158
+ path: "products[0].reporting_capabilities.vendor_metrics[0].vendor.domain"
159
+ description: "Each declared vendor metric entry carries a vendor domain"
160
+ - check: field_present
161
+ path: "products[0].reporting_capabilities.vendor_metrics[0].metric_id"
162
+ description: "Each declared vendor metric entry carries a metric_id"
163
+ - check: field_present
164
+ path: "products[0].pricing_options[0].fixed_price"
165
+ description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
166
+
167
+ - id: create_media_buy
168
+ title: "Commit the media buy on the matched product"
169
+ narrative: |
170
+ The buyer commits a media buy on the vendor-metric-capable product. The
171
+ product's `vendor_metrics` declaration carries forward as the vendor
172
+ reporting contract for the resulting buy — no additional field is required
173
+ on `create_media_buy` itself.
174
+ steps:
175
+ - id: create_media_buy
176
+ title: "Create media buy"
177
+ task: create_media_buy
178
+ schema_ref: "media-buy/create-media-buy-request.json"
179
+ response_schema_ref: "media-buy/create-media-buy-response.json"
180
+ doc_ref: "/media-buy/task-reference/create_media_buy"
181
+ comply_scenario: create_media_buy
182
+ stateful: true
183
+ expected: |
184
+ The buy succeeds. The product's vendor_metrics declaration carries
185
+ forward as the vendor reporting contract — no additional field is
186
+ required on the buy itself.
187
+ sample_request:
188
+ brand:
189
+ domain: "acmeoutdoor.example"
190
+ account:
191
+ brand:
192
+ domain: "acmeoutdoor.example"
193
+ operator: "pinnacle-agency.example"
194
+ start_time: "2026-05-01T00:00:00Z"
195
+ end_time: "2026-05-31T23:59:59Z"
196
+ packages:
197
+ - product_id: "$context.product_id"
198
+ pricing_option_id: "$context.pricing_option_id"
199
+ budget: 12000
200
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_accountability_create"
201
+ context_outputs:
202
+ - path: "media_buy_id"
203
+ key: "media_buy_id"
204
+ validations:
205
+ - check: response_schema
206
+ description: "Response matches create-media-buy-response.json schema"
207
+ - check: field_present
208
+ path: "media_buy_id"
209
+ description: "Seller returns a media_buy_id"
210
+
211
+ - id: simulate_and_validate_vendor_metrics
212
+ title: "Simulate delivery with vendor-metric values and validate emission"
213
+ narrative: |
214
+ Inject simulated delivery via the test controller, including
215
+ vendor_metric_values, then call get_media_buy_delivery and check that
216
+ `by_package[].vendor_metric_values` carries the injected entries.
217
+
218
+ The semantic uniqueness key for each vendor metric row is
219
+ `(vendor.domain, vendor.brand_id, metric_id)`. Since brand_id is optional
220
+ in BrandRef, the operative key for single-brand vendors is
221
+ `(vendor.domain, metric_id)`. Sellers MUST NOT emit the same
222
+ `(vendor, metric_id)` pair twice in a single delivery report.
223
+ steps:
224
+ - id: simulate_delivery_with_vendor_metrics
225
+ title: "Inject simulated delivery with vendor_metric_values"
226
+ task: comply_test_controller
227
+ requires_tool: comply_test_controller
228
+ stateful: true
229
+ expected: |
230
+ The test controller acknowledges the simulated delivery data including
231
+ the vendor_metric_values.
232
+ sample_request:
233
+ account:
234
+ sandbox: true
235
+ scenario: "simulate_delivery"
236
+ params:
237
+ media_buy_id: "$context.media_buy_id"
238
+ impressions: 80000
239
+ reported_spend:
240
+ amount: 960.00
241
+ currency: "USD"
242
+ vendor_metric_values:
243
+ - vendor:
244
+ domain: "attentionvendor.example"
245
+ metric_id: "attention_units"
246
+ value: 4.2
247
+ unit: "score"
248
+ measurable_impressions: 72000
249
+ validations:
250
+ - check: field_value
251
+ path: "success"
252
+ allowed_values: [true]
253
+ description: "Delivery simulation succeeds"
254
+
255
+ - id: get_delivery_with_vendor_metrics
256
+ title: "Get delivery report and assert vendor_metric_values are present"
257
+ task: get_media_buy_delivery
258
+ schema_ref: "media-buy/get-media-buy-delivery-request.json"
259
+ response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
260
+ doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
261
+ comply_scenario: reporting_flow
262
+ stateful: true
263
+ expected: |
264
+ Return delivery metrics with vendor_metric_values populated in
265
+ by_package[0]. The entry must carry vendor.domain, metric_id, and
266
+ value matching the injected data. measurable_impressions is the
267
+ coverage denominator — buyers compute coverage rate as
268
+ measurable_impressions / impressions.
269
+ sample_request:
270
+ account:
271
+ brand:
272
+ domain: "acmeoutdoor.example"
273
+ operator: "pinnacle-agency.example"
274
+ media_buy_ids:
275
+ - "$context.media_buy_id"
276
+ validations:
277
+ - check: response_schema
278
+ description: "Response matches get-media-buy-delivery-response.json schema"
279
+ - check: field_present
280
+ path: "media_buy_deliveries[0].by_package[0].vendor_metric_values"
281
+ description: "by_package[0] includes vendor_metric_values — vendor metric emission contract honored"
282
+ - check: field_present
283
+ path: "media_buy_deliveries[0].by_package[0].vendor_metric_values[0].vendor.domain"
284
+ description: "Each vendor_metric_value entry carries a vendor domain"
285
+ - check: field_present
286
+ path: "media_buy_deliveries[0].by_package[0].vendor_metric_values[0].metric_id"
287
+ description: "Each vendor_metric_value entry carries a metric_id"
288
+ - check: field_present
289
+ path: "media_buy_deliveries[0].by_package[0].vendor_metric_values[0].value"
290
+ description: "Each vendor_metric_value entry carries a value"
291
+ - check: field_present
292
+ path: "media_buy_deliveries[0].by_package[0].vendor_metric_values[0].measurable_impressions"
293
+ description: "Coverage denominator is present — buyers can compute vendor measurement coverage rate"
@@ -0,0 +1,307 @@
1
+ id: media_buy_seller/vendor_metric_catalog_precondition
2
+ version: "1.0.0"
3
+ title: "Vendor-metric external catalog precondition"
4
+ category: media_buy_seller
5
+ summary: "Exercises the 3.1 SHOULD-window behavior for vendor_metric goals whose metric_id is absent from a seeded measurement.metrics[] catalog."
6
+ track: media_buy
7
+ introduced_in: "3.1"
8
+
9
+ # Gate: scenario runs only when the seller declares vendor-metric
10
+ # optimization support. Sellers that do not advertise this optional 3.1
11
+ # capability are not expected to handle vendor_metric optimization goals.
12
+ requires_capability:
13
+ path: media_buy.vendor_metric_optimization
14
+ present: true
15
+
16
+ required_tools:
17
+ - create_media_buy
18
+ - sync_accounts
19
+ - comply_test_controller
20
+
21
+ narrative: |
22
+ Vendor-metric optimization goals bind to a measurement vendor's
23
+ `measurement.metrics[]` catalog. In AdCP 3.1, sellers SHOULD verify that the
24
+ goal's `(vendor, metric_id)` is present in that vendor-published catalog, but
25
+ MAY accept catalog misses while measurement vendors finish publishing
26
+ conformant capability catalogs. The next minor tightens this discovery
27
+ precondition to MUST.
28
+
29
+ This storyboard seeds two facts that intentionally diverge. The seller product
30
+ can optimize and report `attention_catalog_probe`, satisfying the product
31
+ capability and reporting-coherence preconditions. The measurement vendor
32
+ catalog seeded for `attentionvendor.example` publishes only
33
+ `attention_catalog_baseline`, so `attention_catalog_probe` is a deterministic
34
+ external catalog miss. The storyboard captures the 3.1 compatibility window:
35
+ a seller may accept the request, or it may reject with `TERMS_REJECTED`. The
36
+ 3.2 storyboard cut should collapse this branch set to the reject path only.
37
+
38
+ agent:
39
+ interaction_model: media_buy_seller
40
+ capabilities:
41
+ - sells_media
42
+ - supports_vendor_metric_optimization
43
+ examples:
44
+ - "Premium publishers with attention measurement optimization"
45
+ - "Sellers integrating vendor-defined measurement into bidding"
46
+
47
+ caller:
48
+ role: buyer_agent
49
+ example: "Pinnacle Agency (buyer)"
50
+
51
+ prerequisites:
52
+ description: |
53
+ The runner seeds a product that can optimize and report the
54
+ attention_catalog_probe metric, with an attentionvendor.example
55
+ measurement.metrics[] fixture that deliberately omits that metric_id. The
56
+ request is therefore valid by product capability and reporting coherence,
57
+ but is a deterministic external catalog miss.
58
+ test_kit: "test-kits/acme-outdoor.yaml"
59
+ controller_seeding: true
60
+
61
+ fixtures:
62
+ products:
63
+ - product_id: "display_vendor_metric_catalog_precondition"
64
+ delivery_type: "non_guaranteed"
65
+ channels: ["display"]
66
+ format_ids:
67
+ - id: "display_300x250"
68
+ reporting_capabilities:
69
+ available_metrics:
70
+ - impressions
71
+ - clicks
72
+ - spend
73
+ vendor_metrics:
74
+ - vendor:
75
+ domain: "attentionvendor.example"
76
+ metric_id: "attention_catalog_probe"
77
+ vendor_metric_optimization:
78
+ supported_metrics:
79
+ - vendor:
80
+ domain: "attentionvendor.example"
81
+ metric_id: "attention_catalog_probe"
82
+ supported_targets:
83
+ - threshold_rate
84
+ pricing_options:
85
+ - product_id: "display_vendor_metric_catalog_precondition"
86
+ pricing_option_id: "cpm_vendor_metric_catalog_precondition"
87
+ pricing_model: "cpm"
88
+ currency: "USD"
89
+ fixed_price: 14.0
90
+
91
+ phases:
92
+ - id: account_setup
93
+ title: "Establish account"
94
+ narrative: |
95
+ The buyer provisions or resolves an account so subsequent media-buy
96
+ creation uses the same tenant scope as the seeded product.
97
+ steps:
98
+ - id: sync_accounts
99
+ title: "Establish buyer account"
100
+ task: sync_accounts
101
+ schema_ref: "account/sync-accounts-request.json"
102
+ response_schema_ref: "account/sync-accounts-response.json"
103
+ doc_ref: "/accounts/tasks/sync_accounts"
104
+ stateful: true
105
+ expected: |
106
+ Return the account with account_id and status active.
107
+ sample_request:
108
+ accounts:
109
+ - brand:
110
+ domain: "acmeoutdoor.example"
111
+ operator: "pinnacle-agency.example"
112
+ billing: "operator"
113
+ payment_terms: "net_30"
114
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_catalog_precondition_sync_accounts"
115
+ validations:
116
+ - check: response_schema
117
+ description: "Response matches sync-accounts-response.json schema"
118
+ - check: field_present
119
+ path: "accounts[0].account_id"
120
+ description: "Account has a platform-assigned ID"
121
+
122
+ - id: seed_measurement_catalog
123
+ title: "Seed the measurement vendor catalog"
124
+ narrative: |
125
+ The product fixture proves the seller-side vendor_metric capability and
126
+ reporting contract. This controller step separately seeds the external
127
+ measurement vendor catalog so the later create_media_buy request is a
128
+ deterministic catalog miss rather than merely catalog-unproven.
129
+
130
+ steps:
131
+ - id: seed_attention_vendor_catalog
132
+ title: "Seed attentionvendor.example without the requested metric"
133
+ task: comply_test_controller
134
+ requires_tool: comply_test_controller
135
+ stateful: true
136
+ expected: |
137
+ The controller stores attentionvendor.example's measurement.metrics[]
138
+ catalog for this compliance session.
139
+ sample_request:
140
+ account:
141
+ sandbox: true
142
+ brand:
143
+ domain: "acmeoutdoor.example"
144
+ scenario: "seed_measurement_catalog"
145
+ params:
146
+ vendor:
147
+ domain: "attentionvendor.example"
148
+ metrics:
149
+ - metric_id: "attention_catalog_baseline"
150
+ unit: "score"
151
+ description: "Baseline attention metric present in the seeded vendor catalog."
152
+ context:
153
+ correlation_id: "vendor_metric_catalog_precondition--seed_catalog"
154
+ validations:
155
+ - check: field_value
156
+ path: "success"
157
+ allowed_values: [true]
158
+ description: "Measurement catalog seeding succeeds"
159
+ - check: field_present
160
+ path: "context"
161
+ description: "Response echoes back the context object"
162
+ - check: field_value
163
+ path: "context.correlation_id"
164
+ value: "vendor_metric_catalog_precondition--seed_catalog"
165
+ description: "Context correlation_id returned unchanged"
166
+
167
+ - id: catalog_miss_accept_path
168
+ title: "3.1 catalog-miss metric — accept path"
169
+ narrative: |
170
+ The seller may accept the buy during the 3.1 SHOULD window even though
171
+ attention_catalog_probe is absent from the seeded vendor catalog.
172
+ optional: true
173
+ branch_set:
174
+ id: vendor_metric_catalog_miss_handled
175
+ semantics: any_of
176
+ steps:
177
+ - id: create_media_buy_catalog_miss_accept
178
+ title: "Accept vendor_metric with catalog miss during 3.1 SHOULD window"
179
+ task: create_media_buy
180
+ schema_ref: "media-buy/create-media-buy-request.json"
181
+ response_schema_ref: "media-buy/create-media-buy-response.json"
182
+ doc_ref: "/media-buy/task-reference/create_media_buy"
183
+ comply_scenario: create_media_buy
184
+ auth:
185
+ type: api_key
186
+ from_test_kit: true
187
+ stateful: false
188
+ contributes: true
189
+ expected: |
190
+ 3.1 compatibility behavior: accept the buy even though the metric is
191
+ absent from the seeded vendor measurement.metrics[] catalog.
192
+ sample_request:
193
+ brand:
194
+ domain: "acmeoutdoor.example"
195
+ account:
196
+ brand:
197
+ domain: "acmeoutdoor.example"
198
+ operator: "pinnacle-agency.example"
199
+ start_time: "2026-06-01T00:00:00Z"
200
+ end_time: "2026-06-30T23:59:59Z"
201
+ packages:
202
+ - product_id: "display_vendor_metric_catalog_precondition"
203
+ pricing_option_id: "cpm_vendor_metric_catalog_precondition"
204
+ budget: 5000
205
+ optimization_goals:
206
+ - kind: "vendor_metric"
207
+ vendor:
208
+ domain: "attentionvendor.example"
209
+ metric_id: "attention_catalog_probe"
210
+ target:
211
+ kind: "threshold_rate"
212
+ value: 70
213
+ priority: 1
214
+ committed_metrics:
215
+ - scope: "vendor"
216
+ vendor:
217
+ domain: "attentionvendor.example"
218
+ metric_id: "attention_catalog_probe"
219
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_catalog_precondition_accept"
220
+ validations:
221
+ - check: response_schema
222
+ description: "Response matches create-media-buy-response.json schema for the 3.1 catalog-miss accept branch"
223
+ - check: field_present
224
+ path: "media_buy_id"
225
+ description: "Seller returns a media_buy_id during the 3.1 catalog-miss SHOULD window"
226
+
227
+ - id: catalog_miss_reject_path
228
+ title: "3.1 catalog-miss metric — reject path"
229
+ narrative: |
230
+ The seller may also reject the same request in 3.1. This is the
231
+ recommended behavior ahead of the 3.2 MUST boundary.
232
+ optional: true
233
+ branch_set:
234
+ id: vendor_metric_catalog_miss_handled
235
+ semantics: any_of
236
+ steps:
237
+ - id: create_media_buy_catalog_miss_reject
238
+ title: "Reject vendor_metric with catalog miss using TERMS_REJECTED"
239
+ task: create_media_buy
240
+ schema_ref: "media-buy/create-media-buy-request.json"
241
+ response_schema_ref: "media-buy/create-media-buy-response.json"
242
+ doc_ref: "/media-buy/task-reference/create_media_buy"
243
+ comply_scenario: create_media_buy
244
+ expect_error: true
245
+ negative_path: payload_well_formed
246
+ auth:
247
+ type: api_key
248
+ from_test_kit: true
249
+ stateful: false
250
+ contributes: true
251
+ expected: |
252
+ Recommended 3.1 behavior and required 3.2 behavior: reject with
253
+ TERMS_REJECTED because the metric is absent from the vendor's seeded
254
+ measurement.metrics[] catalog.
255
+ sample_request:
256
+ brand:
257
+ domain: "acmeoutdoor.example"
258
+ account:
259
+ brand:
260
+ domain: "acmeoutdoor.example"
261
+ operator: "pinnacle-agency.example"
262
+ start_time: "2026-06-01T00:00:00Z"
263
+ end_time: "2026-06-30T23:59:59Z"
264
+ packages:
265
+ - product_id: "display_vendor_metric_catalog_precondition"
266
+ pricing_option_id: "cpm_vendor_metric_catalog_precondition"
267
+ budget: 5000
268
+ optimization_goals:
269
+ - kind: "vendor_metric"
270
+ vendor:
271
+ domain: "attentionvendor.example"
272
+ metric_id: "attention_catalog_probe"
273
+ target:
274
+ kind: "threshold_rate"
275
+ value: 70
276
+ priority: 1
277
+ committed_metrics:
278
+ - scope: "vendor"
279
+ vendor:
280
+ domain: "attentionvendor.example"
281
+ metric_id: "attention_catalog_probe"
282
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_catalog_precondition_reject"
283
+ validations:
284
+ - check: error_code
285
+ allowed_values: ["TERMS_REJECTED"]
286
+ description: "Seller may reject catalog-miss vendor metrics with TERMS_REJECTED in 3.1; catalog misses become required rejections at 3.2"
287
+
288
+ - id: catalog_miss_assertion
289
+ title: "Require catalog-miss metric handling"
290
+ narrative: |
291
+ Synthetic assertion over the accept and reject branches. In 3.1, either
292
+ compatibility acceptance or recommended TERMS_REJECTED rejection satisfies
293
+ the catalog-miss metric behavior. The 3.2 storyboard cut should collapse
294
+ this branch set to the reject branch only.
295
+ steps:
296
+ - id: assert_vendor_metric_catalog_miss_handled
297
+ title: "Require catalog-miss handling from either branch"
298
+ task: assert_contribution
299
+ comply_scenario: create_media_buy
300
+ stateful: false
301
+ expected: |
302
+ At least one of catalog_miss_accept_path or catalog_miss_reject_path
303
+ contributed vendor_metric_catalog_miss_handled.
304
+ validations:
305
+ - check: any_of
306
+ allowed_values: ["vendor_metric_catalog_miss_handled"]
307
+ description: "Agent must either accept the catalog-miss metric during the 3.1 SHOULD window or reject it with TERMS_REJECTED."