@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,212 @@
1
+ id: creative/canonical_supported_formats
2
+ version: "1.0.0"
3
+ title: "Creative canonical supported formats"
4
+ category: creative
5
+ summary: "Verifies the 3.1 creative-agent canonical path: targetable supported_formats capability IDs, build_creative routing, and unsupported target rejection."
6
+ track: creative
7
+ introduced_in: "3.1"
8
+ required_tools:
9
+ - get_adcp_capabilities
10
+ - build_creative
11
+
12
+ narrative: |
13
+ Creative agents in 3.1 declare what they can produce via
14
+ `creative.supported_formats` on `get_adcp_capabilities`. Targetable
15
+ supported-format entries carry an agent-local stable `capability_id` that
16
+ selects the build path on that creative agent. This is separate from media-buy
17
+ `format_option_id`, which selects a product or publisher-catalog format
18
+ option.
19
+
20
+ The buyer reads the canonical capability catalog, invokes one advertised
21
+ capability through `build_creative`, and verifies that an unsupported target
22
+ fails with `FORMAT_NOT_SUPPORTED` instead of silently producing an arbitrary
23
+ manifest.
24
+
25
+ agent:
26
+ interaction_model: creative_agent
27
+ capabilities:
28
+ - supports_generation
29
+ - supports_transformation
30
+ examples:
31
+ - "Creative generation platforms"
32
+ - "Creative transformation services"
33
+
34
+ caller:
35
+ role: buyer_agent
36
+ example: "Pinnacle Agency (buyer)"
37
+
38
+ prerequisites:
39
+ description: |
40
+ The caller needs a brand identity and a creative brief. The test kit
41
+ provides fictional brand context for Acme Outdoor.
42
+ test_kit: "test-kits/acme-outdoor.yaml"
43
+
44
+ phases:
45
+ - id: capability_discovery
46
+ title: "Discover canonical build capabilities"
47
+ narrative: |
48
+ The buyer calls `get_adcp_capabilities` and reads
49
+ `creative.supported_formats` as the creative agent's 3.1 canonical build
50
+ catalog. The first advertised image capability is used in the next phase.
51
+
52
+ steps:
53
+ - id: get_capabilities
54
+ title: "Read supported canonical formats"
55
+ task: get_adcp_capabilities
56
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
57
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
58
+ doc_ref: "/protocol/get_adcp_capabilities"
59
+ comply_scenario: capability_discovery
60
+ stateful: false
61
+ expected: |
62
+ Return a creative capability block with implemented `supported_formats[]`.
63
+ The targetable entry used for build routing has:
64
+ - `capability_id` at the supported-format entry level
65
+ - `format.format_kind` and `format.params.slots[]`
66
+ - no product-level `format_option_id` on the creative-agent
67
+ capability entry used for build routing
68
+ sample_request:
69
+ context:
70
+ correlation_id: "creative_canonical_supported_formats--get_capabilities"
71
+ context_outputs:
72
+ - key: "image_build_capability_id"
73
+ path: "creative.supported_formats[0].capability_id"
74
+ validations:
75
+ - check: response_schema
76
+ description: "Response matches get-adcp-capabilities-response.json schema"
77
+ - check: field_present
78
+ path: "creative.supported_formats"
79
+ description: "Creative canonical supported formats are advertised"
80
+ - check: field_value
81
+ path: "creative.supported_formats[0].capability_id"
82
+ value: "training_image_generation"
83
+ description: "The image build path has a stable local capability_id"
84
+ - check: field_value
85
+ path: "creative.supported_formats[0].format.format_kind"
86
+ value: "image"
87
+ description: "The first supported capability declares the image canonical"
88
+ - check: field_present
89
+ path: "creative.supported_formats[0].format.params.slots[0].asset_group_id"
90
+ description: "Canonical format declaration includes slot metadata"
91
+ - check: field_absent
92
+ path: "creative.supported_formats[0].format.format_option_id"
93
+ description: "Creative-agent build routing uses capability_id, not product format_option_id"
94
+ - check: field_absent
95
+ path: "creative.supported_formats[1].capability_id"
96
+ description: "Storyboard fixture only advertises implemented canonical build paths"
97
+ - check: field_value
98
+ path: "context.correlation_id"
99
+ value: "creative_canonical_supported_formats--get_capabilities"
100
+ description: "Context correlation_id returned unchanged"
101
+
102
+ - id: build_from_capability
103
+ title: "Build using the advertised capability"
104
+ narrative: |
105
+ The buyer invokes `build_creative` using the advertised image build
106
+ capability. The produced manifest uses the 3.1 canonical manifest path
107
+ (`format_kind`) and does not fall back to a legacy named format.
108
+
109
+ steps:
110
+ - id: build_image_capability
111
+ title: "Build with the advertised image capability"
112
+ task: build_creative
113
+ schema_ref: "media-buy/build-creative-request.json"
114
+ response_schema_ref: "media-buy/build-creative-response.json"
115
+ doc_ref: "/creative/task-reference/build_creative"
116
+ comply_scenario: creative_flow
117
+ stateful: false
118
+ expected: |
119
+ Return a completed build with a canonical image manifest:
120
+ - `creative_manifest.format_kind: image`
121
+ - generated assets keyed by canonical slot names
122
+ sample_request:
123
+ message: "Create a clean image creative for Acme Outdoor's summer trail sale. Use a direct headline and a clear landing page."
124
+ target_format_id:
125
+ agent_url: "https://your-agent.example.com"
126
+ id: "$context.image_build_capability_id"
127
+ account:
128
+ brand:
129
+ domain: "acmeoutdoor.example"
130
+ operator: "pinnacle-agency.example"
131
+ brand:
132
+ domain: "acmeoutdoor.example"
133
+ quality: "draft"
134
+ idempotency_key: "$generate:uuid_v4#creative_canonical_supported_formats_build_image"
135
+ context:
136
+ correlation_id: "creative_canonical_supported_formats--build_image"
137
+ validations:
138
+ - check: response_schema
139
+ description: "Response matches build-creative-response.json schema"
140
+ - check: field_value
141
+ path: "creative_manifest.format_kind"
142
+ value: "image"
143
+ description: "Generated manifest uses the 3.1 canonical manifest path"
144
+ - check: field_absent
145
+ path: "creative_manifest.format_id"
146
+ description: "Canonical build does not invent a legacy named-format id"
147
+ - check: field_present
148
+ path: "creative_manifest.assets.image_main"
149
+ description: "Output manifest includes an image asset under the canonical slot"
150
+ - check: field_value
151
+ path: "context.correlation_id"
152
+ value: "creative_canonical_supported_formats--build_image"
153
+ description: "Context correlation_id returned unchanged"
154
+
155
+ - id: reject_unsupported_capability
156
+ title: "Reject unsupported target capability"
157
+ narrative: |
158
+ A buyer may cache or mistype a build target. The creative agent must fail
159
+ closed with `FORMAT_NOT_SUPPORTED` instead of producing a manifest under a
160
+ target it does not recognize. Legacy named-format IDs may still be
161
+ accepted during the 3.x migration window; this phase probes an unknown
162
+ selector that is neither a legacy format nor an advertised capability.
163
+
164
+ steps:
165
+ - id: reject_unknown_capability
166
+ title: "Reject an unknown build target"
167
+ task: build_creative
168
+ schema_ref: "media-buy/build-creative-request.json"
169
+ response_schema_ref: "media-buy/build-creative-response.json"
170
+ doc_ref: "/creative/task-reference/build_creative"
171
+ comply_scenario: creative_flow
172
+ stateful: false
173
+ expect_error: true
174
+ negative_path: payload_well_formed
175
+ expected: |
176
+ Return a build_creative error response with:
177
+ - errors[0].code: FORMAT_NOT_SUPPORTED
178
+ - errors[0].field: target_format_id
179
+ - errors[0].recovery: correctable
180
+ sample_request:
181
+ message: "Create an unsupported canonical creative."
182
+ target_format_id:
183
+ agent_url: "https://your-agent.example.com"
184
+ id: "unknown_takeover_generation"
185
+ account:
186
+ brand:
187
+ domain: "acmeoutdoor.example"
188
+ operator: "pinnacle-agency.example"
189
+ brand:
190
+ domain: "acmeoutdoor.example"
191
+ quality: "draft"
192
+ idempotency_key: "$generate:uuid_v4#creative_canonical_supported_formats_reject_unknown"
193
+ context:
194
+ correlation_id: "creative_canonical_supported_formats--reject_unknown"
195
+ validations:
196
+ - check: response_schema
197
+ description: "Response matches build-creative-response.json schema"
198
+ - check: error_code
199
+ value: "FORMAT_NOT_SUPPORTED"
200
+ description: "Unsupported build target is rejected with the canonical error code"
201
+ - check: field_value
202
+ path: "errors[0].field"
203
+ value: "target_format_id"
204
+ description: "Error points at the unsupported target selector"
205
+ - check: field_value
206
+ path: "errors[0].recovery"
207
+ value: "correctable"
208
+ description: "Buyer can correct the target by choosing an advertised capability_id"
209
+ - check: field_value
210
+ path: "context.correlation_id"
211
+ value: "creative_canonical_supported_formats--reject_unknown"
212
+ description: "Context correlation_id returned unchanged"
@@ -0,0 +1,389 @@
1
+ id: creative/creative_lifecycle_webhooks
2
+ version: "1.0.0"
3
+ introduced_in: "3.1"
4
+ title: "Creative lifecycle webhooks"
5
+ category: creative
6
+ summary: "Registers account-level creative lifecycle notifications, forces a seller-side status transition, observes creative.status_changed, and verifies list_creatives snapshot repair plus optional creative.purged coverage."
7
+ track: creative
8
+ required_tools:
9
+ - sync_accounts
10
+ - sync_creatives
11
+ - list_creatives
12
+ - comply_test_controller
13
+
14
+ narrative: |
15
+ A buyer registers an account-level webhook subscriber through
16
+ sync_accounts.accounts[].notification_configs[] for creative lifecycle
17
+ events. The runner then pushes a creative, forces a seller-side lifecycle
18
+ transition with comply_test_controller, observes the account-anchored
19
+ creative.status_changed event, and re-reads list_creatives as the repair
20
+ path after a missed or distrusted webhook.
21
+
22
+ This storyboard is deliberately separate from media-buy impairment coverage:
23
+ creative.status_changed and creative.purged are account-anchored lifecycle
24
+ events, while impairment webhooks are media-buy anchored state-event logs.
25
+
26
+ agent:
27
+ interaction_model: stateful_push
28
+ capabilities:
29
+ - has_creative_library
30
+ - emits_account_lifecycle_webhooks
31
+ examples:
32
+ - "Creative management platforms"
33
+ - "Ad servers with account-scoped creative libraries"
34
+ - "Media sellers that host buyer-supplied creative assets"
35
+
36
+ caller:
37
+ role: compliance_runner
38
+ example: "AdCP Verified runner with webhook receiver capability"
39
+
40
+ prerequisites:
41
+ description: |
42
+ The runner MUST host the webhook receiver contract so the account-level
43
+ notification_configs[] URL can point at a per-step receiver. This
44
+ storyboard is intended for sellers that expose account-level creative
45
+ lifecycle notifications; sellers that do not support notification_configs[]
46
+ should omit this scenario from their claimed coverage.
47
+ test_kit: "test-kits/acme-outdoor.yaml"
48
+
49
+ phases:
50
+ - id: register_account_lifecycle_subscriber
51
+ title: "Register account-level creative lifecycle notifications"
52
+ narrative: |
53
+ The buyer provisions a sandbox account and declares a webhook subscriber
54
+ interested in account-anchored creative.status_changed and
55
+ creative.purged events. The subscriber URL is owned by the runner.
56
+
57
+ steps:
58
+ - id: sync_accounts_with_lifecycle_notifications
59
+ title: "Register notification_configs[] for creative lifecycle events"
60
+ task: sync_accounts
61
+ schema_ref: "account/sync-accounts-request.json"
62
+ response_schema_ref: "account/sync-accounts-response.json"
63
+ doc_ref: "/accounts/tasks/sync_accounts"
64
+ stateful: true
65
+ expected: |
66
+ Seller accepts the sandbox account relationship and persists the
67
+ account-level subscriber:
68
+ - action: created or updated
69
+ - status: active
70
+ - notification_configs[0].subscriber_id: buyer-primary
71
+ - notification_configs[0].event_types includes creative.status_changed
72
+ and creative.purged
73
+ sample_request:
74
+ brand:
75
+ domain: "acmeoutdoor.example"
76
+ accounts:
77
+ - brand:
78
+ domain: "acmeoutdoor.example"
79
+ operator: "pinnacle-agency.example"
80
+ billing: "operator"
81
+ sandbox: true
82
+ notification_configs:
83
+ - subscriber_id: "buyer-primary"
84
+ url: "{{runner.webhook_url:creative_lifecycle_events}}"
85
+ event_types:
86
+ - "creative.status_changed"
87
+ - "creative.purged"
88
+ active: true
89
+ idempotency_key: "$generate:uuid_v4#creative_lifecycle_webhooks_sync_accounts"
90
+ context:
91
+ correlation_id: "creative_lifecycle_webhooks--sync_accounts"
92
+ validations:
93
+ - check: response_schema
94
+ description: "Response matches sync-accounts-response.json"
95
+ - check: field_value
96
+ path: "accounts[0].action"
97
+ allowed_values: ["created", "updated", "unchanged"]
98
+ description: "Account sync succeeded"
99
+ - check: field_value
100
+ path: "accounts[0].status"
101
+ allowed_values: ["active"]
102
+ description: "Sandbox account is active"
103
+ - check: field_value
104
+ path: "accounts[0].notification_configs[0].subscriber_id"
105
+ value: "buyer-primary"
106
+ description: "Seller echoes the account-level subscriber id"
107
+ - check: field_present
108
+ path: "accounts[0].notification_configs[0].event_types"
109
+ description: "Seller echoes the account-level creative lifecycle event filter array"
110
+
111
+ - id: seed_creative
112
+ title: "Create a sandbox creative"
113
+ narrative: |
114
+ The buyer syncs a creative into the account-scoped library. The creative
115
+ starts from a known approved baseline before the runner forces a
116
+ seller-side status transition.
117
+
118
+ steps:
119
+ - id: sync_creative
120
+ title: "Sync a display creative into the account library"
121
+ task: sync_creatives
122
+ schema_ref: "creative/sync-creatives-request.json"
123
+ response_schema_ref: "creative/sync-creatives-response.json"
124
+ doc_ref: "/creative/task-reference/sync_creatives"
125
+ stateful: true
126
+ expected: |
127
+ Creative is created or updated and can be addressed by creative_id
128
+ in later list_creatives and comply_test_controller calls.
129
+ sample_request:
130
+ account:
131
+ brand:
132
+ domain: "acmeoutdoor.example"
133
+ operator: "pinnacle-agency.example"
134
+ brand:
135
+ domain: "acmeoutdoor.example"
136
+ creatives:
137
+ - creative_id: "acme_lifecycle_banner_001"
138
+ name: "Trail Pro lifecycle webhook banner"
139
+ format_id:
140
+ agent_url: "https://your-platform.example.com"
141
+ id: "display_300x250"
142
+ assets:
143
+ image:
144
+ asset_type: "image"
145
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/trail-pro-300x250.png"
146
+ width: 300
147
+ height: 250
148
+ mime_type: "image/png"
149
+ idempotency_key: "$generate:uuid_v4#creative_lifecycle_webhooks_sync_creative"
150
+ context:
151
+ correlation_id: "creative_lifecycle_webhooks--sync_creative"
152
+ validations:
153
+ - check: response_schema
154
+ description: "Response matches sync-creatives-response.json"
155
+ - check: field_value
156
+ path: "creatives[0].creative_id"
157
+ value: "acme_lifecycle_banner_001"
158
+ description: "Creative id is echoed"
159
+ - check: field_value
160
+ path: "creatives[0].action"
161
+ allowed_values: ["created", "updated"]
162
+ description: "Creative was stored"
163
+
164
+ - id: force_creative_approved
165
+ title: "Force approved baseline"
166
+ task: comply_test_controller
167
+ schema_ref: "compliance/comply-test-controller-request.json"
168
+ response_schema_ref: "compliance/comply-test-controller-response.json"
169
+ doc_ref: "/building/implementation/comply-test-controller"
170
+ stateful: true
171
+ expected: |
172
+ success: true. The creative is approved before the status-changed
173
+ event phase begins.
174
+ sample_request:
175
+ account:
176
+ sandbox: true
177
+ brand:
178
+ domain: "acmeoutdoor.example"
179
+ scenario: "force_creative_status"
180
+ params:
181
+ creative_id: "acme_lifecycle_banner_001"
182
+ status: "approved"
183
+ context:
184
+ correlation_id: "creative_lifecycle_webhooks--force_approved"
185
+ validations:
186
+ - check: response_schema
187
+ description: "Response matches comply-test-controller-response.json"
188
+ - check: field_value
189
+ path: "success"
190
+ allowed_values: [true]
191
+ description: "Controller accepted the approved baseline"
192
+
193
+ - id: status_changed_event
194
+ title: "Observe creative.status_changed"
195
+ narrative: |
196
+ The controller forces an approved → rejected seller-side transition. The
197
+ seller emits creative.status_changed to the registered account-level
198
+ subscriber, and the buyer re-reads the creative snapshot to repair state
199
+ after any missed webhook.
200
+
201
+ steps:
202
+ - id: force_creative_rejected
203
+ title: "Force approved → rejected"
204
+ task: comply_test_controller
205
+ schema_ref: "compliance/comply-test-controller-request.json"
206
+ response_schema_ref: "compliance/comply-test-controller-response.json"
207
+ doc_ref: "/building/implementation/comply-test-controller"
208
+ stateful: true
209
+ expected: |
210
+ success: true. Seller observed a seller-initiated creative lifecycle
211
+ transition and must notify account-level lifecycle subscribers.
212
+ sample_request:
213
+ account:
214
+ sandbox: true
215
+ brand:
216
+ domain: "acmeoutdoor.example"
217
+ scenario: "force_creative_status"
218
+ params:
219
+ creative_id: "acme_lifecycle_banner_001"
220
+ status: "rejected"
221
+ rejection_reason: "Lifecycle webhook storyboard: forced revocation for account-level notification coverage."
222
+ context:
223
+ correlation_id: "creative_lifecycle_webhooks--force_rejected"
224
+ validations:
225
+ - check: response_schema
226
+ description: "Response matches comply-test-controller-response.json"
227
+ - check: field_value
228
+ path: "success"
229
+ allowed_values: [true]
230
+ description: "Controller accepted the rejected transition"
231
+
232
+ - id: expect_status_changed_webhook
233
+ title: "Assert creative.status_changed webhook payload"
234
+ task: expect_webhook
235
+ triggered_by: force_creative_rejected
236
+ filter:
237
+ notification_type: "creative.status_changed"
238
+ creative_id: "acme_lifecycle_banner_001"
239
+ subscriber_id: "buyer-primary"
240
+ timeout_seconds: 30
241
+ expect_idempotency_key: true
242
+ webhook_payload_schema_ref: "creative/creative-status-changed-webhook.json"
243
+ requires_contract: webhook_receiver_runner
244
+ stateful: true
245
+ expected: |
246
+ A webhook arrives at the account-level subscriber URL. Payload
247
+ validates against creative-status-changed-webhook.json and carries:
248
+ notification_type: creative.status_changed, subscriber_id:
249
+ buyer-primary, creative_id: acme_lifecycle_banner_001,
250
+ transition.from: approved, transition.to: rejected, notification_id,
251
+ and idempotency_key.
252
+
253
+ - id: list_creatives_after_status_change
254
+ title: "Repair from list_creatives after the status webhook"
255
+ task: list_creatives
256
+ schema_ref: "creative/list-creatives-request.json"
257
+ response_schema_ref: "creative/list-creatives-response.json"
258
+ doc_ref: "/creative/task-reference/list_creatives"
259
+ stateful: true
260
+ expected: |
261
+ Snapshot repair shows the creative's current rejected status and the
262
+ recent creative.status_changed activity record, keyed by the same
263
+ creative_id as the webhook payload.
264
+ sample_request:
265
+ account:
266
+ brand:
267
+ domain: "acmeoutdoor.example"
268
+ operator: "pinnacle-agency.example"
269
+ brand:
270
+ domain: "acmeoutdoor.example"
271
+ creative_ids:
272
+ - "acme_lifecycle_banner_001"
273
+ include_webhook_activity: true
274
+ context:
275
+ correlation_id: "creative_lifecycle_webhooks--list_after_status_change"
276
+ validations:
277
+ - check: response_schema
278
+ description: "Response matches list-creatives-response.json"
279
+ - check: field_value
280
+ path: "creatives[0].creative_id"
281
+ value: "acme_lifecycle_banner_001"
282
+ description: "Snapshot returns the transitioned creative"
283
+ - check: field_value
284
+ path: "creatives[0].status"
285
+ value: "rejected"
286
+ description: "Snapshot repair reflects the current rejected status"
287
+ - check: field_value
288
+ path: "creatives[0].webhook_activity[0].notification_type"
289
+ value: "creative.status_changed"
290
+ description: "Snapshot exposes recent status-changed webhook activity"
291
+ - check: field_present
292
+ path: "creatives[0].webhook_activity[0].idempotency_key"
293
+ description: "Activity record carries the delivery idempotency key"
294
+
295
+ - id: purged_event_optional
296
+ title: "Optional creative.purged coverage"
297
+ optional: true
298
+ narrative: |
299
+ Sellers that advertise force_creative_purge can deterministically destroy
300
+ the sandbox creative and emit creative.purged. This phase is optional;
301
+ the required status_changed and snapshot-repair coverage above still
302
+ stands when a seller does not implement the purge primitive.
303
+
304
+ steps:
305
+ - id: force_creative_purged
306
+ title: "Force a soft purge"
307
+ task: comply_test_controller
308
+ schema_ref: "compliance/comply-test-controller-request.json"
309
+ response_schema_ref: "compliance/comply-test-controller-response.json"
310
+ doc_ref: "/building/implementation/comply-test-controller"
311
+ stateful: true
312
+ expected: |
313
+ success: true when the seller supports force_creative_purge. The
314
+ creative is soft-purged so list_creatives can expose a tombstone.
315
+ sample_request:
316
+ account:
317
+ sandbox: true
318
+ brand:
319
+ domain: "acmeoutdoor.example"
320
+ scenario: "force_creative_purge"
321
+ params:
322
+ creative_id: "acme_lifecycle_banner_001"
323
+ purge_kind: "soft"
324
+ reason_code: "retention_expired"
325
+ reason_detail: "Lifecycle webhook storyboard: soft purge for account-level notification coverage."
326
+ context:
327
+ correlation_id: "creative_lifecycle_webhooks--force_purged"
328
+ validations:
329
+ - check: response_schema
330
+ description: "Response matches comply-test-controller-response.json"
331
+
332
+ - id: expect_purged_webhook
333
+ title: "Assert creative.purged webhook payload"
334
+ task: expect_webhook
335
+ triggered_by: force_creative_purged
336
+ filter:
337
+ notification_type: "creative.purged"
338
+ creative_id: "acme_lifecycle_banner_001"
339
+ subscriber_id: "buyer-primary"
340
+ timeout_seconds: 30
341
+ expect_idempotency_key: true
342
+ webhook_payload_schema_ref: "creative/creative-purged-webhook.json"
343
+ requires_contract: webhook_receiver_runner
344
+ stateful: true
345
+ expected: |
346
+ A creative.purged webhook arrives for the same account-level
347
+ subscriber. Payload validates against creative-purged-webhook.json
348
+ and carries creative_id, notification_id, idempotency_key,
349
+ purge_kind: soft, and reason_code.
350
+
351
+ - id: list_creatives_after_purge
352
+ title: "Repair from list_creatives tombstone"
353
+ task: list_creatives
354
+ schema_ref: "creative/list-creatives-request.json"
355
+ response_schema_ref: "creative/list-creatives-response.json"
356
+ doc_ref: "/creative/task-reference/list_creatives"
357
+ stateful: true
358
+ expected: |
359
+ With include_purged and include_webhook_activity, snapshot repair
360
+ surfaces the soft-purged tombstone and the recent creative.purged
361
+ activity record.
362
+ sample_request:
363
+ account:
364
+ brand:
365
+ domain: "acmeoutdoor.example"
366
+ operator: "pinnacle-agency.example"
367
+ brand:
368
+ domain: "acmeoutdoor.example"
369
+ creative_ids:
370
+ - "acme_lifecycle_banner_001"
371
+ include_purged: true
372
+ include_webhook_activity: true
373
+ context:
374
+ correlation_id: "creative_lifecycle_webhooks--list_after_purge"
375
+ validations:
376
+ - check: response_schema
377
+ description: "Response matches list-creatives-response.json"
378
+ - check: field_value
379
+ path: "creatives[0].creative_id"
380
+ value: "acme_lifecycle_banner_001"
381
+ description: "Tombstone retains the creative id"
382
+ - check: field_value
383
+ path: "creatives[0].purge.kind"
384
+ value: "soft"
385
+ description: "Soft-purged creative remains visible as a tombstone"
386
+ - check: field_value
387
+ path: "creatives[0].webhook_activity[0].notification_type"
388
+ value: "creative.purged"
389
+ description: "Snapshot exposes recent purged webhook activity"