@adcp/sdk 7.10.2 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
  2. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  3. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
  4. package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
  5. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
  6. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
  7. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  8. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
  9. package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
  10. package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
  11. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  12. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
  13. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  14. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
  15. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  16. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  17. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  18. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  19. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
  20. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
  21. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
  22. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  23. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  24. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  25. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
  26. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
  27. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
  28. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  29. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
  30. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  31. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  32. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
  33. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  34. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  35. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  36. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  37. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  38. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  39. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  40. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
  41. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  42. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  43. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  44. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  45. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  46. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  47. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  48. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
  49. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  50. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  51. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  52. package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
  53. package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
  54. package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
  55. package/compliance/cache/3.1.0-rc.2/index.json +356 -0
  56. package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
  57. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  58. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
  59. package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
  60. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
  61. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
  62. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  63. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
  64. package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
  65. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
  66. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  67. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
  68. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  69. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
  70. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  71. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  72. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  73. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  74. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
  75. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
  76. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
  77. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  78. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  79. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  80. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
  81. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
  82. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
  83. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  84. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
  85. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  86. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  87. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
  88. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  89. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  90. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  91. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  92. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  93. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  94. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  95. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
  96. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  97. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  98. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  99. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  100. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  101. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  102. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  103. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  104. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  105. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  106. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  107. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
  108. package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
  109. package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
  110. package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
  111. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
  112. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
  113. package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
  114. package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
  115. package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
  116. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
  117. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
  118. package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
  119. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
  120. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
  121. package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
  122. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
  123. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
  124. package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
  125. package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
  126. package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
  127. package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
  128. package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
  129. package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
  130. package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
  131. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
  132. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
  133. package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
  134. package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
  135. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
  136. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
  137. package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
  138. package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
  139. package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
  140. package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
  141. package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
  142. package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
  143. package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
  144. package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
  145. package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
  146. package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
  147. package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
  148. package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
  149. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  150. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
  151. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  152. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  153. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  154. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  155. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  156. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  157. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  158. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  159. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  160. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
  161. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
  162. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
  163. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  164. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  165. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  166. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  167. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  168. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  169. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  170. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  171. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  172. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  173. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  174. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  175. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  176. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  177. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  178. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  179. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  180. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  181. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  182. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  183. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  184. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  185. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  186. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  187. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  188. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  189. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  190. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
  191. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  192. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  193. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  194. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  195. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  196. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  197. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  198. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  199. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  200. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  201. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  202. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  203. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
  204. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
  205. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  206. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  207. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  208. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  209. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  210. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  211. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  212. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  213. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  214. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  215. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  216. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  217. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  218. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  219. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  220. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  221. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  222. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  223. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  224. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  225. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  226. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  227. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  228. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  229. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  230. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  231. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  232. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  233. package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
  234. package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
  235. package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
  236. package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
  237. package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
  238. package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
  239. package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
  240. package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
  241. package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
  242. package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
  243. package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
  244. package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
  245. package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
  246. package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
  247. package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
  248. package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
  249. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
  250. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
  251. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
  252. package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
  253. package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
  254. package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
  255. package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
  256. package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
  257. package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
  258. package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
  259. package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
  260. package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
  261. package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
  262. package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
  263. package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
  264. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
  265. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
  266. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
  267. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
  268. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
  269. package/dist/lib/index.d.ts +1 -1
  270. package/dist/lib/index.d.ts.map +1 -1
  271. package/dist/lib/index.js +9 -5
  272. package/dist/lib/index.js.map +1 -1
  273. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  274. package/dist/lib/testing/storyboard/default-invariants.js +30 -1
  275. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  276. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  277. package/dist/lib/testing/storyboard/runner.js +84 -21
  278. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  279. package/dist/lib/testing/storyboard/types.d.ts +21 -0
  280. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  281. package/dist/lib/testing/storyboard/types.js.map +1 -1
  282. package/dist/lib/testing/types.d.ts +9 -0
  283. package/dist/lib/testing/types.d.ts.map +1 -1
  284. package/dist/lib/types/schemas.generated.d.ts +6707 -12040
  285. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  286. package/dist/lib/types/schemas.generated.js +1 -1
  287. package/dist/lib/types/schemas.generated.js.map +1 -1
  288. package/dist/lib/utils/signal-id-builders.d.ts +19 -0
  289. package/dist/lib/utils/signal-id-builders.d.ts.map +1 -1
  290. package/dist/lib/utils/signal-id-builders.js +30 -0
  291. package/dist/lib/utils/signal-id-builders.js.map +1 -1
  292. package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -1
  293. package/dist/lib/utils/tool-request-schemas.js +3 -0
  294. package/dist/lib/utils/tool-request-schemas.js.map +1 -1
  295. package/dist/lib/v2/projection/constants.d.ts +28 -0
  296. package/dist/lib/v2/projection/constants.d.ts.map +1 -0
  297. package/dist/lib/v2/projection/constants.js +31 -0
  298. package/dist/lib/v2/projection/constants.js.map +1 -0
  299. package/dist/lib/v2/projection/registry.d.ts.map +1 -1
  300. package/dist/lib/v2/projection/registry.js +9 -4
  301. package/dist/lib/v2/projection/registry.js.map +1 -1
  302. package/dist/lib/version.d.ts +3 -3
  303. package/dist/lib/version.js +3 -3
  304. package/package.json +1 -1
  305. package/skills/SHAPE-GOTCHAS.md +5 -0
