@adcp/sdk 6.9.0 → 6.10.0

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 (233) hide show
  1. package/bin/adcp.js +285 -5
  2. package/compliance/cache/3.0.6.previous/domains/brand/index.yaml +163 -0
  3. package/compliance/cache/3.0.6.previous/domains/creative/index.yaml +412 -0
  4. package/compliance/cache/3.0.6.previous/domains/governance/index.yaml +683 -0
  5. package/compliance/cache/3.0.6.previous/domains/media-buy/creative-reception.yaml +247 -0
  6. package/compliance/cache/3.0.6.previous/domains/media-buy/index.yaml +769 -0
  7. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
  8. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
  9. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
  10. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
  11. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
  12. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
  13. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
  14. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
  15. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
  16. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
  17. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
  18. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
  19. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
  20. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
  21. package/compliance/cache/3.0.6.previous/domains/media-buy/state-machine.yaml +442 -0
  22. package/compliance/cache/3.0.6.previous/domains/signals/index.yaml +266 -0
  23. package/compliance/cache/3.0.6.previous/domains/sponsored-intelligence/index.yaml +256 -0
  24. package/compliance/cache/3.0.6.previous/index.json +324 -0
  25. package/compliance/cache/3.0.6.previous/protocols/brand/index.yaml +163 -0
  26. package/compliance/cache/3.0.6.previous/protocols/creative/index.yaml +412 -0
  27. package/compliance/cache/3.0.6.previous/protocols/governance/index.yaml +683 -0
  28. package/compliance/cache/3.0.6.previous/protocols/media-buy/creative-reception.yaml +247 -0
  29. package/compliance/cache/3.0.6.previous/protocols/media-buy/index.yaml +769 -0
  30. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
  31. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
  32. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
  33. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
  34. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
  35. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
  36. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
  37. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
  38. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
  39. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
  40. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
  41. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
  42. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
  43. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  44. package/compliance/cache/3.0.6.previous/protocols/media-buy/state-machine.yaml +442 -0
  45. package/compliance/cache/3.0.6.previous/protocols/signals/index.yaml +266 -0
  46. package/compliance/cache/3.0.6.previous/protocols/sponsored-intelligence/index.yaml +256 -0
  47. package/compliance/cache/3.0.6.previous/specialisms/audience-sync/index.yaml +280 -0
  48. package/compliance/cache/3.0.6.previous/specialisms/brand-rights/index.yaml +350 -0
  49. package/compliance/cache/3.0.6.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
  50. package/compliance/cache/3.0.6.previous/specialisms/collection-lists/index.yaml +359 -0
  51. package/compliance/cache/3.0.6.previous/specialisms/content-standards/index.yaml +572 -0
  52. package/compliance/cache/3.0.6.previous/specialisms/creative-ad-server/index.yaml +383 -0
  53. package/compliance/cache/3.0.6.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
  54. package/compliance/cache/3.0.6.previous/specialisms/creative-generative/index.yaml +746 -0
  55. package/compliance/cache/3.0.6.previous/specialisms/creative-template/index.yaml +413 -0
  56. package/compliance/cache/3.0.6.previous/specialisms/governance-aware-seller/index.yaml +136 -0
  57. package/compliance/cache/3.0.6.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
  58. package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
  59. package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/index.yaml +330 -0
  60. package/compliance/cache/3.0.6.previous/specialisms/property-lists/index.yaml +482 -0
  61. package/compliance/cache/3.0.6.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
  62. package/compliance/cache/3.0.6.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
  63. package/compliance/cache/3.0.6.previous/specialisms/sales-guaranteed/index.yaml +504 -0
  64. package/compliance/cache/3.0.6.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
  65. package/compliance/cache/3.0.6.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
  66. package/compliance/cache/3.0.6.previous/specialisms/sales-social/index.yaml +584 -0
  67. package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/index.yaml +415 -0
  68. package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
  69. package/compliance/cache/3.0.6.previous/specialisms/signal-owned/index.yaml +316 -0
  70. package/compliance/cache/3.0.6.previous/test-kits/acme-outdoor.yaml +210 -0
  71. package/compliance/cache/3.0.6.previous/test-kits/bistro-oranje.yaml +126 -0
  72. package/compliance/cache/3.0.6.previous/test-kits/nova-motors.yaml +262 -0
  73. package/compliance/cache/3.0.6.previous/test-kits/osei-natural.yaml +126 -0
  74. package/compliance/cache/3.0.6.previous/test-kits/signed-requests-runner.yaml +155 -0
  75. package/compliance/cache/3.0.6.previous/test-kits/substitution-observer-runner.yaml +690 -0
  76. package/compliance/cache/3.0.6.previous/test-kits/summit-foods.yaml +125 -0
  77. package/compliance/cache/3.0.6.previous/test-kits/webhook-receiver-runner.yaml +265 -0
  78. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  79. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
  80. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  81. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  82. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  83. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  84. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  85. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  86. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  87. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  88. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  89. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/README.md +219 -0
  90. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/canonicalization.json +241 -0
  91. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/keys.json +60 -0
  92. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  93. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  94. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  95. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  96. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  97. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  98. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  99. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  100. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  101. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  102. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  103. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  104. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  105. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  106. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  107. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  108. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  109. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  110. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  111. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  112. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  113. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  114. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  115. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  116. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  117. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  118. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  119. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  120. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  121. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  122. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  123. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  124. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  125. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  126. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  127. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  128. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  129. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  130. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  131. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/README.md +211 -0
  132. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/keys.json +61 -0
  133. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  134. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  135. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  136. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  137. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  138. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  139. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  140. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  141. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  142. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  143. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  144. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  145. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  146. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  147. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  148. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  149. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  150. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  151. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  152. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  153. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  154. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  155. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  156. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  157. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  158. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  159. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  160. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  161. package/compliance/cache/3.0.6.previous/universal/capability-discovery.yaml +125 -0
  162. package/compliance/cache/3.0.6.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
  163. package/compliance/cache/3.0.6.previous/universal/content-standards-pagination-integrity.yaml +326 -0
  164. package/compliance/cache/3.0.6.previous/universal/deterministic-testing.yaml +1343 -0
  165. package/compliance/cache/3.0.6.previous/universal/error-compliance.yaml +474 -0
  166. package/compliance/cache/3.0.6.previous/universal/fictional-entities.yaml +307 -0
  167. package/compliance/cache/3.0.6.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
  168. package/compliance/cache/3.0.6.previous/universal/get-signals-pagination-integrity.yaml +211 -0
  169. package/compliance/cache/3.0.6.previous/universal/idempotency.yaml +593 -0
  170. package/compliance/cache/3.0.6.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
  171. package/compliance/cache/3.0.6.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
  172. package/compliance/cache/3.0.6.previous/universal/pagination-integrity.yaml +263 -0
  173. package/compliance/cache/3.0.6.previous/universal/property-lists-pagination-integrity.yaml +307 -0
  174. package/compliance/cache/3.0.6.previous/universal/runner-output-contract.yaml +358 -0
  175. package/compliance/cache/3.0.6.previous/universal/schema-validation.yaml +526 -0
  176. package/compliance/cache/3.0.6.previous/universal/security.yaml +431 -0
  177. package/compliance/cache/3.0.6.previous/universal/signed-requests.yaml +205 -0
  178. package/compliance/cache/3.0.6.previous/universal/storyboard-schema.yaml +1176 -0
  179. package/compliance/cache/3.0.6.previous/universal/v3-envelope-integrity.yaml +106 -0
  180. package/compliance/cache/3.0.6.previous/universal/webhook-emission.yaml +337 -0
  181. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  182. package/dist/lib/server/create-adcp-server.d.ts +33 -0
  183. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  184. package/dist/lib/server/create-adcp-server.js +127 -1
  185. package/dist/lib/server/create-adcp-server.js.map +1 -1
  186. package/dist/lib/server/credential-policy.d.ts +221 -0
  187. package/dist/lib/server/credential-policy.d.ts.map +1 -0
  188. package/dist/lib/server/credential-policy.js +260 -0
  189. package/dist/lib/server/credential-policy.js.map +1 -0
  190. package/dist/lib/server/dynamic-registry.d.ts +219 -0
  191. package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
  192. package/dist/lib/server/dynamic-registry.js +245 -0
  193. package/dist/lib/server/dynamic-registry.js.map +1 -0
  194. package/dist/lib/server/index.d.ts +8 -0
  195. package/dist/lib/server/index.d.ts.map +1 -1
  196. package/dist/lib/server/index.js +15 -4
  197. package/dist/lib/server/index.js.map +1 -1
  198. package/dist/lib/server/operational-platform.d.ts +239 -0
  199. package/dist/lib/server/operational-platform.d.ts.map +1 -0
  200. package/dist/lib/server/operational-platform.js +94 -0
  201. package/dist/lib/server/operational-platform.js.map +1 -0
  202. package/dist/lib/server/wire-safe.d.ts +211 -0
  203. package/dist/lib/server/wire-safe.d.ts.map +1 -0
  204. package/dist/lib/server/wire-safe.js +231 -0
  205. package/dist/lib/server/wire-safe.js.map +1 -0
  206. package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
  207. package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
  208. package/dist/lib/server/wire-spec-fields.generated.js +172 -0
  209. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
  210. package/dist/lib/testing/compliance/index.d.ts +2 -0
  211. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  212. package/dist/lib/testing/compliance/index.js +6 -1
  213. package/dist/lib/testing/compliance/index.js.map +1 -1
  214. package/dist/lib/testing/compliance/summary.d.ts +77 -0
  215. package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
  216. package/dist/lib/testing/compliance/summary.js +176 -0
  217. package/dist/lib/testing/compliance/summary.js.map +1 -0
  218. package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
  219. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  220. package/dist/lib/testing/storyboard/compliance.js +51 -0
  221. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  222. package/dist/lib/testing/storyboard/index.d.ts +2 -2
  223. package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
  224. package/dist/lib/testing/storyboard/index.js +4 -2
  225. package/dist/lib/testing/storyboard/index.js.map +1 -1
  226. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  227. package/dist/lib/testing/storyboard/runner.js +58 -5
  228. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  229. package/dist/lib/version.d.ts +3 -3
  230. package/dist/lib/version.d.ts.map +1 -1
  231. package/dist/lib/version.js +3 -3
  232. package/dist/lib/version.js.map +1 -1
  233. package/package.json +2 -2
