@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,203 @@
1
+ id: media_buy_seller/measurement_terms_rejected
2
+ version: "1.0.0"
3
+ title: "Seller rejects unworkable measurement_terms"
4
+ category: media_buy_seller
5
+ summary: "Buyer proposes measurement_terms the seller will not accept; seller returns TERMS_REJECTED; buyer retries with seller-compatible terms."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+
11
+ narrative: |
12
+ measurement_terms negotiation is a round-trip. The buyer proposes a measurement vendor,
13
+ window, and variance tolerance on each package; the seller either accepts (returning
14
+ measurement_terms echoed in the response) or rejects with TERMS_REJECTED and a message
15
+ explaining what is unacceptable. The buyer mints a fresh idempotency_key and retries
16
+ create_media_buy with the adjusted payload — reusing the prior key against a different
17
+ body MUST be rejected with IDEMPOTENCY_CONFLICT per spec.
18
+
19
+ This scenario sends an intentionally aggressive first proposal (max_variance_percent: 0
20
+ with a window the seller does not guarantee), verifies the seller rejects with
21
+ TERMS_REJECTED, then retries with a relaxed proposal that falls inside the seller's
22
+ stated tolerance and expects a successful create_media_buy.
23
+
24
+ agent:
25
+ interaction_model: media_buy_seller
26
+ capabilities:
27
+ - sells_media
28
+ - measurement_terms
29
+ examples:
30
+ - "Broadcast sellers"
31
+ - "CTV sellers with C3/C7 guarantees"
32
+ - "Any seller that negotiates measurement terms"
33
+
34
+ caller:
35
+ role: buyer_agent
36
+ example: "Pinnacle Agency (buyer)"
37
+
38
+ prerequisites:
39
+ description: |
40
+ Seller supports measurement_terms on create_media_buy packages. Buyer knows the
41
+ seller's declared measurement capabilities from get_adcp_capabilities.
42
+ test_kit: "test-kits/acme-outdoor.yaml"
43
+
44
+ phases:
45
+ - id: discover_products
46
+ title: "Discover products"
47
+ steps:
48
+ - id: get_products_brief
49
+ title: "Find a product that supports measurement_terms"
50
+ task: get_products
51
+ schema_ref: "media-buy/get-products-request.json"
52
+ response_schema_ref: "media-buy/get-products-response.json"
53
+ doc_ref: "/media-buy/task-reference/get_products"
54
+ comply_scenario: full_sales_flow
55
+ stateful: false
56
+ expected: |
57
+ Return products with pricing_options. At least one product should advertise
58
+ measurement support in the response.
59
+ sample_request:
60
+ buying_mode: "brief"
61
+ brief: "Premium video inventory with measurement guarantees. Q3 flight, $50K."
62
+ filters:
63
+ is_fixed_price: true
64
+ account:
65
+ brand:
66
+ domain: "acmeoutdoor.example"
67
+ operator: "pinnacle-agency.example"
68
+ context_outputs:
69
+ - path: "products[0].product_id"
70
+ key: "product_id"
71
+ - path: "products[0].pricing_options[0].pricing_option_id"
72
+ key: "pricing_option_id"
73
+ validations:
74
+ - check: response_schema
75
+ description: "Response matches get-products-response.json schema"
76
+ - check: field_present
77
+ path: "products[0].product_id"
78
+ description: "At least one product returned"
79
+ - check: field_present
80
+ path: "products[0].pricing_options[0].fixed_price"
81
+ description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
82
+
83
+ - id: reject_terms
84
+ title: "Seller rejects unworkable terms"
85
+ narrative: |
86
+ The buyer proposes max_variance_percent: 0 — a tolerance almost no seller can
87
+ honor against third-party measurement. The seller must reject with TERMS_REJECTED
88
+ and indicate what would be acceptable.
89
+
90
+ steps:
91
+ - id: create_media_buy_aggressive_terms
92
+ title: "Propose aggressive measurement_terms"
93
+ task: create_media_buy
94
+ schema_ref: "media-buy/create-media-buy-request.json"
95
+ response_schema_ref: "media-buy/create-media-buy-response.json"
96
+ doc_ref: "/media-buy/task-reference/create_media_buy"
97
+ comply_scenario: create_media_buy
98
+ expect_error: true
99
+ negative_path: payload_well_formed
100
+ stateful: false
101
+ expected: |
102
+ Reject with:
103
+ - code: TERMS_REJECTED
104
+ - recovery: correctable
105
+ - message indicating which terms are unworkable (vendor, window, or variance)
106
+
107
+ sample_request:
108
+ brand:
109
+ domain: "acmeoutdoor.example"
110
+ account:
111
+ brand:
112
+ domain: "acmeoutdoor.example"
113
+ operator: "pinnacle-agency.example"
114
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_measurement_terms_rejected_reject_terms_create_media_buy_aggressive_terms"
115
+ start_time: "2026-07-01T00:00:00Z"
116
+ end_time: "2026-09-30T23:59:59Z"
117
+ packages:
118
+ - product_id: "$context.product_id"
119
+ budget: 25000
120
+ pricing_option_id: "$context.pricing_option_id"
121
+ measurement_terms:
122
+ billing_measurement:
123
+ vendor:
124
+ domain: "videoamp.example"
125
+ measurement_window: "c28"
126
+ max_variance_percent: 0
127
+ makegood_policy:
128
+ available_remedies: ["credit"]
129
+
130
+ context:
131
+ correlation_id: "measurement_terms_rejected--aggressive"
132
+ validations:
133
+ - check: error_code
134
+ value: "TERMS_REJECTED"
135
+ description: "Error code is TERMS_REJECTED"
136
+ - check: field_present
137
+ path: "context"
138
+ description: "Response echoes back the context object even on errors"
139
+ - check: field_value
140
+ path: "context.correlation_id"
141
+ value: "measurement_terms_rejected--aggressive"
142
+ description: "Context correlation_id returned unchanged"
143
+
144
+ - id: accept_terms
145
+ title: "Buyer retries with acceptable terms"
146
+ narrative: |
147
+ The buyer relaxes measurement_terms to match the seller's stated capability
148
+ (c7 window, 10% variance, makegood remedies) and retries. The seller accepts and
149
+ returns the confirmed terms echoed in the response.
150
+
151
+ steps:
152
+ - id: create_media_buy_relaxed_terms
153
+ title: "Propose seller-compatible measurement_terms"
154
+ task: create_media_buy
155
+ schema_ref: "media-buy/create-media-buy-request.json"
156
+ response_schema_ref: "media-buy/create-media-buy-response.json"
157
+ doc_ref: "/media-buy/task-reference/create_media_buy"
158
+ comply_scenario: create_media_buy
159
+ stateful: true
160
+ expected: |
161
+ The buy succeeds. The response echoes the accepted measurement_terms (possibly
162
+ normalized by the seller).
163
+
164
+ sample_request:
165
+ brand:
166
+ domain: "acmeoutdoor.example"
167
+ account:
168
+ brand:
169
+ domain: "acmeoutdoor.example"
170
+ operator: "pinnacle-agency.example"
171
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_measurement_terms_rejected_reject_terms_create_media_buy_aggressive_terms"
172
+ start_time: "2026-07-01T00:00:00Z"
173
+ end_time: "2026-09-30T23:59:59Z"
174
+ packages:
175
+ - product_id: "$context.product_id"
176
+ budget: 25000
177
+ pricing_option_id: "$context.pricing_option_id"
178
+ measurement_terms:
179
+ billing_measurement:
180
+ vendor:
181
+ domain: "videoamp.example"
182
+ measurement_window: "c7"
183
+ max_variance_percent: 10
184
+ makegood_policy:
185
+ available_remedies: ["additional_delivery", "credit"]
186
+
187
+ context:
188
+ correlation_id: "measurement_terms_rejected--relaxed"
189
+ validations:
190
+ - check: response_schema
191
+ description: "Response matches create-media-buy-response.json schema"
192
+ - check: field_present
193
+ path: "media_buy_id"
194
+ description: "Seller returns a media_buy_id after accepting terms"
195
+ - check: field_present
196
+ path: "context"
197
+ description: "Response echoes back the context object"
198
+ - check: field_value
199
+ path: "context.correlation_id"
200
+ value: "measurement_terms_rejected--relaxed"
201
+ description: "Context correlation_id returned unchanged"
202
+ reviewer_checks:
203
+ - "Reviewer MUST confirm the seller releases the idempotency claim after a TERMS_REJECTED response. Probe: send the aggressive-terms request (same key, step 1), then retry with the same key and corrected terms (this step) — the seller MUST return a fresh media_buy_id, not IDEMPOTENCY_CONFLICT. A seller that caches rejected requests would make this two-step retry pattern impossible. See security.mdx#idempotency rule 3 ('Only successful responses are cached')."
@@ -0,0 +1,113 @@
1
+ id: media_buy_seller/package_correlation_legacy_fallback
2
+ version: "1.0.0"
3
+ title: "Legacy package correlation fallback without product_id"
4
+ category: media_buy_seller
5
+ summary: "Models the mixed-seller compatibility path where a legacy package response omits product_id and buyers correlate by package context.buyer_ref."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_media_buys
9
+
10
+ narrative: |
11
+ Current sellers MUST echo package product_id for explicit create_media_buy
12
+ package requests. Legacy sellers may still return package objects without
13
+ product_id. Buyers and SDKs targeting mixed seller populations need an
14
+ executable compatibility vector for that legacy response shape: correlate the
15
+ seller-assigned package_id back to the requested line item through package
16
+ context, commonly context.buyer_ref.
17
+
18
+ This storyboard is a compatibility fixture, not the current seller
19
+ conformance path. The runner seeds a legacy-shaped media buy whose package
20
+ intentionally omits product_id, then verifies get_media_buys still surfaces
21
+ package-level context so a buyer can recover the mapping.
22
+
23
+ agent:
24
+ interaction_model: stateful_preloaded
25
+ capabilities:
26
+ - sells_media
27
+ examples:
28
+ - "Compatibility test harnesses validating buyer-side package correlation"
29
+
30
+ caller:
31
+ role: buyer_agent
32
+ example: "Pinnacle Agency (buyer)"
33
+
34
+ prerequisites:
35
+ description: |
36
+ The runner seeds a legacy-shaped media buy via seed_media_buy. Sellers or
37
+ SDK test harnesses that do not implement seed_media_buy grade this scenario
38
+ not_applicable rather than failing current seller conformance.
39
+ test_kit: "test-kits/acme-outdoor.yaml"
40
+ controller_seeding: true
41
+
42
+ fixtures:
43
+ media_buys:
44
+ - media_buy_id: "legacy_package_correlation_buy"
45
+ status: "active"
46
+ currency: "USD"
47
+ total_budget: 5000
48
+ confirmed_at: "2026-04-01T00:00:00Z"
49
+ revision: 1
50
+ context:
51
+ correlation_id: "legacy-package-correlation-media-buy"
52
+ packages:
53
+ - package_id: "pkg_legacy_context_only"
54
+ budget: 5000
55
+ currency: "USD"
56
+ context:
57
+ buyer_ref: "legacy-line-001"
58
+
59
+ phases:
60
+ - id: read_legacy_package
61
+ title: "Read a legacy package shape"
62
+ narrative: |
63
+ The buyer reads a seeded media buy whose package intentionally has no
64
+ product_id. The response must still include package context.buyer_ref,
65
+ giving the buyer a stable fallback mapping from package_id to the line
66
+ item it submitted.
67
+ steps:
68
+ - id: get_seeded_legacy_buy
69
+ title: "Get seeded legacy media buy"
70
+ task: get_media_buys
71
+ schema_ref: "media-buy/get-media-buys-request.json"
72
+ response_schema_ref: "media-buy/get-media-buys-response.json"
73
+ doc_ref: "/media-buy/task-reference/get_media_buys"
74
+ comply_scenario: package_correlation_legacy_fallback
75
+ stateful: true
76
+ expected: |
77
+ Return the seeded media buy with:
78
+ - media_buys[0].packages[0].package_id present
79
+ - media_buys[0].packages[0].product_id absent, modeling the legacy response
80
+ - media_buys[0].packages[0].context.buyer_ref preserved for fallback correlation
81
+
82
+ sample_request:
83
+ account:
84
+ brand:
85
+ domain: "acmeoutdoor.example"
86
+ operator: "pinnacle-agency.example"
87
+ media_buy_ids:
88
+ - "legacy_package_correlation_buy"
89
+ context:
90
+ correlation_id: "package_correlation_legacy_fallback--get_seeded_legacy_buy"
91
+
92
+ validations:
93
+ - check: response_schema
94
+ description: "Response matches get-media-buys-response.json schema"
95
+ - check: field_value
96
+ path: "media_buys[0].media_buy_id"
97
+ value: "legacy_package_correlation_buy"
98
+ description: "The seeded legacy media buy is returned"
99
+ - check: field_value
100
+ path: "media_buys[0].packages[0].package_id"
101
+ value: "pkg_legacy_context_only"
102
+ description: "Package has the seller-assigned package_id buyers must persist"
103
+ - check: field_absent
104
+ path: "media_buys[0].packages[0].product_id"
105
+ description: "Legacy-shaped package omits product_id; this scenario verifies fallback behavior, not current seller conformance"
106
+ - check: field_value
107
+ path: "media_buys[0].packages[0].context.buyer_ref"
108
+ value: "legacy-line-001"
109
+ description: "Package context preserves buyer_ref for buyer-side fallback correlation"
110
+ - check: field_value
111
+ path: "context.correlation_id"
112
+ value: "package_correlation_legacy_fallback--get_seeded_legacy_buy"
113
+ description: "Response context correlation_id returned unchanged"
@@ -0,0 +1,292 @@
1
+ id: media_buy_seller/pending_creatives_to_start
2
+ version: "1.0.0"
3
+ title: "Creative sync unblocks pending_creatives → pending_start"
4
+ category: media_buy_seller
5
+ summary: "Verifies that a media buy created without creatives sits in pending_creatives until sync_creatives completes, then transitions to pending_start."
6
+ track: media_buy
7
+
8
+ # This scenario requires an explicit auto-approval declaration. Sellers that
9
+ # declare `require_human`, or omit the field because approval behavior is
10
+ # legacy-unspecified, grade not_applicable rather than false-failing on a
11
+ # manual-review workflow.
12
+ requires_capability:
13
+ path: media_buy.creative_approval_mode
14
+ equals: auto_approve
15
+
16
+ required_tools:
17
+ - get_products
18
+ - create_media_buy
19
+ - sync_creatives
20
+ - get_media_buys
21
+
22
+ narrative: |
23
+ When a buyer creates a media buy without creative_assignments, the seller cannot start
24
+ delivery until creatives are supplied. The seller must report status: pending_creatives
25
+ and, after sync_creatives attaches the required assets, transition the buy to
26
+ pending_start (awaiting flight start) or active (if already in flight).
27
+
28
+ This scenario walks the transition end-to-end: create the buy, confirm pending_creatives,
29
+ sync a creative, and confirm the status advances to pending_start. The transition
30
+ proves that the creative pipeline and the buy state machine are wired together — a
31
+ common integration gap when creative and media buy systems live on different backends.
32
+ Sellers with manual creative review declare media_buy.creative_approval_mode:
33
+ require_human and skip this auto-approval-dependent scenario as not_applicable.
34
+
35
+ agent:
36
+ interaction_model: media_buy_seller
37
+ capabilities:
38
+ - sells_media
39
+ - accepts_creatives
40
+ examples:
41
+ - "Any seller that requires creatives before starting delivery"
42
+
43
+ caller:
44
+ role: buyer_agent
45
+ example: "Pinnacle Agency (buyer)"
46
+
47
+ prerequisites:
48
+ description: |
49
+ Seller supports create_media_buy without creative_assignments and honors the
50
+ pending_creatives → pending_start transition when creatives are synced.
51
+ test_kit: "test-kits/acme-outdoor.yaml"
52
+
53
+ phases:
54
+ - id: setup
55
+ title: "Discover products and formats"
56
+ steps:
57
+ - id: get_products_brief
58
+ title: "Discover a product"
59
+ task: get_products
60
+ schema_ref: "media-buy/get-products-request.json"
61
+ response_schema_ref: "media-buy/get-products-response.json"
62
+ doc_ref: "/media-buy/task-reference/get_products"
63
+ comply_scenario: full_sales_flow
64
+ stateful: false
65
+ expected: |
66
+ Return at least one product with format_ids and pricing options.
67
+ sample_request:
68
+ buying_mode: "brief"
69
+ brief: "Display inventory on outdoor lifestyle content. Q3 flight."
70
+ filters:
71
+ is_fixed_price: true
72
+ account:
73
+ brand:
74
+ domain: "acmeoutdoor.example"
75
+ operator: "pinnacle-agency.example"
76
+ context_outputs:
77
+ - path: "products[0].product_id"
78
+ key: "product_id"
79
+ - path: "products[0].pricing_options[0].pricing_option_id"
80
+ key: "pricing_option_id"
81
+ - path: "products[0].format_ids[0]"
82
+ key: "format_id"
83
+ validations:
84
+ - check: response_schema
85
+ description: "Response matches get-products-response.json schema"
86
+ - check: field_present
87
+ path: "products[0].format_ids[0].id"
88
+ description: "Product declares a format_id for creative sync"
89
+ - check: field_present
90
+ path: "products[0].pricing_options[0].fixed_price"
91
+ description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
92
+
93
+ - id: create_without_creatives
94
+ title: "Create media buy without creative_assignments"
95
+ narrative: |
96
+ The buyer intentionally omits creative_assignments. The seller must accept the
97
+ buy, persist it, and return status: pending_creatives with valid_actions
98
+ including sync_creatives.
99
+
100
+ steps:
101
+ - id: create_buy_no_creatives
102
+ title: "Create buy in pending_creatives"
103
+ task: create_media_buy
104
+ schema_ref: "media-buy/create-media-buy-request.json"
105
+ response_schema_ref: "media-buy/create-media-buy-response.json"
106
+ doc_ref: "/media-buy/task-reference/create_media_buy"
107
+ comply_scenario: create_media_buy
108
+ stateful: true
109
+ expected: |
110
+ Media buy created with:
111
+ - media_buy_id assigned
112
+ - status: pending_creatives
113
+ - valid_actions including sync_creatives
114
+
115
+ sample_request:
116
+ brand:
117
+ domain: "acmeoutdoor.example"
118
+ account:
119
+ brand:
120
+ domain: "acmeoutdoor.example"
121
+ operator: "pinnacle-agency.example"
122
+ idempotency_key: "$generate:uuid_v4#pending_creatives_to_start_create_buy_no_creatives"
123
+ start_time: "2026-08-01T00:00:00Z"
124
+ end_time: "2026-08-31T23:59:59Z"
125
+ packages:
126
+ - product_id: "$context.product_id"
127
+ budget: 10000
128
+ pricing_option_id: "$context.pricing_option_id"
129
+ context:
130
+ buyer_ref: "pending-creatives-line-001"
131
+
132
+ context:
133
+ correlation_id: "pending_creatives_to_start--create_buy_no_creatives"
134
+ context_outputs:
135
+ - path: "media_buy_id"
136
+ key: "media_buy_id"
137
+ - path: "packages[0].package_id"
138
+ key: "package_id"
139
+ validations:
140
+ - check: response_schema
141
+ description: "Response matches create-media-buy-response.json schema"
142
+ - check: field_present
143
+ path: "media_buy_id"
144
+ description: "Seller assigns a media_buy_id"
145
+ - check: field_value
146
+ path: "media_buy_status"
147
+ value: "pending_creatives"
148
+ description: "media_buy_status is pending_creatives because no creatives supplied"
149
+ - check: field_value_or_absent
150
+ path: "status"
151
+ value: "pending_creatives"
152
+ description: "Legacy status, when present alongside media_buy_status, MUST carry the same value (3.1 deprecation window — see #4908)"
153
+ - check: field_present
154
+ path: "context"
155
+ description: "Response echoes back the context object"
156
+ - check: field_value
157
+ path: "context.correlation_id"
158
+ value: "pending_creatives_to_start--create_buy_no_creatives"
159
+ description: "Context correlation_id returned unchanged"
160
+ - check: field_equals_context
161
+ path: "packages[0].product_id"
162
+ context_key: "product_id"
163
+ description: "Created package echoes the requested product_id for package-to-product correlation"
164
+ - check: field_value
165
+ path: "packages[0].context.buyer_ref"
166
+ value: "pending-creatives-line-001"
167
+ description: "Created package echoes package-level context for legacy package correlation"
168
+
169
+ - id: supply_creatives
170
+ title: "Supply creatives and assign to the package"
171
+ narrative: |
172
+ The buyer syncs a creative with the format the product requires, then updates the
173
+ media buy with creative_assignments so the seller can attach the asset to the
174
+ package and advance state.
175
+
176
+ steps:
177
+ - id: sync_creative
178
+ title: "Sync the creative asset"
179
+ task: sync_creatives
180
+ schema_ref: "creative/sync-creatives-request.json"
181
+ response_schema_ref: "creative/sync-creatives-response.json"
182
+ doc_ref: "/creative/task-reference/sync_creatives"
183
+ comply_scenario: creative_lifecycle
184
+ stateful: true
185
+ expected: |
186
+ The seller ingests the creative and returns status active (or approved).
187
+ sample_request:
188
+ account:
189
+ brand:
190
+ domain: "acmeoutdoor.example"
191
+ operator: "pinnacle-agency.example"
192
+ creatives:
193
+ - creative_id: "acme-outdoor-display-q3"
194
+ name: "Acme Outdoor Q3 display"
195
+ format_id: "$context.format_id"
196
+ assets:
197
+ image:
198
+ asset_type: "image"
199
+ url: "https://creative.acmeoutdoor.example/q3/display-300x250.jpg"
200
+ width: 300
201
+ height: 250
202
+ mime_type: "image/jpeg"
203
+
204
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_pending_creatives_to_start_supply_creatives_sync_creative"
205
+ context:
206
+ correlation_id: "pending_creatives_to_start--sync_creative"
207
+ validations:
208
+ - check: response_schema
209
+ description: "Response matches sync-creatives-response.json schema"
210
+
211
+ - id: assign_creative_to_package
212
+ title: "Assign the creative to the package"
213
+ task: update_media_buy
214
+ schema_ref: "media-buy/update-media-buy-request.json"
215
+ response_schema_ref: "media-buy/update-media-buy-response.json"
216
+ doc_ref: "/media-buy/task-reference/update_media_buy"
217
+ comply_scenario: media_buy_lifecycle
218
+ stateful: true
219
+ expected: |
220
+ The seller acknowledges the assignment and advances the buy state. The response
221
+ status should be pending_start (or active if the flight has started).
222
+
223
+ sample_request:
224
+ account:
225
+ brand:
226
+ domain: "acmeoutdoor.example"
227
+ operator: "pinnacle-agency.example"
228
+ media_buy_id: "$context.media_buy_id"
229
+ packages:
230
+ - package_id: "$context.package_id"
231
+ creative_assignments:
232
+ - creative_id: "acme-outdoor-display-q3"
233
+
234
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_pending_creatives_to_start_supply_creatives_assign_creative_to_package"
235
+ context:
236
+ correlation_id: "pending_creatives_to_start--assign_creative_to_package"
237
+ validations:
238
+ - check: response_schema
239
+ description: "Response matches update-media-buy-response.json schema"
240
+ - check: field_value
241
+ path: "media_buy_status"
242
+ allowed_values: ["pending_start", "active"]
243
+ description: "media_buy_status advances out of pending_creatives once creatives attached"
244
+ - check: field_value_or_absent
245
+ path: "status"
246
+ allowed_values: ["pending_start", "active"]
247
+ description: "Legacy status, when present alongside media_buy_status, MUST carry the same value (3.1 deprecation window — see #4908)"
248
+
249
+ - id: verify_transition
250
+ title: "Verify the status transition"
251
+ narrative: |
252
+ Independently of the update_media_buy response, call get_media_buys to confirm the
253
+ seller's stored state has advanced. This protects against sellers that return the
254
+ updated status in response but do not persist it.
255
+
256
+ steps:
257
+ - id: get_media_buy_after_sync
258
+ title: "Confirm pending_start after creative sync"
259
+ task: get_media_buys
260
+ schema_ref: "media-buy/get-media-buys-request.json"
261
+ response_schema_ref: "media-buy/get-media-buys-response.json"
262
+ doc_ref: "/media-buy/task-reference/get_media_buys"
263
+ comply_scenario: media_buy_lifecycle
264
+ stateful: true
265
+ expected: |
266
+ The media buy's persisted status is pending_start (or active). valid_actions
267
+ no longer includes sync_creatives as a required next step.
268
+ sample_request:
269
+ account:
270
+ brand:
271
+ domain: "acmeoutdoor.example"
272
+ operator: "pinnacle-agency.example"
273
+ media_buy_ids:
274
+ - "$context.media_buy_id"
275
+
276
+ context:
277
+ correlation_id: "pending_creatives_to_start--get_media_buy_after_sync"
278
+ validations:
279
+ - check: response_schema
280
+ description: "Response matches get-media-buys-response.json schema"
281
+ - check: field_value
282
+ path: "media_buys[0].status"
283
+ allowed_values: ["pending_start", "active"]
284
+ description: "Persisted status is past pending_creatives"
285
+ - check: field_equals_context
286
+ path: "media_buys[0].packages[0].product_id"
287
+ context_key: "product_id"
288
+ description: "Read package retains the product_id from the explicit create request"
289
+ - check: field_value
290
+ path: "media_buys[0].packages[0].context.buyer_ref"
291
+ value: "pending-creatives-line-001"
292
+ description: "Read package includes persisted package context for legacy package correlation"