@@ -0,0 +1,234 @@
1
+ id: media_buy_seller/create_media_buy_async
2
+ version: "1.0.0"
3
+ title: "Seller returns submitted task envelope when create_media_buy goes async"
4
+ category: media_buy_seller
5
+ summary: "Verifies the AdCP-payload wire shape of the submitted-arm response from create_media_buy: status='submitted', task_id present, no media_buy_id and no packages on the envelope."
6
+ track: media_buy
7
+ required_tools:
8
+ - create_media_buy
9
+ - comply_test_controller
10
+
11
+ narrative: |
12
+ When create_media_buy cannot confirm the buy synchronously — e.g., the seller is
13
+ routing the request through IO signing, batch processing, or any out-of-band human
14
+ workflow — the task layer carries the result, not the response. The seller emits the
15
+ submitted task envelope: status='submitted', task_id present, no media_buy_id, no
16
+ packages. The buyer then polls tasks/get with task_id (or waits for a webhook) until
17
+ the task completes and the media_buy_id arrives on the completion artifact.
18
+
19
+ This scenario anchors the AdCP-payload-level invariant for that envelope. Three things
20
+ matter and are easy to regress:
21
+
22
+ 1. status MUST be the literal string 'submitted' (not 'pending', not a MediaBuyStatus
23
+ value, not omitted)
24
+ 2. task_id MUST be present at the top of the payload, snake_case (A2A adapters MAY
25
+ surface it as taskId on the wire, but the payload field emitted by the agent is
26
+ task_id)
27
+ 3. media_buy_id and packages MUST NOT appear on the envelope — they land on the task's
28
+ completion artifact, not here. Sellers that return media_buy_id with status='submitted'
29
+ break the buyer's polling contract; buyers cannot tell whether the buy is queued or
30
+ confirmed.
31
+
32
+ Determinism. The submitted arm is implementation-dependent — most sellers route most
33
+ buys synchronously. To make this storyboard runnable across implementations, the test
34
+ harness uses comply_test_controller force_create_media_buy_arm to drive the next
35
+ create_media_buy call into the submitted arm. The directive is keyed to the caller's
36
+ authenticated sandbox account (account + principal pair); sellers that do not implement
37
+ the controller scenario return UNKNOWN_SCENARIO and the runner grades this storyboard
38
+ not_applicable rather than failed.
39
+
40
+ Round-trip integrity. The deterministic task_id is captured from the controller
41
+ response and reused as the expected task_id on the create_media_buy assertion, so the
42
+ storyboard catches sellers that fabricate a fresh task_id instead of honoring the
43
+ registered directive.
44
+
45
+ Out of scope (by design). Transport-level wire-shape assertions — A2A Task.state and
46
+ artifact.metadata.adcp_task_id placement, MCP structuredContent envelope details — are
47
+ runner-side concerns, not storyboard assertions. The runner exercises this scenario
48
+ against both transports and probes the transport envelope independently. See
49
+ adcp-client#904 for the runner-side probes; this storyboard provides the deterministic
50
+ driver.
51
+
52
+ The submitted → completed transition (forcing the task to resolve and asserting the
53
+ completion artifact carries media_buy_id) is deferred to a follow-up scenario. It needs
54
+ a force_task_completion controller scenario that does not exist yet.
55
+
56
+ agent:
57
+ interaction_model: media_buy_seller
58
+ capabilities:
59
+ - sells_media
60
+ - supports_test_controller
61
+ examples:
62
+ - "Sellers that route some create_media_buy calls through IO signing or batch processing"
63
+ - "Any seller exposing comply_test_controller in sandbox mode"
64
+
65
+ caller:
66
+ role: buyer_agent
67
+ example: "Pinnacle Agency (buyer)"
68
+
69
+ prerequisites:
70
+ description: |
71
+ Seller exposes comply_test_controller in sandbox mode and supports
72
+ force_create_media_buy_arm. The directive is keyed to the caller's
73
+ authenticated sandbox account; without controller support, the storyboard
74
+ grades not_applicable — sellers cannot be deterministically driven into
75
+ the submitted arm by buyer-initiated requests alone.
76
+ test_kit: "test-kits/acme-outdoor.yaml"
77
+ controller_seeding: true
78
+
79
+ fixtures:
80
+ products:
81
+ - product_id: "async_signed_io_q2"
82
+ delivery_type: "guaranteed"
83
+ channels: ["video"]
84
+ format_ids:
85
+ - id: "video_30s"
86
+ pricing_options:
87
+ - product_id: "async_signed_io_q2"
88
+ pricing_option_id: "cpm_guaranteed"
89
+ pricing_model: "cpm"
90
+ currency: "USD"
91
+ fixed_price: 18.0
92
+
93
+ phases:
94
+ - id: force_submitted_arm
95
+ title: "Drive next create_media_buy into submitted arm"
96
+ narrative: |
97
+ Tell the controller that the next create_media_buy call from the caller's
98
+ authenticated sandbox account should return the submitted task envelope.
99
+ The controller stores the directive against the (account, principal) pair
100
+ and consumes it on the next create_media_buy call. Sellers that do not
101
+ implement force_create_media_buy_arm return UNKNOWN_SCENARIO and the
102
+ runner grades this storyboard not_applicable.
103
+
104
+ steps:
105
+ - id: force_arm_submitted
106
+ title: "Force submitted arm on next create_media_buy"
107
+ requires_tool: comply_test_controller
108
+ narrative: |
109
+ Direct the controller to return the submitted envelope with a
110
+ deterministic task_id on the buyer's next create_media_buy call. The
111
+ message field is set to a representative IO-signing explanation so
112
+ buyers exercising prompt-injection sanitization on submitted.message
113
+ have a stable string to assert against.
114
+ task: comply_test_controller
115
+ comply_scenario: create_media_buy
116
+ stateful: true
117
+ context_outputs:
118
+ - name: forced_task_id
119
+ path: "forced.task_id"
120
+ expected: |
121
+ Return a successful directive:
122
+ - success: true
123
+ - forced.arm: submitted
124
+ - forced.task_id: deterministic task handle the next create_media_buy will return
125
+
126
+ sample_request:
127
+ account:
128
+ sandbox: true
129
+ scenario: "force_create_media_buy_arm"
130
+ params:
131
+ arm: "submitted"
132
+ task_id: "task_async_signed_io_q2"
133
+ message: "Awaiting IO signature from sales team; typical turnaround 2–4 hours"
134
+ context:
135
+ correlation_id: "create_media_buy_async--force_arm_submitted"
136
+ validations:
137
+ - check: field_value
138
+ path: "success"
139
+ allowed_values: [true]
140
+ description: "Controller accepts the directive"
141
+ - check: field_value
142
+ path: "forced.arm"
143
+ value: "submitted"
144
+ description: "Controller echoes the forced arm"
145
+ - check: field_present
146
+ path: "forced.task_id"
147
+ description: "Controller echoes the deterministic task_id"
148
+ - check: field_present
149
+ path: "context"
150
+ description: "Response echoes back the context object"
151
+ - check: field_value
152
+ path: "context.correlation_id"
153
+ value: "create_media_buy_async--force_arm_submitted"
154
+ description: "Context correlation_id returned unchanged"
155
+
156
+ - id: submitted_arm_response
157
+ title: "create_media_buy returns submitted task envelope"
158
+ narrative: |
159
+ The buyer makes a normal create_media_buy call. Because the controller
160
+ registered a directive against this sandbox account, the seller MUST emit
161
+ the submitted task envelope: status='submitted', task_id matching the
162
+ forced value, no media_buy_id, no packages.
163
+
164
+ The response_schema check carries the absence invariant — the submitted
165
+ arm in create-media-buy-response.json has not.anyOf clauses for both
166
+ media_buy_id and packages, so a seller that emits either under
167
+ status='submitted' fails schema validation. The explicit field_value
168
+ check on status pins the literal 'submitted' value, since a malformed
169
+ seller might omit the discriminator and still satisfy the parent oneOf
170
+ via the error or success branch. The task_id check uses the captured
171
+ $context.forced_task_id so the storyboard fails if the seller ignores
172
+ the registered directive and fabricates its own task_id.
173
+
174
+ steps:
175
+ - id: create_media_buy_submitted
176
+ title: "Call create_media_buy and observe the submitted envelope"
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
+ Return the submitted task envelope:
185
+ - status: 'submitted' (literal, not a MediaBuyStatus value)
186
+ - task_id: matches the value registered by force_create_media_buy_arm
187
+ - no media_buy_id (issued on task completion, not here)
188
+ - no packages (issued on task completion, not here)
189
+ - message (optional): seller's explanation of the wait
190
+
191
+ sample_request:
192
+ brand:
193
+ domain: "acmeoutdoor.example"
194
+ account:
195
+ brand:
196
+ domain: "acmeoutdoor.example"
197
+ operator: "pinnacle-agency.example"
198
+ sandbox: true
199
+ start_time: "2026-07-01T00:00:00Z"
200
+ end_time: "2026-09-30T23:59:59Z"
201
+ packages:
202
+ - product_id: "async_signed_io_q2"
203
+ budget: 30000
204
+ pricing_option_id: "cpm_guaranteed"
205
+ push_notification_config:
206
+ url: "https://buyer.example/webhooks/adcp"
207
+ authentication:
208
+ schemes:
209
+ - "HMAC-SHA256"
210
+ credentials: "media-buy-seller-webhook-secret-token"
211
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_create_media_buy_async_submitted_arm_response_create_media_buy_submitted"
212
+ context:
213
+ correlation_id: "create_media_buy_async--create_media_buy_submitted"
214
+ validations:
215
+ - check: response_schema
216
+ description: "Response matches create-media-buy-response.json — submitted-arm not.required clauses block media_buy_id and packages"
217
+ - check: field_value
218
+ path: "status"
219
+ value: "submitted"
220
+ description: "Status is the literal 'submitted' task-status value, not a MediaBuyStatus"
221
+ - check: field_present
222
+ path: "task_id"
223
+ description: "task_id is present at the top of the envelope (snake_case payload field, even when the A2A adapter surfaces it as taskId on the wire)"
224
+ - check: field_value
225
+ path: "task_id"
226
+ value: "$context.forced_task_id"
227
+ description: "task_id matches the captured value from the controller directive — sellers that fabricate a fresh task_id instead of honoring the registered one fail here"
228
+ - check: field_present
229
+ path: "context"
230
+ description: "Response echoes back the context object"
231
+ - check: field_value
232
+ path: "context.correlation_id"
233
+ value: "create_media_buy_async--create_media_buy_submitted"
234
+ description: "Context correlation_id returned unchanged"
@@ -0,0 +1,419 @@
1
+ id: media_buy_seller/creative_fate_after_cancellation
2
+ version: "1.0.0"
3
+ title: "Creative lifecycle is decoupled from media buy lifecycle"
4
+ category: media_buy_seller
5
+ summary: "Validates that canceling a media buy releases package-creative assignments but leaves the underlying creatives in the library with their review state intact, and that buyers can reuse released creatives on a new buy."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+ - update_media_buy
11
+ - sync_creatives
12
+ - list_creatives
13
+
14
+ narrative: |
15
+ Per the creative library model (docs/creative/creative-libraries#creative-state-and-assignment-state-are-separate)
16
+ and the Media Buy State Transitions rule, canceling or rejecting a media buy
17
+ releases its package-creative assignments but leaves the creatives themselves
18
+ in the library. The creatives remain reusable by `creative_id` in a subsequent
19
+ `create_media_buy` or `sync_creatives` call, and a seller MUST NOT implicitly
20
+ reject a creative because its containing buy was canceled — a creative
21
+ rejection MUST be a deliberate review decision with its own `rejection_reason`.
22
+
23
+ This scenario walks the whole flow end-to-end:
24
+
25
+ 1. Create a buy, sync a creative, assign it to a package (setup)
26
+ 2. Confirm the creative is in the library with a non-terminal review state (pre-cancel)
27
+ 3. Cancel the buy
28
+ 4. Confirm the creative is STILL in the library with its review state intact —
29
+ not archived, not auto-rejected as a side effect of the cancel
30
+ 5. Reuse the same `creative_id` on a new buy via `sync_creatives` assignment
31
+
32
+ A seller that evaporates library creatives on buy cancellation, or that flips
33
+ `status: rejected` on creatives whose only assignment was released by a cancel,
34
+ fails this scenario. A seller that correctly decouples the two lifecycles
35
+ passes.
36
+
37
+ agent:
38
+ interaction_model: media_buy_seller
39
+ capabilities:
40
+ - sells_media
41
+ examples:
42
+ - "Any media buy seller with a creative library"
43
+
44
+ caller:
45
+ role: buyer_agent
46
+ example: "Pinnacle Agency (buyer)"
47
+
48
+ prerequisites:
49
+ description: |
50
+ Seller supports create_media_buy, update_media_buy with cancellation, sync_creatives,
51
+ and list_creatives. Catalog-driven sellers and sellers without a creative library
52
+ grade this scenario not_applicable (creative lifecycle assumes a library surface).
53
+ test_kit: "test-kits/acme-outdoor.yaml"
54
+
55
+ phases:
56
+ - id: setup
57
+ title: "Create a buy and assign a creative"
58
+ narrative: |
59
+ Discover a product, create a media buy, sync one creative with an inline
60
+ assignment to the buy's first package. Capture the media_buy_id, package_id,
61
+ and creative_id for subsequent phases.
62
+
63
+ steps:
64
+ - id: get_products_brief
65
+ title: "Discover a product"
66
+ task: get_products
67
+ schema_ref: "media-buy/get-products-request.json"
68
+ response_schema_ref: "media-buy/get-products-response.json"
69
+ doc_ref: "/media-buy/task-reference/get_products"
70
+ comply_scenario: full_sales_flow
71
+ stateful: false
72
+ expected: |
73
+ Return at least one product with a pricing option and at least one format_id.
74
+ sample_request:
75
+ buying_mode: "brief"
76
+ brief: "Display inventory on outdoor lifestyle content for creative-reuse testing."
77
+ filters:
78
+ is_fixed_price: true
79
+ account:
80
+ brand:
81
+ domain: "acmeoutdoor.example"
82
+ operator: "pinnacle-agency.example"
83
+ context:
84
+ correlation_id: "creative_fate--get_products"
85
+ context_outputs:
86
+ - path: "products[0].product_id"
87
+ key: "product_id"
88
+ - path: "products[0].pricing_options[0].pricing_option_id"
89
+ key: "pricing_option_id"
90
+ - path: "products[0].format_ids[0].agent_url"
91
+ key: "format_agent_url"
92
+ - path: "products[0].format_ids[0].id"
93
+ key: "format_id"
94
+ validations:
95
+ - check: response_schema
96
+ description: "Response matches get-products-response.json schema"
97
+ - check: field_present
98
+ path: "products[0].format_ids[0].id"
99
+ description: "Product exposes at least one format_id for creative sync"
100
+ - check: field_present
101
+ path: "products[0].pricing_options[0].fixed_price"
102
+ description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
103
+
104
+ - id: create_buy
105
+ title: "Create the initial media buy"
106
+ task: create_media_buy
107
+ schema_ref: "media-buy/create-media-buy-request.json"
108
+ response_schema_ref: "media-buy/create-media-buy-response.json"
109
+ doc_ref: "/media-buy/task-reference/create_media_buy"
110
+ comply_scenario: create_media_buy
111
+ stateful: true
112
+ expected: |
113
+ Media buy created with media_buy_id and at least one package.
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#creative_fate_after_cancellation_create_buy"
123
+ start_time: "2026-09-01T00:00:00Z"
124
+ end_time: "2026-09-30T23:59:59Z"
125
+ packages:
126
+ - product_id: "$context.product_id"
127
+ budget: 5000
128
+ pricing_option_id: "$context.pricing_option_id"
129
+ context:
130
+ correlation_id: "creative_fate--create_buy"
131
+ context_outputs:
132
+ - path: "media_buy_id"
133
+ key: "media_buy_id"
134
+ - path: "packages[0].package_id"
135
+ key: "package_id"
136
+ validations:
137
+ - check: response_schema
138
+ description: "Response matches create-media-buy-response.json schema"
139
+ - check: field_present
140
+ path: "media_buy_id"
141
+ description: "Seller returns media_buy_id"
142
+ - check: field_present
143
+ path: "packages[0].package_id"
144
+ description: "Seller returns package_id for the newly created package"
145
+
146
+ - id: sync_creative_with_assignment
147
+ title: "Sync a creative and assign to the package"
148
+ narrative: |
149
+ Sync one creative into the library and assign it to the package in a single
150
+ sync_creatives call. The creative enters the library with the library's
151
+ review flow; the assignment binds it to the media buy's package.
152
+ task: sync_creatives
153
+ schema_ref: "creative/sync-creatives-request.json"
154
+ response_schema_ref: "creative/sync-creatives-response.json"
155
+ doc_ref: "/creative/task-reference/sync_creatives"
156
+ comply_scenario: creative_sync
157
+ stateful: true
158
+ expected: |
159
+ Creative accepted into the library (action: created), assignment acknowledged.
160
+ Creative status is one of: pending_review, approved, processing.
161
+
162
+ sample_request:
163
+ account:
164
+ brand:
165
+ domain: "acmeoutdoor.example"
166
+ operator: "pinnacle-agency.example"
167
+ creatives:
168
+ - creative_id: "acme_reuse_banner_001"
169
+ name: "Acme Outdoor reuse banner"
170
+ format_id:
171
+ agent_url: "$context.format_agent_url"
172
+ id: "$context.format_id"
173
+ assets:
174
+ image:
175
+ asset_type: "image"
176
+ url: "https://cdn.pinnacle-agency.example/acme-reuse-banner.png"
177
+ width: 300
178
+ height: 250
179
+ mime_type: "image/png"
180
+ assignments:
181
+ - creative_id: "acme_reuse_banner_001"
182
+ package_id: "$context.package_id"
183
+ idempotency_key: "$generate:uuid_v4#creative_fate_after_cancellation_sync_creative_with_assignment"
184
+ context:
185
+ correlation_id: "creative_fate--sync_creative_with_assignment"
186
+ context_outputs:
187
+ - path: "creatives[0].creative_id"
188
+ key: "creative_id"
189
+ validations:
190
+ - check: response_schema
191
+ description: "Response matches sync-creatives-response.json schema"
192
+ - check: field_present
193
+ path: "creatives[0].creative_id"
194
+ description: "Response echoes back the buyer-supplied creative_id"
195
+
196
+ - id: verify_creative_in_library_pre_cancel
197
+ title: "Baseline: creative is in the library with a non-terminal review state"
198
+ narrative: |
199
+ Before canceling the buy, list the creative via list_creatives and record the
200
+ review state. The purpose of this phase is to establish the baseline the
201
+ post-cancel phase compares against: the creative exists and has a status
202
+ that is NOT `rejected` or `archived`.
203
+
204
+ steps:
205
+ - id: list_creatives_before_cancel
206
+ title: "Look up the creative in the library"
207
+ task: list_creatives
208
+ schema_ref: "creative/list-creatives-request.json"
209
+ response_schema_ref: "creative/list-creatives-response.json"
210
+ doc_ref: "/creative/task-reference/list_creatives"
211
+ comply_scenario: creative_library
212
+ stateful: true
213
+ expected: |
214
+ list_creatives returns the creative with a non-terminal review state
215
+ (processing, pending_review, or approved).
216
+
217
+ sample_request:
218
+ account:
219
+ brand:
220
+ domain: "acmeoutdoor.example"
221
+ operator: "pinnacle-agency.example"
222
+ filters:
223
+ creative_ids:
224
+ - "$context.creative_id"
225
+ context:
226
+ correlation_id: "creative_fate--list_creatives_before_cancel"
227
+ validations:
228
+ - check: response_schema
229
+ description: "Response matches list-creatives-response.json schema"
230
+ - check: field_present
231
+ path: "creatives[0].creative_id"
232
+ description: "Creative is present in the library"
233
+ - check: field_value
234
+ path: "creatives[0].status"
235
+ allowed_values: ["processing", "pending_review", "approved"]
236
+ description: "Creative status is non-terminal (not rejected or archived) before cancel"
237
+
238
+ - id: cancel_buy
239
+ title: "Cancel the media buy"
240
+ narrative: |
241
+ Cancel the media buy with `canceled: true`. The seller MUST transition the buy
242
+ to `canceled` and release the creative's package assignment per
243
+ docs/media-buy/specification#media-buy-state-transitions.
244
+
245
+ steps:
246
+ - id: update_media_buy_canceled
247
+ title: "update_media_buy with canceled: true"
248
+ task: update_media_buy
249
+ schema_ref: "media-buy/update-media-buy-request.json"
250
+ response_schema_ref: "media-buy/update-media-buy-response.json"
251
+ doc_ref: "/media-buy/task-reference/update_media_buy"
252
+ comply_scenario: media_buy_lifecycle
253
+ stateful: true
254
+ expected: |
255
+ Seller acknowledges the cancellation and transitions the buy to `canceled`.
256
+
257
+ sample_request:
258
+ account:
259
+ brand:
260
+ domain: "acmeoutdoor.example"
261
+ operator: "pinnacle-agency.example"
262
+ media_buy_id: "$context.media_buy_id"
263
+ canceled: true
264
+ cancellation_reason: "Creative-fate scenario: releasing assignment to verify library persistence."
265
+ idempotency_key: "$generate:uuid_v4#creative_fate_after_cancellation_update_media_buy_canceled"
266
+ context:
267
+ correlation_id: "creative_fate--update_media_buy_canceled"
268
+ validations:
269
+ - check: response_schema
270
+ description: "Response matches update-media-buy-response.json schema"
271
+
272
+ - id: verify_creative_persists_post_cancel
273
+ title: "Creative remains in the library with review state intact"
274
+ narrative: |
275
+ After the cancel, the creative's library entry MUST still exist and its review
276
+ state MUST NOT be `rejected` (which would indicate implicit-reject-on-cancel,
277
+ forbidden by the spec) and SHOULD NOT be `archived` (which would indicate the
278
+ seller evaporated library state on buy cancellation, inconsistent with the
279
+ decoupled-lifecycle contract). Allowed terminal-adjacent states are
280
+ `processing`, `pending_review`, `approved` — whatever the review flow produced.
281
+
282
+ steps:
283
+ - id: list_creatives_after_cancel
284
+ title: "Look up the creative again, post-cancel"
285
+ task: list_creatives
286
+ schema_ref: "creative/list-creatives-request.json"
287
+ response_schema_ref: "creative/list-creatives-response.json"
288
+ doc_ref: "/creative/task-reference/list_creatives"
289
+ comply_scenario: creative_library
290
+ stateful: true
291
+ expected: |
292
+ Creative still present with non-rejected, non-archived status. A seller
293
+ that returns an empty list, or that has flipped the creative to
294
+ `rejected` or `archived` as a side effect of the cancel, fails.
295
+
296
+ sample_request:
297
+ account:
298
+ brand:
299
+ domain: "acmeoutdoor.example"
300
+ operator: "pinnacle-agency.example"
301
+ filters:
302
+ creative_ids:
303
+ - "$context.creative_id"
304
+ context:
305
+ correlation_id: "creative_fate--list_creatives_after_cancel"
306
+ validations:
307
+ - check: response_schema
308
+ description: "Response matches list-creatives-response.json schema"
309
+ - check: field_present
310
+ path: "creatives[0].creative_id"
311
+ description: "Creative still in the library after buy cancellation"
312
+ - check: field_value
313
+ path: "creatives[0].creative_id"
314
+ value: "acme_reuse_banner_001"
315
+ description: "Creative ID is unchanged (not re-keyed on cancel)"
316
+ - check: field_value
317
+ path: "creatives[0].status"
318
+ allowed_values: ["processing", "pending_review", "approved"]
319
+ description: "Creative status is NOT rejected and NOT archived — no implicit review cascade from the buy cancel"
320
+
321
+ - id: reuse_creative_on_new_buy
322
+ title: "Reuse the released creative on a new media buy"
323
+ narrative: |
324
+ With the old buy canceled and the assignment released, the buyer creates a NEW
325
+ media buy and references the same creative_id in a fresh assignment. The seller
326
+ MUST accept the assignment — the creative_id resolves to the persisted library
327
+ entry, demonstrating end-to-end reusability.
328
+
329
+ steps:
330
+ - id: create_second_buy
331
+ title: "Create a second media buy"
332
+ task: create_media_buy
333
+ schema_ref: "media-buy/create-media-buy-request.json"
334
+ response_schema_ref: "media-buy/create-media-buy-response.json"
335
+ doc_ref: "/media-buy/task-reference/create_media_buy"
336
+ comply_scenario: create_media_buy
337
+ stateful: true
338
+ expected: |
339
+ Second media buy created successfully with a new media_buy_id and package_id.
340
+
341
+ sample_request:
342
+ brand:
343
+ domain: "acmeoutdoor.example"
344
+ account:
345
+ brand:
346
+ domain: "acmeoutdoor.example"
347
+ operator: "pinnacle-agency.example"
348
+ idempotency_key: "$generate:uuid_v4#creative_fate_after_cancellation_create_second_buy"
349
+ start_time: "2026-10-01T00:00:00Z"
350
+ end_time: "2026-10-31T23:59:59Z"
351
+ packages:
352
+ - product_id: "$context.product_id"
353
+ budget: 5000
354
+ pricing_option_id: "$context.pricing_option_id"
355
+ context:
356
+ correlation_id: "creative_fate--create_second_buy"
357
+ context_outputs:
358
+ - path: "media_buy_id"
359
+ key: "second_media_buy_id"
360
+ - path: "packages[0].package_id"
361
+ key: "second_package_id"
362
+ validations:
363
+ - check: response_schema
364
+ description: "Response matches create-media-buy-response.json schema"
365
+ - check: field_present
366
+ path: "media_buy_id"
367
+ description: "Second media_buy_id returned"
368
+ - check: field_present
369
+ path: "packages[0].package_id"
370
+ description: "Second package_id returned"
371
+
372
+ - id: reassign_creative
373
+ title: "Assign the original creative_id to the new package"
374
+ narrative: |
375
+ Reference the original creative by creative_id only (no assets, no re-upload)
376
+ and assign it to the new package. The seller resolves the creative_id from
377
+ the library; if the creative was evaporated on cancel, this call fails.
378
+ task: sync_creatives
379
+ schema_ref: "creative/sync-creatives-request.json"
380
+ response_schema_ref: "creative/sync-creatives-response.json"
381
+ doc_ref: "/creative/task-reference/sync_creatives"
382
+ comply_scenario: creative_sync
383
+ stateful: true
384
+ expected: |
385
+ Assignment accepted. No creative-not-found or similar error.
386
+
387
+ sample_request:
388
+ account:
389
+ brand:
390
+ domain: "acmeoutdoor.example"
391
+ operator: "pinnacle-agency.example"
392
+ creatives:
393
+ # Buyer-authoritative id set in sync_creative_with_assignment —
394
+ # use it literally instead of round-tripping through
395
+ # `$context.creative_id`. That context key is populated from
396
+ # the seller's response at `creatives[0].creative_id`; sellers
397
+ # whose envelope doesn't surface that exact path resolve to
398
+ # undefined and the template engine strips the creative,
399
+ # leaving `creatives: undefined` which fails pre-flight zod.
400
+ - creative_id: "acme_reuse_banner_001"
401
+ name: "Reassigned creative"
402
+ format_id:
403
+ agent_url: "https://your-platform.example.com"
404
+ id: "display_300x250"
405
+ assets:
406
+ image:
407
+ asset_type: "image"
408
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/banner_300x250.jpg"
409
+ width: 300
410
+ height: 250
411
+ assignments:
412
+ - creative_id: "acme_reuse_banner_001"
413
+ package_id: "$context.second_package_id"
414
+ idempotency_key: "$generate:uuid_v4#creative_fate_after_cancellation_reassign_creative"
415
+ context:
416
+ correlation_id: "creative_fate--reassign_creative"
417
+ validations:
418
+ - check: response_schema
419
+ description: "Response matches sync-creatives-response.json schema"