@adcp/sdk 7.11.0 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
  2. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  3. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
  4. package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
  5. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
  6. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
  7. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  8. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
  9. package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
  10. package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
  11. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  12. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
  13. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  14. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
  15. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  16. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  17. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  18. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  19. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
  20. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
  21. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
  22. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  23. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  24. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  25. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
  26. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
  27. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
  28. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  29. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
  30. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  31. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  32. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
  33. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  34. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  35. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  36. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  37. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  38. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  39. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  40. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
  41. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  42. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  43. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  44. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  45. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  46. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  47. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  48. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
  49. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  50. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  51. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  52. package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
  53. package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
  54. package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
  55. package/compliance/cache/3.1.0-rc.2/index.json +356 -0
  56. package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
  57. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  58. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
  59. package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
  60. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
  61. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
  62. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  63. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
  64. package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
  65. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
  66. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  67. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
  68. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  69. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
  70. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  71. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  72. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  73. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  74. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
  75. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
  76. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
  77. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  78. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  79. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  80. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
  81. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
  82. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
  83. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  84. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
  85. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  86. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  87. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
  88. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  89. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  90. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  91. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  92. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  93. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  94. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  95. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
  96. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  97. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  98. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  99. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  100. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  101. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  102. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  103. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  104. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  105. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  106. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  107. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
  108. package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
  109. package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
  110. package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
  111. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
  112. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
  113. package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
  114. package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
  115. package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
  116. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
  117. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
  118. package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
  119. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
  120. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
  121. package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
  122. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
  123. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
  124. package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
  125. package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
  126. package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
  127. package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
  128. package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
  129. package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
  130. package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
  131. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
  132. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
  133. package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
  134. package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
  135. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
  136. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
  137. package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
  138. package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
  139. package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
  140. package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
  141. package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
  142. package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
  143. package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
  144. package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
  145. package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
  146. package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
  147. package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
  148. package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
  149. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  150. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
  151. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  152. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  153. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  154. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  155. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  156. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  157. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  158. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  159. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  160. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
  161. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
  162. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
  163. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  164. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  165. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  166. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  167. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  168. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  169. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  170. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  171. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  172. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  173. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  174. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  175. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  176. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  177. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  178. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  179. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  180. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  181. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  182. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  183. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  184. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  185. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  186. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  187. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  188. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  189. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  190. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
  191. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  192. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  193. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  194. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  195. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  196. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  197. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  198. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  199. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  200. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  201. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  202. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  203. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
  204. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
  205. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  206. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  207. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  208. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  209. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  210. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  211. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  212. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  213. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  214. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  215. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  216. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  217. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  218. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  219. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  220. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  221. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  222. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  223. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  224. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  225. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  226. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  227. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  228. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  229. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  230. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  231. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  232. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  233. package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
  234. package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
  235. package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
  236. package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
  237. package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
  238. package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
  239. package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
  240. package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
  241. package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
  242. package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
  243. package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
  244. package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
  245. package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
  246. package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
  247. package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
  248. package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
  249. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
  250. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
  251. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
  252. package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
  253. package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
  254. package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
  255. package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
  256. package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
  257. package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
  258. package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
  259. package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
  260. package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
  261. package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
  262. package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
  263. package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
  264. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
  265. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
  266. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
  267. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
  268. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
  269. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  270. package/dist/lib/testing/storyboard/default-invariants.js +23 -0
  271. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  272. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  273. package/dist/lib/testing/storyboard/runner.js +84 -21
  274. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  275. package/dist/lib/testing/storyboard/types.d.ts +21 -0
  276. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  277. package/dist/lib/testing/storyboard/types.js.map +1 -1
  278. package/dist/lib/testing/types.d.ts +9 -0
  279. package/dist/lib/testing/types.d.ts.map +1 -1
  280. package/dist/lib/version.d.ts +3 -3
  281. package/dist/lib/version.js +3 -3
  282. package/package.json +1 -1
