@adcp/sdk 7.10.2 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
  2. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  3. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
  4. package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
  5. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
  6. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
  7. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  8. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
  9. package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
  10. package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
  11. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  12. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
  13. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  14. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
  15. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  16. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  17. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  18. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  19. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
  20. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
  21. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
  22. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  23. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  24. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  25. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
  26. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
  27. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
  28. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  29. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
  30. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  31. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  32. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
  33. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  34. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  35. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  36. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  37. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  38. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  39. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  40. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
  41. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  42. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  43. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  44. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  45. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  46. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  47. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  48. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
  49. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  50. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  51. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  52. package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
  53. package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
  54. package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
  55. package/compliance/cache/3.1.0-rc.2/index.json +356 -0
  56. package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
  57. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  58. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
  59. package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
  60. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
  61. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
  62. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  63. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
  64. package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
  65. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
  66. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  67. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
  68. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  69. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
  70. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  71. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  72. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  73. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  74. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
  75. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
  76. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
  77. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  78. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  79. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  80. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
  81. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
  82. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
  83. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  84. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
  85. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  86. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  87. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
  88. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  89. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  90. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  91. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  92. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  93. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  94. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  95. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
  96. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  97. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  98. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  99. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  100. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  101. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  102. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  103. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  104. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  105. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  106. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  107. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
  108. package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
  109. package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
  110. package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
  111. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
  112. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
  113. package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
  114. package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
  115. package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
  116. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
  117. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
  118. package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
  119. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
  120. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
  121. package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
  122. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
  123. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
  124. package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
  125. package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
  126. package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
  127. package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
  128. package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
  129. package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
  130. package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
  131. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
  132. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
  133. package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
  134. package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
  135. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
  136. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
  137. package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
  138. package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
  139. package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
  140. package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
  141. package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
  142. package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
  143. package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
  144. package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
  145. package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
  146. package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
  147. package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
  148. package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
  149. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  150. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
  151. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  152. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  153. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  154. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  155. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  156. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  157. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  158. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  159. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  160. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
  161. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
  162. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
  163. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  164. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  165. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  166. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  167. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  168. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  169. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  170. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  171. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  172. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  173. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  174. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  175. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  176. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  177. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  178. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  179. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  180. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  181. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  182. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  183. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  184. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  185. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  186. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  187. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  188. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  189. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  190. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
  191. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  192. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  193. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  194. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  195. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  196. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  197. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  198. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  199. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  200. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  201. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  202. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  203. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
  204. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
  205. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  206. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  207. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  208. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  209. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  210. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  211. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  212. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  213. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  214. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  215. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  216. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  217. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  218. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  219. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  220. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  221. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  222. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  223. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  224. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  225. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  226. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  227. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  228. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  229. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  230. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  231. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  232. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  233. package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
  234. package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
  235. package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
  236. package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
  237. package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
  238. package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
  239. package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
  240. package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
  241. package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
  242. package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
  243. package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
  244. package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
  245. package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
  246. package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
  247. package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
  248. package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
  249. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
  250. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
  251. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
  252. package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
  253. package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
  254. package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
  255. package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
  256. package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
  257. package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
  258. package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
  259. package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
  260. package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
  261. package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
  262. package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
  263. package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
  264. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
  265. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
  266. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
  267. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
  268. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
  269. package/dist/lib/index.d.ts +1 -1
  270. package/dist/lib/index.d.ts.map +1 -1
  271. package/dist/lib/index.js +9 -5
  272. package/dist/lib/index.js.map +1 -1
  273. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  274. package/dist/lib/testing/storyboard/default-invariants.js +30 -1
  275. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  276. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  277. package/dist/lib/testing/storyboard/runner.js +84 -21
  278. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  279. package/dist/lib/testing/storyboard/types.d.ts +21 -0
  280. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  281. package/dist/lib/testing/storyboard/types.js.map +1 -1
  282. package/dist/lib/testing/types.d.ts +9 -0
  283. package/dist/lib/testing/types.d.ts.map +1 -1
  284. package/dist/lib/types/schemas.generated.d.ts +6707 -12040
  285. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  286. package/dist/lib/types/schemas.generated.js +1 -1
  287. package/dist/lib/types/schemas.generated.js.map +1 -1
  288. package/dist/lib/utils/signal-id-builders.d.ts +19 -0
  289. package/dist/lib/utils/signal-id-builders.d.ts.map +1 -1
  290. package/dist/lib/utils/signal-id-builders.js +30 -0
  291. package/dist/lib/utils/signal-id-builders.js.map +1 -1
  292. package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -1
  293. package/dist/lib/utils/tool-request-schemas.js +3 -0
  294. package/dist/lib/utils/tool-request-schemas.js.map +1 -1
  295. package/dist/lib/v2/projection/constants.d.ts +28 -0
  296. package/dist/lib/v2/projection/constants.d.ts.map +1 -0
  297. package/dist/lib/v2/projection/constants.js +31 -0
  298. package/dist/lib/v2/projection/constants.js.map +1 -0
  299. package/dist/lib/v2/projection/registry.d.ts.map +1 -1
  300. package/dist/lib/v2/projection/registry.js +9 -4
  301. package/dist/lib/v2/projection/registry.js.map +1 -1
  302. package/dist/lib/version.d.ts +3 -3
  303. package/dist/lib/version.js +3 -3
  304. package/package.json +1 -1
  305. package/skills/SHAPE-GOTCHAS.md +5 -0
