@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,565 @@
1
+ id: media_buy_seller/available_actions
2
+ version: "1.0.0"
3
+ title: "Seller carries product allowed actions into per-buy available actions"
4
+ category: media_buy_seller
5
+ summary: "Validates the AdCP 3.1 media-buy action-discovery flow: product allowed_actions[], buy available_actions[], SLAWindow duration fields, self-serve mutation, and ACTION_NOT_ALLOWED enforcement."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+ - get_media_buys
11
+ - update_media_buy
12
+
13
+ narrative: |
14
+ Buyers should not hard-code a seller's media-buy state machine. Sellers
15
+ declare the product-level action template in get_products.allowed_actions[],
16
+ resolve it into the authoritative buy-level available_actions[] when the
17
+ buy is created, return that surface from get_media_buys, and enforce the
18
+ same surface when update_media_buy is called.
19
+
20
+ This scenario creates a media buy from a product whose allowed_actions[]
21
+ advertise one self-serve budget action, one proposal-routed flight action,
22
+ and one approval-routed cancellation action. The runner then verifies that
23
+ the created buy and subsequent get/update responses carry the resolved
24
+ available_actions[] surface, that the self-serve update succeeds, and that
25
+ direct updates for non-self-serve or unadvertised product actions reject
26
+ with ACTION_NOT_ALLOWED.
27
+
28
+ agent:
29
+ interaction_model: stateful_preloaded
30
+ capabilities:
31
+ - sells_media
32
+ examples:
33
+ - "Any AdCP media buy seller exposing the 3.1 action-discovery surface"
34
+
35
+ caller:
36
+ role: buyer_agent
37
+ example: "Pinnacle Agency (buyer)"
38
+
39
+ prerequisites:
40
+ description: |
41
+ The runner seeds a product with allowed_actions[]. The seller must carry
42
+ that product template into buy-level available_actions[] on create_media_buy,
43
+ persist it for get_media_buys, and enforce the advertised modes when
44
+ update_media_buy is called.
45
+ test_kit: "test-kits/acme-outdoor.yaml"
46
+ controller_seeding: true
47
+
48
+ fixtures:
49
+ products:
50
+ - product_id: "available_actions_display"
51
+ name: "Available Actions Display Package"
52
+ description: "Display inventory fixture used to verify product allowed actions become buy available actions."
53
+ delivery_type: "guaranteed"
54
+ channels: ["display"]
55
+ format_ids:
56
+ - id: "display_300x250"
57
+ allowed_actions:
58
+ - action: "increase_budget"
59
+ modes: ["self_serve"]
60
+ sla:
61
+ response_max: "PT5M"
62
+ completion_max: "PT1H"
63
+ - action: "extend_flight"
64
+ modes: ["requires_proposal"]
65
+ sla:
66
+ response_max: "PT4H"
67
+ completion_max: "P2D"
68
+ terms_ref: "terms://available-actions/extension"
69
+ - action: "cancel"
70
+ modes: ["requires_approval"]
71
+ sla:
72
+ response_max: "PT1H"
73
+ completion_max: "P1D"
74
+ - action: "decrease_budget"
75
+ modes: ["self_serve"]
76
+ allowed_statuses: ["active"]
77
+ pricing_options:
78
+ - product_id: "available_actions_display"
79
+ pricing_option_id: "available_actions_cpm"
80
+ pricing_model: "cpm"
81
+ currency: "USD"
82
+ fixed_price: 8.0
83
+
84
+ phases:
85
+ - id: discover_product_action_template
86
+ title: "Discover product allowed actions"
87
+ narrative: |
88
+ The buyer discovers the product-level allowed_actions[] template before
89
+ creating a media buy. This is the product promise the later buy-level
90
+ surface must resolve and enforce.
91
+ steps:
92
+ - id: get_product_allowed_actions
93
+ title: "Read allowed_actions from get_products"
94
+ task: get_products
95
+ schema_ref: "media-buy/get-products-request.json"
96
+ response_schema_ref: "media-buy/get-products-response.json"
97
+ doc_ref: "/media-buy/task-reference/get_products"
98
+ comply_scenario: media_buy_action_discovery
99
+ stateful: true
100
+ expected: |
101
+ Return the seeded product with allowed_actions[] entries for
102
+ increase_budget, extend_flight, and cancel.
103
+ sample_request:
104
+ buying_mode: brief
105
+ brief: "available actions display package"
106
+ filters:
107
+ channels: ["display"]
108
+ account:
109
+ brand:
110
+ domain: "acmeoutdoor.example"
111
+ operator: "pinnacle-agency.example"
112
+ brand:
113
+ domain: "acmeoutdoor.example"
114
+ context:
115
+ correlation_id: "available_actions--get_products"
116
+ validations:
117
+ - check: response_schema
118
+ description: "Response matches get-products-response.json schema"
119
+ - check: field_value
120
+ path: "products[0].product_id"
121
+ value: "available_actions_display"
122
+ description: "The seeded product is discoverable through get_products"
123
+ - check: field_value
124
+ path: "products[0].allowed_actions[0].action"
125
+ value: "increase_budget"
126
+ description: "Product advertises the self-serve budget action"
127
+ - check: field_value
128
+ path: "products[0].allowed_actions[0].modes[0]"
129
+ value: "self_serve"
130
+ description: "Product declares increase_budget as self-serve"
131
+ - check: field_value
132
+ path: "products[0].allowed_actions[0].sla.response_max"
133
+ value: "PT5M"
134
+ description: "Product action SLA uses the generated ISO 8601 duration shape"
135
+ - check: field_value
136
+ path: "products[0].allowed_actions[1].action"
137
+ value: "extend_flight"
138
+ description: "Product advertises the proposal-routed flight extension action"
139
+ - check: field_value
140
+ path: "products[0].allowed_actions[1].modes[0]"
141
+ value: "requires_proposal"
142
+ description: "Product declares extend_flight as proposal-routed"
143
+ - check: field_value
144
+ path: "products[0].allowed_actions[2].action"
145
+ value: "cancel"
146
+ description: "Product advertises the approval-routed cancellation action"
147
+ - check: field_value
148
+ path: "products[0].allowed_actions[2].modes[0]"
149
+ value: "requires_approval"
150
+ description: "Product declares cancel as approval-routed"
151
+ - check: field_value
152
+ path: "products[0].allowed_actions[3].action"
153
+ value: "decrease_budget"
154
+ description: "Product advertises a status-scoped budget decrease action"
155
+ - check: field_value
156
+ path: "products[0].allowed_actions[3].allowed_statuses[0]"
157
+ value: "active"
158
+ description: "Product can scope allowed actions to specific buy statuses"
159
+
160
+ - id: create_buy_from_product
161
+ title: "Resolve product actions onto the buy"
162
+ narrative: |
163
+ The buyer creates a media buy from the discovered product. The seller
164
+ must materialize the product-level template into buy-level
165
+ available_actions[] on the create response.
166
+ steps:
167
+ - id: create_media_buy_with_available_actions
168
+ title: "Create a buy from the action-enabled product"
169
+ task: create_media_buy
170
+ schema_ref: "media-buy/create-media-buy-request.json"
171
+ response_schema_ref: "media-buy/create-media-buy-response.json"
172
+ doc_ref: "/media-buy/task-reference/create_media_buy"
173
+ comply_scenario: media_buy_action_discovery
174
+ stateful: true
175
+ expected: |
176
+ Create the buy and return available_actions[] resolved from the
177
+ product's allowed_actions[] template.
178
+ sample_request:
179
+ account:
180
+ brand:
181
+ domain: "acmeoutdoor.example"
182
+ operator: "pinnacle-agency.example"
183
+ brand:
184
+ domain: "acmeoutdoor.example"
185
+ media_buy_id: "available_actions_product_mb"
186
+ start_time: "2026-05-01T00:00:00Z"
187
+ end_time: "2027-07-31T23:59:59Z"
188
+ packages:
189
+ - product_id: "available_actions_display"
190
+ pricing_option_id: "available_actions_cpm"
191
+ budget: 10000
192
+ idempotency_key: "$generate:uuid_v4#available_actions_create_buy"
193
+ context:
194
+ correlation_id: "available_actions--create_buy"
195
+ context_outputs:
196
+ - path: "media_buy_id"
197
+ key: "available_actions_media_buy_id"
198
+ - path: "packages[0].package_id"
199
+ key: "available_actions_package_id"
200
+ validations:
201
+ - check: response_schema
202
+ description: "Response matches create-media-buy-response.json schema"
203
+ - check: field_present
204
+ path: "media_buy_id"
205
+ description: "Seller returns the created media buy ID"
206
+ - check: field_present
207
+ path: "packages[0].package_id"
208
+ description: "Seller returns the created package ID for later updates"
209
+ - check: field_value
210
+ path: "available_actions[0].action"
211
+ value: "increase_budget"
212
+ description: "Created buy carries increase_budget from product allowed_actions"
213
+ - check: field_value
214
+ path: "available_actions[0].mode"
215
+ value: "self_serve"
216
+ description: "Created buy resolves increase_budget to self_serve"
217
+ - check: field_value
218
+ path: "available_actions[0].sla.response_max"
219
+ value: "PT5M"
220
+ description: "Created buy preserves response_max SLA duration"
221
+ - check: field_value
222
+ path: "available_actions[0].sla.completion_max"
223
+ value: "PT1H"
224
+ description: "Created buy preserves completion_max SLA duration"
225
+ - check: field_value
226
+ path: "available_actions[1].action"
227
+ value: "extend_flight"
228
+ description: "Created buy carries extend_flight from product allowed_actions"
229
+ - check: field_value
230
+ path: "available_actions[1].mode"
231
+ value: "requires_proposal"
232
+ description: "Created buy resolves extend_flight to requires_proposal"
233
+ - check: field_value
234
+ path: "available_actions[1].terms_ref"
235
+ value: "terms://available-actions/extension"
236
+ description: "Created buy preserves the action terms reference"
237
+ - check: field_value
238
+ path: "available_actions[2].action"
239
+ value: "cancel"
240
+ description: "Created buy carries cancel from product allowed_actions"
241
+ - check: field_value
242
+ path: "available_actions[2].mode"
243
+ value: "requires_approval"
244
+ description: "Created buy resolves cancel to requires_approval"
245
+ - check: field_present
246
+ path: "valid_actions"
247
+ description: "Legacy valid_actions may still be present during the 3.x deprecation window"
248
+
249
+ - id: read_persisted_buy_actions
250
+ title: "Read persisted buy actions"
251
+ narrative: |
252
+ The buyer reads the created buy. The same available_actions[] surface
253
+ must persist through get_media_buys; it is the authoritative contract
254
+ for update_media_buy.
255
+ steps:
256
+ - id: get_created_buy_available_actions
257
+ title: "Read available_actions from get_media_buys"
258
+ task: get_media_buys
259
+ schema_ref: "media-buy/get-media-buys-request.json"
260
+ response_schema_ref: "media-buy/get-media-buys-response.json"
261
+ doc_ref: "/media-buy/task-reference/get_media_buys"
262
+ comply_scenario: media_buy_action_discovery
263
+ stateful: true
264
+ expected: |
265
+ Return the created buy with the same available_actions[] resolved
266
+ during create_media_buy.
267
+ sample_request:
268
+ account:
269
+ brand:
270
+ domain: "acmeoutdoor.example"
271
+ operator: "pinnacle-agency.example"
272
+ brand:
273
+ domain: "acmeoutdoor.example"
274
+ media_buy_ids: ["$context.available_actions_media_buy_id"]
275
+ context:
276
+ correlation_id: "available_actions--get_buy"
277
+ validations:
278
+ - check: response_schema
279
+ description: "Response matches get-media-buys-response.json schema"
280
+ - check: field_value
281
+ path: "media_buys[0].media_buy_id"
282
+ value: "$context.available_actions_media_buy_id"
283
+ description: "Seller returns the created media buy"
284
+ - check: field_value
285
+ path: "media_buys[0].available_actions[0].action"
286
+ value: "increase_budget"
287
+ description: "Persisted buy carries the self-serve budget action"
288
+ - check: field_value
289
+ path: "media_buys[0].available_actions[0].mode"
290
+ value: "self_serve"
291
+ description: "Persisted buy keeps the self-serve mode"
292
+ - check: field_value
293
+ path: "media_buys[0].available_actions[1].action"
294
+ value: "extend_flight"
295
+ description: "Persisted buy carries the proposal-routed action"
296
+ - check: field_value
297
+ path: "media_buys[0].available_actions[1].mode"
298
+ value: "requires_proposal"
299
+ description: "Persisted buy keeps the proposal mode"
300
+ - check: field_value
301
+ path: "media_buys[0].available_actions[2].action"
302
+ value: "cancel"
303
+ description: "Persisted buy carries the approval-routed action"
304
+ - check: field_value
305
+ path: "media_buys[0].available_actions[2].mode"
306
+ value: "requires_approval"
307
+ description: "Persisted buy keeps the approval mode"
308
+ - check: field_value
309
+ path: "context.correlation_id"
310
+ value: "available_actions--get_buy"
311
+ description: "Context correlation_id returned unchanged"
312
+
313
+ - id: enforce_available_actions
314
+ title: "Enforce advertised actions"
315
+ narrative: |
316
+ The buyer attempts updates against the created buy. The self-serve action
317
+ succeeds, proposal/approval modes reject direct mutation with
318
+ mode_mismatch, and an action never advertised by the product rejects as
319
+ not_supported_on_product.
320
+ steps:
321
+ - id: increase_budget
322
+ title: "Apply the advertised self-serve budget action"
323
+ task: update_media_buy
324
+ schema_ref: "media-buy/update-media-buy-request.json"
325
+ response_schema_ref: "media-buy/update-media-buy-response.json"
326
+ doc_ref: "/media-buy/task-reference/update_media_buy"
327
+ comply_scenario: media_buy_action_discovery
328
+ stateful: true
329
+ expected: |
330
+ Accept the budget increase and return the post-update
331
+ available_actions[] surface.
332
+ sample_request:
333
+ account:
334
+ brand:
335
+ domain: "acmeoutdoor.example"
336
+ operator: "pinnacle-agency.example"
337
+ brand:
338
+ domain: "acmeoutdoor.example"
339
+ media_buy_id: "$context.available_actions_media_buy_id"
340
+ packages:
341
+ - package_id: "$context.available_actions_package_id"
342
+ budget: 12000
343
+ idempotency_key: "$generate:uuid_v4#available_actions_increase_budget"
344
+ context:
345
+ correlation_id: "available_actions--increase_budget"
346
+ validations:
347
+ - check: response_schema
348
+ description: "Response matches update-media-buy-response.json schema"
349
+ - check: field_value
350
+ path: "media_buy_id"
351
+ value: "$context.available_actions_media_buy_id"
352
+ description: "Seller updates the requested media buy"
353
+ - check: field_value
354
+ path: "available_actions[0].action"
355
+ value: "increase_budget"
356
+ description: "Update response carries the post-update action surface"
357
+ - check: field_value
358
+ path: "context.correlation_id"
359
+ value: "available_actions--increase_budget"
360
+ description: "Context correlation_id returned unchanged"
361
+
362
+ - id: direct_extend_requires_proposal
363
+ title: "Reject direct update for proposal-routed extension"
364
+ task: update_media_buy
365
+ schema_ref: "media-buy/update-media-buy-request.json"
366
+ response_schema_ref: "media-buy/update-media-buy-response.json"
367
+ doc_ref: "/media-buy/task-reference/update_media_buy"
368
+ comply_scenario: media_buy_action_discovery
369
+ expect_error: true
370
+ negative_path: mode_mismatch
371
+ stateful: true
372
+ expected: |
373
+ Reject with ACTION_NOT_ALLOWED because extend_flight is advertised,
374
+ but its resolved mode is requires_proposal rather than self_serve.
375
+ sample_request:
376
+ account:
377
+ brand:
378
+ domain: "acmeoutdoor.example"
379
+ operator: "pinnacle-agency.example"
380
+ brand:
381
+ domain: "acmeoutdoor.example"
382
+ media_buy_id: "$context.available_actions_media_buy_id"
383
+ end_time: "2027-08-31T23:59:59Z"
384
+ idempotency_key: "$generate:uuid_v4#available_actions_extend_direct"
385
+ context:
386
+ correlation_id: "available_actions--extend_direct"
387
+ validations:
388
+ - check: error_code
389
+ code: ACTION_NOT_ALLOWED
390
+ description: "Seller rejects direct mutation for proposal-routed action"
391
+ - check: field_value
392
+ path: "errors[0].details.attempted_action"
393
+ value: "extend_flight"
394
+ description: "Error identifies the attempted fine-grained action"
395
+ - check: field_value
396
+ path: "errors[0].details.reason"
397
+ value: "mode_mismatch"
398
+ description: "Error distinguishes mode mismatch from unsupported action"
399
+ - check: field_value
400
+ path: "errors[0].recovery"
401
+ value: "correctable"
402
+ description: "Mode mismatch is a correctable flow-switch recovery"
403
+ - check: field_value
404
+ path: "errors[0].details.currently_available_actions[1].mode"
405
+ value: "requires_proposal"
406
+ description: "Recovery details echo the current proposal-routed action surface"
407
+ - check: field_value
408
+ path: "context.correlation_id"
409
+ value: "available_actions--extend_direct"
410
+ description: "Context correlation_id returned unchanged"
411
+
412
+ - id: direct_cancel_requires_approval
413
+ title: "Reject direct update for approval-routed cancellation"
414
+ task: update_media_buy
415
+ schema_ref: "media-buy/update-media-buy-request.json"
416
+ response_schema_ref: "media-buy/update-media-buy-response.json"
417
+ doc_ref: "/media-buy/task-reference/update_media_buy"
418
+ comply_scenario: media_buy_action_discovery
419
+ expect_error: true
420
+ negative_path: mode_mismatch
421
+ stateful: true
422
+ expected: |
423
+ Reject with ACTION_NOT_ALLOWED because cancel is advertised, but its
424
+ resolved mode is requires_approval rather than self_serve.
425
+ sample_request:
426
+ account:
427
+ brand:
428
+ domain: "acmeoutdoor.example"
429
+ operator: "pinnacle-agency.example"
430
+ brand:
431
+ domain: "acmeoutdoor.example"
432
+ media_buy_id: "$context.available_actions_media_buy_id"
433
+ canceled: true
434
+ cancellation_reason: "Buyer wants a direct cancellation despite approval routing"
435
+ idempotency_key: "$generate:uuid_v4#available_actions_cancel_direct"
436
+ context:
437
+ correlation_id: "available_actions--cancel_direct"
438
+ validations:
439
+ - check: error_code
440
+ code: ACTION_NOT_ALLOWED
441
+ description: "Seller rejects direct mutation for approval-routed action"
442
+ - check: field_value
443
+ path: "errors[0].details.attempted_action"
444
+ value: "cancel"
445
+ description: "Error identifies the attempted fine-grained action"
446
+ - check: field_value
447
+ path: "errors[0].details.reason"
448
+ value: "mode_mismatch"
449
+ description: "Error distinguishes approval routing from unsupported action"
450
+ - check: field_value
451
+ path: "errors[0].recovery"
452
+ value: "correctable"
453
+ description: "Approval mode mismatch is a correctable flow-switch recovery"
454
+ - check: field_value
455
+ path: "errors[0].details.currently_available_actions[2].mode"
456
+ value: "requires_approval"
457
+ description: "Recovery details echo the current approval-routed action surface"
458
+ - check: field_value
459
+ path: "context.correlation_id"
460
+ value: "available_actions--cancel_direct"
461
+ description: "Context correlation_id returned unchanged"
462
+
463
+ - id: direct_decrease_wrong_status
464
+ title: "Reject an action whose product status scope does not match"
465
+ task: update_media_buy
466
+ schema_ref: "media-buy/update-media-buy-request.json"
467
+ response_schema_ref: "media-buy/update-media-buy-response.json"
468
+ doc_ref: "/media-buy/task-reference/update_media_buy"
469
+ comply_scenario: media_buy_action_discovery
470
+ expect_error: true
471
+ negative_path: wrong_status
472
+ stateful: true
473
+ expected: |
474
+ Reject with ACTION_NOT_ALLOWED because decrease_budget is supported
475
+ by the product, but only for active buys. The created buy is still
476
+ pending_creatives, so the action is not currently available.
477
+ sample_request:
478
+ account:
479
+ brand:
480
+ domain: "acmeoutdoor.example"
481
+ operator: "pinnacle-agency.example"
482
+ brand:
483
+ domain: "acmeoutdoor.example"
484
+ media_buy_id: "$context.available_actions_media_buy_id"
485
+ packages:
486
+ - package_id: "$context.available_actions_package_id"
487
+ budget: 11000
488
+ idempotency_key: "$generate:uuid_v4#available_actions_decrease_wrong_status"
489
+ context:
490
+ correlation_id: "available_actions--decrease_wrong_status"
491
+ validations:
492
+ - check: error_code
493
+ code: ACTION_NOT_ALLOWED
494
+ description: "Seller rejects a product-supported action in the wrong buy status"
495
+ - check: field_value
496
+ path: "errors[0].details.attempted_action"
497
+ value: "decrease_budget"
498
+ description: "Error identifies the attempted fine-grained action"
499
+ - check: field_value
500
+ path: "errors[0].details.reason"
501
+ value: "wrong_status"
502
+ description: "Error distinguishes status scoping from unsupported action"
503
+ - check: field_value
504
+ path: "errors[0].recovery"
505
+ value: "correctable"
506
+ description: "Wrong-status action rejection is correctable by waiting for or transitioning status"
507
+ - check: field_value
508
+ path: "errors[0].details.currently_available_actions[0].action"
509
+ value: "increase_budget"
510
+ description: "Recovery details echo the currently available buy actions"
511
+ - check: field_value
512
+ path: "context.correlation_id"
513
+ value: "available_actions--decrease_wrong_status"
514
+ description: "Context correlation_id returned unchanged"
515
+
516
+ - id: direct_pause_not_supported_on_product
517
+ title: "Reject an action the product never advertised"
518
+ task: update_media_buy
519
+ schema_ref: "media-buy/update-media-buy-request.json"
520
+ response_schema_ref: "media-buy/update-media-buy-response.json"
521
+ doc_ref: "/media-buy/task-reference/update_media_buy"
522
+ comply_scenario: media_buy_action_discovery
523
+ expect_error: true
524
+ negative_path: unsupported_action
525
+ stateful: true
526
+ expected: |
527
+ Reject with ACTION_NOT_ALLOWED because pause is not present in the
528
+ product's allowed_actions[] template and therefore is not available
529
+ on the buy.
530
+ sample_request:
531
+ account:
532
+ brand:
533
+ domain: "acmeoutdoor.example"
534
+ operator: "pinnacle-agency.example"
535
+ brand:
536
+ domain: "acmeoutdoor.example"
537
+ media_buy_id: "$context.available_actions_media_buy_id"
538
+ paused: true
539
+ idempotency_key: "$generate:uuid_v4#available_actions_pause_direct"
540
+ context:
541
+ correlation_id: "available_actions--pause_direct"
542
+ validations:
543
+ - check: error_code
544
+ code: ACTION_NOT_ALLOWED
545
+ description: "Seller rejects direct mutation for an action not supported by the product"
546
+ - check: field_value
547
+ path: "errors[0].details.attempted_action"
548
+ value: "pause"
549
+ description: "Error identifies the attempted fine-grained action"
550
+ - check: field_value
551
+ path: "errors[0].details.reason"
552
+ value: "not_supported_on_product"
553
+ description: "Error distinguishes product capability from transient buy state"
554
+ - check: field_value
555
+ path: "errors[0].recovery"
556
+ value: "terminal"
557
+ description: "Unsupported product action is terminal for this buy"
558
+ - check: field_value
559
+ path: "errors[0].details.currently_available_actions[0].action"
560
+ value: "increase_budget"
561
+ description: "Recovery details echo the currently available buy actions"
562
+ - check: field_value
563
+ path: "context.correlation_id"
564
+ value: "available_actions--pause_direct"
565
+ description: "Context correlation_id returned unchanged"