@@ -0,0 +1,548 @@
1
+ id: schema_validation
2
+ version: "1.0.0"
3
+ title: "Schema compliance and temporal validation"
4
+ category: schema_validation
5
+ summary: "Validates that agent responses conform to AdCP schemas and that temporal constraints are enforced."
6
+ track: core
7
+ required_tools:
8
+ - get_products
9
+
10
+ narrative: |
11
+ Every AdCP agent must return responses that match the published JSON schemas. Fields defined
12
+ in the spec — product_id, delivery_type, pricing_options — must be present and correctly typed.
13
+ Agents must also enforce temporal constraints: flight dates must be logically consistent
14
+ (end after start) and start dates should not be in the past.
15
+
16
+ This storyboard checks schema compliance on get_products responses and enforces temporal
17
+ constraints on create_media_buy — reversed dates must always be rejected, and past
18
+ start_time must be either rejected or accepted-with-adjustment (never silently accepted).
19
+ These are foundational requirements that every agent must satisfy regardless of platform
20
+ type.
21
+
22
+ agent:
23
+ interaction_model: media_buy_seller
24
+ capabilities:
25
+ - sells_media
26
+ examples:
27
+ - "Any AdCP seller agent"
28
+
29
+ caller:
30
+ role: buyer_agent
31
+ example: "Compliance test harness"
32
+
33
+ prerequisites:
34
+ description: |
35
+ The caller needs a brand identity for product discovery requests.
36
+ test_kit: "test-kits/acme-outdoor.yaml"
37
+
38
+ phases:
39
+ - id: capability_discovery
40
+ title: "Capability discovery"
41
+ narrative: |
42
+ The buyer calls get_adcp_capabilities to confirm the agent supports media buying before validating response schemas.
43
+
44
+ steps:
45
+ - id: get_capabilities
46
+ title: "Check agent capabilities"
47
+ narrative: |
48
+ Verify that the agent declares the expected protocol support before
49
+ proceeding with domain-specific operations.
50
+ task: get_adcp_capabilities
51
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
52
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
53
+ doc_ref: "/protocol/get_adcp_capabilities"
54
+ comply_scenario: capability_discovery
55
+ stateful: false
56
+ expected: |
57
+ Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
58
+ sample_request:
59
+ context:
60
+ correlation_id: "schema_validation--get_capabilities"
61
+ validations:
62
+ - check: response_schema
63
+ description: "Response matches get-adcp-capabilities-response.json schema"
64
+ - check: field_present
65
+ path: "supported_protocols"
66
+ description: "Agent declares supported protocols"
67
+
68
+ - check: field_present
69
+ path: "context"
70
+ description: "Response echoes back the context object"
71
+ - check: field_value
72
+ path: "context.correlation_id"
73
+ value: "schema_validation--get_capabilities"
74
+ description: "Context correlation_id returned unchanged"
75
+ - id: schema_compliance
76
+ title: "Response schema compliance"
77
+ narrative: |
78
+ The buyer sends a standard get_products request and validates that the response
79
+ matches the published schema. Each product must have the required fields defined
80
+ in the AdCP spec.
81
+
82
+ steps:
83
+ - id: get_products_schema
84
+ title: "Validate get_products response schema"
85
+ narrative: |
86
+ Send a brief and validate the response structure. Every product in the response
87
+ must conform to the get-products-response.json schema, with required v3 fields
88
+ present.
89
+ task: get_products
90
+ schema_ref: "media-buy/get-products-request.json"
91
+ response_schema_ref: "media-buy/get-products-response.json"
92
+ doc_ref: "/media-buy/task-reference/get_products"
93
+ comply_scenario: schema_compliance
94
+ stateful: false
95
+ expected: |
96
+ Return products matching the brief. Each product must have all eight required fields:
97
+ - product_id: unique identifier for the product
98
+ - name: human-readable product name
99
+ - description: detailed description of the product and its inventory
100
+ - publisher_properties: array (minItems: 1) of publisher property selectors
101
+ - format_ids: array of format_id objects — each with agent_url (URI) and id
102
+ - delivery_type: "guaranteed" or "non_guaranteed"
103
+ - pricing_options: array (minItems: 1) — each with pricing_option_id, pricing_model, and currency
104
+ - reporting_capabilities: fully-formed object with required sub-fields:
105
+ available_reporting_frequencies, expected_delay_minutes, timezone,
106
+ supports_webhooks, available_metrics, date_range_support
107
+
108
+ Responses missing any of these fields fail schema validation regardless of
109
+ what other fields are present.
110
+
111
+ sample_request:
112
+ buying_mode: "brief"
113
+ brief: "Return a small representative sample of available advertising products"
114
+ pagination:
115
+ max_results: 5
116
+ account:
117
+ brand:
118
+ domain: "acmeoutdoor.example"
119
+ operator: "pinnacle-agency.example"
120
+
121
+ context:
122
+ correlation_id: "schema_validation--get_products_schema"
123
+ validations:
124
+ - check: response_schema
125
+ description: "Response matches get-products-response.json schema"
126
+ - check: field_present
127
+ path: "products"
128
+ description: "Response contains a products array"
129
+ - check: field_present
130
+ path: "products[0].product_id"
131
+ description: "Each product has a product_id"
132
+ - check: field_present
133
+ path: "products[0].delivery_type"
134
+ description: "Each product declares guaranteed or non_guaranteed delivery"
135
+
136
+ - check: field_present
137
+ path: "context"
138
+ description: "Response echoes back the context object"
139
+ - check: field_value
140
+ path: "context.correlation_id"
141
+ value: "schema_validation--get_products_schema"
142
+ description: "Context correlation_id returned unchanged"
143
+ - id: pricing_options_present
144
+ title: "Validate pricing options structure"
145
+ narrative: |
146
+ Verify that products include pricing_options with the required fields:
147
+ pricing_option_id and pricing_model. These are required for buyers to
148
+ construct valid create_media_buy requests.
149
+ task: get_products
150
+ schema_ref: "media-buy/get-products-request.json"
151
+ response_schema_ref: "media-buy/get-products-response.json"
152
+ doc_ref: "/media-buy/task-reference/get_products"
153
+ comply_scenario: schema_compliance
154
+ stateful: false
155
+ expected: |
156
+ Products include pricing_options with:
157
+ - pricing_option_id: unique identifier for the pricing option
158
+ - pricing_model: CPM, CPC, flat_rate, etc.
159
+
160
+ sample_request:
161
+ buying_mode: "brief"
162
+ brief: "Premium display inventory with pricing details"
163
+ pagination:
164
+ max_results: 5
165
+ account:
166
+ brand:
167
+ domain: "acmeoutdoor.example"
168
+ operator: "pinnacle-agency.example"
169
+
170
+ context:
171
+ correlation_id: "schema_validation--pricing_options_present"
172
+ validations:
173
+ - check: field_present
174
+ path: "products[0].pricing_options[0].pricing_option_id"
175
+ description: "Pricing options have a pricing_option_id"
176
+ - check: field_present
177
+ path: "products[0].pricing_options[0].pricing_model"
178
+ description: "Pricing options declare a pricing_model"
179
+
180
+ - check: field_present
181
+ path: "context"
182
+ description: "Response echoes back the context object"
183
+ - check: field_value
184
+ path: "context.correlation_id"
185
+ value: "schema_validation--pricing_options_present"
186
+ description: "Context correlation_id returned unchanged"
187
+ - id: format_id_reconciliation
188
+ title: "Format ID and pricing option reconciliation"
189
+ narrative: |
190
+ Identifiers returned by get_products must be accepted back by the same agent in
191
+ subsequent calls. Two common reconciliation failures:
192
+
193
+ 1. Format IDs: the seller returns format_id objects in products that their own
194
+ validation rejects when the buyer echoes them back in sync_creatives.
195
+ 2. Pricing option IDs: the seller returns pricing_option_id values in products
196
+ that create_media_buy rejects when the buyer references them.
197
+
198
+ These validations confirm structural correctness — that required fields exist and
199
+ are well-formed. Full roundtrip verification (echoing a product's format_id into
200
+ sync_creatives and confirming acceptance) requires a stateful multi-step test,
201
+ which is covered by the media_buy_seller storyboard's creative_sync phase.
202
+
203
+ steps:
204
+ - id: get_products_for_formats
205
+ title: "Get products and verify identifiers"
206
+ narrative: |
207
+ Request products and verify that each product includes format_ids and
208
+ pricing_options with the required fields. These identifiers will be echoed
209
+ back in create_media_buy and sync_creatives — if they are malformed or
210
+ missing, the buyer cannot complete the purchase.
211
+ task: get_products
212
+ schema_ref: "media-buy/get-products-request.json"
213
+ response_schema_ref: "media-buy/get-products-response.json"
214
+ doc_ref: "/media-buy/task-reference/get_products"
215
+ comply_scenario: schema_compliance
216
+ stateful: false
217
+ expected: |
218
+ Return products with format_ids and pricing_options. Each format_id must have:
219
+ - agent_url: URI of the agent that defines the format
220
+ - id: format identifier within that agent's namespace
221
+ - Optional: width, height, duration_ms for parameterized formats
222
+
223
+ Each pricing_option must have:
224
+ - pricing_option_id: unique identifier echoed in create_media_buy
225
+ - pricing_model: CPM, CPC, flat_rate, etc.
226
+
227
+ These identifiers must be accepted unchanged in subsequent requests.
228
+
229
+ sample_request:
230
+ buying_mode: "brief"
231
+ brief: "Return one representative product with creative format requirements"
232
+ pagination:
233
+ max_results: 1
234
+ account:
235
+ brand:
236
+ domain: "acmeoutdoor.example"
237
+ operator: "pinnacle-agency.example"
238
+ context:
239
+ correlation_id: "schema_validation--get_products_for_formats"
240
+
241
+ context_outputs:
242
+ - name: product_format_id
243
+ path: "products[0].format_ids[0]"
244
+ validations:
245
+ - check: response_schema
246
+ description: "Response matches get-products-response.json schema"
247
+ - check: field_present
248
+ path: "products[0].format_ids"
249
+ description: "Products include format_ids array"
250
+ - check: field_present
251
+ path: "products[0].format_ids[0].agent_url"
252
+ description: "Format IDs include agent_url"
253
+ - check: field_present
254
+ path: "products[0].format_ids[0].id"
255
+ description: "Format IDs include id"
256
+ - check: field_present
257
+ path: "products[0].pricing_options[0].pricing_option_id"
258
+ description: "Pricing options include pricing_option_id — must be accepted in create_media_buy"
259
+ - check: field_present
260
+ path: "products[0].pricing_options[0].pricing_model"
261
+ description: "Pricing options include pricing_model"
262
+ - check: field_present
263
+ path: "context"
264
+ description: "Response echoes back the context object"
265
+ - check: field_value
266
+ path: "context.correlation_id"
267
+ value: "schema_validation--get_products_for_formats"
268
+ description: "Context correlation_id returned unchanged"
269
+
270
+ - id: list_formats_match
271
+ title: "Verify format catalog includes product formats"
272
+ narrative: |
273
+ Call list_creative_formats for the first format_id returned on a
274
+ product and verify that the format catalog resolves that exact
275
+ reference. The seller's format catalog must cover that referenced
276
+ format.
277
+ task: list_creative_formats
278
+ schema_ref: "creative/list-creative-formats-request.json"
279
+ response_schema_ref: "creative/list-creative-formats-response.json"
280
+ doc_ref: "/creative/task-reference/list_creative_formats"
281
+ comply_scenario: schema_compliance
282
+ stateful: false
283
+ expected: |
284
+ Return the format matching the agent's own product format_id:
285
+ - format_id.agent_url must match the agent's own URL
286
+ - format_id.id values must include those referenced by products
287
+ - Each format must define asset requirements (types, dimensions, mime types)
288
+
289
+ If the agent returns format_ids in products that don't appear in
290
+ list_creative_formats, buyers cannot construct valid sync_creatives requests.
291
+
292
+ sample_request:
293
+ format_ids:
294
+ - "$context.product_format_id"
295
+ pagination:
296
+ max_results: 1
297
+ context:
298
+ correlation_id: "schema_validation--list_formats_match"
299
+
300
+ validations:
301
+ - check: response_schema
302
+ description: "Response matches list-creative-formats-response.json schema"
303
+ - check: field_present
304
+ path: "formats[0].format_id.agent_url"
305
+ description: "Formats include format_id with agent_url"
306
+ - check: field_present
307
+ path: "formats[0].format_id.id"
308
+ description: "Formats include format_id with id"
309
+ - check: field_value
310
+ path: "formats[0].format_id"
311
+ value: "$context.product_format_id"
312
+ description: "Filtered format response returns the product's exact format_id"
313
+ - check: field_present
314
+ path: "context"
315
+ description: "Response echoes back the context object"
316
+ - check: field_value
317
+ path: "context.correlation_id"
318
+ value: "schema_validation--list_formats_match"
319
+ description: "Context correlation_id returned unchanged"
320
+
321
+ - id: temporal_validation
322
+ title: "Temporal constraint enforcement"
323
+ narrative: |
324
+ The buyer sends media buy requests with invalid temporal constraints. The agent
325
+ must reject reversed dates (end before start) and handle past start dates
326
+ appropriately.
327
+
328
+ steps:
329
+ - id: reversed_dates
330
+ title: "Reject reversed flight dates"
331
+ narrative: |
332
+ Send a create_media_buy request where end_time is before start_time. The agent
333
+ must reject this with an INVALID_REQUEST error.
334
+ task: create_media_buy
335
+ requires_tool: create_media_buy
336
+ schema_ref: "media-buy/create-media-buy-request.json"
337
+ response_schema_ref: "media-buy/create-media-buy-response.json"
338
+ doc_ref: "/media-buy/task-reference/create_media_buy"
339
+ comply_scenario: temporal_validation
340
+ expect_error: true
341
+ negative_path: payload_well_formed
342
+ stateful: false
343
+ expected: |
344
+ Reject the request with:
345
+ - Error code: INVALID_REQUEST
346
+ - Message indicating the date constraint violation
347
+
348
+ sample_request:
349
+ brand:
350
+ domain: "acmeoutdoor.example"
351
+ account:
352
+ brand:
353
+ domain: "acmeoutdoor.example"
354
+ operator: "pinnacle-agency.example"
355
+ idempotency_key: "$generate:uuid_v4#schema-validation-reversed-dates"
356
+ start_time: "2026-12-31T00:00:00Z"
357
+ end_time: "2026-01-01T00:00:00Z"
358
+ packages:
359
+ - product_id: "test-product"
360
+ budget: 10000
361
+ pricing_option_id: "test-pricing"
362
+
363
+ context:
364
+ correlation_id: "schema_validation--reversed_dates"
365
+ validations:
366
+ - check: field_present
367
+ path: "adcp_error"
368
+ description: "Response contains an error for reversed dates"
369
+
370
+ - check: field_present
371
+ path: "context"
372
+ description: "Response echoes back the context object"
373
+ - check: field_value
374
+ path: "context.correlation_id"
375
+ value: "schema_validation--reversed_dates"
376
+ description: "Context correlation_id returned unchanged"
377
+ - id: past_start_reject_path
378
+ title: "Past start date — reject path"
379
+ narrative: |
380
+ Some agents reject past start dates with INVALID_REQUEST. This phase
381
+ exercises that path. Passing agents that reject here contribute
382
+ `past_start_handled`; passing agents that accept-with-adjustment do so
383
+ in the parallel adjust path below. Either path satisfies the temporal
384
+ enforcement assertion at the end.
385
+ optional: true
386
+ branch_set:
387
+ id: past_start_handled
388
+ semantics: any_of
389
+
390
+ steps:
391
+ - id: create_buy_past_start_reject
392
+ title: "Submit a past-start create_media_buy — expect rejection"
393
+ narrative: |
394
+ Send a create_media_buy whose start_time is years in the past. An
395
+ agent on this path rejects with INVALID_REQUEST. The request
396
+ carries a valid `idempotency_key` so the rejection is
397
+ unambiguously about the temporal constraint — without a key the
398
+ agent could also legitimately reject for missing-key (per
399
+ universal/idempotency.yaml), and the storyboard couldn't tell
400
+ which rule fired.
401
+ task: create_media_buy
402
+ requires_tool: create_media_buy
403
+ schema_ref: "media-buy/create-media-buy-request.json"
404
+ response_schema_ref: "media-buy/create-media-buy-response.json"
405
+ doc_ref: "/media-buy/task-reference/create_media_buy"
406
+ comply_scenario: temporal_validation
407
+ expect_error: true
408
+ negative_path: payload_well_formed
409
+ stateful: false
410
+ contributes: true
411
+ expected: |
412
+ Reject the request with:
413
+ - Error code: INVALID_REQUEST
414
+ - Message indicating the past start_time violation
415
+
416
+ sample_request:
417
+ brand:
418
+ domain: "acmeoutdoor.example"
419
+ account:
420
+ brand:
421
+ domain: "acmeoutdoor.example"
422
+ operator: "pinnacle-agency.example"
423
+ start_time: "2020-01-01T00:00:00Z"
424
+ end_time: "2026-12-31T23:59:59Z"
425
+ packages:
426
+ - product_id: "test-product"
427
+ budget: 10000
428
+ pricing_option_id: "test-pricing"
429
+
430
+ idempotency_key: "$generate:uuid_v4#schema_validation_past_start_reject"
431
+ context:
432
+ correlation_id: "schema_validation--past_start_date_reject"
433
+ validations:
434
+ - check: error_code
435
+ value: "INVALID_REQUEST"
436
+ description: "Past start_time rejected with INVALID_REQUEST"
437
+
438
+ - check: field_present
439
+ path: "context"
440
+ description: "Response echoes back the context object"
441
+ - check: field_value
442
+ path: "context.correlation_id"
443
+ value: "schema_validation--past_start_date_reject"
444
+ description: "Context correlation_id returned unchanged"
445
+
446
+ - id: past_start_adjust_path
447
+ title: "Past start date — adjust path"
448
+ narrative: |
449
+ Some agents accept past start dates and auto-adjust them forward to a
450
+ legal flight window. This phase exercises that path. Passing agents
451
+ contribute `past_start_handled`; the parallel reject path above covers
452
+ agents that chose rejection instead.
453
+
454
+ The response doesn't carry the adjusted start_time directly, so the
455
+ validation here is success-envelope + context echo — a conformant
456
+ accept-with-adjustment response returns a media_buy_id, and the agent
457
+ is trusted to have adjusted the date per its own policy.
458
+ optional: true
459
+ branch_set:
460
+ id: past_start_handled
461
+ semantics: any_of
462
+
463
+ steps:
464
+ - id: create_buy_past_start_adjust
465
+ title: "Submit a past-start create_media_buy — expect accept-and-adjust"
466
+ narrative: |
467
+ Same request as the reject path. An agent on this path accepts it,
468
+ auto-adjusts the start_time forward, and returns a media_buy_id.
469
+ idempotency_key is present because the request is a real mutation.
470
+ task: create_media_buy
471
+ requires_tool: create_media_buy
472
+ schema_ref: "media-buy/create-media-buy-request.json"
473
+ response_schema_ref: "media-buy/create-media-buy-response.json"
474
+ doc_ref: "/media-buy/task-reference/create_media_buy"
475
+ comply_scenario: temporal_validation
476
+ stateful: false
477
+ contributes: true
478
+ expected: |
479
+ Accept the request with auto-adjusted dates:
480
+ - Response matches create-media-buy-response.json schema
481
+ - media_buy_id present
482
+ - context.correlation_id echoed
483
+
484
+ sample_request:
485
+ brand:
486
+ domain: "acmeoutdoor.example"
487
+ account:
488
+ brand:
489
+ domain: "acmeoutdoor.example"
490
+ operator: "pinnacle-agency.example"
491
+ start_time: "2020-01-01T00:00:00Z"
492
+ end_time: "2026-12-31T23:59:59Z"
493
+ packages:
494
+ - product_id: "test-product"
495
+ budget: 10000
496
+ pricing_option_id: "test-pricing"
497
+
498
+ idempotency_key: "$generate:uuid_v4#schema_validation_past_start_adjust"
499
+ context:
500
+ correlation_id: "schema_validation--past_start_date_adjust"
501
+ validations:
502
+ - check: response_schema
503
+ description: "Response matches create-media-buy-response.json schema"
504
+ - check: field_present
505
+ path: "media_buy_id"
506
+ description: "Response carries a media_buy_id (accept branch)"
507
+
508
+ - check: field_present
509
+ path: "context"
510
+ description: "Response echoes back the context object"
511
+ - check: field_value
512
+ path: "context.correlation_id"
513
+ value: "schema_validation--past_start_date_adjust"
514
+ description: "Context correlation_id returned unchanged"
515
+
516
+ - id: past_start_enforcement
517
+ title: "Past start date — require handling"
518
+ narrative: |
519
+ An agent that silently accepts a past start_time without either
520
+ rejecting or acknowledging an adjustment is non-conformant. Either
521
+ optional path above must succeed. This phase asserts the
522
+ `past_start_handled` contribution was set by at least one of them.
523
+
524
+ Note: the spec (docs/media-buy/task-reference/create_media_buy.mdx,
525
+ §Flight date validation) explicitly mandates INVALID_REQUEST for
526
+ reversed/out-of-range dates but is silent on past start_time,
527
+ which is why either-or is the current conformant stance. If a
528
+ future spec revision commits to one behavior, this phase
529
+ collapses to a single required path.
530
+
531
+ steps:
532
+ - id: assert_past_start_handled
533
+ title: "Require past_start_handled from either path"
534
+ narrative: |
535
+ Synthetic assertion over accumulated flags from the two optional
536
+ phases. Fails only if neither path contributed past_start_handled.
537
+ task: assert_contribution
538
+ requires_tool: create_media_buy
539
+ comply_scenario: temporal_validation
540
+ stateful: false
541
+ expected: |
542
+ At least one of past_start_reject_path or past_start_adjust_path
543
+ contributed `past_start_handled`.
544
+
545
+ validations:
546
+ - check: any_of
547
+ allowed_values: ["past_start_handled"]
548
+ description: "Agent must either reject the past start_time (reject path) or accept-and-adjust (adjust path). Silent acceptance without either outcome is non-conformant."