@@ -0,0 +1,250 @@
1
+ id: media_buy_seller/pending_creatives_to_start
2
+ version: "1.0.0"
3
+ title: "Creative sync unblocks pending_creatives → pending_start"
4
+ category: media_buy_seller
5
+ summary: "Verifies that a media buy created without creatives sits in pending_creatives until sync_creatives completes, then transitions to pending_start."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+ - sync_creatives
11
+ - get_media_buys
12
+
13
+ narrative: |
14
+ When a buyer creates a media buy without creative_assignments, the seller cannot start
15
+ delivery until creatives are supplied. The seller must report status: pending_creatives
16
+ and, after sync_creatives attaches the required assets, transition the buy to
17
+ pending_start (awaiting flight start) or active (if already in flight).
18
+
19
+ This scenario walks the transition end-to-end: create the buy, confirm pending_creatives,
20
+ sync a creative, and confirm the status advances to pending_start. The transition
21
+ proves that the creative pipeline and the buy state machine are wired together — a
22
+ common integration gap when creative and media buy systems live on different backends.
23
+
24
+ agent:
25
+ interaction_model: media_buy_seller
26
+ capabilities:
27
+ - sells_media
28
+ - accepts_creatives
29
+ examples:
30
+ - "Any seller that requires creatives before starting delivery"
31
+
32
+ caller:
33
+ role: buyer_agent
34
+ example: "Pinnacle Agency (buyer)"
35
+
36
+ prerequisites:
37
+ description: |
38
+ Seller supports create_media_buy without creative_assignments and honors the
39
+ pending_creatives → pending_start transition when creatives are synced.
40
+ test_kit: "test-kits/acme-outdoor.yaml"
41
+
42
+ phases:
43
+ - id: setup
44
+ title: "Discover products and formats"
45
+ steps:
46
+ - id: get_products_brief
47
+ title: "Discover a product"
48
+ task: get_products
49
+ schema_ref: "media-buy/get-products-request.json"
50
+ response_schema_ref: "media-buy/get-products-response.json"
51
+ doc_ref: "/media-buy/task-reference/get_products"
52
+ comply_scenario: full_sales_flow
53
+ stateful: false
54
+ expected: |
55
+ Return at least one product with format_ids and pricing options.
56
+ sample_request:
57
+ buying_mode: "brief"
58
+ brief: "Display inventory on outdoor lifestyle content. Q3 flight."
59
+ account:
60
+ brand:
61
+ domain: "acmeoutdoor.example"
62
+ operator: "pinnacle-agency.example"
63
+ context_outputs:
64
+ - path: "products[0].product_id"
65
+ key: "product_id"
66
+ - path: "products[0].pricing_options[0].pricing_option_id"
67
+ key: "pricing_option_id"
68
+ - path: "products[0].format_ids[0]"
69
+ key: "format_id"
70
+ validations:
71
+ - check: response_schema
72
+ description: "Response matches get-products-response.json schema"
73
+ - check: field_present
74
+ path: "products[0].format_ids[0].id"
75
+ description: "Product declares a format_id for creative sync"
76
+
77
+ - id: create_without_creatives
78
+ title: "Create media buy without creative_assignments"
79
+ narrative: |
80
+ The buyer intentionally omits creative_assignments. The seller must accept the
81
+ buy, persist it, and return status: pending_creatives with valid_actions
82
+ including sync_creatives.
83
+
84
+ steps:
85
+ - id: create_buy_no_creatives
86
+ title: "Create buy in pending_creatives"
87
+ task: create_media_buy
88
+ schema_ref: "media-buy/create-media-buy-request.json"
89
+ response_schema_ref: "media-buy/create-media-buy-response.json"
90
+ doc_ref: "/media-buy/task-reference/create_media_buy"
91
+ comply_scenario: create_media_buy
92
+ stateful: true
93
+ expected: |
94
+ Media buy created with:
95
+ - media_buy_id assigned
96
+ - status: pending_creatives
97
+ - valid_actions including sync_creatives
98
+
99
+ sample_request:
100
+ brand:
101
+ domain: "acmeoutdoor.example"
102
+ account:
103
+ brand:
104
+ domain: "acmeoutdoor.example"
105
+ operator: "pinnacle-agency.example"
106
+ idempotency_key: "pending-creatives-transition-v1"
107
+ start_time: "2026-08-01T00:00:00Z"
108
+ end_time: "2026-08-31T23:59:59Z"
109
+ packages:
110
+ - product_id: "$context.product_id"
111
+ budget: 10000
112
+ pricing_option_id: "$context.pricing_option_id"
113
+
114
+ context:
115
+ correlation_id: "pending_creatives_to_start--create_buy_no_creatives"
116
+ context_outputs:
117
+ - path: "media_buy_id"
118
+ key: "media_buy_id"
119
+ - path: "packages[0].package_id"
120
+ key: "package_id"
121
+ validations:
122
+ - check: response_schema
123
+ description: "Response matches create-media-buy-response.json schema"
124
+ - check: field_present
125
+ path: "media_buy_id"
126
+ description: "Seller assigns a media_buy_id"
127
+ - check: field_value
128
+ path: "status"
129
+ value: "pending_creatives"
130
+ description: "Status is pending_creatives because no creatives supplied"
131
+ - check: field_present
132
+ path: "context"
133
+ description: "Response echoes back the context object"
134
+ - check: field_value
135
+ path: "context.correlation_id"
136
+ value: "pending_creatives_to_start--create_buy_no_creatives"
137
+ description: "Context correlation_id returned unchanged"
138
+
139
+ - id: supply_creatives
140
+ title: "Supply creatives and assign to the package"
141
+ narrative: |
142
+ The buyer syncs a creative with the format the product requires, then updates the
143
+ media buy with creative_assignments so the seller can attach the asset to the
144
+ package and advance state.
145
+
146
+ steps:
147
+ - id: sync_creative
148
+ title: "Sync the creative asset"
149
+ task: sync_creatives
150
+ schema_ref: "creative/sync-creatives-request.json"
151
+ response_schema_ref: "creative/sync-creatives-response.json"
152
+ doc_ref: "/creative/task-reference/sync_creatives"
153
+ comply_scenario: creative_lifecycle
154
+ stateful: true
155
+ expected: |
156
+ The seller ingests the creative and returns status active (or approved).
157
+ sample_request:
158
+ account:
159
+ brand:
160
+ domain: "acmeoutdoor.example"
161
+ operator: "pinnacle-agency.example"
162
+ creatives:
163
+ - creative_id: "acme-outdoor-display-q3"
164
+ name: "Acme Outdoor Q3 display"
165
+ format_id: "$context.format_id"
166
+ assets:
167
+ image:
168
+ asset_type: "image"
169
+ url: "https://creative.acmeoutdoor.example/q3/display-300x250.jpg"
170
+ width: 300
171
+ height: 250
172
+ mime_type: "image/jpeg"
173
+
174
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_pending_creatives_to_start_supply_creatives_sync_creative"
175
+ context:
176
+ correlation_id: "pending_creatives_to_start--sync_creative"
177
+ validations:
178
+ - check: response_schema
179
+ description: "Response matches sync-creatives-response.json schema"
180
+
181
+ - id: assign_creative_to_package
182
+ title: "Assign the creative to the package"
183
+ task: update_media_buy
184
+ schema_ref: "media-buy/update-media-buy-request.json"
185
+ response_schema_ref: "media-buy/update-media-buy-response.json"
186
+ doc_ref: "/media-buy/task-reference/update_media_buy"
187
+ comply_scenario: media_buy_lifecycle
188
+ stateful: true
189
+ expected: |
190
+ The seller acknowledges the assignment and advances the buy state. The response
191
+ status should be pending_start (or active if the flight has started).
192
+
193
+ sample_request:
194
+ account:
195
+ brand:
196
+ domain: "acmeoutdoor.example"
197
+ operator: "pinnacle-agency.example"
198
+ media_buy_id: "$context.media_buy_id"
199
+ packages:
200
+ - package_id: "$context.package_id"
201
+ creative_assignments:
202
+ - creative_id: "acme-outdoor-display-q3"
203
+
204
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_pending_creatives_to_start_supply_creatives_assign_creative_to_package"
205
+ context:
206
+ correlation_id: "pending_creatives_to_start--assign_creative_to_package"
207
+ validations:
208
+ - check: response_schema
209
+ description: "Response matches update-media-buy-response.json schema"
210
+ - check: field_value
211
+ path: "status"
212
+ allowed_values: ["pending_start", "active"]
213
+ description: "Status advances out of pending_creatives once creatives attached"
214
+
215
+ - id: verify_transition
216
+ title: "Verify the status transition"
217
+ narrative: |
218
+ Independently of the update_media_buy response, call get_media_buys to confirm the
219
+ seller's stored state has advanced. This protects against sellers that return the
220
+ updated status in response but do not persist it.
221
+
222
+ steps:
223
+ - id: get_media_buy_after_sync
224
+ title: "Confirm pending_start after creative sync"
225
+ task: get_media_buys
226
+ schema_ref: "media-buy/get-media-buys-request.json"
227
+ response_schema_ref: "media-buy/get-media-buys-response.json"
228
+ doc_ref: "/media-buy/task-reference/get_media_buys"
229
+ comply_scenario: media_buy_lifecycle
230
+ stateful: true
231
+ expected: |
232
+ The media buy's persisted status is pending_start (or active). valid_actions
233
+ no longer includes sync_creatives as a required next step.
234
+ sample_request:
235
+ account:
236
+ brand:
237
+ domain: "acmeoutdoor.example"
238
+ operator: "pinnacle-agency.example"
239
+ media_buy_ids:
240
+ - "$context.media_buy_id"
241
+
242
+ context:
243
+ correlation_id: "pending_creatives_to_start--get_media_buy_after_sync"
244
+ validations:
245
+ - check: response_schema
246
+ description: "Response matches get-media-buys-response.json schema"
247
+ - check: field_value
248
+ path: "media_buys[0].status"
249
+ allowed_values: ["pending_start", "active"]
250
+ description: "Persisted status is past pending_creatives"
@@ -0,0 +1,243 @@
1
+ id: media_buy_seller/proposal_finalize
2
+ version: "1.0.0"
3
+ title: "Seller handles proposal refinement and finalize"
4
+ category: media_buy_seller
5
+ summary: "Verifies the full proposal lifecycle: brief with proposals, refine a proposal, finalize to committed, and accept via create_media_buy."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+
11
+ narrative: |
12
+ Proposals are curated media plans that the seller generates alongside products. The buyer
13
+ reviews proposals, refines them (adjust budget splits, swap products, add constraints),
14
+ and then finalizes a proposal to get firm pricing and an inventory hold. Once committed,
15
+ the buyer accepts the proposal via create_media_buy.
16
+
17
+ The proposal lifecycle is: draft (indicative pricing) -> refine -> finalize (firm pricing,
18
+ inventory hold) -> create_media_buy (accept and go live).
19
+
20
+ This scenario exercises the complete proposal flow including the finalize action, which
21
+ transitions a proposal from draft to committed status with an expires_at hold window.
22
+
23
+ agent:
24
+ interaction_model: media_buy_seller
25
+ capabilities:
26
+ - sells_media
27
+ - accepts_briefs
28
+ - generates_proposals
29
+ examples:
30
+ - "Full-service publisher with proposal engine"
31
+ - "Retail media network with curated packages"
32
+
33
+ caller:
34
+ role: buyer_agent
35
+ example: "Pinnacle Agency (buyer)"
36
+
37
+ prerequisites:
38
+ description: |
39
+ The caller needs a brand identity and operator credentials. The seller must support
40
+ proposal generation (return proposals alongside products in get_products responses).
41
+ test_kit: "test-kits/acme-outdoor.yaml"
42
+
43
+ phases:
44
+ - id: setup
45
+ title: "Account setup"
46
+ steps:
47
+ - id: sync_accounts
48
+ title: "Establish account"
49
+ task: sync_accounts
50
+ schema_ref: "account/sync-accounts-request.json"
51
+ response_schema_ref: "account/sync-accounts-response.json"
52
+ doc_ref: "/accounts/tasks/sync_accounts"
53
+ stateful: true
54
+ expected: |
55
+ Return the account with account_id and status active.
56
+
57
+ sample_request:
58
+ accounts:
59
+ - brand:
60
+ domain: "acmeoutdoor.example"
61
+ operator: "pinnacle-agency.example"
62
+ billing: "operator"
63
+ payment_terms: "net_30"
64
+
65
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_setup_sync_accounts"
66
+ validations:
67
+ - check: response_schema
68
+ description: "Response matches sync-accounts-response.json schema"
69
+ - check: field_present
70
+ path: "accounts[0].account_id"
71
+ description: "Account has a platform-assigned ID"
72
+
73
+ - id: brief_with_proposals
74
+ title: "Brief with proposals"
75
+ narrative: |
76
+ Send a brief and receive proposals alongside products. Proposals are curated
77
+ media plans with budget allocations the buyer can review and refine.
78
+
79
+ steps:
80
+ - id: get_products_brief
81
+ title: "Send a brief and receive proposals"
82
+ task: get_products
83
+ schema_ref: "media-buy/get-products-request.json"
84
+ response_schema_ref: "media-buy/get-products-response.json"
85
+ doc_ref: "/media-buy/task-reference/get_products"
86
+ comply_scenario: full_sales_flow
87
+ stateful: false
88
+ expected: |
89
+ Return products and proposals matching the brief:
90
+ - products: individual products with pricing and forecasts
91
+ - proposals: curated media plans with proposal_id, budget_allocations, rationale
92
+
93
+ sample_request:
94
+ buying_mode: "brief"
95
+ brief: "Premium video and display across outdoor lifestyle and sports. Q2 flight, $50K budget. Adults 25-54, US and Canada."
96
+ account:
97
+ brand:
98
+ domain: "acmeoutdoor.example"
99
+ operator: "pinnacle-agency.example"
100
+
101
+ validations:
102
+ - check: response_schema
103
+ description: "Response matches get-products-response.json schema"
104
+ - check: field_present
105
+ path: "products"
106
+ description: "Response contains products"
107
+ - check: field_present
108
+ path: "proposals"
109
+ description: "Response contains proposals"
110
+ - check: field_present
111
+ path: "proposals[0].proposal_id"
112
+ description: "Proposals have IDs"
113
+
114
+ - id: refine_proposal
115
+ title: "Refine the proposal"
116
+ narrative: |
117
+ The buyer reviews the proposals and wants to adjust one. They call get_products in
118
+ refine mode targeting a specific proposal_id with changes. The seller applies the
119
+ refinements and returns the updated proposal.
120
+
121
+ steps:
122
+ - id: get_products_refine
123
+ title: "Refine a specific proposal"
124
+ task: get_products
125
+ schema_ref: "media-buy/get-products-request.json"
126
+ response_schema_ref: "media-buy/get-products-response.json"
127
+ doc_ref: "/media-buy/task-reference/get_products"
128
+ comply_scenario: full_sales_flow
129
+ stateful: true
130
+ expected: |
131
+ Return the refined proposal:
132
+ - proposals: updated proposal reflecting the requested changes
133
+ - refinement_applied: how each refinement was handled
134
+ - Updated budget allocations, product selections, and forecasts
135
+
136
+ sample_request:
137
+ buying_mode: "refine"
138
+ refine:
139
+ - scope: "proposal"
140
+ proposal_id: "balanced_reach_q2"
141
+ ask: "Shift 60% of budget to CTV. Drop the display product and redistribute that budget to video."
142
+ - scope: "request"
143
+ ask: "All products must support frequency capping at 3 per day."
144
+ account:
145
+ brand:
146
+ domain: "acmeoutdoor.example"
147
+ operator: "pinnacle-agency.example"
148
+
149
+ validations:
150
+ - check: response_schema
151
+ description: "Response matches get-products-response.json schema"
152
+ - check: field_present
153
+ path: "proposals"
154
+ description: "Response contains updated proposals"
155
+
156
+ - id: finalize_proposal
157
+ title: "Finalize the proposal"
158
+ narrative: |
159
+ The buyer is satisfied with the refined proposal and requests finalization. This
160
+ triggers the transition from draft (indicative pricing) to committed (firm pricing
161
+ with inventory hold). The seller may need time to process this — the buyer should
162
+ not set a time_budget to signal willingness to wait.
163
+
164
+ After finalization, the proposal has firm pricing and an expires_at timestamp.
165
+ The buyer must create the media buy before the hold expires.
166
+
167
+ steps:
168
+ - id: get_products_finalize
169
+ title: "Finalize the proposal"
170
+ task: get_products
171
+ schema_ref: "media-buy/get-products-request.json"
172
+ response_schema_ref: "media-buy/get-products-response.json"
173
+ doc_ref: "/media-buy/task-reference/get_products"
174
+ comply_scenario: full_sales_flow
175
+ stateful: true
176
+ expected: |
177
+ Return the finalized proposal with committed status:
178
+ - proposals[0].proposal_status: committed
179
+ - proposals[0].expires_at: timestamp for the inventory hold window
180
+ - Firm pricing (not indicative)
181
+ - The proposal is ready to accept via create_media_buy
182
+
183
+ sample_request:
184
+ buying_mode: "refine"
185
+ refine:
186
+ - scope: "proposal"
187
+ proposal_id: "balanced_reach_q2"
188
+ action: "finalize"
189
+ account:
190
+ brand:
191
+ domain: "acmeoutdoor.example"
192
+ operator: "pinnacle-agency.example"
193
+
194
+ validations:
195
+ - check: response_schema
196
+ description: "Response matches get-products-response.json schema"
197
+ - check: field_present
198
+ path: "proposals"
199
+ description: "Response contains the finalized proposal"
200
+
201
+ - id: accept_proposal
202
+ title: "Accept the committed proposal"
203
+ narrative: |
204
+ The buyer accepts the committed proposal by creating a media buy with the
205
+ proposal_id. The seller converts the proposal's product selections and budget
206
+ allocations into active packages.
207
+
208
+ steps:
209
+ - id: create_media_buy
210
+ title: "Create media buy from proposal"
211
+ task: create_media_buy
212
+ schema_ref: "media-buy/create-media-buy-request.json"
213
+ response_schema_ref: "media-buy/create-media-buy-response.json"
214
+ doc_ref: "/media-buy/task-reference/create_media_buy"
215
+ comply_scenario: create_media_buy
216
+ stateful: true
217
+ expected: |
218
+ Convert the committed proposal into an active media buy:
219
+ - media_buy_id: the seller's identifier
220
+ - status: active
221
+ - confirmed_at: timestamp
222
+ - packages: line items derived from the proposal's budget allocations
223
+ - proposal_id: echoed back to confirm which proposal was accepted
224
+
225
+ sample_request:
226
+ brand:
227
+ domain: "acmeoutdoor.example"
228
+ account:
229
+ brand:
230
+ domain: "acmeoutdoor.example"
231
+ operator: "pinnacle-agency.example"
232
+ sandbox: true
233
+ proposal_id: "balanced_reach_q2"
234
+ total_budget:
235
+ amount: 50000
236
+ currency: "USD"
237
+ start_time: "2026-04-01T00:00:00Z"
238
+ end_time: "2026-06-30T23:59:59Z"
239
+
240
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_accept_proposal_create_media_buy"
241
+ validations:
242
+ - check: response_schema
243
+ description: "Response matches create-media-buy-response.json schema"
@@ -0,0 +1,148 @@
1
+ id: media_buy_seller/refine_products
2
+ version: "1.0.0"
3
+ title: "Seller handles product refinement"
4
+ category: media_buy_seller
5
+ summary: "Verifies that a media buy seller supports buying_mode: refine with product-level and request-level changes."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+
10
+ narrative: |
11
+ After a buyer receives products from a brief, they refine the results without starting
12
+ over. The buyer calls get_products with buying_mode: refine and a refine array describing
13
+ changes at the request level ("only guaranteed") or product level ("increase this product's
14
+ budget").
15
+
16
+ The seller must apply each refinement, return updated products, and include
17
+ refinement_applied showing how each request was handled. This is the standard negotiation
18
+ loop — brief, review, refine, repeat until satisfied.
19
+
20
+ Every media buy seller that supports negotiation (not just wholesale) must handle
21
+ product-level refinement.
22
+
23
+ agent:
24
+ interaction_model: media_buy_seller
25
+ capabilities:
26
+ - sells_media
27
+ - accepts_briefs
28
+ examples:
29
+ - "Any media buy seller that accepts briefs"
30
+
31
+ caller:
32
+ role: buyer_agent
33
+ example: "Pinnacle Agency (buyer)"
34
+
35
+ prerequisites:
36
+ description: |
37
+ The caller needs a brand identity and operator credentials.
38
+ test_kit: "test-kits/acme-outdoor.yaml"
39
+
40
+ phases:
41
+ - id: setup
42
+ title: "Account setup"
43
+ steps:
44
+ - id: sync_accounts
45
+ title: "Establish account"
46
+ task: sync_accounts
47
+ schema_ref: "account/sync-accounts-request.json"
48
+ response_schema_ref: "account/sync-accounts-response.json"
49
+ doc_ref: "/accounts/tasks/sync_accounts"
50
+ stateful: true
51
+ expected: |
52
+ Return the account with account_id and status active.
53
+
54
+ sample_request:
55
+ accounts:
56
+ - brand:
57
+ domain: "acmeoutdoor.example"
58
+ operator: "pinnacle-agency.example"
59
+ billing: "operator"
60
+ payment_terms: "net_30"
61
+
62
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_refine_products_setup_sync_accounts"
63
+ validations:
64
+ - check: response_schema
65
+ description: "Response matches sync-accounts-response.json schema"
66
+ - check: field_present
67
+ path: "accounts[0].account_id"
68
+ description: "Account has a platform-assigned ID"
69
+
70
+ - id: brief
71
+ title: "Initial brief"
72
+ narrative: |
73
+ Send a brief to get the initial product set that the buyer will refine.
74
+
75
+ steps:
76
+ - id: get_products_brief
77
+ title: "Send a brief"
78
+ task: get_products
79
+ schema_ref: "media-buy/get-products-request.json"
80
+ response_schema_ref: "media-buy/get-products-response.json"
81
+ doc_ref: "/media-buy/task-reference/get_products"
82
+ comply_scenario: full_sales_flow
83
+ stateful: false
84
+ expected: |
85
+ Return products matching the brief. Each product should include product_id,
86
+ delivery_type, pricing_models, and forecast.
87
+
88
+ sample_request:
89
+ buying_mode: "brief"
90
+ brief: "Premium video and display on sports and outdoor lifestyle. Q2 flight, $50K budget. Adults 25-54, US and Canada."
91
+ account:
92
+ brand:
93
+ domain: "acmeoutdoor.example"
94
+ operator: "pinnacle-agency.example"
95
+
96
+ validations:
97
+ - check: response_schema
98
+ description: "Response matches get-products-response.json schema"
99
+ - check: field_present
100
+ path: "products"
101
+ description: "Response contains products"
102
+ - check: field_present
103
+ path: "products[0].product_id"
104
+ description: "Products have IDs"
105
+
106
+ - id: refine
107
+ title: "Refine products"
108
+ narrative: |
109
+ The buyer has reviewed the initial products and wants to narrow down. They call
110
+ get_products with buying_mode: refine and a refine array with request-level and
111
+ product-level changes. The seller applies each refinement and returns the updated
112
+ product set.
113
+
114
+ steps:
115
+ - id: get_products_refine
116
+ title: "Refine with request-level and product-level changes"
117
+ task: get_products
118
+ schema_ref: "media-buy/get-products-request.json"
119
+ response_schema_ref: "media-buy/get-products-response.json"
120
+ doc_ref: "/media-buy/task-reference/get_products"
121
+ comply_scenario: full_sales_flow
122
+ stateful: true
123
+ expected: |
124
+ Return updated products reflecting the refinements:
125
+ - Apply each refinement to the relevant scope (request or product)
126
+ - Include refinement_applied showing how each request was handled
127
+ - Preserve products that weren't targeted by refinements
128
+ - Update pricing and forecasts to reflect the changes
129
+
130
+ sample_request:
131
+ buying_mode: "refine"
132
+ refine:
133
+ - scope: "request"
134
+ ask: "Only guaranteed packages. Must include completion rate SLA above 80%."
135
+ - scope: "product"
136
+ product_id: "sports_preroll_q2"
137
+ ask: "Increase budget allocation to $30K"
138
+ account:
139
+ brand:
140
+ domain: "acmeoutdoor.example"
141
+ operator: "pinnacle-agency.example"
142
+
143
+ validations:
144
+ - check: response_schema
145
+ description: "Response matches get-products-response.json schema"
146
+ - check: field_present
147
+ path: "products"
148
+ description: "Response contains updated products"