@adcp/sdk 6.9.0 → 6.11.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 (261) 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/decisioning/async-outcome.d.ts +17 -0
  191. package/dist/lib/server/decisioning/async-outcome.d.ts.map +1 -1
  192. package/dist/lib/server/decisioning/async-outcome.js +23 -18
  193. package/dist/lib/server/decisioning/async-outcome.js.map +1 -1
  194. package/dist/lib/server/decisioning/context.d.ts +8 -2
  195. package/dist/lib/server/decisioning/context.d.ts.map +1 -1
  196. package/dist/lib/server/decisioning/index.d.ts +1 -0
  197. package/dist/lib/server/decisioning/index.d.ts.map +1 -1
  198. package/dist/lib/server/decisioning/index.js.map +1 -1
  199. package/dist/lib/server/decisioning/runtime/from-platform.js +6 -4
  200. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  201. package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts.map +1 -1
  202. package/dist/lib/server/decisioning/runtime/postgres-task-registry.js +5 -2
  203. package/dist/lib/server/decisioning/runtime/postgres-task-registry.js.map +1 -1
  204. package/dist/lib/server/decisioning/runtime/task-registry.d.ts +5 -0
  205. package/dist/lib/server/decisioning/runtime/task-registry.d.ts.map +1 -1
  206. package/dist/lib/server/decisioning/runtime/task-registry.js +4 -1
  207. package/dist/lib/server/decisioning/runtime/task-registry.js.map +1 -1
  208. package/dist/lib/server/decisioning/runtime/to-context.d.ts.map +1 -1
  209. package/dist/lib/server/decisioning/runtime/to-context.js +10 -2
  210. package/dist/lib/server/decisioning/runtime/to-context.js.map +1 -1
  211. package/dist/lib/server/dynamic-registry.d.ts +219 -0
  212. package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
  213. package/dist/lib/server/dynamic-registry.js +245 -0
  214. package/dist/lib/server/dynamic-registry.js.map +1 -0
  215. package/dist/lib/server/index.d.ts +8 -0
  216. package/dist/lib/server/index.d.ts.map +1 -1
  217. package/dist/lib/server/index.js +15 -4
  218. package/dist/lib/server/index.js.map +1 -1
  219. package/dist/lib/server/operational-platform.d.ts +239 -0
  220. package/dist/lib/server/operational-platform.d.ts.map +1 -0
  221. package/dist/lib/server/operational-platform.js +94 -0
  222. package/dist/lib/server/operational-platform.js.map +1 -0
  223. package/dist/lib/server/test-controller.d.ts +2 -0
  224. package/dist/lib/server/test-controller.d.ts.map +1 -1
  225. package/dist/lib/server/test-controller.js +6 -11
  226. package/dist/lib/server/test-controller.js.map +1 -1
  227. package/dist/lib/server/wire-safe.d.ts +211 -0
  228. package/dist/lib/server/wire-safe.d.ts.map +1 -0
  229. package/dist/lib/server/wire-safe.js +231 -0
  230. package/dist/lib/server/wire-safe.js.map +1 -0
  231. package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
  232. package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
  233. package/dist/lib/server/wire-spec-fields.generated.js +172 -0
  234. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
  235. package/dist/lib/testing/compliance/index.d.ts +2 -0
  236. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  237. package/dist/lib/testing/compliance/index.js +6 -1
  238. package/dist/lib/testing/compliance/index.js.map +1 -1
  239. package/dist/lib/testing/compliance/summary.d.ts +77 -0
  240. package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
  241. package/dist/lib/testing/compliance/summary.js +176 -0
  242. package/dist/lib/testing/compliance/summary.js.map +1 -0
  243. package/dist/lib/testing/comply-controller.d.ts +2 -0
  244. package/dist/lib/testing/comply-controller.d.ts.map +1 -1
  245. package/dist/lib/testing/comply-controller.js.map +1 -1
  246. package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
  247. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  248. package/dist/lib/testing/storyboard/compliance.js +51 -0
  249. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  250. package/dist/lib/testing/storyboard/index.d.ts +2 -2
  251. package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
  252. package/dist/lib/testing/storyboard/index.js +4 -2
  253. package/dist/lib/testing/storyboard/index.js.map +1 -1
  254. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  255. package/dist/lib/testing/storyboard/runner.js +58 -5
  256. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  257. package/dist/lib/version.d.ts +3 -3
  258. package/dist/lib/version.d.ts.map +1 -1
  259. package/dist/lib/version.js +3 -3
  260. package/dist/lib/version.js.map +1 -1
  261. package/package.json +2 -2
