@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,125 @@
1
+ id: capability_discovery
2
+ version: "1.0.0"
3
+ title: "Capability discovery"
4
+ category: capability_discovery
5
+ summary: "Buyer calls get_adcp_capabilities to discover what an agent supports before making any buying or creative decisions."
6
+ track: core
7
+
8
+ narrative: |
9
+ Before doing anything else, a buyer agent calls get_adcp_capabilities to learn what your
10
+ platform supports. This is the first call in any new relationship — the buyer needs to know
11
+ your protocol version, supported domains (media buy, creative, governance, signals, SI),
12
+ pricing models, targeting capabilities, and creative specs.
13
+
14
+ The response shapes every subsequent call. If you declare media_buy support, the buyer knows
15
+ it can send briefs and create media buys. If you declare creative support, the buyer knows
16
+ it can sync or build creatives. The buyer uses this to decide which storyboards apply to your
17
+ agent and what flows to attempt.
18
+
19
+ agent:
20
+ interaction_model: media_buy_seller
21
+ capabilities:
22
+ - sells_media
23
+ examples:
24
+ - "Any AdCP-compliant agent"
25
+ - "Publisher platforms"
26
+ - "Creative ad servers"
27
+ - "DSPs"
28
+
29
+ caller:
30
+ role: buyer_agent
31
+ example: "Scope3 (DSP)"
32
+
33
+ prerequisites:
34
+ description: |
35
+ No prerequisites. This is the very first call a buyer makes to any agent.
36
+ The test kit provides brand context but it is not required for this storyboard.
37
+ test_kit: "test-kits/acme-outdoor.yaml"
38
+
39
+ phases:
40
+ - id: protocol_discovery
41
+ title: "Protocol and capability discovery"
42
+ narrative: |
43
+ The buyer calls get_adcp_capabilities to learn what your agent supports. This call
44
+ takes no required arguments — it is a read-only introspection of the agent's
45
+ capabilities. The buyer may optionally filter by protocol domain or major version.
46
+
47
+ steps:
48
+ - id: get_capabilities
49
+ title: "Discover agent capabilities"
50
+ narrative: |
51
+ The buyer calls get_adcp_capabilities with no arguments. Your agent returns its
52
+ full capability declaration: protocol version, supported domains, pricing models,
53
+ targeting options, creative specs, and any extensions.
54
+
55
+ This response is the source of truth for what the buyer can do with your agent.
56
+ Every field the buyer reads here determines which tasks it will call next.
57
+ task: get_adcp_capabilities
58
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
59
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
60
+ doc_ref: "/protocol/get_adcp_capabilities"
61
+ comply_scenario: capability_discovery
62
+ stateful: false
63
+ expected: |
64
+ Return your agent's full capability declaration:
65
+ - adcp.major_versions: which protocol versions you support (e.g., [3])
66
+ - supported_protocols: which domains are available (media_buy, creative, governance, signals, sponsored_intelligence)
67
+ - media_buy: pricing models, delivery types, targeting, reporting features
68
+ - creative: library support, generation, transformation capabilities
69
+ - governance: property and creative features the governance agent can evaluate
70
+ - account: auth model, billing support, sandbox mode
71
+
72
+ sample_request:
73
+ context:
74
+ correlation_id: "capability_discovery--get_capabilities"
75
+
76
+ validations:
77
+ - check: response_schema
78
+ description: "Response matches get-adcp-capabilities-response.json schema"
79
+ - check: field_present
80
+ path: "adcp.major_versions"
81
+ description: "Agent declares supported protocol versions"
82
+ - check: field_present
83
+ path: "supported_protocols"
84
+ description: "Agent declares which protocol domains it supports"
85
+
86
+ - check: field_present
87
+ path: "context"
88
+ description: "Response echoes back the context object"
89
+ - check: field_value
90
+ path: "context.correlation_id"
91
+ value: "capability_discovery--get_capabilities"
92
+ description: "Context correlation_id returned unchanged"
93
+ - id: get_capabilities_filtered
94
+ title: "Discover capabilities filtered by protocol"
95
+ narrative: |
96
+ The buyer calls get_adcp_capabilities again, this time filtering for a specific
97
+ protocol domain. This is useful when the buyer already knows what it wants and
98
+ only needs details for one domain (e.g., just media_buy capabilities).
99
+ task: get_adcp_capabilities
100
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
101
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
102
+ doc_ref: "/protocol/get_adcp_capabilities"
103
+ comply_scenario: capability_discovery
104
+ stateful: false
105
+ expected: |
106
+ Return capabilities filtered to the requested protocol domain. The response
107
+ should include the same structure but only the requested domain details.
108
+
109
+ sample_request:
110
+ protocols:
111
+ - "media_buy"
112
+
113
+ context:
114
+ correlation_id: "capability_discovery--get_capabilities_filtered"
115
+ validations:
116
+ - check: response_schema
117
+ description: "Response matches get-adcp-capabilities-response.json schema"
118
+
119
+ - check: field_present
120
+ path: "context"
121
+ description: "Response echoes back the context object"
122
+ - check: field_value
123
+ path: "context.correlation_id"
124
+ value: "capability_discovery--get_capabilities_filtered"
125
+ description: "Context correlation_id returned unchanged"
@@ -0,0 +1,306 @@
1
+ id: pagination_integrity_collection_lists
2
+ version: "1.0.0"
3
+ title: "Pagination cursor integrity — list_collection_lists"
4
+ category: schema_validation
5
+ summary: "Validates the cursor↔has_more invariant by walking a paginated list_collection_lists response from a continuation page to a terminal page."
6
+ track: core
7
+ required_tools:
8
+ - list_collection_lists
9
+
10
+ narrative: |
11
+ Pagination is cursor-based across AdCP. Every response carrying a
12
+ `pagination` block satisfies a single invariant: when `has_more` is true the
13
+ `cursor` MUST be present (callers need it to fetch the next page); when
14
+ `has_more` is false the `cursor` MUST be absent (a stale token on a terminal
15
+ page invites callers to follow it into undefined behavior).
16
+
17
+ The invariant is documented in prose on
18
+ `static/schemas/source/core/pagination-response.json` but JSON Schema does
19
+ not gate the two fields against each other. This storyboard exercises both
20
+ sides of the invariant on `list_collection_lists` in a single run.
21
+
22
+ The runner bootstraps three collection lists via `create_collection_list`,
23
+ then lists them back with `max_results=2`. The first page MUST cap at two
24
+ lists and signal continuation with `has_more=true` plus a cursor. The runner
25
+ then follows that cursor; the second call MUST return the terminal page with
26
+ `has_more=false` and no cursor. An agent that hides the third list by
27
+ reporting `has_more=false` on the first page fails the first-page assertion.
28
+ An agent that carries a stale cursor onto the terminal page fails the
29
+ second-page assertion.
30
+
31
+ The `total_count` field is allowed to be absent (some backends cannot
32
+ compute it cheaply per the pagination-response schema) but when an agent
33
+ volunteers it, the value MUST match the seeded count of three.
34
+
35
+ agent:
36
+ interaction_model: stateful_preloaded
37
+ capabilities: []
38
+ examples:
39
+ - "Any AdCP agent that exposes a paginated list_collection_lists"
40
+
41
+ caller:
42
+ role: buyer_agent
43
+ example: "Compliance test harness"
44
+
45
+ prerequisites:
46
+ description: |
47
+ The storyboard bootstraps three collection lists in the setup phase via
48
+ `create_collection_list`. The seed-DAG does not include collection lists,
49
+ so this storyboard uses the create-then-list pattern to keep itself
50
+ self-contained without extending the seed taxonomy.
51
+ test_kit: "test-kits/acme-outdoor.yaml"
52
+ controller_seeding: false
53
+
54
+ phases:
55
+ - id: capability_discovery
56
+ title: "Capability discovery"
57
+ narrative: |
58
+ Confirm the agent responds to get_adcp_capabilities before
59
+ exercising list_collection_lists.
60
+ steps:
61
+ - id: get_capabilities
62
+ title: "Check agent capabilities"
63
+ narrative: |
64
+ Verify that the agent declares supported protocols before
65
+ driving paginated list_collection_lists.
66
+ task: get_adcp_capabilities
67
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
68
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
69
+ doc_ref: "/protocol/get_adcp_capabilities"
70
+ comply_scenario: pagination_integrity_collection_lists
71
+ stateful: false
72
+ expected: |
73
+ Return capabilities declaring supported protocols.
74
+
75
+ sample_request:
76
+ context:
77
+ correlation_id: "pagination_integrity_collection_lists--get_capabilities"
78
+ validations:
79
+ - check: response_schema
80
+ description: "Response matches get-adcp-capabilities-response.json schema"
81
+ - check: field_present
82
+ path: "supported_protocols"
83
+ description: "Agent declares supported protocols"
84
+ - check: field_present
85
+ path: "context"
86
+ description: "Response echoes back the context object"
87
+ - check: field_value
88
+ path: "context.correlation_id"
89
+ value: "pagination_integrity_collection_lists--get_capabilities"
90
+ description: "Context correlation_id returned unchanged"
91
+
92
+ - id: setup
93
+ title: "Bootstrap three collection lists"
94
+ narrative: |
95
+ Create three collection lists so the pagination walk has a deterministic
96
+ set of three items to page through with max_results=2.
97
+ steps:
98
+ - id: create_list_1
99
+ title: "Create first collection list"
100
+ narrative: |
101
+ Create a collection list for primetime drama programs. The agent MUST
102
+ accept this and return a list_id.
103
+ task: create_collection_list
104
+ schema_ref: "collection/create-collection-list-request.json"
105
+ response_schema_ref: "collection/create-collection-list-response.json"
106
+ doc_ref: "/governance/task-reference/create_collection_list"
107
+ comply_scenario: pagination_integrity_collection_lists
108
+ stateful: true
109
+ expected: |
110
+ Accept the collection list and return a list.list_id.
111
+
112
+ sample_request:
113
+ account:
114
+ brand:
115
+ domain: "acmeoutdoor.example"
116
+ operator: "pinnacle-agency.example"
117
+ name: "Primetime Drama Allowlist"
118
+ description: "Collection of approved primetime drama programs."
119
+ idempotency_key: "$generate:uuid_v4#pagination_integrity_collection_lists_setup_create_list_1"
120
+ context:
121
+ correlation_id: "pagination_integrity_collection_lists--setup_1"
122
+ validations:
123
+ - check: response_schema
124
+ description: "Response matches create-collection-list-response.json schema"
125
+ - check: field_present
126
+ path: "list.list_id"
127
+ description: "Response contains list.list_id"
128
+
129
+ - id: create_list_2
130
+ title: "Create second collection list"
131
+ narrative: |
132
+ Create a collection list for news programs.
133
+ task: create_collection_list
134
+ schema_ref: "collection/create-collection-list-request.json"
135
+ response_schema_ref: "collection/create-collection-list-response.json"
136
+ doc_ref: "/governance/task-reference/create_collection_list"
137
+ comply_scenario: pagination_integrity_collection_lists
138
+ stateful: true
139
+ expected: |
140
+ Accept the collection list and return a list.list_id.
141
+
142
+ sample_request:
143
+ account:
144
+ brand:
145
+ domain: "acmeoutdoor.example"
146
+ operator: "pinnacle-agency.example"
147
+ name: "News Programs Allowlist"
148
+ description: "Approved national news broadcast programs."
149
+ idempotency_key: "$generate:uuid_v4#pagination_integrity_collection_lists_setup_create_list_2"
150
+ context:
151
+ correlation_id: "pagination_integrity_collection_lists--setup_2"
152
+ validations:
153
+ - check: response_schema
154
+ description: "Response matches create-collection-list-response.json schema"
155
+ - check: field_present
156
+ path: "list.list_id"
157
+ description: "Response contains list.list_id"
158
+
159
+ - id: create_list_3
160
+ title: "Create third collection list"
161
+ narrative: |
162
+ Create a collection list for sports programs.
163
+ task: create_collection_list
164
+ schema_ref: "collection/create-collection-list-request.json"
165
+ response_schema_ref: "collection/create-collection-list-response.json"
166
+ doc_ref: "/governance/task-reference/create_collection_list"
167
+ comply_scenario: pagination_integrity_collection_lists
168
+ stateful: true
169
+ expected: |
170
+ Accept the collection list and return a list.list_id.
171
+
172
+ sample_request:
173
+ account:
174
+ brand:
175
+ domain: "acmeoutdoor.example"
176
+ operator: "pinnacle-agency.example"
177
+ name: "Sports Programs Allowlist"
178
+ description: "Approved live sports broadcasts."
179
+ idempotency_key: "$generate:uuid_v4#pagination_integrity_collection_lists_setup_create_list_3"
180
+ context:
181
+ correlation_id: "pagination_integrity_collection_lists--setup_3"
182
+ validations:
183
+ - check: response_schema
184
+ description: "Response matches create-collection-list-response.json schema"
185
+ - check: field_present
186
+ path: "list.list_id"
187
+ description: "Response contains list.list_id"
188
+
189
+ - id: pagination_walk
190
+ title: "Walk pages with a small max_results"
191
+ narrative: |
192
+ With three collection lists seeded and `max_results: 2`, the first call
193
+ MUST return a continuation page (has_more=true with a cursor). The runner
194
+ then follows the cursor; the second call MUST return the terminal page
195
+ (has_more=false with no cursor).
196
+
197
+ steps:
198
+ - id: first_page
199
+ title: "Request the first page with max_results=2"
200
+ narrative: |
201
+ The buyer asks for up to two collection lists. The agent has three
202
+ matching lists, so the request is non-terminal: callers expect
203
+ `has_more=true` and a `cursor` they can follow to retrieve the
204
+ remaining list.
205
+
206
+ The runner captures `pagination.cursor` into `$context.next_cursor`
207
+ for the follow-up step. If the agent reports `has_more=false` on
208
+ this page (hiding the seeded third list behind a dishonest terminal
209
+ signal), the field_value check on `pagination.has_more` fails.
210
+ task: list_collection_lists
211
+ schema_ref: "collection/list-collection-lists-request.json"
212
+ response_schema_ref: "collection/list-collection-lists-response.json"
213
+ doc_ref: "/governance/task-reference/list_collection_lists"
214
+ comply_scenario: pagination_integrity_collection_lists
215
+ stateful: true
216
+ context_outputs:
217
+ - name: next_cursor
218
+ path: "pagination.cursor"
219
+ expected: |
220
+ Return up to two collection lists with:
221
+ - pagination.has_more = true
222
+ - pagination.cursor present (an opaque continuation token)
223
+
224
+ sample_request:
225
+ account:
226
+ brand:
227
+ domain: "acmeoutdoor.example"
228
+ operator: "pinnacle-agency.example"
229
+ pagination:
230
+ max_results: 2
231
+
232
+ context:
233
+ correlation_id: "pagination_integrity_collection_lists--first_page"
234
+ validations:
235
+ - check: response_schema
236
+ description: "Response matches list-collection-lists-response.json schema"
237
+ - check: field_value
238
+ path: "pagination.has_more"
239
+ value: true
240
+ description: "Three lists seeded with max_results=2 → first page is non-terminal"
241
+ - check: field_present
242
+ path: "pagination.cursor"
243
+ description: "has_more=true requires a cursor — without one the caller cannot continue"
244
+ - check: field_value_or_absent
245
+ path: "pagination.total_count"
246
+ allowed_values: [3]
247
+ description: "If volunteered, total_count MUST equal the seeded set size"
248
+ - check: field_present
249
+ path: "context"
250
+ description: "Response echoes back the context object"
251
+ - check: field_value
252
+ path: "context.correlation_id"
253
+ value: "pagination_integrity_collection_lists--first_page"
254
+ description: "Context correlation_id returned unchanged"
255
+
256
+ - id: terminal_page
257
+ title: "Follow the cursor to the terminal page"
258
+ narrative: |
259
+ The buyer follows the captured cursor. With at most one remaining
260
+ list the agent MUST return a terminal page: `has_more=false` with no
261
+ `cursor` field. A cursor on `has_more=false` is a stale token that
262
+ invites callers to follow it past the end of results.
263
+ task: list_collection_lists
264
+ schema_ref: "collection/list-collection-lists-request.json"
265
+ response_schema_ref: "collection/list-collection-lists-response.json"
266
+ doc_ref: "/governance/task-reference/list_collection_lists"
267
+ comply_scenario: pagination_integrity_collection_lists
268
+ stateful: true
269
+ expected: |
270
+ Return the remaining list(s) with:
271
+ - pagination.has_more = false
272
+ - pagination.cursor absent
273
+
274
+ sample_request:
275
+ account:
276
+ brand:
277
+ domain: "acmeoutdoor.example"
278
+ operator: "pinnacle-agency.example"
279
+ pagination:
280
+ cursor: "$context.next_cursor"
281
+ max_results: 2
282
+
283
+ context:
284
+ correlation_id: "pagination_integrity_collection_lists--terminal_page"
285
+ validations:
286
+ - check: response_schema
287
+ description: "Response matches list-collection-lists-response.json schema"
288
+ - check: field_value
289
+ path: "pagination.has_more"
290
+ value: false
291
+ description: "After two pages of two items the seeded set is exhausted"
292
+ - check: field_value_or_absent
293
+ path: "pagination.cursor"
294
+ allowed_values: [null]
295
+ description: "Terminal page MUST omit cursor (null also accepted for clients that explicitly clear the field)"
296
+ - check: field_value_or_absent
297
+ path: "pagination.total_count"
298
+ allowed_values: [3]
299
+ description: "total_count (when volunteered) MUST stay stable across pages and equal the seeded set size"
300
+ - check: field_present
301
+ path: "context"
302
+ description: "Response echoes back the context object"
303
+ - check: field_value
304
+ path: "context.correlation_id"
305
+ value: "pagination_integrity_collection_lists--terminal_page"
306
+ description: "Context correlation_id returned unchanged"
@@ -0,0 +1,141 @@
1
+ id: comply_controller_mode_gate
2
+ version: '1.0.0'
3
+ title: 'Comply test controller — live-account denial gate'
4
+ category: deterministic_testing
5
+ summary: 'Verifies that a seller exposing comply_test_controller refuses calls from live-mode (non-sandbox) accounts with FORBIDDEN.'
6
+ track: security
7
+ required_tools:
8
+ - comply_test_controller
9
+
10
+ requires:
11
+ - controller
12
+
13
+ narrative: |
14
+ Sellers that expose comply_test_controller MUST gate dispatch against the calling
15
+ account's mode. When a buyer agent authenticates as a live-mode (non-sandbox)
16
+ account and calls comply_test_controller, the seller MUST refuse with
17
+ error: FORBIDDEN before dispatching any scenario.
18
+
19
+ This storyboard exercises the denial path by sending a well-formed
20
+ force_creative_status request from a live-mode principal (test-kit:
21
+ acme-outdoor-live, sandbox: false) and asserting FORBIDDEN is returned.
22
+
23
+ The live_account_denial phase is optional for two-deployment sellers whose
24
+ sandbox endpoint admits all authenticated principals regardless of account mode.
25
+ Those sellers rely on their production endpoint simply not advertising
26
+ comply_test_controller. Single-endpoint sellers that expose the controller on
27
+ their main endpoint MUST implement per-account gating and MUST pass this phase.
28
+
29
+ This storyboard is the keystone for the (Sandbox) AAO Verified tier — a seller
30
+ claiming that badge must prove its compliance infrastructure correctly refuses
31
+ live-mode callers from the controller surface, confirming the sandbox/production
32
+ boundary is enforced in both directions.
33
+
34
+ agent:
35
+ interaction_model: media_buy_seller
36
+ capabilities:
37
+ - sells_media
38
+ - supports_test_controller
39
+ examples:
40
+ - 'Any single-endpoint seller with comply_test_controller'
41
+
42
+ caller:
43
+ role: buyer_agent
44
+ example: 'Comply test harness'
45
+
46
+ prerequisites:
47
+ description: |
48
+ The seller must expose comply_test_controller (verified by requires: [controller]
49
+ at storyboard load time). The live-mode test kit (acme-outdoor-live, sandbox: false)
50
+ provides an API key whose associated account resolves as live/production mode.
51
+ Conformant sellers resolve the account, detect mode: live, and return FORBIDDEN
52
+ without dispatching the scenario.
53
+ test_kit: 'test-kits/acme-outdoor-live.yaml'
54
+
55
+ phases:
56
+ - id: live_account_denial
57
+ title: 'Live-account caller is denied'
58
+ narrative: |
59
+ A buyer authenticates as the live-mode Acme Outdoor principal (sandbox: false)
60
+ and calls comply_test_controller with a well-formed force_creative_status request.
61
+
62
+ Sellers that implement per-account gating MUST detect mode: live and return
63
+ ControllerError with error: FORBIDDEN before any scenario dispatch occurs.
64
+
65
+ This phase is optional: two-deployment sellers whose sandbox endpoint
66
+ has no per-account gate will return a successful state transition rather than
67
+ FORBIDDEN, which would fail this phase. Those sellers correctly prevent
68
+ live-mode misuse by not advertising the tool on their production endpoint
69
+ at all, so an optional result here does not indicate non-conformance.
70
+
71
+ optional: true
72
+
73
+ steps:
74
+ - id: deny_live_caller
75
+ title: 'comply_test_controller returns FORBIDDEN for a live-mode account'
76
+ narrative: |
77
+ Send a valid force_creative_status request authenticated as the live-mode
78
+ principal. The creative_id comply-live-mode-probe-000 is a stable probe
79
+ value that will not exist on any real seller; the scenario is benign —
80
+ the seller's gate fires before entity lookup, so NOT_FOUND is not a
81
+ conformant response here.
82
+
83
+ The seller MUST resolve the calling account, detect that account.mode
84
+ is live (not sandbox), and return FORBIDDEN. Returning UNKNOWN_SCENARIO,
85
+ NOT_FOUND, or a success response are all non-conformant for a
86
+ single-endpoint seller that implements the gate.
87
+ task: comply_test_controller
88
+ schema_ref: 'compliance/comply-test-controller-request.json'
89
+ response_schema_ref: 'compliance/comply-test-controller-response.json'
90
+ doc_ref: '/building/implementation/comply-test-controller'
91
+ comply_scenario: comply_controller_mode_gate
92
+ stateful: false
93
+ auth:
94
+ type: api_key
95
+ from_test_kit: true
96
+ expect_error: true
97
+ negative_path: payload_well_formed
98
+ expected: |
99
+ Seller refuses with:
100
+ - success: false
101
+ - error: FORBIDDEN
102
+ - error_detail (optional): human-readable explanation such as
103
+ "comply_test_controller requires a sandbox account; resolved
104
+ account is in live mode"
105
+
106
+ sample_request:
107
+ scenario: 'force_creative_status'
108
+ params:
109
+ creative_id: 'comply-live-mode-probe-000'
110
+ status: 'approved'
111
+ # account.sandbox is a caller-side declaration of intent (schema const: true).
112
+ # The denial here comes from the seller resolving the auth principal to a
113
+ # live-mode account in its persisted records — not from the payload claim.
114
+ # The payload still MUST be schema-valid, otherwise it never reaches the
115
+ # per-account gate (schema rejection happens first as defense-in-depth).
116
+ account:
117
+ sandbox: true
118
+ context:
119
+ correlation_id: "comply_controller_mode_gate--deny_live_caller"
120
+
121
+ validations:
122
+ - check: response_schema
123
+ description: 'Response matches comply-test-controller-response.json schema (ControllerError branch)'
124
+ - check: field_value
125
+ path: 'success'
126
+ allowed_values:
127
+ - false
128
+ description: 'Request is rejected — seller refused live-mode controller dispatch'
129
+ - check: field_value
130
+ path: 'error'
131
+ allowed_values:
132
+ - 'FORBIDDEN'
133
+ description: 'Error code is FORBIDDEN — seller detected live-mode account and denied dispatch before scenario execution'
134
+
135
+ - check: field_present
136
+ path: "context"
137
+ description: "Response echoes back the context object"
138
+ - check: field_value
139
+ path: "context.correlation_id"
140
+ value: "comply_controller_mode_gate--deny_live_caller"
141
+ description: "Context correlation_id returned unchanged"