@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,309 @@
1
+ id: media_buy_seller/frequency_cap_enforcement
2
+ version: "1.0.0"
3
+ title: "Seller honors a package-level frequency cap and reports observed frequency at-or-below the cap"
4
+ category: media_buy_seller
5
+ summary: "Verifies that a seller advertising frequency_capping accepts a package-level frequency_cap (max_impressions + per + window form) on create_media_buy and, after simulated delivery, reports observed reach and frequency on get_media_buy_delivery with the observed frequency at-or-below the requested cap. Runtime-enforcement scenario — no rejection arm. Sellers without frequency_capping grade not_applicable."
6
+ track: media_buy
7
+
8
+ # Gate: scenario runs only when the seller declares frequency_capping (object
9
+ # presence indicates the seller honors targeting.frequency_cap and rejects
10
+ # caps it cannot enforce rather than silently dropping them). Sellers without
11
+ # the capability — many programmatic exchanges that pass frequency control
12
+ # upstream to the bidder, broadcast TV inventory where caps are managed at
13
+ # the schedule level — grade `not_applicable`, not failing. Requires runner
14
+ # support for the `present:` matcher (adcp-client >= 7.6.0).
15
+ requires_capability:
16
+ path: media_buy.frequency_capping
17
+ present: true
18
+
19
+ required_tools:
20
+ - get_products
21
+ - create_media_buy
22
+ - get_media_buy_delivery
23
+ - comply_test_controller
24
+
25
+ invariants:
26
+ - status.monotonic
27
+
28
+ narrative: |
29
+ Frequency capping is a runtime-enforcement contract, not a buy-time
30
+ validation. The buyer attaches a frequency_cap to a package's
31
+ targeting_overlay declaring "no more than N impressions per entity in
32
+ a given window"; the seller commits to enforcing that ceiling during
33
+ delivery and reporting observed reach + frequency in delivery totals
34
+ so the buyer can verify enforcement.
35
+
36
+ This scenario is the buy-mode contract test on the cap side. Unlike
37
+ audience_buy_flow and performance_buy_flow, there is no unbound-id
38
+ rejection phase — frequency_cap is a numeric constraint, not a pointer
39
+ to a registered resource, so there's nothing structurally analogous to
40
+ reject against. The discriminating assertion is the observed frequency
41
+ in delivery: a seller that silently drops the cap would deliver to its
42
+ natural frequency distribution (typically well above the cap when the
43
+ buy is impression-heavy relative to reach), and observed frequency
44
+ would exceed the requested max_impressions ceiling.
45
+
46
+ Discriminating behaviors this scenario verifies:
47
+ 1. create_media_buy with a package whose targeting_overlay.frequency_cap
48
+ carries the cap form (max_impressions + per + window) is accepted —
49
+ the response carries a media_buy_id used for subsequent delivery
50
+ checks. Cap-form (not cooldown-form `suppress`) is asserted because
51
+ it's the form that declares a numeric ceiling on exposures, which
52
+ this scenario verifies enforcement of.
53
+ 2. get_media_buy_delivery for the capped buy reports `totals.reach`
54
+ (computed; frequency needs a denominator) and `totals.frequency`
55
+ (observed average exposures per reach unit). frequency_capping:
56
+ present commits the seller to surfacing these metrics — without them
57
+ the buyer cannot verify cap enforcement.
58
+ 3. The observed frequency is at-or-below the requested cap of 3
59
+ impressions per individual per day. Asserted as `field_less_than`
60
+ against a literal threshold of 3.01 — the storyboard-schema check
61
+ enum exposes strict less-than via `field_less_than` with a literal
62
+ `value:` (see static/compliance/source/universal/storyboard-schema.yaml).
63
+ A native `<=` / `max:` matcher does not exist today; the strict-less-
64
+ than form with a small epsilon above the cap is the strongest
65
+ literal-threshold assertion available. A runner extension adding a
66
+ `field_at_most` / `field_lte` check enum would let this assertion
67
+ drop the epsilon and target the literal cap value — captured as a
68
+ soft follow-up; the cap-enforcement signal is already discriminating
69
+ without it.
70
+
71
+ Per-package frequency breakdown (a row carrying its own cap and observed
72
+ values) is deliberately NOT asserted here — delivery-metrics.json carries
73
+ frequency at the totals level, and per-package frequency reporting isn't
74
+ a first-class shape today. A follow-up scenario gated on a sub-capability
75
+ bit could land per-package frequency attribution.
76
+
77
+ agent:
78
+ interaction_model: media_buy_seller
79
+ capabilities:
80
+ - sells_media
81
+ - supports_non_guaranteed
82
+ - frequency_capping
83
+ examples:
84
+ - "DSPs honoring buyer-supplied frequency caps on direct buys"
85
+ - "Walled-garden platforms with per-user impression ceilings"
86
+ - "CTV platforms with household-level frequency management"
87
+ - "Retail-media networks with logged-in-account cap enforcement"
88
+
89
+ caller:
90
+ role: buyer_agent
91
+ example: "Pinnacle Agency (buyer)"
92
+
93
+ prerequisites:
94
+ description: |
95
+ The seller must implement comply_test_controller with simulate_delivery.
96
+ simulate_delivery injects impressions and spend; the seller then
97
+ computes reach and frequency at delivery-report time from its internal
98
+ user-graph model so get_media_buy_delivery has totals.reach and
99
+ totals.frequency to return.
100
+
101
+ The buyer fixture supplies a brand, an operator, and a small display
102
+ buy sufficient to exercise frequency-cap acceptance and observed-
103
+ frequency reporting.
104
+ test_kit: "test-kits/acme-outdoor.yaml"
105
+ controller_seeding: true
106
+
107
+ fixtures:
108
+ products:
109
+ - product_id: "frequency_capped_display_q2"
110
+ delivery_type: "non_guaranteed"
111
+ channels: ["display"]
112
+ format_ids:
113
+ - id: "display_300x250"
114
+ pricing_options:
115
+ - product_id: "frequency_capped_display_q2"
116
+ pricing_option_id: "auction_cpm"
117
+ pricing_model: "cpm"
118
+ currency: "USD"
119
+ floor_price: 2.00
120
+
121
+ phases:
122
+
123
+ - id: setup
124
+ title: "Establish account and discover products"
125
+ steps:
126
+ - id: sync_accounts
127
+ title: "Establish account"
128
+ task: sync_accounts
129
+ schema_ref: "account/sync-accounts-request.json"
130
+ response_schema_ref: "account/sync-accounts-response.json"
131
+ doc_ref: "/accounts/tasks/sync_accounts"
132
+ stateful: true
133
+ expected: |
134
+ Return the account with account_id and status active.
135
+ sample_request:
136
+ accounts:
137
+ - brand:
138
+ domain: "acmeoutdoor.example"
139
+ operator: "pinnacle-agency.example"
140
+ billing: "operator"
141
+ idempotency_key: "$generate:uuid_v4#frequency_cap_enforcement_setup_sync_accounts"
142
+ validations:
143
+ - check: response_schema
144
+ description: "Response matches sync-accounts-response.json schema"
145
+ - check: field_present
146
+ path: "accounts[0].account_id"
147
+ description: "Account has a platform-assigned ID"
148
+
149
+ - id: get_products_for_frequency_cap
150
+ title: "Discover products"
151
+ task: get_products
152
+ schema_ref: "media-buy/get-products-request.json"
153
+ response_schema_ref: "media-buy/get-products-response.json"
154
+ doc_ref: "/media-buy/task-reference/get_products"
155
+ stateful: false
156
+ expected: |
157
+ Return at least one display product compatible with package-level
158
+ frequency_cap targeting overlays.
159
+ sample_request:
160
+ buying_mode: "brief"
161
+ brief: "Display inventory, US adults 25-54, Q2 flight, ~$15K budget. Frequency-capped at 3 impressions per individual per day."
162
+ account:
163
+ brand:
164
+ domain: "acmeoutdoor.example"
165
+ operator: "pinnacle-agency.example"
166
+ validations:
167
+ - check: response_schema
168
+ description: "Response matches get-products-response.json schema"
169
+ - check: field_present
170
+ path: "products"
171
+ description: "Response contains products"
172
+
173
+ - id: create_buy_with_frequency_cap
174
+ title: "Create a buy whose package carries a frequency_cap"
175
+ narrative: |
176
+ The buyer creates a media buy whose package targeting_overlay carries
177
+ a frequency_cap in the cap form (max_impressions + per + window). The
178
+ seller should accept and return a media_buy_id. Cap-form (not
179
+ cooldown-form `suppress`) is the assertion target because it declares
180
+ the numeric ceiling whose enforcement this scenario verifies.
181
+
182
+ steps:
183
+ - id: create_media_buy_with_frequency_cap
184
+ title: "Create media buy with frequency_cap in targeting_overlay"
185
+ task: create_media_buy
186
+ schema_ref: "media-buy/create-media-buy-request.json"
187
+ response_schema_ref: "media-buy/create-media-buy-response.json"
188
+ doc_ref: "/media-buy/task-reference/create_media_buy"
189
+ stateful: true
190
+ expected: |
191
+ Create the media buy. Response carries a media_buy_id used for
192
+ subsequent get_media_buy_delivery calls.
193
+ sample_request:
194
+ brand:
195
+ domain: "acmeoutdoor.example"
196
+ account:
197
+ brand:
198
+ domain: "acmeoutdoor.example"
199
+ operator: "pinnacle-agency.example"
200
+ start_time: "2026-06-01T00:00:00Z"
201
+ end_time: "2026-06-30T23:59:59Z"
202
+ packages:
203
+ - product_id: "frequency_capped_display_q2"
204
+ budget: 15000
205
+ pricing_option_id: "auction_cpm"
206
+ targeting_overlay:
207
+ frequency_cap:
208
+ max_impressions: 3
209
+ per: "individuals"
210
+ window:
211
+ interval: 1
212
+ unit: "days"
213
+ idempotency_key: "$generate:uuid_v4#frequency_cap_enforcement_create_buy_create_media_buy"
214
+ context_outputs:
215
+ - name: media_buy_id
216
+ path: "media_buy_id"
217
+ validations:
218
+ - check: response_schema
219
+ description: "Response matches create-media-buy-response.json schema"
220
+ - check: field_present
221
+ path: "media_buy_id"
222
+ description: "Media buy has a platform-assigned ID"
223
+
224
+ - id: simulate_delivery_with_observed_frequency
225
+ title: "Inject impressions sufficient to test cap enforcement"
226
+ narrative: |
227
+ simulate_delivery injects an impression count well above the natural
228
+ reach of the targeted audience — the seller must clamp delivery (or
229
+ report clamped delivery) such that observed frequency stays at-or-
230
+ below the requested cap of 3 impressions per individual per day. A
231
+ seller silently dropping the cap would surface frequency well above
232
+ 3 for impression-heavy buys against a small audience.
233
+
234
+ steps:
235
+ - id: simulate_capped_delivery
236
+ title: "Inject impressions + spend for the capped buy"
237
+ task: comply_test_controller
238
+ requires_tool: comply_test_controller
239
+ stateful: true
240
+ expected: |
241
+ The test controller acknowledges the simulated delivery.
242
+ sample_request:
243
+ account:
244
+ sandbox: true
245
+ scenario: "simulate_delivery"
246
+ params:
247
+ media_buy_id: "$context.media_buy_id"
248
+ impressions: 8550
249
+ reported_spend:
250
+ amount: 1500.00
251
+ currency: "USD"
252
+ validations:
253
+ - check: field_value
254
+ path: "success"
255
+ allowed_values: [true]
256
+ description: "Delivery simulation succeeds"
257
+
258
+ - id: assert_frequency_observed_within_cap
259
+ title: "Verify delivery reports reach + frequency at-or-below the cap"
260
+ narrative: |
261
+ The discriminating assertion of the frequency-cap mode. Delivery
262
+ reporting MUST surface totals.reach and totals.frequency (per
263
+ delivery-metrics.json — frequency requires a reach denominator to
264
+ be interpretable, and frequency_capping: present commits the seller
265
+ to populating these) and the observed frequency MUST be at-or-below
266
+ the requested cap of 3 impressions per individual per day.
267
+
268
+ Strict-less-than threshold is set at 3.01 because the storyboard-
269
+ schema check enum exposes `field_less_than` with a literal `value:`
270
+ as the only single-step numeric-comparison matcher today — there is
271
+ no native `<=` / `field_at_most` form. The 0.01 epsilon lets the
272
+ assertion target the cap literal (3) without rejecting honest
273
+ sellers that report frequency at exactly 3.0. A future runner
274
+ extension adding `field_at_most` would let this drop to a literal
275
+ `value: 3` without the epsilon; the cap-enforcement signal is
276
+ already discriminating without it.
277
+
278
+ steps:
279
+ - id: get_capped_delivery
280
+ title: "Get delivery and verify reach + frequency within cap"
281
+ task: get_media_buy_delivery
282
+ schema_ref: "media-buy/get-media-buy-delivery-request.json"
283
+ response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
284
+ doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
285
+ stateful: true
286
+ expected: |
287
+ Delivery response includes totals.reach and totals.frequency for
288
+ the capped buy, with observed frequency at-or-below the cap of 3.
289
+ sample_request:
290
+ account:
291
+ brand:
292
+ domain: "acmeoutdoor.example"
293
+ operator: "pinnacle-agency.example"
294
+ media_buy_ids:
295
+ - "$context.media_buy_id"
296
+ include_package_daily_breakdown: true
297
+ validations:
298
+ - check: response_schema
299
+ description: "Response matches get-media-buy-delivery-response.json schema"
300
+ - check: field_present
301
+ path: "media_buy_deliveries[0].totals.reach"
302
+ description: "Reach surfaced at the buy level — frequency needs a denominator to be interpretable"
303
+ - check: field_present
304
+ path: "media_buy_deliveries[0].totals.frequency"
305
+ description: "Observed frequency surfaced at the buy level — frequency_capping: present commits the seller to populating this"
306
+ - check: field_less_than
307
+ path: "media_buy_deliveries[0].totals.frequency"
308
+ value: 3.01
309
+ description: "Observed frequency is at-or-below the requested cap of 3 impressions per individual per day (strict less-than against 3.01 with 0.01 epsilon — see phase narrative)"
@@ -0,0 +1,214 @@
1
+ id: media_buy_seller/governance_approved
2
+ version: "1.0.0"
3
+ title: "Seller creates buy when governance approves"
4
+ category: media_buy_seller
5
+ summary: "Verifies that the seller creates a media buy when governance approves the transaction."
6
+ track: media_buy
7
+ required_tools:
8
+ - sync_governance
9
+ - get_products
10
+ - create_media_buy
11
+
12
+ narrative: |
13
+ This is a multi-agent test. The test harness sets up a permissive governance plan on
14
+ a governance agent with a $100K budget, then registers that agent with the seller.
15
+ The buyer creates a $25K buy which falls within limits.
16
+
17
+ When the seller calls check_governance during create_media_buy, the governance agent
18
+ approves. The seller must confirm the buy normally.
19
+
20
+ By default, the governance agent is the training agent at test-agent.adcontextprotocol.org.
21
+ Override by supplying a different `governance_agent_url` in the run's initial context
22
+ (e.g., via `--context` on `adcp storyboard run` once the CLI supports it).
23
+
24
+ context:
25
+ governance_agent_url: "https://test-agent.adcontextprotocol.org"
26
+
27
+ agent:
28
+ interaction_model: media_buy_seller
29
+ capabilities:
30
+ - sells_media
31
+ - governance_aware
32
+ examples:
33
+ - "Any media buy seller with governance support"
34
+
35
+ caller:
36
+ role: buyer_agent
37
+ example: "Pinnacle Agency (buyer)"
38
+
39
+ prerequisites:
40
+ description: |
41
+ A governance agent that supports sync_plans and check_governance.
42
+ test_kit: "test-kits/acme-outdoor.yaml"
43
+ controller_seeding: true
44
+
45
+ fixtures:
46
+ products:
47
+ - product_id: "outdoor_display_q2"
48
+ delivery_type: "guaranteed"
49
+ channels: ["display"]
50
+ format_ids:
51
+ - id: "display_300x250"
52
+ - product_id: "outdoor_video_q2"
53
+ delivery_type: "guaranteed"
54
+ channels: ["video"]
55
+ format_ids:
56
+ - id: "video_15s"
57
+ pricing_options:
58
+ - product_id: "outdoor_display_q2"
59
+ pricing_option_id: "cpm_standard"
60
+ pricing_model: "cpm"
61
+ currency: "USD"
62
+ fixed_price: 8.0
63
+ - product_id: "outdoor_video_q2"
64
+ pricing_option_id: "cpm_standard"
65
+ pricing_model: "cpm"
66
+ currency: "USD"
67
+ fixed_price: 12.0
68
+
69
+ phases:
70
+ - id: governance_plan_setup
71
+ title: "Set up permissive governance plan"
72
+ narrative: |
73
+ Create a governance plan on the governance agent with a high budget ($100K).
74
+ The subsequent $25K buy will fall within these limits and should be approved.
75
+
76
+ steps:
77
+ - id: sync_plans
78
+ title: "Create permissive governance plan"
79
+ task: sync_plans
80
+ schema_ref: "governance/sync-plans-request.json"
81
+ response_schema_ref: "governance/sync-plans-response.json"
82
+ doc_ref: "/governance/campaign/tasks/sync_plans"
83
+ stateful: true
84
+ expected: |
85
+ The governance agent acknowledges the plan with a plan_id.
86
+ sample_request:
87
+ idempotency_key: "$generate:uuid_v4#governance_approved_sync_plans"
88
+ plans:
89
+ - plan_id: "comply-gov-approved-plan"
90
+ brand:
91
+ domain: "acmeoutdoor.example"
92
+ objectives: "Q2 outdoor lifestyle campaign — display and video"
93
+ budget:
94
+ total: 100000
95
+ currency: "USD"
96
+ reallocation_threshold: 100000
97
+ flight:
98
+ start: "2026-04-01T00:00:00Z"
99
+ end: "2026-06-30T23:59:59Z"
100
+ countries: ["US", "CA"]
101
+ validations:
102
+ - check: response_schema
103
+ description: "Response matches sync-plans-response.json schema"
104
+
105
+ - id: seller_setup
106
+ title: "Account and governance registration on seller"
107
+ steps:
108
+ - id: sync_accounts
109
+ title: "Establish account with seller"
110
+ task: sync_accounts
111
+ schema_ref: "account/sync-accounts-request.json"
112
+ response_schema_ref: "account/sync-accounts-response.json"
113
+ doc_ref: "/accounts/tasks/sync_accounts"
114
+ stateful: true
115
+ expected: |
116
+ Return the account with account_id and status active.
117
+ sample_request:
118
+ accounts:
119
+ - brand:
120
+ domain: "acmeoutdoor.example"
121
+ operator: "pinnacle-agency.example"
122
+ billing: "operator"
123
+ payment_terms: "net_30"
124
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_approved_seller_setup_sync_accounts"
125
+ validations:
126
+ - check: response_schema
127
+ description: "Response matches sync-accounts-response.json schema"
128
+ - check: field_present
129
+ path: "accounts[0].account_id"
130
+ description: "Account has a platform-assigned ID"
131
+
132
+ - id: sync_governance
133
+ title: "Register governance agent with seller"
134
+ task: sync_governance
135
+ schema_ref: "account/sync-governance-request.json"
136
+ response_schema_ref: "account/sync-governance-response.json"
137
+ doc_ref: "/accounts/tasks/sync_governance"
138
+ stateful: true
139
+ expected: |
140
+ Acknowledge the governance agent registration.
141
+ sample_request:
142
+ accounts:
143
+ - account:
144
+ brand:
145
+ domain: "acmeoutdoor.example"
146
+ operator: "pinnacle-agency.example"
147
+ governance_agents:
148
+ - url: "$context.governance_agent_url"
149
+ authentication:
150
+ schemes: ["Bearer"]
151
+ credentials: "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
152
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_approved_seller_setup_sync_governance"
153
+ validations:
154
+ - check: response_schema
155
+ description: "Response matches sync-governance-response.json schema"
156
+
157
+ - id: buy_approved
158
+ title: "Create buy within governance limits"
159
+ steps:
160
+ - id: get_products_brief
161
+ title: "Discover products"
162
+ task: get_products
163
+ schema_ref: "media-buy/get-products-request.json"
164
+ response_schema_ref: "media-buy/get-products-response.json"
165
+ doc_ref: "/media-buy/task-reference/get_products"
166
+ comply_scenario: full_sales_flow
167
+ stateful: false
168
+ expected: |
169
+ Return products matching the brief.
170
+ sample_request:
171
+ buying_mode: "brief"
172
+ brief: "Display and video inventory on outdoor lifestyle content. Q2 flight, $25K budget. Adults 25-54, US."
173
+ account:
174
+ brand:
175
+ domain: "acmeoutdoor.example"
176
+ operator: "pinnacle-agency.example"
177
+ validations:
178
+ - check: response_schema
179
+ description: "Response matches get-products-response.json schema"
180
+ - check: field_present
181
+ path: "products"
182
+ description: "Response contains products"
183
+
184
+ - id: create_media_buy
185
+ title: "Create buy (governance approves)"
186
+ task: create_media_buy
187
+ schema_ref: "media-buy/create-media-buy-request.json"
188
+ response_schema_ref: "media-buy/create-media-buy-response.json"
189
+ doc_ref: "/media-buy/task-reference/create_media_buy"
190
+ comply_scenario: create_media_buy
191
+ stateful: true
192
+ expected: |
193
+ The buy succeeds — governance approved because the $25K buy is within
194
+ the plan's $100K budget.
195
+ sample_request:
196
+ brand:
197
+ domain: "acmeoutdoor.example"
198
+ account:
199
+ brand:
200
+ domain: "acmeoutdoor.example"
201
+ operator: "pinnacle-agency.example"
202
+ start_time: "2026-04-01T00:00:00Z"
203
+ end_time: "2026-06-30T23:59:59Z"
204
+ packages:
205
+ - product_id: "outdoor_display_q2"
206
+ budget: 15000
207
+ pricing_option_id: "cpm_standard"
208
+ - product_id: "outdoor_video_q2"
209
+ budget: 10000
210
+ pricing_option_id: "cpm_standard"
211
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_approved_buy_approved_create_media_buy"
212
+ validations:
213
+ - check: response_schema
214
+ description: "Response matches create-media-buy-response.json schema"