@@ -0,0 +1,1343 @@
1
+ id: deterministic_testing
2
+ version: '1.0.0'
3
+ title: 'Deterministic testing'
4
+ category: core
5
+ summary: 'Uses comply_test_controller to force state transitions and simulate delivery/budget, verifying state machines and reporting.'
6
+ track: core
7
+ required_tools:
8
+ - comply_test_controller
9
+ platform_types:
10
+ - display_ad_server
11
+ - video_ad_server
12
+ - social_platform
13
+ - retail_media
14
+ - search_platform
15
+ - audio_platform
16
+ - linear_tv_platform
17
+ - dsp
18
+ - pmax_platform
19
+ - ai_ad_network
20
+ - ai_platform
21
+ - generative_dsp
22
+
23
+ narrative: |
24
+ Sellers that implement the comply_test_controller tool enable deterministic compliance
25
+ testing. The controller forces server-side state transitions without relying on real
26
+ async workflows, letting the test harness verify state machine behavior, operation
27
+ gating, and reporting accuracy.
28
+
29
+ This storyboard covers the full controller surface: scenario listing, account state
30
+ machines, media buy lifecycle, creative status transitions, SI session management,
31
+ delivery simulation, and budget spend simulation.
32
+
33
+ agent:
34
+ interaction_model: media_buy_seller
35
+ capabilities:
36
+ - sells_media
37
+ - supports_test_controller
38
+ examples:
39
+ - 'Any seller with comply_test_controller'
40
+
41
+ caller:
42
+ role: buyer_agent
43
+ example: 'Comply test harness'
44
+
45
+ prerequisites:
46
+ description: |
47
+ The seller must expose the comply_test_controller tool. The controller is detected
48
+ via list_scenarios before any state transitions are attempted. Phases that require
49
+ specific scenarios are skipped if the controller does not support them.
50
+ test_kit: 'test-kits/acme-outdoor.yaml'
51
+
52
+ phases:
53
+ - id: capability_discovery
54
+ title: "Capability discovery"
55
+ narrative: |
56
+ The buyer calls get_adcp_capabilities to confirm the agent supports media buying before running deterministic test scenarios.
57
+
58
+ steps:
59
+ - id: get_capabilities
60
+ title: "Check agent capabilities"
61
+ narrative: |
62
+ Verify that the agent declares the expected protocol support before
63
+ proceeding with domain-specific operations.
64
+ task: get_adcp_capabilities
65
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
66
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
67
+ doc_ref: "/protocol/get_adcp_capabilities"
68
+ comply_scenario: capability_discovery
69
+ stateful: false
70
+ expected: |
71
+ Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
72
+ sample_request:
73
+ context:
74
+ correlation_id: "deterministic_testing--get_capabilities"
75
+ validations:
76
+ - check: response_schema
77
+ description: "Response matches get-adcp-capabilities-response.json schema"
78
+ - check: field_present
79
+ path: "supported_protocols"
80
+ description: "Agent declares supported protocols"
81
+
82
+ - check: field_present
83
+ path: "context"
84
+ description: "Response echoes back the context object"
85
+ - check: field_value
86
+ path: "context.correlation_id"
87
+ value: "deterministic_testing--get_capabilities"
88
+ description: "Context correlation_id returned unchanged"
89
+ - id: controller_validation
90
+ title: 'Controller validation'
91
+ narrative: |
92
+ Validates that the comply_test_controller is functional and responds correctly
93
+ to scenario discovery, unknown scenarios, missing parameters, and nonexistent
94
+ entity references.
95
+
96
+ steps:
97
+ - id: list_scenarios
98
+ title: 'List supported scenarios'
99
+ requires_tool: comply_test_controller
100
+ narrative: |
101
+ Call the controller with scenario: list_scenarios to discover which
102
+ force_* and simulate_* scenarios the seller supports.
103
+ task: comply_test_controller
104
+ comply_scenario: controller_validation
105
+ stateful: false
106
+ context_outputs:
107
+ - name: supported_scenarios
108
+ path: 'scenarios'
109
+ expected: |
110
+ Return a list of supported scenarios. The response should include:
111
+ - success: true
112
+ - scenarios: array or object of scenario names
113
+
114
+ sample_request:
115
+ scenario: 'list_scenarios'
116
+
117
+ context:
118
+ correlation_id: "deterministic_testing--list_scenarios"
119
+ validations:
120
+ - check: field_present
121
+ path: 'scenarios'
122
+ description: 'Controller returns supported scenarios'
123
+ - check: field_value
124
+ path: 'success'
125
+ allowed_values:
126
+ - true
127
+ description: 'list_scenarios succeeds'
128
+
129
+ - check: field_present
130
+ path: "context"
131
+ description: "Response echoes back the context object"
132
+ - check: field_value
133
+ path: "context.correlation_id"
134
+ value: "deterministic_testing--list_scenarios"
135
+ description: "Context correlation_id returned unchanged"
136
+ - id: unknown_scenario
137
+ title: 'Unknown scenario returns error'
138
+ requires_tool: comply_test_controller
139
+ narrative: |
140
+ Send a nonexistent scenario name. The controller should return
141
+ UNKNOWN_SCENARIO error code.
142
+ task: comply_test_controller
143
+ comply_scenario: controller_validation
144
+ stateful: false
145
+ expect_error: true
146
+ negative_path: schema_invalid
147
+ expected: |
148
+ Return an error response with:
149
+ - success: false
150
+ - error: UNKNOWN_SCENARIO
151
+
152
+ sample_request:
153
+ scenario: 'nonexistent_scenario'
154
+ params: {}
155
+
156
+ context:
157
+ correlation_id: "deterministic_testing--unknown_scenario"
158
+ validations:
159
+ - check: field_value
160
+ path: 'success'
161
+ allowed_values:
162
+ - false
163
+ description: 'Unknown scenario fails'
164
+ - check: field_value
165
+ path: 'error'
166
+ allowed_values:
167
+ - 'UNKNOWN_SCENARIO'
168
+ description: 'Error code is UNKNOWN_SCENARIO'
169
+
170
+ - check: field_present
171
+ path: "context"
172
+ description: "Response echoes back the context object"
173
+ - check: field_value
174
+ path: "context.correlation_id"
175
+ value: "deterministic_testing--unknown_scenario"
176
+ description: "Context correlation_id returned unchanged"
177
+ - id: missing_params
178
+ title: 'Missing params returns error'
179
+ requires_tool: comply_test_controller
180
+ narrative: |
181
+ Call force_creative_status with empty params. The controller should
182
+ return INVALID_PARAMS error code.
183
+ task: comply_test_controller
184
+ comply_scenario: controller_validation
185
+ stateful: false
186
+ expect_error: true
187
+ negative_path: schema_invalid
188
+ expected: |
189
+ Return an error response with:
190
+ - success: false
191
+ - error: INVALID_PARAMS
192
+
193
+ sample_request:
194
+ scenario: 'force_creative_status'
195
+ params: {}
196
+
197
+ context:
198
+ correlation_id: "deterministic_testing--missing_params"
199
+ validations:
200
+ - check: field_value
201
+ path: 'success'
202
+ allowed_values:
203
+ - false
204
+ description: 'Missing params fails'
205
+ - check: field_value
206
+ path: 'error'
207
+ allowed_values:
208
+ - 'INVALID_PARAMS'
209
+ description: 'Error code is INVALID_PARAMS'
210
+
211
+ - check: field_present
212
+ path: "context"
213
+ description: "Response echoes back the context object"
214
+ - check: field_value
215
+ path: "context.correlation_id"
216
+ value: "deterministic_testing--missing_params"
217
+ description: "Context correlation_id returned unchanged"
218
+ - id: not_found_entity
219
+ title: 'Nonexistent entity returns NOT_FOUND'
220
+ requires_tool: comply_test_controller
221
+ narrative: |
222
+ Call force_creative_status with a nonexistent creative_id. The controller
223
+ should return NOT_FOUND error code.
224
+ task: comply_test_controller
225
+ comply_scenario: controller_validation
226
+ stateful: false
227
+ expect_error: true
228
+ negative_path: payload_well_formed
229
+ expected: |
230
+ Return an error response with:
231
+ - success: false
232
+ - error: NOT_FOUND
233
+
234
+ sample_request:
235
+ scenario: 'force_creative_status'
236
+ params:
237
+ creative_id: 'comply-test-nonexistent-000000000000'
238
+ status: 'approved'
239
+
240
+ context:
241
+ correlation_id: "deterministic_testing--not_found_entity"
242
+ validations:
243
+ - check: field_value
244
+ path: 'success'
245
+ allowed_values:
246
+ - false
247
+ description: 'Nonexistent entity fails'
248
+ - check: field_value
249
+ path: 'error'
250
+ allowed_values:
251
+ - 'NOT_FOUND'
252
+ description: 'Error code is NOT_FOUND'
253
+
254
+ - check: field_present
255
+ path: "context"
256
+ description: "Response echoes back the context object"
257
+ - check: field_value
258
+ path: "context.correlation_id"
259
+ value: "deterministic_testing--not_found_entity"
260
+ description: "Context correlation_id returned unchanged"
261
+ - id: deterministic_account
262
+ title: 'Deterministic account state machine'
263
+ narrative: |
264
+ Forces account status transitions via the controller and verifies them through
265
+ list_accounts. Tests suspension gating (operations blocked when suspended),
266
+ payment_required state, and reactivation.
267
+
268
+ steps:
269
+ - id: sync_accounts_for_state
270
+ title: 'Create sandbox account for state machine test'
271
+ requires_tool: comply_test_controller
272
+ narrative: |
273
+ Sync a sandbox account so the state machine has an entity to
274
+ force transitions on.
275
+ task: sync_accounts
276
+ schema_ref: 'account/sync-accounts-request.json'
277
+ response_schema_ref: 'account/sync-accounts-response.json'
278
+ comply_scenario: deterministic_account
279
+ stateful: true
280
+
281
+ sample_request:
282
+ accounts:
283
+ - brand:
284
+ domain: 'test.example'
285
+ operator: 'test.example'
286
+ billing: 'operator'
287
+ sandbox: true
288
+
289
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_account_sync_accounts_for_state"
290
+ context:
291
+ correlation_id: "deterministic_testing--sync_accounts_for_state"
292
+ validations:
293
+ - check: field_present
294
+ path: 'accounts[0].account_id'
295
+ description: 'Account sync returns account_id'
296
+
297
+ - check: field_present
298
+ path: "context"
299
+ description: "Response echoes back the context object"
300
+ - check: field_value
301
+ path: "context.correlation_id"
302
+ value: "deterministic_testing--sync_accounts_for_state"
303
+ description: "Context correlation_id returned unchanged"
304
+ - id: list_accounts_for_state
305
+ title: 'Find account for state machine test'
306
+ requires_tool: comply_test_controller
307
+ narrative: |
308
+ List accounts to find an active account for state transitions.
309
+ task: list_accounts
310
+ comply_scenario: deterministic_account
311
+ stateful: false
312
+ context_outputs:
313
+ - name: account_id
314
+ path: 'accounts[0].account_id'
315
+ expected: |
316
+ Return at least one account with an account_id.
317
+
318
+ sample_request:
319
+ context:
320
+ correlation_id: "deterministic_testing--list_accounts_for_state"
321
+
322
+ validations:
323
+ - check: field_present
324
+ path: 'accounts[0].account_id'
325
+ description: 'At least one account exists'
326
+
327
+ - check: field_present
328
+ path: "context"
329
+ description: "Response echoes back the context object"
330
+ - check: field_value
331
+ path: "context.correlation_id"
332
+ value: "deterministic_testing--list_accounts_for_state"
333
+ description: "Context correlation_id returned unchanged"
334
+ - id: force_account_suspended
335
+ title: 'Force account to suspended'
336
+ requires_tool: comply_test_controller
337
+ narrative: |
338
+ Use the controller to force the account into suspended state. Operations
339
+ like create_media_buy should be blocked while the account is suspended.
340
+ task: comply_test_controller
341
+ comply_scenario: deterministic_account
342
+ stateful: true
343
+ expected: |
344
+ Return a successful state transition:
345
+ - success: true
346
+ - previous_state: the account's prior status
347
+ - current_state: suspended
348
+
349
+ sample_request:
350
+ scenario: 'force_account_status'
351
+ params:
352
+ account_id: '$context.account_id'
353
+ status: 'suspended'
354
+
355
+ context:
356
+ correlation_id: "deterministic_testing--force_account_suspended"
357
+ validations:
358
+ - check: field_value
359
+ path: 'success'
360
+ allowed_values:
361
+ - true
362
+ description: 'Account suspension succeeds'
363
+ - check: field_value
364
+ path: 'current_state'
365
+ allowed_values:
366
+ - 'suspended'
367
+ description: 'Account is now suspended'
368
+
369
+ - check: field_present
370
+ path: "context"
371
+ description: "Response echoes back the context object"
372
+ - check: field_value
373
+ path: "context.correlation_id"
374
+ value: "deterministic_testing--force_account_suspended"
375
+ description: "Context correlation_id returned unchanged"
376
+ - id: force_account_active
377
+ title: 'Reactivate account'
378
+ requires_tool: comply_test_controller
379
+ narrative: |
380
+ Restore the account to active state. Verify the transition from suspended
381
+ back to active succeeds.
382
+ task: comply_test_controller
383
+ comply_scenario: deterministic_account
384
+ stateful: true
385
+ expected: |
386
+ Return a successful state transition:
387
+ - success: true
388
+ - previous_state: suspended
389
+ - current_state: active
390
+
391
+ sample_request:
392
+ scenario: 'force_account_status'
393
+ params:
394
+ account_id: '$context.account_id'
395
+ status: 'active'
396
+
397
+ context:
398
+ correlation_id: "deterministic_testing--force_account_active"
399
+ validations:
400
+ - check: field_value
401
+ path: 'success'
402
+ allowed_values:
403
+ - true
404
+ description: 'Account reactivation succeeds'
405
+ - check: field_value
406
+ path: 'current_state'
407
+ allowed_values:
408
+ - 'active'
409
+ description: 'Account is now active'
410
+
411
+ - check: field_present
412
+ path: "context"
413
+ description: "Response echoes back the context object"
414
+ - check: field_value
415
+ path: "context.correlation_id"
416
+ value: "deterministic_testing--force_account_active"
417
+ description: "Context correlation_id returned unchanged"
418
+ - id: force_account_payment_required
419
+ title: 'Force account to payment_required'
420
+ requires_tool: comply_test_controller
421
+ narrative: |
422
+ Force the account into payment_required state. This tests a distinct
423
+ non-terminal blocked state.
424
+ task: comply_test_controller
425
+ comply_scenario: deterministic_account
426
+ stateful: true
427
+ expected: |
428
+ Return a successful state transition to payment_required.
429
+
430
+ sample_request:
431
+ scenario: 'force_account_status'
432
+ params:
433
+ account_id: '$context.account_id'
434
+ status: 'payment_required'
435
+
436
+ context:
437
+ correlation_id: "deterministic_testing--force_account_payment_required"
438
+ validations:
439
+ - check: field_value
440
+ path: 'success'
441
+ allowed_values:
442
+ - true
443
+ description: 'Transition to payment_required succeeds'
444
+
445
+ - check: field_present
446
+ path: "context"
447
+ description: "Response echoes back the context object"
448
+ - check: field_value
449
+ path: "context.correlation_id"
450
+ value: "deterministic_testing--force_account_payment_required"
451
+ description: "Context correlation_id returned unchanged"
452
+ - id: restore_account_active
453
+ title: 'Restore account to active'
454
+ requires_tool: comply_test_controller
455
+ narrative: |
456
+ Restore the account to active state after the payment_required test.
457
+ task: comply_test_controller
458
+ comply_scenario: deterministic_account
459
+ stateful: true
460
+ expected: |
461
+ Account restored to active state.
462
+
463
+ sample_request:
464
+ scenario: 'force_account_status'
465
+ params:
466
+ account_id: '$context.account_id'
467
+ status: 'active'
468
+
469
+ context:
470
+ correlation_id: "deterministic_testing--restore_account_active"
471
+ validations:
472
+ - check: field_value
473
+ path: 'success'
474
+ allowed_values:
475
+ - true
476
+ description: 'Account restored to active'
477
+
478
+ - check: field_present
479
+ path: "context"
480
+ description: "Response echoes back the context object"
481
+ - check: field_value
482
+ path: "context.correlation_id"
483
+ value: "deterministic_testing--restore_account_active"
484
+ description: "Context correlation_id returned unchanged"
485
+ - id: deterministic_media_buy
486
+ title: 'Deterministic media buy state machine'
487
+ narrative: |
488
+ Creates a media buy through the normal flow, then uses the controller to force
489
+ it through status transitions: active, completed (terminal). Verifies that
490
+ terminal states reject further transitions.
491
+
492
+ steps:
493
+ - id: create_media_buy
494
+ title: 'Create media buy for state machine test'
495
+ requires_tool: comply_test_controller
496
+ narrative: |
497
+ Create a media buy through the standard create_media_buy task. The resulting
498
+ media_buy_id is used for controller-driven state transitions.
499
+ task: create_media_buy
500
+ schema_ref: 'media-buy/create-media-buy-request.json'
501
+ response_schema_ref: 'media-buy/create-media-buy-response.json'
502
+ doc_ref: '/media-buy/task-reference/create_media_buy'
503
+ comply_scenario: deterministic_media_buy
504
+ stateful: true
505
+ context_outputs:
506
+ - name: media_buy_id
507
+ path: 'media_buy_id'
508
+ expected: |
509
+ Create a media buy and return a media_buy_id for state machine testing.
510
+
511
+ sample_request:
512
+ account:
513
+ brand:
514
+ domain: 'acmeoutdoor.example'
515
+ operator: 'pinnacle-agency.example'
516
+ brand:
517
+ domain: 'acmeoutdoor.example'
518
+ start_time: '2026-04-01T00:00:00Z'
519
+ end_time: '2026-06-30T23:59:59Z'
520
+ packages:
521
+ - product_id: 'test-product'
522
+ budget: 5000
523
+ pricing_option_id: 'test-pricing'
524
+
525
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_media_buy_create_media_buy"
526
+ context:
527
+ correlation_id: "deterministic_testing--create_media_buy"
528
+ validations:
529
+ - check: response_schema
530
+ description: 'Response matches create-media-buy-response.json schema'
531
+
532
+ - check: field_present
533
+ path: "context"
534
+ description: "Response echoes back the context object"
535
+ - check: field_value
536
+ path: "context.correlation_id"
537
+ value: "deterministic_testing--create_media_buy"
538
+ description: "Context correlation_id returned unchanged"
539
+ - id: force_media_buy_active
540
+ title: 'Force media buy to active'
541
+ requires_tool: comply_test_controller
542
+ narrative: |
543
+ Use the controller to force the media buy into active state.
544
+ task: comply_test_controller
545
+ comply_scenario: deterministic_media_buy
546
+ stateful: true
547
+ expected: |
548
+ Return a successful state transition to active.
549
+
550
+ sample_request:
551
+ brand:
552
+ domain: 'acmeoutdoor.example'
553
+ scenario: 'force_media_buy_status'
554
+ params:
555
+ media_buy_id: '$context.media_buy_id'
556
+ status: 'active'
557
+
558
+ context:
559
+ correlation_id: "deterministic_testing--force_media_buy_active"
560
+ validations:
561
+ - check: field_value
562
+ path: 'success'
563
+ allowed_values:
564
+ - true
565
+ description: 'Media buy activation succeeds'
566
+ - check: field_value
567
+ path: 'current_state'
568
+ allowed_values:
569
+ - 'active'
570
+ description: 'Media buy is now active'
571
+
572
+ - check: field_present
573
+ path: "context"
574
+ description: "Response echoes back the context object"
575
+ - check: field_value
576
+ path: "context.correlation_id"
577
+ value: "deterministic_testing--force_media_buy_active"
578
+ description: "Context correlation_id returned unchanged"
579
+ - id: verify_media_buy_active
580
+ title: 'Verify media buy status via get_media_buys'
581
+ requires_tool: comply_test_controller
582
+ narrative: |
583
+ Call get_media_buys to confirm the controller-forced status is reflected
584
+ in the standard API.
585
+ task: get_media_buys
586
+ schema_ref: 'media-buy/get-media-buys-request.json'
587
+ response_schema_ref: 'media-buy/get-media-buys-response.json'
588
+ doc_ref: '/media-buy/task-reference/get_media_buys'
589
+ comply_scenario: deterministic_media_buy
590
+ stateful: true
591
+ expected: |
592
+ Return the media buy with status: active.
593
+
594
+ sample_request:
595
+ account:
596
+ brand:
597
+ domain: 'acmeoutdoor.example'
598
+ operator: 'pinnacle-agency.example'
599
+ media_buy_ids:
600
+ - '$context.media_buy_id'
601
+
602
+ context:
603
+ correlation_id: "deterministic_testing--verify_media_buy_active"
604
+ validations:
605
+ - check: response_schema
606
+ description: 'Response matches get-media-buys-response.json schema'
607
+ - check: field_present
608
+ path: 'media_buys[0].status'
609
+ description: 'Media buy has a status field'
610
+
611
+ - check: field_present
612
+ path: "context"
613
+ description: "Response echoes back the context object"
614
+ - check: field_value
615
+ path: "context.correlation_id"
616
+ value: "deterministic_testing--verify_media_buy_active"
617
+ description: "Context correlation_id returned unchanged"
618
+ - id: force_media_buy_completed
619
+ title: 'Force media buy to completed (terminal)'
620
+ requires_tool: comply_test_controller
621
+ narrative: |
622
+ Force the media buy to completed, a terminal state. No further transitions
623
+ should be allowed.
624
+ task: comply_test_controller
625
+ comply_scenario: deterministic_media_buy
626
+ stateful: true
627
+ expected: |
628
+ Return a successful transition to completed.
629
+
630
+ sample_request:
631
+ brand:
632
+ domain: 'acmeoutdoor.example'
633
+ scenario: 'force_media_buy_status'
634
+ params:
635
+ media_buy_id: '$context.media_buy_id'
636
+ status: 'completed'
637
+
638
+ context:
639
+ correlation_id: "deterministic_testing--force_media_buy_completed"
640
+ validations:
641
+ - check: field_value
642
+ path: 'success'
643
+ allowed_values:
644
+ - true
645
+ description: 'Transition to completed succeeds'
646
+ - check: field_value
647
+ path: 'current_state'
648
+ allowed_values:
649
+ - 'completed'
650
+ description: 'Media buy is now completed'
651
+
652
+ - check: field_present
653
+ path: "context"
654
+ description: "Response echoes back the context object"
655
+ - check: field_value
656
+ path: "context.correlation_id"
657
+ value: "deterministic_testing--force_media_buy_completed"
658
+ description: "Context correlation_id returned unchanged"
659
+ - id: invalid_transition_from_terminal
660
+ title: 'Reject transition from terminal state'
661
+ requires_tool: comply_test_controller
662
+ narrative: |
663
+ Attempt to force the completed media buy back to active. The controller
664
+ should reject this with INVALID_TRANSITION.
665
+ task: comply_test_controller
666
+ comply_scenario: deterministic_media_buy
667
+ stateful: true
668
+ expect_error: true
669
+ negative_path: payload_well_formed
670
+ expected: |
671
+ Return an error response:
672
+ - success: false
673
+ - error: INVALID_TRANSITION
674
+
675
+ sample_request:
676
+ brand:
677
+ domain: 'acmeoutdoor.example'
678
+ scenario: 'force_media_buy_status'
679
+ params:
680
+ media_buy_id: '$context.media_buy_id'
681
+ status: 'active'
682
+
683
+ context:
684
+ correlation_id: "deterministic_testing--invalid_transition_from_terminal"
685
+ validations:
686
+ - check: field_value
687
+ path: 'success'
688
+ allowed_values:
689
+ - false
690
+ description: 'Terminal state rejects transition'
691
+ - check: field_value
692
+ path: 'error'
693
+ allowed_values:
694
+ - 'INVALID_TRANSITION'
695
+ description: 'Error code is INVALID_TRANSITION'
696
+
697
+ - check: field_present
698
+ path: "context"
699
+ description: "Response echoes back the context object"
700
+ - check: field_value
701
+ path: "context.correlation_id"
702
+ value: "deterministic_testing--invalid_transition_from_terminal"
703
+ description: "Context correlation_id returned unchanged"
704
+ - id: deterministic_creative
705
+ title: 'Deterministic creative state machine'
706
+ narrative: |
707
+ Syncs a creative, then uses the controller to force it through status
708
+ transitions: approved, archived (terminal). Verifies terminal state rejection
709
+ and rejection with reason.
710
+
711
+ steps:
712
+ - id: sync_creative_for_state
713
+ title: 'Sync creative for state machine test'
714
+ requires_tool: comply_test_controller
715
+ narrative: |
716
+ Push a test creative via sync_creatives. The creative_id is captured
717
+ for controller-driven transitions.
718
+ task: sync_creatives
719
+ schema_ref: 'creative/sync-creatives-request.json'
720
+ response_schema_ref: 'creative/sync-creatives-response.json'
721
+ doc_ref: '/creative/task-reference/sync_creatives'
722
+ comply_scenario: deterministic_creative
723
+ stateful: true
724
+ context_outputs:
725
+ - name: creative_id
726
+ path: 'creatives[0].creative_id'
727
+ expected: |
728
+ Accept the creative and return a creative_id for state machine testing.
729
+
730
+ sample_request:
731
+ account:
732
+ brand:
733
+ domain: 'acmeoutdoor.example'
734
+ operator: 'pinnacle-agency.example'
735
+ creatives:
736
+ - creative_id: 'comply-state-test-creative'
737
+ name: 'Comply State Test Creative'
738
+ format_id:
739
+ agent_url: 'https://your-platform.example.com'
740
+ id: 'display_300x250'
741
+ assets:
742
+ image:
743
+ asset_type: 'image'
744
+ url: 'https://via.placeholder.com/300x250'
745
+ width: 300
746
+ height: 250
747
+ mime_type: 'image/png'
748
+
749
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_creative_sync_creative_for_state"
750
+ context:
751
+ correlation_id: "deterministic_testing--sync_creative_for_state"
752
+ validations:
753
+ - check: response_schema
754
+ description: 'Response matches sync-creatives-response.json schema'
755
+
756
+ - check: field_present
757
+ path: "context"
758
+ description: "Response echoes back the context object"
759
+ - check: field_value
760
+ path: "context.correlation_id"
761
+ value: "deterministic_testing--sync_creative_for_state"
762
+ description: "Context correlation_id returned unchanged"
763
+ - id: force_creative_approved
764
+ title: 'Force creative to approved'
765
+ requires_tool: comply_test_controller
766
+ narrative: |
767
+ Use the controller to force the creative into approved state.
768
+ task: comply_test_controller
769
+ comply_scenario: deterministic_creative
770
+ stateful: true
771
+ expected: |
772
+ Successful transition to approved.
773
+
774
+ sample_request:
775
+ brand:
776
+ domain: 'acmeoutdoor.example'
777
+ scenario: 'force_creative_status'
778
+ params:
779
+ creative_id: '$context.creative_id'
780
+ status: 'approved'
781
+
782
+ context:
783
+ correlation_id: "deterministic_testing--force_creative_approved"
784
+ validations:
785
+ - check: field_value
786
+ path: 'success'
787
+ allowed_values:
788
+ - true
789
+ description: 'Creative approval succeeds'
790
+ - check: field_value
791
+ path: 'current_state'
792
+ allowed_values:
793
+ - 'approved'
794
+ description: 'Creative is now approved'
795
+
796
+ - check: field_present
797
+ path: "context"
798
+ description: "Response echoes back the context object"
799
+ - check: field_value
800
+ path: "context.correlation_id"
801
+ value: "deterministic_testing--force_creative_approved"
802
+ description: "Context correlation_id returned unchanged"
803
+ - id: force_creative_archived
804
+ title: 'Force creative to archived (terminal)'
805
+ requires_tool: comply_test_controller
806
+ narrative: |
807
+ Force the creative to archived, a terminal state.
808
+ task: comply_test_controller
809
+ comply_scenario: deterministic_creative
810
+ stateful: true
811
+ expected: |
812
+ Successful transition to archived.
813
+
814
+ sample_request:
815
+ brand:
816
+ domain: 'acmeoutdoor.example'
817
+ scenario: 'force_creative_status'
818
+ params:
819
+ creative_id: '$context.creative_id'
820
+ status: 'archived'
821
+
822
+ context:
823
+ correlation_id: "deterministic_testing--force_creative_archived"
824
+ validations:
825
+ - check: field_value
826
+ path: 'success'
827
+ allowed_values:
828
+ - true
829
+ description: 'Transition to archived succeeds'
830
+
831
+ - check: field_present
832
+ path: "context"
833
+ description: "Response echoes back the context object"
834
+ - check: field_value
835
+ path: "context.correlation_id"
836
+ value: "deterministic_testing--force_creative_archived"
837
+ description: "Context correlation_id returned unchanged"
838
+ - id: invalid_creative_transition
839
+ title: 'Reject archived to processing'
840
+ requires_tool: comply_test_controller
841
+ narrative: |
842
+ Attempt to force the archived creative back to processing. The controller
843
+ should reject this with INVALID_TRANSITION.
844
+ task: comply_test_controller
845
+ comply_scenario: deterministic_creative
846
+ stateful: true
847
+ expect_error: true
848
+ negative_path: payload_well_formed
849
+ expected: |
850
+ Return error with INVALID_TRANSITION.
851
+
852
+ sample_request:
853
+ brand:
854
+ domain: 'acmeoutdoor.example'
855
+ scenario: 'force_creative_status'
856
+ params:
857
+ creative_id: '$context.creative_id'
858
+ status: 'processing'
859
+
860
+ context:
861
+ correlation_id: "deterministic_testing--invalid_creative_transition"
862
+ validations:
863
+ - check: field_value
864
+ path: 'success'
865
+ allowed_values:
866
+ - false
867
+ description: 'Terminal state rejects transition'
868
+ - check: field_value
869
+ path: 'error'
870
+ allowed_values:
871
+ - 'INVALID_TRANSITION'
872
+ description: 'Error code is INVALID_TRANSITION'
873
+
874
+ - check: field_present
875
+ path: "context"
876
+ description: "Response echoes back the context object"
877
+ - check: field_value
878
+ path: "context.correlation_id"
879
+ value: "deterministic_testing--invalid_creative_transition"
880
+ description: "Context correlation_id returned unchanged"
881
+ - id: sync_fresh_creative_for_rejection
882
+ title: 'Sync a fresh creative to exercise rejection'
883
+ requires_tool: sync_creatives
884
+ narrative: |
885
+ The preceding phase archived the first creative — a terminal state
886
+ that cannot transition to rejected. Sync a second, fresh creative so
887
+ the rejection path starts from processing rather than archived.
888
+ task: sync_creatives
889
+ schema_ref: "creative/sync-creatives-request.json"
890
+ response_schema_ref: "creative/sync-creatives-response.json"
891
+ doc_ref: "/media-buy/task-reference/sync_creatives"
892
+ comply_scenario: deterministic_creative
893
+ stateful: true
894
+ expected: |
895
+ A new creative with a distinct creative_id, reusable by downstream
896
+ force_creative_status calls.
897
+
898
+ sample_request:
899
+ account:
900
+ brand:
901
+ domain: "acmeoutdoor.example"
902
+ operator: "pinnacle-agency.example"
903
+ creatives:
904
+ - creative_id: "deterministic-rejection-probe"
905
+ name: "Creative for rejection probe"
906
+ format_id:
907
+ agent_url: "https://your-platform.example.com"
908
+ id: "display_300x250"
909
+ assets:
910
+ image:
911
+ asset_type: "image"
912
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/banner_300x250.jpg"
913
+ width: 300
914
+ height: 250
915
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_sync_fresh_creative_for_rejection"
916
+ context:
917
+ correlation_id: "deterministic_testing--sync_fresh_creative_for_rejection"
918
+ context_outputs:
919
+ - path: "creatives[0].creative_id"
920
+ name: "fresh_creative_id"
921
+ validations:
922
+ - check: response_schema
923
+ description: "Response matches sync-creatives-response.json schema"
924
+ - check: field_present
925
+ path: "creatives[0].creative_id"
926
+ description: "Response includes the seller's creative_id for the fresh creative"
927
+
928
+ - id: force_creative_rejected
929
+ title: 'Force fresh creative to rejected with reason'
930
+ requires_tool: comply_test_controller
931
+ narrative: |
932
+ Reject the fresh creative (captured as $context.fresh_creative_id)
933
+ with a reason string. Verifies the controller supports rejection
934
+ reasons. Uses the fresh id — NOT the archived one from the prior
935
+ phase, since archived→rejected is not a valid creative-state
936
+ transition.
937
+ task: comply_test_controller
938
+ comply_scenario: deterministic_creative
939
+ stateful: true
940
+ expected: |
941
+ Successful transition to rejected with reason preserved.
942
+
943
+ sample_request:
944
+ brand:
945
+ domain: 'acmeoutdoor.example'
946
+ scenario: 'force_creative_status'
947
+ params:
948
+ creative_id: '$context.fresh_creative_id'
949
+ status: 'rejected'
950
+ rejection_reason: 'Brand safety policy violation (comply test)'
951
+
952
+ context:
953
+ correlation_id: "deterministic_testing--force_creative_rejected"
954
+ validations:
955
+ - check: field_value
956
+ path: 'success'
957
+ allowed_values:
958
+ - true
959
+ description: 'Creative rejection succeeds'
960
+
961
+ - check: field_present
962
+ path: "context"
963
+ description: "Response echoes back the context object"
964
+ - check: field_value
965
+ path: "context.correlation_id"
966
+ value: "deterministic_testing--force_creative_rejected"
967
+ description: "Context correlation_id returned unchanged"
968
+ - id: deterministic_session
969
+ title: 'Deterministic SI session state machine'
970
+ narrative: |
971
+ Initiates an SI session, then uses the controller to force session timeout.
972
+ Verifies that messaging on a terminated session fails appropriately.
973
+
974
+ steps:
975
+ - id: initiate_session
976
+ title: 'Initiate SI session'
977
+ requires_tool: si_initiate_session
978
+ narrative: |
979
+ Create an SI session via si_initiate_session. The session_id is captured
980
+ for controller-driven termination.
981
+ task: si_initiate_session
982
+ schema_ref: 'sponsored-intelligence/si-initiate-session-request.json'
983
+ response_schema_ref: 'sponsored-intelligence/si-initiate-session-response.json'
984
+ comply_scenario: deterministic_session
985
+ stateful: true
986
+ context_outputs:
987
+ - name: session_id
988
+ path: 'session_id'
989
+ expected: |
990
+ Return a session with a session_id.
991
+
992
+ sample_request:
993
+ intent: "comply test — initiate deterministic SI session"
994
+ identity:
995
+ consent_granted: true
996
+ user_type: 'consumer'
997
+ supported_capabilities:
998
+ response_formats:
999
+ - 'text'
1000
+
1001
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_session_initiate_session"
1002
+ context:
1003
+ correlation_id: "deterministic_testing--initiate_session"
1004
+ validations:
1005
+ - check: field_present
1006
+ path: 'session_id'
1007
+ description: 'Session has a session_id'
1008
+
1009
+ - check: field_present
1010
+ path: "context"
1011
+ description: "Response echoes back the context object"
1012
+ - check: field_value
1013
+ path: "context.correlation_id"
1014
+ value: "deterministic_testing--initiate_session"
1015
+ description: "Context correlation_id returned unchanged"
1016
+ - id: force_session_terminated
1017
+ title: 'Force session timeout'
1018
+ requires_tool: comply_test_controller
1019
+ narrative: |
1020
+ Use the controller to force the session into terminated state with
1021
+ termination_reason: session_timeout.
1022
+ task: comply_test_controller
1023
+ comply_scenario: deterministic_session
1024
+ stateful: true
1025
+ expected: |
1026
+ Successful transition to terminated.
1027
+
1028
+ sample_request:
1029
+ scenario: 'force_session_status'
1030
+ params:
1031
+ session_id: '$context.session_id'
1032
+ status: 'terminated'
1033
+ termination_reason: 'session_timeout'
1034
+
1035
+ context:
1036
+ correlation_id: "deterministic_testing--force_session_terminated"
1037
+ validations:
1038
+ - check: field_value
1039
+ path: 'success'
1040
+ allowed_values:
1041
+ - true
1042
+ description: 'Session termination succeeds'
1043
+
1044
+ - check: field_present
1045
+ path: "context"
1046
+ description: "Response echoes back the context object"
1047
+ - check: field_value
1048
+ path: "context.correlation_id"
1049
+ value: "deterministic_testing--force_session_terminated"
1050
+ description: "Context correlation_id returned unchanged"
1051
+ - id: verify_terminated_session
1052
+ title: 'Verify messaging fails on terminated session'
1053
+ requires_tool: comply_test_controller
1054
+ narrative: |
1055
+ Attempt to send a message on the terminated session. The agent should
1056
+ return an error or terminated status.
1057
+ task: si_send_message
1058
+ schema_ref: 'sponsored-intelligence/si-send-message-request.json'
1059
+ response_schema_ref: 'sponsored-intelligence/si-send-message-response.json'
1060
+ comply_scenario: deterministic_session
1061
+ stateful: true
1062
+ expected: |
1063
+ The request should fail or return session_status: terminated. The agent
1064
+ must not accept messages on a terminated session.
1065
+
1066
+ sample_request:
1067
+ session_id: '$context.session_id'
1068
+ message: 'comply test — session should be terminated'
1069
+
1070
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_session_verify_terminated_session"
1071
+ context:
1072
+ correlation_id: "deterministic_testing--verify_terminated_session"
1073
+ validations:
1074
+ - check: field_value
1075
+ path: 'success'
1076
+ allowed_values:
1077
+ - false
1078
+ description: 'Message on terminated session fails'
1079
+
1080
+ - check: field_present
1081
+ path: "context"
1082
+ description: "Response echoes back the context object"
1083
+ - check: field_value
1084
+ path: "context.correlation_id"
1085
+ value: "deterministic_testing--verify_terminated_session"
1086
+ description: "Context correlation_id returned unchanged"
1087
+ - id: deterministic_delivery
1088
+ title: 'Deterministic delivery simulation'
1089
+ narrative: |
1090
+ Creates a media buy, simulates delivery data via the controller, then verifies
1091
+ the simulated metrics are reflected in get_media_buy_delivery.
1092
+
1093
+ steps:
1094
+ - id: create_media_buy_for_delivery
1095
+ title: 'Create media buy for delivery test'
1096
+ requires_tool: comply_test_controller
1097
+ narrative: |
1098
+ Create a media buy to receive simulated delivery data.
1099
+ task: create_media_buy
1100
+ schema_ref: 'media-buy/create-media-buy-request.json'
1101
+ response_schema_ref: 'media-buy/create-media-buy-response.json'
1102
+ doc_ref: '/media-buy/task-reference/create_media_buy'
1103
+ comply_scenario: deterministic_delivery
1104
+ stateful: true
1105
+ context_outputs:
1106
+ - name: delivery_media_buy_id
1107
+ path: 'media_buy_id'
1108
+ expected: |
1109
+ Create a media buy and return a media_buy_id.
1110
+
1111
+ sample_request:
1112
+ account:
1113
+ brand:
1114
+ domain: 'acmeoutdoor.example'
1115
+ operator: 'pinnacle-agency.example'
1116
+ brand:
1117
+ domain: 'acmeoutdoor.example'
1118
+ start_time: '2026-04-01T00:00:00Z'
1119
+ end_time: '2026-06-30T23:59:59Z'
1120
+ packages:
1121
+ - product_id: 'test-product'
1122
+ budget: 5000
1123
+ pricing_option_id: 'test-pricing'
1124
+
1125
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_delivery_create_media_buy_for_delivery"
1126
+ context:
1127
+ correlation_id: "deterministic_testing--create_media_buy_for_delivery"
1128
+ validations:
1129
+ - check: response_schema
1130
+ description: 'Response matches create-media-buy-response.json schema'
1131
+
1132
+ - check: field_present
1133
+ path: "context"
1134
+ description: "Response echoes back the context object"
1135
+ - check: field_value
1136
+ path: "context.correlation_id"
1137
+ value: "deterministic_testing--create_media_buy_for_delivery"
1138
+ description: "Context correlation_id returned unchanged"
1139
+ - id: simulate_delivery
1140
+ title: 'Simulate delivery data'
1141
+ requires_tool: comply_test_controller
1142
+ narrative: |
1143
+ Inject simulated delivery metrics (impressions, clicks, spend) into the
1144
+ media buy via the controller.
1145
+ task: comply_test_controller
1146
+ comply_scenario: deterministic_delivery
1147
+ stateful: true
1148
+ expected: |
1149
+ Return success with simulated delivery metrics acknowledged.
1150
+
1151
+ sample_request:
1152
+ brand:
1153
+ domain: 'acmeoutdoor.example'
1154
+ scenario: 'simulate_delivery'
1155
+ params:
1156
+ media_buy_id: '$context.delivery_media_buy_id'
1157
+ impressions: 10000
1158
+ clicks: 150
1159
+ reported_spend:
1160
+ amount: 150.00
1161
+ currency: 'USD'
1162
+
1163
+ context:
1164
+ correlation_id: "deterministic_testing--simulate_delivery"
1165
+ validations:
1166
+ - check: field_value
1167
+ path: 'success'
1168
+ allowed_values:
1169
+ - true
1170
+ description: 'Delivery simulation succeeds'
1171
+
1172
+ - check: field_present
1173
+ path: "context"
1174
+ description: "Response echoes back the context object"
1175
+ - check: field_value
1176
+ path: "context.correlation_id"
1177
+ value: "deterministic_testing--simulate_delivery"
1178
+ description: "Context correlation_id returned unchanged"
1179
+ - id: verify_delivery
1180
+ title: 'Verify delivery via get_media_buy_delivery'
1181
+ requires_tool: comply_test_controller
1182
+ narrative: |
1183
+ Call get_media_buy_delivery and verify the simulated metrics are reflected
1184
+ in the response. Expect at least 10000 impressions.
1185
+ task: get_media_buy_delivery
1186
+ schema_ref: 'media-buy/get-media-buy-delivery-request.json'
1187
+ response_schema_ref: 'media-buy/get-media-buy-delivery-response.json'
1188
+ doc_ref: '/media-buy/task-reference/get_media_buy_delivery'
1189
+ comply_scenario: deterministic_delivery
1190
+ stateful: true
1191
+ expected: |
1192
+ Return delivery metrics reflecting the simulated data:
1193
+ - impressions >= 10000
1194
+ - clicks and spend data present
1195
+
1196
+ sample_request:
1197
+ account:
1198
+ brand:
1199
+ domain: 'acmeoutdoor.example'
1200
+ operator: 'pinnacle-agency.example'
1201
+ media_buy_ids:
1202
+ - '$context.delivery_media_buy_id'
1203
+
1204
+ context:
1205
+ correlation_id: "deterministic_testing--verify_delivery"
1206
+ validations:
1207
+ - check: response_schema
1208
+ description: 'Response matches get-media-buy-delivery-response.json schema'
1209
+ - check: field_present
1210
+ path: 'media_buy_deliveries'
1211
+ description: 'Response contains delivery data'
1212
+
1213
+ - check: field_present
1214
+ path: "context"
1215
+ description: "Response echoes back the context object"
1216
+ - check: field_value
1217
+ path: "context.correlation_id"
1218
+ value: "deterministic_testing--verify_delivery"
1219
+ description: "Context correlation_id returned unchanged"
1220
+ - id: deterministic_budget
1221
+ title: 'Deterministic budget simulation'
1222
+ narrative: |
1223
+ Creates a media buy, then uses the controller to simulate budget spend at 95%
1224
+ and 100%. Verifies the agent handles near-depletion and full depletion.
1225
+
1226
+ steps:
1227
+ - id: create_media_buy_for_budget
1228
+ title: 'Create media buy for budget test'
1229
+ requires_tool: comply_test_controller
1230
+ narrative: |
1231
+ Create a media buy with a known budget for spend simulation.
1232
+ task: create_media_buy
1233
+ schema_ref: 'media-buy/create-media-buy-request.json'
1234
+ response_schema_ref: 'media-buy/create-media-buy-response.json'
1235
+ doc_ref: '/media-buy/task-reference/create_media_buy'
1236
+ comply_scenario: deterministic_budget
1237
+ stateful: true
1238
+ context_outputs:
1239
+ - name: budget_media_buy_id
1240
+ path: 'media_buy_id'
1241
+ expected: |
1242
+ Create a media buy and return a media_buy_id.
1243
+
1244
+ sample_request:
1245
+ account:
1246
+ brand:
1247
+ domain: 'acmeoutdoor.example'
1248
+ operator: 'pinnacle-agency.example'
1249
+ brand:
1250
+ domain: 'acmeoutdoor.example'
1251
+ start_time: '2026-04-01T00:00:00Z'
1252
+ end_time: '2026-06-30T23:59:59Z'
1253
+ packages:
1254
+ - product_id: 'test-product'
1255
+ budget: 10000
1256
+ pricing_option_id: 'test-pricing'
1257
+
1258
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_budget_create_media_buy_for_budget"
1259
+ context:
1260
+ correlation_id: "deterministic_testing--create_media_buy_for_budget"
1261
+ validations:
1262
+ - check: response_schema
1263
+ description: 'Response matches create-media-buy-response.json schema'
1264
+
1265
+ - check: field_present
1266
+ path: "context"
1267
+ description: "Response echoes back the context object"
1268
+ - check: field_value
1269
+ path: "context.correlation_id"
1270
+ value: "deterministic_testing--create_media_buy_for_budget"
1271
+ description: "Context correlation_id returned unchanged"
1272
+ - id: simulate_budget_95
1273
+ title: 'Simulate 95% budget spend'
1274
+ requires_tool: comply_test_controller
1275
+ narrative: |
1276
+ Simulate 95% of the media buy budget being spent. The agent should
1277
+ handle near-depletion state.
1278
+ task: comply_test_controller
1279
+ comply_scenario: deterministic_budget
1280
+ stateful: true
1281
+ expected: |
1282
+ Return success with budget spend simulated to 95%.
1283
+
1284
+ sample_request:
1285
+ brand:
1286
+ domain: 'acmeoutdoor.example'
1287
+ scenario: 'simulate_budget_spend'
1288
+ params:
1289
+ media_buy_id: '$context.budget_media_buy_id'
1290
+ spend_percentage: 95
1291
+
1292
+ context:
1293
+ correlation_id: "deterministic_testing--simulate_budget_95"
1294
+ validations:
1295
+ - check: field_value
1296
+ path: 'success'
1297
+ allowed_values:
1298
+ - true
1299
+ description: '95% budget simulation succeeds'
1300
+
1301
+ - check: field_present
1302
+ path: "context"
1303
+ description: "Response echoes back the context object"
1304
+ - check: field_value
1305
+ path: "context.correlation_id"
1306
+ value: "deterministic_testing--simulate_budget_95"
1307
+ description: "Context correlation_id returned unchanged"
1308
+ - id: simulate_budget_100
1309
+ title: 'Simulate 100% budget depletion'
1310
+ requires_tool: comply_test_controller
1311
+ narrative: |
1312
+ Simulate complete budget depletion. The agent should handle the fully
1313
+ spent state.
1314
+ task: comply_test_controller
1315
+ comply_scenario: deterministic_budget
1316
+ stateful: true
1317
+ expected: |
1318
+ Return success with budget fully depleted.
1319
+
1320
+ sample_request:
1321
+ brand:
1322
+ domain: 'acmeoutdoor.example'
1323
+ scenario: 'simulate_budget_spend'
1324
+ params:
1325
+ media_buy_id: '$context.budget_media_buy_id'
1326
+ spend_percentage: 100
1327
+
1328
+ context:
1329
+ correlation_id: "deterministic_testing--simulate_budget_100"
1330
+ validations:
1331
+ - check: field_value
1332
+ path: 'success'
1333
+ allowed_values:
1334
+ - true
1335
+ description: '100% budget depletion simulation succeeds'
1336
+
1337
+ - check: field_present
1338
+ path: "context"
1339
+ description: "Response echoes back the context object"
1340
+ - check: field_value
1341
+ path: "context.correlation_id"
1342
+ value: "deterministic_testing--simulate_budget_100"
1343
+ description: "Context correlation_id returned unchanged"