@@ -0,0 +1,1430 @@
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
+ account:
116
+ sandbox: true
117
+ scenario: 'list_scenarios'
118
+
119
+ context:
120
+ correlation_id: "deterministic_testing--list_scenarios"
121
+ validations:
122
+ - check: field_present
123
+ path: 'scenarios'
124
+ description: 'Controller returns supported scenarios'
125
+ - check: field_value
126
+ path: 'success'
127
+ allowed_values:
128
+ - true
129
+ description: 'list_scenarios succeeds'
130
+
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: "deterministic_testing--list_scenarios"
137
+ description: "Context correlation_id returned unchanged"
138
+ - id: unknown_scenario
139
+ title: 'Unknown scenario returns error'
140
+ requires_tool: comply_test_controller
141
+ narrative: |
142
+ Send a nonexistent scenario name. The controller should return
143
+ UNKNOWN_SCENARIO error code.
144
+ task: comply_test_controller
145
+ comply_scenario: controller_validation
146
+ stateful: false
147
+ expect_error: true
148
+ negative_path: schema_invalid
149
+ expected: |
150
+ Return an error response with:
151
+ - success: false
152
+ - error: UNKNOWN_SCENARIO
153
+
154
+ sample_request:
155
+ account:
156
+ sandbox: true
157
+ scenario: 'nonexistent_scenario'
158
+ params: {}
159
+
160
+ context:
161
+ correlation_id: "deterministic_testing--unknown_scenario"
162
+ validations:
163
+ - check: field_value
164
+ path: 'success'
165
+ allowed_values:
166
+ - false
167
+ description: 'Unknown scenario fails'
168
+ - check: field_value
169
+ path: 'error'
170
+ allowed_values:
171
+ - 'UNKNOWN_SCENARIO'
172
+ description: 'Error code is UNKNOWN_SCENARIO'
173
+
174
+ - check: field_present
175
+ path: "context"
176
+ description: "Response echoes back the context object"
177
+ - check: field_value
178
+ path: "context.correlation_id"
179
+ value: "deterministic_testing--unknown_scenario"
180
+ description: "Context correlation_id returned unchanged"
181
+ - id: missing_params
182
+ title: 'Missing params returns error'
183
+ requires_tool: comply_test_controller
184
+ narrative: |
185
+ Call force_creative_status with empty params. The controller should
186
+ return INVALID_PARAMS when it implements the scenario, or
187
+ UNKNOWN_SCENARIO when it doesn't (per-tenant scenario registration
188
+ is up to the seller — universal storyboards accept either response
189
+ as valid because both signal "controller validated input and refused
190
+ gracefully," which is the load-bearing test intent).
191
+ task: comply_test_controller
192
+ comply_scenario: controller_validation
193
+ stateful: false
194
+ expect_error: true
195
+ negative_path: schema_invalid
196
+ expected: |
197
+ Return an error response with:
198
+ - success: false
199
+ - error: INVALID_PARAMS (when scenario implemented) OR
200
+ UNKNOWN_SCENARIO (when scenario not on this tenant)
201
+
202
+ sample_request:
203
+ account:
204
+ sandbox: true
205
+ scenario: 'force_creative_status'
206
+ params: {}
207
+
208
+ context:
209
+ correlation_id: "deterministic_testing--missing_params"
210
+ validations:
211
+ - check: field_value
212
+ path: 'success'
213
+ allowed_values:
214
+ - false
215
+ description: 'Missing params fails'
216
+ - check: field_value
217
+ path: 'error'
218
+ allowed_values:
219
+ - 'INVALID_PARAMS'
220
+ - 'UNKNOWN_SCENARIO'
221
+ description: 'Error code is INVALID_PARAMS or UNKNOWN_SCENARIO (tenant-conditional — per-tenant scenario registration)'
222
+
223
+ - check: field_present
224
+ path: "context"
225
+ description: "Response echoes back the context object"
226
+ - check: field_value
227
+ path: "context.correlation_id"
228
+ value: "deterministic_testing--missing_params"
229
+ description: "Context correlation_id returned unchanged"
230
+ - id: not_found_entity
231
+ title: 'Nonexistent entity returns NOT_FOUND'
232
+ requires_tool: comply_test_controller
233
+ narrative: |
234
+ Call force_creative_status with a nonexistent creative_id. The
235
+ controller should return NOT_FOUND when it implements the scenario,
236
+ or UNKNOWN_SCENARIO when it doesn't. Both are valid graceful-refusal
237
+ shapes; the storyboard accepts either since per-tenant scenario
238
+ registration is up to the seller.
239
+ task: comply_test_controller
240
+ comply_scenario: controller_validation
241
+ stateful: false
242
+ expect_error: true
243
+ negative_path: payload_well_formed
244
+ expected: |
245
+ Return an error response with:
246
+ - success: false
247
+ - error: NOT_FOUND (when scenario implemented) OR
248
+ UNKNOWN_SCENARIO (when scenario not on this tenant)
249
+
250
+ sample_request:
251
+ account:
252
+ sandbox: true
253
+ scenario: 'force_creative_status'
254
+ params:
255
+ creative_id: 'comply-test-nonexistent-000000000000'
256
+ status: 'approved'
257
+
258
+ context:
259
+ correlation_id: "deterministic_testing--not_found_entity"
260
+ validations:
261
+ - check: field_value
262
+ path: 'success'
263
+ allowed_values:
264
+ - false
265
+ description: 'Nonexistent entity fails'
266
+ - check: field_value
267
+ path: 'error'
268
+ allowed_values:
269
+ - 'NOT_FOUND'
270
+ - 'UNKNOWN_SCENARIO'
271
+ description: 'Error code is NOT_FOUND or UNKNOWN_SCENARIO (tenant-conditional — per-tenant scenario registration)'
272
+
273
+ - check: field_present
274
+ path: "context"
275
+ description: "Response echoes back the context object"
276
+ - check: field_value
277
+ path: "context.correlation_id"
278
+ value: "deterministic_testing--not_found_entity"
279
+ description: "Context correlation_id returned unchanged"
280
+ - id: deterministic_account
281
+ title: 'Deterministic account state machine'
282
+ narrative: |
283
+ Forces account status transitions via the controller and verifies them through
284
+ list_accounts. Tests suspension gating (operations blocked when suspended),
285
+ payment_required state, and reactivation.
286
+
287
+ # Phase creates its own sandbox account via sync_accounts and only consumes
288
+ # context produced within the phase. Explicit empty depends_on prevents the
289
+ # runner's default "depend on all prior phases" from cascade-skipping when
290
+ # an unrelated upstream phase trips on missing_tool.
291
+ depends_on: []
292
+
293
+ steps:
294
+ - id: sync_accounts_for_state
295
+ title: 'Create sandbox account for state machine test'
296
+ requires_tool: comply_test_controller
297
+ narrative: |
298
+ Sync a sandbox account so the state machine has an entity to
299
+ force transitions on.
300
+ task: sync_accounts
301
+ schema_ref: 'account/sync-accounts-request.json'
302
+ response_schema_ref: 'account/sync-accounts-response.json'
303
+ comply_scenario: deterministic_account
304
+ stateful: true
305
+
306
+ sample_request:
307
+ accounts:
308
+ - brand:
309
+ domain: 'test.example'
310
+ operator: 'test.example'
311
+ billing: 'operator'
312
+ sandbox: true
313
+
314
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_account_sync_accounts_for_state"
315
+ context:
316
+ correlation_id: "deterministic_testing--sync_accounts_for_state"
317
+ validations:
318
+ - check: field_present
319
+ path: 'accounts[0].account_id'
320
+ description: 'Account sync returns account_id'
321
+
322
+ - check: field_present
323
+ path: "context"
324
+ description: "Response echoes back the context object"
325
+ - check: field_value
326
+ path: "context.correlation_id"
327
+ value: "deterministic_testing--sync_accounts_for_state"
328
+ description: "Context correlation_id returned unchanged"
329
+ - id: list_accounts_for_state
330
+ title: 'Find account for state machine test'
331
+ requires_tool: comply_test_controller
332
+ narrative: |
333
+ List accounts to find an active account for state transitions.
334
+ task: list_accounts
335
+ comply_scenario: deterministic_account
336
+ stateful: false
337
+ context_outputs:
338
+ - name: account_id
339
+ path: 'accounts[0].account_id'
340
+ expected: |
341
+ Return at least one account with an account_id.
342
+
343
+ sample_request:
344
+ context:
345
+ correlation_id: "deterministic_testing--list_accounts_for_state"
346
+
347
+ validations:
348
+ - check: field_present
349
+ path: 'accounts[0].account_id'
350
+ description: 'At least one account exists'
351
+
352
+ - check: field_present
353
+ path: "context"
354
+ description: "Response echoes back the context object"
355
+ - check: field_value
356
+ path: "context.correlation_id"
357
+ value: "deterministic_testing--list_accounts_for_state"
358
+ description: "Context correlation_id returned unchanged"
359
+ - id: force_account_suspended
360
+ title: 'Force account to suspended'
361
+ requires_tool: comply_test_controller
362
+ narrative: |
363
+ Use the controller to force the account into suspended state. Operations
364
+ like create_media_buy should be blocked while the account is suspended.
365
+ task: comply_test_controller
366
+ comply_scenario: deterministic_account
367
+ stateful: true
368
+ expected: |
369
+ Return a successful state transition:
370
+ - success: true
371
+ - previous_state: the account's prior status
372
+ - current_state: suspended
373
+
374
+ sample_request:
375
+ account:
376
+ sandbox: true
377
+ scenario: 'force_account_status'
378
+ params:
379
+ account_id: '$context.account_id'
380
+ status: 'suspended'
381
+
382
+ context:
383
+ correlation_id: "deterministic_testing--force_account_suspended"
384
+ validations:
385
+ - check: field_value
386
+ path: 'success'
387
+ allowed_values:
388
+ - true
389
+ description: 'Account suspension succeeds'
390
+ - check: field_value
391
+ path: 'current_state'
392
+ allowed_values:
393
+ - 'suspended'
394
+ description: 'Account is now suspended'
395
+
396
+ - check: field_present
397
+ path: "context"
398
+ description: "Response echoes back the context object"
399
+ - check: field_value
400
+ path: "context.correlation_id"
401
+ value: "deterministic_testing--force_account_suspended"
402
+ description: "Context correlation_id returned unchanged"
403
+ - id: force_account_active
404
+ title: 'Reactivate account'
405
+ requires_tool: comply_test_controller
406
+ narrative: |
407
+ Restore the account to active state. Verify the transition from suspended
408
+ back to active succeeds.
409
+ task: comply_test_controller
410
+ comply_scenario: deterministic_account
411
+ stateful: true
412
+ expected: |
413
+ Return a successful state transition:
414
+ - success: true
415
+ - previous_state: suspended
416
+ - current_state: active
417
+
418
+ sample_request:
419
+ account:
420
+ sandbox: true
421
+ scenario: 'force_account_status'
422
+ params:
423
+ account_id: '$context.account_id'
424
+ status: 'active'
425
+
426
+ context:
427
+ correlation_id: "deterministic_testing--force_account_active"
428
+ validations:
429
+ - check: field_value
430
+ path: 'success'
431
+ allowed_values:
432
+ - true
433
+ description: 'Account reactivation succeeds'
434
+ - check: field_value
435
+ path: 'current_state'
436
+ allowed_values:
437
+ - 'active'
438
+ description: 'Account is now active'
439
+
440
+ - check: field_present
441
+ path: "context"
442
+ description: "Response echoes back the context object"
443
+ - check: field_value
444
+ path: "context.correlation_id"
445
+ value: "deterministic_testing--force_account_active"
446
+ description: "Context correlation_id returned unchanged"
447
+ - id: force_account_payment_required
448
+ title: 'Force account to payment_required'
449
+ requires_tool: comply_test_controller
450
+ narrative: |
451
+ Force the account into payment_required state. This tests a distinct
452
+ non-terminal blocked state.
453
+ task: comply_test_controller
454
+ comply_scenario: deterministic_account
455
+ stateful: true
456
+ expected: |
457
+ Return a successful state transition to payment_required.
458
+
459
+ sample_request:
460
+ account:
461
+ sandbox: true
462
+ scenario: 'force_account_status'
463
+ params:
464
+ account_id: '$context.account_id'
465
+ status: 'payment_required'
466
+
467
+ context:
468
+ correlation_id: "deterministic_testing--force_account_payment_required"
469
+ validations:
470
+ - check: field_value
471
+ path: 'success'
472
+ allowed_values:
473
+ - true
474
+ description: 'Transition to payment_required succeeds'
475
+
476
+ - check: field_present
477
+ path: "context"
478
+ description: "Response echoes back the context object"
479
+ - check: field_value
480
+ path: "context.correlation_id"
481
+ value: "deterministic_testing--force_account_payment_required"
482
+ description: "Context correlation_id returned unchanged"
483
+ - id: restore_account_active
484
+ title: 'Restore account to active'
485
+ requires_tool: comply_test_controller
486
+ narrative: |
487
+ Restore the account to active state after the payment_required test.
488
+ task: comply_test_controller
489
+ comply_scenario: deterministic_account
490
+ stateful: true
491
+ expected: |
492
+ Account restored to active state.
493
+
494
+ sample_request:
495
+ account:
496
+ sandbox: true
497
+ scenario: 'force_account_status'
498
+ params:
499
+ account_id: '$context.account_id'
500
+ status: 'active'
501
+
502
+ context:
503
+ correlation_id: "deterministic_testing--restore_account_active"
504
+ validations:
505
+ - check: field_value
506
+ path: 'success'
507
+ allowed_values:
508
+ - true
509
+ description: 'Account restored to active'
510
+
511
+ - check: field_present
512
+ path: "context"
513
+ description: "Response echoes back the context object"
514
+ - check: field_value
515
+ path: "context.correlation_id"
516
+ value: "deterministic_testing--restore_account_active"
517
+ description: "Context correlation_id returned unchanged"
518
+ - id: deterministic_media_buy
519
+ title: 'Deterministic media buy state machine'
520
+ narrative: |
521
+ Creates a media buy through the normal flow, then uses the controller to force
522
+ it through status transitions: active, completed (terminal). Verifies that
523
+ terminal states reject further transitions.
524
+
525
+ # Phase creates its own media buy via create_media_buy and only consumes
526
+ # context produced within the phase. Explicit empty depends_on prevents the
527
+ # runner's default "depend on all prior phases" from cascade-skipping when
528
+ # an unrelated upstream phase trips on missing_tool.
529
+ depends_on: []
530
+
531
+ steps:
532
+ - id: create_media_buy
533
+ title: 'Create media buy for state machine test'
534
+ requires_tool: comply_test_controller
535
+ narrative: |
536
+ Create a media buy through the standard create_media_buy task. The resulting
537
+ media_buy_id is used for controller-driven state transitions.
538
+ task: create_media_buy
539
+ schema_ref: 'media-buy/create-media-buy-request.json'
540
+ response_schema_ref: 'media-buy/create-media-buy-response.json'
541
+ doc_ref: '/media-buy/task-reference/create_media_buy'
542
+ comply_scenario: deterministic_media_buy
543
+ stateful: true
544
+ context_outputs:
545
+ - name: media_buy_id
546
+ path: 'media_buy_id'
547
+ expected: |
548
+ Create a media buy and return a media_buy_id for state machine testing.
549
+
550
+ sample_request:
551
+ account:
552
+ brand:
553
+ domain: 'acmeoutdoor.example'
554
+ operator: 'pinnacle-agency.example'
555
+ brand:
556
+ domain: 'acmeoutdoor.example'
557
+ start_time: '2026-04-01T00:00:00Z'
558
+ end_time: '2026-06-30T23:59:59Z'
559
+ packages:
560
+ - product_id: 'test-product'
561
+ budget: 5000
562
+ pricing_option_id: 'test-pricing'
563
+
564
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_media_buy_create_media_buy"
565
+ context:
566
+ correlation_id: "deterministic_testing--create_media_buy"
567
+ validations:
568
+ - check: response_schema
569
+ description: 'Response matches create-media-buy-response.json schema'
570
+
571
+ - check: field_present
572
+ path: "context"
573
+ description: "Response echoes back the context object"
574
+ - check: field_value
575
+ path: "context.correlation_id"
576
+ value: "deterministic_testing--create_media_buy"
577
+ description: "Context correlation_id returned unchanged"
578
+ - id: force_media_buy_active
579
+ title: 'Force media buy to active'
580
+ requires_tool: comply_test_controller
581
+ narrative: |
582
+ Use the controller to force the media buy into active state.
583
+ task: comply_test_controller
584
+ comply_scenario: deterministic_media_buy
585
+ stateful: true
586
+ expected: |
587
+ Return a successful state transition to active.
588
+
589
+ sample_request:
590
+ account:
591
+ sandbox: true
592
+ brand:
593
+ domain: 'acmeoutdoor.example'
594
+ scenario: 'force_media_buy_status'
595
+ params:
596
+ media_buy_id: '$context.media_buy_id'
597
+ status: 'active'
598
+
599
+ context:
600
+ correlation_id: "deterministic_testing--force_media_buy_active"
601
+ validations:
602
+ - check: field_value
603
+ path: 'success'
604
+ allowed_values:
605
+ - true
606
+ description: 'Media buy activation succeeds'
607
+ - check: field_value
608
+ path: 'current_state'
609
+ allowed_values:
610
+ - 'active'
611
+ description: 'Media buy is now active'
612
+
613
+ - check: field_present
614
+ path: "context"
615
+ description: "Response echoes back the context object"
616
+ - check: field_value
617
+ path: "context.correlation_id"
618
+ value: "deterministic_testing--force_media_buy_active"
619
+ description: "Context correlation_id returned unchanged"
620
+ - id: verify_media_buy_active
621
+ title: 'Verify media buy status via get_media_buys'
622
+ requires_tool: comply_test_controller
623
+ narrative: |
624
+ Call get_media_buys to confirm the controller-forced status is reflected
625
+ in the standard API.
626
+ task: get_media_buys
627
+ schema_ref: 'media-buy/get-media-buys-request.json'
628
+ response_schema_ref: 'media-buy/get-media-buys-response.json'
629
+ doc_ref: '/media-buy/task-reference/get_media_buys'
630
+ comply_scenario: deterministic_media_buy
631
+ stateful: true
632
+ expected: |
633
+ Return the media buy with status: active.
634
+
635
+ sample_request:
636
+ account:
637
+ brand:
638
+ domain: 'acmeoutdoor.example'
639
+ operator: 'pinnacle-agency.example'
640
+ media_buy_ids:
641
+ - '$context.media_buy_id'
642
+
643
+ context:
644
+ correlation_id: "deterministic_testing--verify_media_buy_active"
645
+ validations:
646
+ - check: response_schema
647
+ description: 'Response matches get-media-buys-response.json schema'
648
+ - check: field_present
649
+ path: 'media_buys[0].status'
650
+ description: 'Media buy has a status field'
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--verify_media_buy_active"
658
+ description: "Context correlation_id returned unchanged"
659
+ - id: force_media_buy_completed
660
+ title: 'Force media buy to completed (terminal)'
661
+ requires_tool: comply_test_controller
662
+ narrative: |
663
+ Force the media buy to completed, a terminal state. No further transitions
664
+ should be allowed.
665
+ task: comply_test_controller
666
+ comply_scenario: deterministic_media_buy
667
+ stateful: true
668
+ expected: |
669
+ Return a successful transition to completed.
670
+
671
+ sample_request:
672
+ account:
673
+ sandbox: true
674
+ brand:
675
+ domain: 'acmeoutdoor.example'
676
+ scenario: 'force_media_buy_status'
677
+ params:
678
+ media_buy_id: '$context.media_buy_id'
679
+ status: 'completed'
680
+
681
+ context:
682
+ correlation_id: "deterministic_testing--force_media_buy_completed"
683
+ validations:
684
+ - check: field_value
685
+ path: 'success'
686
+ allowed_values:
687
+ - true
688
+ description: 'Transition to completed succeeds'
689
+ - check: field_value
690
+ path: 'current_state'
691
+ allowed_values:
692
+ - 'completed'
693
+ description: 'Media buy is now completed'
694
+
695
+ - check: field_present
696
+ path: "context"
697
+ description: "Response echoes back the context object"
698
+ - check: field_value
699
+ path: "context.correlation_id"
700
+ value: "deterministic_testing--force_media_buy_completed"
701
+ description: "Context correlation_id returned unchanged"
702
+ - id: invalid_transition_from_terminal
703
+ title: 'Reject transition from terminal state'
704
+ requires_tool: comply_test_controller
705
+ narrative: |
706
+ Attempt to force the completed media buy back to active. The controller
707
+ should reject this with INVALID_TRANSITION.
708
+ task: comply_test_controller
709
+ comply_scenario: deterministic_media_buy
710
+ stateful: true
711
+ expect_error: true
712
+ negative_path: payload_well_formed
713
+ expected: |
714
+ Return an error response:
715
+ - success: false
716
+ - error: INVALID_TRANSITION
717
+
718
+ sample_request:
719
+ account:
720
+ sandbox: true
721
+ brand:
722
+ domain: 'acmeoutdoor.example'
723
+ scenario: 'force_media_buy_status'
724
+ params:
725
+ media_buy_id: '$context.media_buy_id'
726
+ status: 'active'
727
+
728
+ context:
729
+ correlation_id: "deterministic_testing--invalid_transition_from_terminal"
730
+ validations:
731
+ - check: field_value
732
+ path: 'success'
733
+ allowed_values:
734
+ - false
735
+ description: 'Terminal state rejects transition'
736
+ - check: field_value
737
+ path: 'error'
738
+ allowed_values:
739
+ - 'INVALID_TRANSITION'
740
+ description: 'Error code is INVALID_TRANSITION'
741
+
742
+ - check: field_present
743
+ path: "context"
744
+ description: "Response echoes back the context object"
745
+ - check: field_value
746
+ path: "context.correlation_id"
747
+ value: "deterministic_testing--invalid_transition_from_terminal"
748
+ description: "Context correlation_id returned unchanged"
749
+ - id: deterministic_creative
750
+ title: 'Deterministic creative state machine'
751
+ narrative: |
752
+ Syncs a creative, then uses the controller to force it through status
753
+ transitions: approved, archived (terminal). Verifies terminal state rejection
754
+ and rejection with reason.
755
+
756
+ # Phase syncs its own creative via sync_creatives and only consumes context
757
+ # produced within the phase. Explicit empty depends_on prevents the runner's
758
+ # default "depend on all prior phases" from cascade-skipping when an
759
+ # unrelated upstream phase trips on missing_tool.
760
+ depends_on: []
761
+
762
+ steps:
763
+ - id: sync_creative_for_state
764
+ title: 'Sync creative for state machine test'
765
+ requires_tool: comply_test_controller
766
+ narrative: |
767
+ Push a test creative via sync_creatives. The creative_id is captured
768
+ for controller-driven transitions.
769
+ task: sync_creatives
770
+ schema_ref: 'creative/sync-creatives-request.json'
771
+ response_schema_ref: 'creative/sync-creatives-response.json'
772
+ doc_ref: '/creative/task-reference/sync_creatives'
773
+ comply_scenario: deterministic_creative
774
+ stateful: true
775
+ context_outputs:
776
+ - name: creative_id
777
+ path: 'creatives[0].creative_id'
778
+ expected: |
779
+ Accept the creative and return a creative_id for state machine testing.
780
+
781
+ sample_request:
782
+ account:
783
+ brand:
784
+ domain: 'acmeoutdoor.example'
785
+ operator: 'pinnacle-agency.example'
786
+ creatives:
787
+ - creative_id: 'comply-state-test-creative'
788
+ name: 'Comply State Test Creative'
789
+ format_id:
790
+ agent_url: 'https://your-platform.example.com'
791
+ id: 'display_300x250'
792
+ assets:
793
+ image:
794
+ asset_type: 'image'
795
+ url: 'https://via.placeholder.com/300x250'
796
+ width: 300
797
+ height: 250
798
+ mime_type: 'image/png'
799
+
800
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_creative_sync_creative_for_state"
801
+ context:
802
+ correlation_id: "deterministic_testing--sync_creative_for_state"
803
+ validations:
804
+ - check: response_schema
805
+ description: 'Response matches sync-creatives-response.json schema'
806
+
807
+ - check: field_present
808
+ path: "context"
809
+ description: "Response echoes back the context object"
810
+ - check: field_value
811
+ path: "context.correlation_id"
812
+ value: "deterministic_testing--sync_creative_for_state"
813
+ description: "Context correlation_id returned unchanged"
814
+ - id: force_creative_approved
815
+ title: 'Force creative to approved'
816
+ requires_tool: comply_test_controller
817
+ narrative: |
818
+ Use the controller to force the creative into approved state.
819
+ task: comply_test_controller
820
+ comply_scenario: deterministic_creative
821
+ stateful: true
822
+ expected: |
823
+ Successful transition to approved.
824
+
825
+ sample_request:
826
+ account:
827
+ sandbox: true
828
+ brand:
829
+ domain: 'acmeoutdoor.example'
830
+ scenario: 'force_creative_status'
831
+ params:
832
+ creative_id: '$context.creative_id'
833
+ status: 'approved'
834
+
835
+ context:
836
+ correlation_id: "deterministic_testing--force_creative_approved"
837
+ validations:
838
+ - check: field_value
839
+ path: 'success'
840
+ allowed_values:
841
+ - true
842
+ description: 'Creative approval succeeds'
843
+ - check: field_value
844
+ path: 'current_state'
845
+ allowed_values:
846
+ - 'approved'
847
+ description: 'Creative is now approved'
848
+
849
+ - check: field_present
850
+ path: "context"
851
+ description: "Response echoes back the context object"
852
+ - check: field_value
853
+ path: "context.correlation_id"
854
+ value: "deterministic_testing--force_creative_approved"
855
+ description: "Context correlation_id returned unchanged"
856
+ - id: force_creative_archived
857
+ title: 'Force creative to archived (terminal)'
858
+ requires_tool: comply_test_controller
859
+ narrative: |
860
+ Force the creative to archived, a terminal state.
861
+ task: comply_test_controller
862
+ comply_scenario: deterministic_creative
863
+ stateful: true
864
+ expected: |
865
+ Successful transition to archived.
866
+
867
+ sample_request:
868
+ account:
869
+ sandbox: true
870
+ brand:
871
+ domain: 'acmeoutdoor.example'
872
+ scenario: 'force_creative_status'
873
+ params:
874
+ creative_id: '$context.creative_id'
875
+ status: 'archived'
876
+
877
+ context:
878
+ correlation_id: "deterministic_testing--force_creative_archived"
879
+ validations:
880
+ - check: field_value
881
+ path: 'success'
882
+ allowed_values:
883
+ - true
884
+ description: 'Transition to archived succeeds'
885
+
886
+ - check: field_present
887
+ path: "context"
888
+ description: "Response echoes back the context object"
889
+ - check: field_value
890
+ path: "context.correlation_id"
891
+ value: "deterministic_testing--force_creative_archived"
892
+ description: "Context correlation_id returned unchanged"
893
+ - id: invalid_creative_transition
894
+ title: 'Reject archived to processing'
895
+ requires_tool: comply_test_controller
896
+ narrative: |
897
+ Attempt to force the archived creative back to processing. The controller
898
+ should reject this with INVALID_TRANSITION.
899
+ task: comply_test_controller
900
+ comply_scenario: deterministic_creative
901
+ stateful: true
902
+ expect_error: true
903
+ negative_path: payload_well_formed
904
+ expected: |
905
+ Return error with INVALID_TRANSITION.
906
+
907
+ sample_request:
908
+ account:
909
+ sandbox: true
910
+ brand:
911
+ domain: 'acmeoutdoor.example'
912
+ scenario: 'force_creative_status'
913
+ params:
914
+ creative_id: '$context.creative_id'
915
+ status: 'processing'
916
+
917
+ context:
918
+ correlation_id: "deterministic_testing--invalid_creative_transition"
919
+ validations:
920
+ - check: field_value
921
+ path: 'success'
922
+ allowed_values:
923
+ - false
924
+ description: 'Terminal state rejects transition'
925
+ - check: field_value
926
+ path: 'error'
927
+ allowed_values:
928
+ - 'INVALID_TRANSITION'
929
+ description: 'Error code is INVALID_TRANSITION'
930
+
931
+ - check: field_present
932
+ path: "context"
933
+ description: "Response echoes back the context object"
934
+ - check: field_value
935
+ path: "context.correlation_id"
936
+ value: "deterministic_testing--invalid_creative_transition"
937
+ description: "Context correlation_id returned unchanged"
938
+ - id: sync_fresh_creative_for_rejection
939
+ title: 'Sync a fresh creative to exercise rejection'
940
+ requires_tool: sync_creatives
941
+ narrative: |
942
+ The preceding phase archived the first creative — a terminal state
943
+ that cannot transition to rejected. Sync a second, fresh creative so
944
+ the rejection path starts from processing rather than archived.
945
+ task: sync_creatives
946
+ schema_ref: "creative/sync-creatives-request.json"
947
+ response_schema_ref: "creative/sync-creatives-response.json"
948
+ doc_ref: "/media-buy/task-reference/sync_creatives"
949
+ comply_scenario: deterministic_creative
950
+ stateful: true
951
+ expected: |
952
+ A new creative with a distinct creative_id, reusable by downstream
953
+ force_creative_status calls.
954
+
955
+ sample_request:
956
+ account:
957
+ brand:
958
+ domain: "acmeoutdoor.example"
959
+ operator: "pinnacle-agency.example"
960
+ creatives:
961
+ - creative_id: "deterministic-rejection-probe"
962
+ name: "Creative for rejection probe"
963
+ format_id:
964
+ agent_url: "https://your-platform.example.com"
965
+ id: "display_300x250"
966
+ assets:
967
+ image:
968
+ asset_type: "image"
969
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/banner_300x250.jpg"
970
+ width: 300
971
+ height: 250
972
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_sync_fresh_creative_for_rejection"
973
+ context:
974
+ correlation_id: "deterministic_testing--sync_fresh_creative_for_rejection"
975
+ context_outputs:
976
+ - path: "creatives[0].creative_id"
977
+ name: "fresh_creative_id"
978
+ validations:
979
+ - check: response_schema
980
+ description: "Response matches sync-creatives-response.json schema"
981
+ - check: field_present
982
+ path: "creatives[0].creative_id"
983
+ description: "Response includes the seller's creative_id for the fresh creative"
984
+
985
+ - id: force_creative_rejected
986
+ title: 'Force fresh creative to rejected with reason'
987
+ requires_tool: comply_test_controller
988
+ narrative: |
989
+ Reject the fresh creative (captured as $context.fresh_creative_id)
990
+ with a reason string. Verifies the controller supports rejection
991
+ reasons. Uses the fresh id — NOT the archived one from the prior
992
+ phase, since archived→rejected is not a valid creative-state
993
+ transition.
994
+ task: comply_test_controller
995
+ comply_scenario: deterministic_creative
996
+ stateful: true
997
+ expected: |
998
+ Successful transition to rejected with reason preserved.
999
+
1000
+ sample_request:
1001
+ account:
1002
+ sandbox: true
1003
+ brand:
1004
+ domain: 'acmeoutdoor.example'
1005
+ scenario: 'force_creative_status'
1006
+ params:
1007
+ creative_id: '$context.fresh_creative_id'
1008
+ status: 'rejected'
1009
+ rejection_reason: 'Brand safety policy violation (comply test)'
1010
+
1011
+ context:
1012
+ correlation_id: "deterministic_testing--force_creative_rejected"
1013
+ validations:
1014
+ - check: field_value
1015
+ path: 'success'
1016
+ allowed_values:
1017
+ - true
1018
+ description: 'Creative rejection succeeds'
1019
+
1020
+ - check: field_present
1021
+ path: "context"
1022
+ description: "Response echoes back the context object"
1023
+ - check: field_value
1024
+ path: "context.correlation_id"
1025
+ value: "deterministic_testing--force_creative_rejected"
1026
+ description: "Context correlation_id returned unchanged"
1027
+ - id: deterministic_session
1028
+ title: 'Deterministic SI session state machine'
1029
+ narrative: |
1030
+ Initiates an SI session, then uses the controller to force session timeout.
1031
+ Verifies that messaging on a terminated session fails appropriately.
1032
+
1033
+ # Phase establishes its own session via initiate_session; doesn't consume
1034
+ # state from earlier deterministic_* phases. Explicit empty depends_on
1035
+ # prevents the runner's default "depend on all prior phases" from
1036
+ # cascade-skipping this phase when an unrelated upstream phase trips.
1037
+ depends_on: []
1038
+
1039
+ steps:
1040
+ - id: initiate_session
1041
+ title: 'Initiate SI session'
1042
+ requires_tool: si_initiate_session
1043
+ narrative: |
1044
+ Create an SI session via si_initiate_session. The session_id is captured
1045
+ for controller-driven termination.
1046
+ task: si_initiate_session
1047
+ schema_ref: 'sponsored-intelligence/si-initiate-session-request.json'
1048
+ response_schema_ref: 'sponsored-intelligence/si-initiate-session-response.json'
1049
+ comply_scenario: deterministic_session
1050
+ stateful: true
1051
+ context_outputs:
1052
+ - name: session_id
1053
+ path: 'session_id'
1054
+ expected: |
1055
+ Return a session with a session_id.
1056
+
1057
+ sample_request:
1058
+ intent: "comply test — initiate deterministic SI session"
1059
+ identity:
1060
+ consent_granted: true
1061
+ user_type: 'consumer'
1062
+ supported_capabilities:
1063
+ response_formats:
1064
+ - 'text'
1065
+
1066
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_session_initiate_session"
1067
+ context:
1068
+ correlation_id: "deterministic_testing--initiate_session"
1069
+ validations:
1070
+ - check: field_present
1071
+ path: 'session_id'
1072
+ description: 'Session has a session_id'
1073
+
1074
+ - check: field_present
1075
+ path: "context"
1076
+ description: "Response echoes back the context object"
1077
+ - check: field_value
1078
+ path: "context.correlation_id"
1079
+ value: "deterministic_testing--initiate_session"
1080
+ description: "Context correlation_id returned unchanged"
1081
+ - id: force_session_terminated
1082
+ title: 'Force session timeout'
1083
+ requires_tool: comply_test_controller
1084
+ narrative: |
1085
+ Use the controller to force the session into terminated state with
1086
+ termination_reason: session_timeout.
1087
+ task: comply_test_controller
1088
+ comply_scenario: deterministic_session
1089
+ stateful: true
1090
+ expected: |
1091
+ Successful transition to terminated.
1092
+
1093
+ sample_request:
1094
+ account:
1095
+ sandbox: true
1096
+ scenario: 'force_session_status'
1097
+ params:
1098
+ session_id: '$context.session_id'
1099
+ status: 'terminated'
1100
+ termination_reason: 'session_timeout'
1101
+
1102
+ context:
1103
+ correlation_id: "deterministic_testing--force_session_terminated"
1104
+ validations:
1105
+ - check: field_value
1106
+ path: 'success'
1107
+ allowed_values:
1108
+ - true
1109
+ description: 'Session termination succeeds'
1110
+
1111
+ - check: field_present
1112
+ path: "context"
1113
+ description: "Response echoes back the context object"
1114
+ - check: field_value
1115
+ path: "context.correlation_id"
1116
+ value: "deterministic_testing--force_session_terminated"
1117
+ description: "Context correlation_id returned unchanged"
1118
+ - id: verify_terminated_session
1119
+ title: 'Verify messaging fails on terminated session'
1120
+ requires_tool: comply_test_controller
1121
+ narrative: |
1122
+ Attempt to send a message on the terminated session. The agent must
1123
+ reject with SESSION_TERMINATED — per si-send-message-response.json,
1124
+ terminated sessions return error codes (SESSION_NOT_FOUND or
1125
+ SESSION_TERMINATED) rather than a success response.
1126
+ task: si_send_message
1127
+ schema_ref: 'sponsored-intelligence/si-send-message-request.json'
1128
+ response_schema_ref: 'sponsored-intelligence/si-send-message-response.json'
1129
+ comply_scenario: deterministic_session
1130
+ stateful: true
1131
+ expect_error: true
1132
+ negative_path: payload_well_formed
1133
+ expected: |
1134
+ The request must fail with error code SESSION_TERMINATED. The agent
1135
+ must not accept messages on a terminated session.
1136
+
1137
+ sample_request:
1138
+ session_id: '$context.session_id'
1139
+ message: 'comply test — session should be terminated'
1140
+
1141
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_session_verify_terminated_session"
1142
+ context:
1143
+ correlation_id: "deterministic_testing--verify_terminated_session"
1144
+ validations:
1145
+ - check: error_code
1146
+ value: 'SESSION_TERMINATED'
1147
+ description: 'Message on terminated session fails with SESSION_TERMINATED'
1148
+
1149
+ - check: field_present
1150
+ path: "context"
1151
+ description: "Response echoes back the context object even on errors"
1152
+ - check: field_value
1153
+ path: "context.correlation_id"
1154
+ value: "deterministic_testing--verify_terminated_session"
1155
+ description: "Context correlation_id returned unchanged"
1156
+ - id: deterministic_delivery
1157
+ title: 'Deterministic delivery simulation'
1158
+ narrative: |
1159
+ Creates a media buy, simulates delivery data via the controller, then verifies
1160
+ the simulated metrics are reflected in get_media_buy_delivery.
1161
+
1162
+ # Phase creates its own media buy via create_media_buy_for_delivery; doesn't
1163
+ # consume state from earlier deterministic_* phases. In particular, must not
1164
+ # cascade-skip when deterministic_session skips for missing si_initiate_session
1165
+ # on non-SI sellers (adcp-client#1711 follow-up).
1166
+ depends_on: []
1167
+
1168
+ steps:
1169
+ - id: create_media_buy_for_delivery
1170
+ title: 'Create media buy for delivery test'
1171
+ requires_tool: comply_test_controller
1172
+ narrative: |
1173
+ Create a media buy to receive simulated delivery data.
1174
+ task: create_media_buy
1175
+ schema_ref: 'media-buy/create-media-buy-request.json'
1176
+ response_schema_ref: 'media-buy/create-media-buy-response.json'
1177
+ doc_ref: '/media-buy/task-reference/create_media_buy'
1178
+ comply_scenario: deterministic_delivery
1179
+ stateful: true
1180
+ context_outputs:
1181
+ - name: delivery_media_buy_id
1182
+ path: 'media_buy_id'
1183
+ expected: |
1184
+ Create a media buy and return a media_buy_id.
1185
+
1186
+ sample_request:
1187
+ account:
1188
+ brand:
1189
+ domain: 'acmeoutdoor.example'
1190
+ operator: 'pinnacle-agency.example'
1191
+ brand:
1192
+ domain: 'acmeoutdoor.example'
1193
+ start_time: '2026-04-01T00:00:00Z'
1194
+ end_time: '2026-06-30T23:59:59Z'
1195
+ packages:
1196
+ - product_id: 'test-product'
1197
+ budget: 5000
1198
+ pricing_option_id: 'test-pricing'
1199
+
1200
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_delivery_create_media_buy_for_delivery"
1201
+ context:
1202
+ correlation_id: "deterministic_testing--create_media_buy_for_delivery"
1203
+ validations:
1204
+ - check: response_schema
1205
+ description: 'Response matches create-media-buy-response.json schema'
1206
+
1207
+ - check: field_present
1208
+ path: "context"
1209
+ description: "Response echoes back the context object"
1210
+ - check: field_value
1211
+ path: "context.correlation_id"
1212
+ value: "deterministic_testing--create_media_buy_for_delivery"
1213
+ description: "Context correlation_id returned unchanged"
1214
+ - id: simulate_delivery
1215
+ title: 'Simulate delivery data'
1216
+ requires_tool: comply_test_controller
1217
+ narrative: |
1218
+ Inject simulated delivery metrics (impressions, clicks, spend) into the
1219
+ media buy via the controller.
1220
+ task: comply_test_controller
1221
+ comply_scenario: deterministic_delivery
1222
+ stateful: true
1223
+ expected: |
1224
+ Return success with simulated delivery metrics acknowledged.
1225
+
1226
+ sample_request:
1227
+ account:
1228
+ sandbox: true
1229
+ brand:
1230
+ domain: 'acmeoutdoor.example'
1231
+ scenario: 'simulate_delivery'
1232
+ params:
1233
+ media_buy_id: '$context.delivery_media_buy_id'
1234
+ impressions: 10000
1235
+ clicks: 150
1236
+ reported_spend:
1237
+ amount: 150.00
1238
+ currency: 'USD'
1239
+
1240
+ context:
1241
+ correlation_id: "deterministic_testing--simulate_delivery"
1242
+ validations:
1243
+ - check: field_value
1244
+ path: 'success'
1245
+ allowed_values:
1246
+ - true
1247
+ description: 'Delivery simulation succeeds'
1248
+
1249
+ - check: field_present
1250
+ path: "context"
1251
+ description: "Response echoes back the context object"
1252
+ - check: field_value
1253
+ path: "context.correlation_id"
1254
+ value: "deterministic_testing--simulate_delivery"
1255
+ description: "Context correlation_id returned unchanged"
1256
+ - id: verify_delivery
1257
+ title: 'Verify delivery via get_media_buy_delivery'
1258
+ requires_tool: comply_test_controller
1259
+ narrative: |
1260
+ Call get_media_buy_delivery and verify the simulated metrics are reflected
1261
+ in the response. Expect at least 10000 impressions.
1262
+ task: get_media_buy_delivery
1263
+ schema_ref: 'media-buy/get-media-buy-delivery-request.json'
1264
+ response_schema_ref: 'media-buy/get-media-buy-delivery-response.json'
1265
+ doc_ref: '/media-buy/task-reference/get_media_buy_delivery'
1266
+ comply_scenario: deterministic_delivery
1267
+ stateful: true
1268
+ expected: |
1269
+ Return delivery metrics reflecting the simulated data:
1270
+ - impressions >= 10000
1271
+ - clicks and spend data present
1272
+
1273
+ sample_request:
1274
+ account:
1275
+ brand:
1276
+ domain: 'acmeoutdoor.example'
1277
+ operator: 'pinnacle-agency.example'
1278
+ media_buy_ids:
1279
+ - '$context.delivery_media_buy_id'
1280
+
1281
+ context:
1282
+ correlation_id: "deterministic_testing--verify_delivery"
1283
+ validations:
1284
+ - check: response_schema
1285
+ description: 'Response matches get-media-buy-delivery-response.json schema'
1286
+ - check: field_present
1287
+ path: 'media_buy_deliveries'
1288
+ description: 'Response contains delivery data'
1289
+
1290
+ - check: field_present
1291
+ path: "context"
1292
+ description: "Response echoes back the context object"
1293
+ - check: field_value
1294
+ path: "context.correlation_id"
1295
+ value: "deterministic_testing--verify_delivery"
1296
+ description: "Context correlation_id returned unchanged"
1297
+ - id: deterministic_budget
1298
+ title: 'Deterministic budget simulation'
1299
+ narrative: |
1300
+ Creates a media buy, then uses the controller to simulate budget spend at 95%
1301
+ and 100%. Verifies the agent handles near-depletion and full depletion.
1302
+
1303
+ # Phase creates its own media buy via create_media_buy_for_budget; doesn't
1304
+ # consume state from earlier deterministic_* phases. In particular, must not
1305
+ # cascade-skip when deterministic_session skips for missing si_initiate_session
1306
+ # on non-SI sellers (adcp-client#1711 follow-up).
1307
+ depends_on: []
1308
+
1309
+ steps:
1310
+ - id: create_media_buy_for_budget
1311
+ title: 'Create media buy for budget test'
1312
+ requires_tool: comply_test_controller
1313
+ narrative: |
1314
+ Create a media buy with a known budget for spend simulation.
1315
+ task: create_media_buy
1316
+ schema_ref: 'media-buy/create-media-buy-request.json'
1317
+ response_schema_ref: 'media-buy/create-media-buy-response.json'
1318
+ doc_ref: '/media-buy/task-reference/create_media_buy'
1319
+ comply_scenario: deterministic_budget
1320
+ stateful: true
1321
+ context_outputs:
1322
+ - name: budget_media_buy_id
1323
+ path: 'media_buy_id'
1324
+ expected: |
1325
+ Create a media buy and return a media_buy_id.
1326
+
1327
+ sample_request:
1328
+ account:
1329
+ brand:
1330
+ domain: 'acmeoutdoor.example'
1331
+ operator: 'pinnacle-agency.example'
1332
+ brand:
1333
+ domain: 'acmeoutdoor.example'
1334
+ start_time: '2026-04-01T00:00:00Z'
1335
+ end_time: '2026-06-30T23:59:59Z'
1336
+ packages:
1337
+ - product_id: 'test-product'
1338
+ budget: 10000
1339
+ pricing_option_id: 'test-pricing'
1340
+
1341
+ idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_budget_create_media_buy_for_budget"
1342
+ context:
1343
+ correlation_id: "deterministic_testing--create_media_buy_for_budget"
1344
+ validations:
1345
+ - check: response_schema
1346
+ description: 'Response matches create-media-buy-response.json schema'
1347
+
1348
+ - check: field_present
1349
+ path: "context"
1350
+ description: "Response echoes back the context object"
1351
+ - check: field_value
1352
+ path: "context.correlation_id"
1353
+ value: "deterministic_testing--create_media_buy_for_budget"
1354
+ description: "Context correlation_id returned unchanged"
1355
+ - id: simulate_budget_95
1356
+ title: 'Simulate 95% budget spend'
1357
+ requires_tool: comply_test_controller
1358
+ narrative: |
1359
+ Simulate 95% of the media buy budget being spent. The agent should
1360
+ handle near-depletion state.
1361
+ task: comply_test_controller
1362
+ comply_scenario: deterministic_budget
1363
+ stateful: true
1364
+ expected: |
1365
+ Return success with budget spend simulated to 95%.
1366
+
1367
+ sample_request:
1368
+ account:
1369
+ sandbox: true
1370
+ brand:
1371
+ domain: 'acmeoutdoor.example'
1372
+ scenario: 'simulate_budget_spend'
1373
+ params:
1374
+ media_buy_id: '$context.budget_media_buy_id'
1375
+ spend_percentage: 95
1376
+
1377
+ context:
1378
+ correlation_id: "deterministic_testing--simulate_budget_95"
1379
+ validations:
1380
+ - check: field_value
1381
+ path: 'success'
1382
+ allowed_values:
1383
+ - true
1384
+ description: '95% budget simulation succeeds'
1385
+
1386
+ - check: field_present
1387
+ path: "context"
1388
+ description: "Response echoes back the context object"
1389
+ - check: field_value
1390
+ path: "context.correlation_id"
1391
+ value: "deterministic_testing--simulate_budget_95"
1392
+ description: "Context correlation_id returned unchanged"
1393
+ - id: simulate_budget_100
1394
+ title: 'Simulate 100% budget depletion'
1395
+ requires_tool: comply_test_controller
1396
+ narrative: |
1397
+ Simulate complete budget depletion. The agent should handle the fully
1398
+ spent state.
1399
+ task: comply_test_controller
1400
+ comply_scenario: deterministic_budget
1401
+ stateful: true
1402
+ expected: |
1403
+ Return success with budget fully depleted.
1404
+
1405
+ sample_request:
1406
+ account:
1407
+ sandbox: true
1408
+ brand:
1409
+ domain: 'acmeoutdoor.example'
1410
+ scenario: 'simulate_budget_spend'
1411
+ params:
1412
+ media_buy_id: '$context.budget_media_buy_id'
1413
+ spend_percentage: 100
1414
+
1415
+ context:
1416
+ correlation_id: "deterministic_testing--simulate_budget_100"
1417
+ validations:
1418
+ - check: field_value
1419
+ path: 'success'
1420
+ allowed_values:
1421
+ - true
1422
+ description: '100% budget depletion simulation succeeds'
1423
+
1424
+ - check: field_present
1425
+ path: "context"
1426
+ description: "Response echoes back the context object"
1427
+ - check: field_value
1428
+ path: "context.correlation_id"
1429
+ value: "deterministic_testing--simulate_budget_100"
1430
+ description: "Context correlation_id returned unchanged"