@adcp/sdk 7.11.0 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
  2. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  3. package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
  4. package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
  5. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
  6. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
  7. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  8. package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
  9. package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
  10. package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
  11. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  12. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
  13. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  14. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
  15. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  16. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  17. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  18. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  19. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
  20. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
  21. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
  22. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  23. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  24. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  25. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
  26. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
  27. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
  28. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  29. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
  30. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  31. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  32. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
  33. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  34. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  35. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  36. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  37. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  38. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  39. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  40. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
  41. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  42. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  43. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  44. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  45. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  46. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  47. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  48. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
  49. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  50. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  51. package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  52. package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
  53. package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
  54. package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
  55. package/compliance/cache/3.1.0-rc.2/index.json +356 -0
  56. package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
  57. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
  58. package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
  59. package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
  60. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
  61. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
  62. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
  63. package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
  64. package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
  65. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
  66. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
  67. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
  68. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
  69. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
  70. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
  71. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
  72. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
  73. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
  74. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
  75. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
  76. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
  77. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
  78. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
  79. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
  80. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
  81. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
  82. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
  83. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
  84. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
  85. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
  86. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
  87. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
  88. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
  89. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
  90. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
  91. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
  92. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
  93. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
  94. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
  95. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
  96. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
  97. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
  98. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
  99. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
  100. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
  101. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
  102. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
  103. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  104. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
  105. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
  106. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
  107. package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
  108. package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
  109. package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
  110. package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
  111. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
  112. package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
  113. package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
  114. package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
  115. package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
  116. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
  117. package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
  118. package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
  119. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
  120. package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
  121. package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
  122. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
  123. package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
  124. package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
  125. package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
  126. package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
  127. package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
  128. package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
  129. package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
  130. package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
  131. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
  132. package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
  133. package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
  134. package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
  135. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
  136. package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
  137. package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
  138. package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
  139. package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
  140. package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
  141. package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
  142. package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
  143. package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
  144. package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
  145. package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
  146. package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
  147. package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
  148. package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
  149. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  150. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
  151. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  152. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  153. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  154. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  155. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  156. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  157. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  158. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  159. package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  160. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
  161. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
  162. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
  163. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  164. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  165. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  166. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  167. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  168. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  169. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  170. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  171. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  172. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  173. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  174. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  175. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  176. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  177. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  178. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  179. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  180. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  181. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  182. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  183. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  184. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  185. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  186. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  187. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  188. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  189. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  190. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
  191. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  192. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  193. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  194. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  195. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  196. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  197. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  198. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  199. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  200. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  201. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  202. package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  203. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
  204. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
  205. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  206. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  207. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  208. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  209. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  210. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  211. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  212. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  213. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  214. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  215. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  216. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  217. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  218. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  219. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  220. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  221. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  222. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  223. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  224. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  225. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  226. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  227. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  228. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  229. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  230. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  231. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  232. package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  233. package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
  234. package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
  235. package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
  236. package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
  237. package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
  238. package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
  239. package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
  240. package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
  241. package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
  242. package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
  243. package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
  244. package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
  245. package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
  246. package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
  247. package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
  248. package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
  249. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
  250. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
  251. package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
  252. package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
  253. package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
  254. package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
  255. package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
  256. package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
  257. package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
  258. package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
  259. package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
  260. package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
  261. package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
  262. package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
  263. package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
  264. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
  265. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
  266. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
  267. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
  268. package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
  269. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  270. package/dist/lib/testing/storyboard/default-invariants.js +23 -0
  271. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  272. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  273. package/dist/lib/testing/storyboard/runner.js +84 -21
  274. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  275. package/dist/lib/testing/storyboard/types.d.ts +21 -0
  276. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  277. package/dist/lib/testing/storyboard/types.js.map +1 -1
  278. package/dist/lib/testing/types.d.ts +9 -0
  279. package/dist/lib/testing/types.d.ts.map +1 -1
  280. package/dist/lib/version.d.ts +3 -3
  281. package/dist/lib/version.js +3 -3
  282. package/package.json +1 -1
@@ -0,0 +1,758 @@
1
+ id: creative_generative
2
+ version: "1.0.0"
3
+ title: "Generative creative agent"
4
+ protocol: creative
5
+ category: creative_generative
6
+ summary: "Agent that takes a brief and generates finished creatives from scratch — no input assets required."
7
+ required_tools:
8
+ - build_creative
9
+ # Note: sync_catalogs is NOT in required_tools. The catalog_augmented_generation
10
+ # phase below is additive — brief-only generative agents (pure-prompt DSPs) pass
11
+ # the other phases without claiming catalog support. Agents that do not implement
12
+ # sync_catalogs grade that phase not_applicable rather than fail the specialism.
13
+
14
+ # Cross-step assertion (adcp#2664). status.monotonic rejects resource
15
+ # status transitions observed across steps that aren't on the spec
16
+ # lifecycle graph — e.g. approved → processing on a creative asset.
17
+ #
18
+ # Cross-resource assertion (adcp#2859). impairment.coherence verifies that
19
+ # creative.rejected transitions propagate to any non-terminal media buy
20
+ # that references the creative — the buy's impairments[] MUST list an
21
+ # entry for the rejected creative, and `health` MUST track impairments[]
22
+ # non-empty (impaired) ↔ empty (ok). See snapshot-and-log Rule 1 and
23
+ # lifecycle.mdx Compliance for the full forward + inverse rule. Grades
24
+ # not_applicable until #2860 wires the cross-resource exercise. Note:
25
+ # generative-creative storyboards typically don't surface a media-buy
26
+ # snapshot read; this specialism may stay not_applicable more often
27
+ # than its peers even after #2860.
28
+ invariants:
29
+ - status.monotonic
30
+ - impairment.coherence
31
+
32
+ narrative: |
33
+ You run a generative creative platform — an AI ad network, a generative DSP, or any system
34
+ that creates ad creatives from a natural-language brief and brand identity. The buyer doesn't
35
+ push assets to you. Instead, they describe what they want, point you at a brand.json, and
36
+ your agent produces finished creatives ready for trafficking.
37
+
38
+ This is fundamentally different from template-based transformation (Celtra) or library-based
39
+ retrieval (Innovid). Your agent creates something new. The buyer sends a brief, optionally
40
+ with seed assets or constraints, and your platform generates creatives — potentially in
41
+ multiple formats at once.
42
+
43
+ This storyboard walks through the generation flow: format discovery, brief-driven generation,
44
+ multi-format builds, iterative refinement, and quality progression from draft to production.
45
+
46
+ agent:
47
+ interaction_model: stateless_generate
48
+ capabilities:
49
+ - supports_generation
50
+ examples:
51
+ - "OpenAds"
52
+ - "AI ad networks"
53
+ - "Generative DSPs"
54
+
55
+ caller:
56
+ role: buyer_agent
57
+ example: "Scope3 (DSP)"
58
+
59
+ prerequisites:
60
+ description: |
61
+ The caller needs a brand identity (brand.json at the brand's domain) for the agent
62
+ to resolve visual identity — logos, colors, fonts, tone. The test kit provides a
63
+ sample brand with campaign parameters.
64
+ test_kit: "test-kits/acme-outdoor.yaml"
65
+
66
+ phases:
67
+ - id: capability_discovery
68
+ title: "Capability discovery"
69
+ narrative: |
70
+ The buyer calls get_adcp_capabilities to confirm the agent supports creative operations before browsing or building creatives.
71
+
72
+ steps:
73
+ - id: get_capabilities
74
+ title: "Check agent capabilities"
75
+ narrative: |
76
+ Verify that the agent declares the expected protocol support before
77
+ proceeding with domain-specific operations.
78
+ task: get_adcp_capabilities
79
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
80
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
81
+ doc_ref: "/protocol/get_adcp_capabilities"
82
+ comply_scenario: capability_discovery
83
+ stateful: false
84
+ expected: |
85
+ Return capabilities declaring creative in supported_protocols, confirming the agent handles creative operations.
86
+ sample_request:
87
+ context:
88
+ correlation_id: "creative_generative--get_capabilities"
89
+ validations:
90
+ - check: response_schema
91
+ description: "Response matches get-adcp-capabilities-response.json schema"
92
+ - check: field_present
93
+ path: "supported_protocols"
94
+ description: "Agent declares supported protocols"
95
+
96
+ - check: field_present
97
+ path: "context"
98
+ description: "Response echoes back the context object"
99
+ - check: field_value
100
+ path: "context.correlation_id"
101
+ value: "creative_generative--get_capabilities"
102
+ description: "Context correlation_id returned unchanged"
103
+ - id: format_discovery
104
+ title: "Discover generative formats"
105
+ narrative: |
106
+ The buyer needs to know what your agent can generate. Unlike a template platform
107
+ where formats are fixed dimensions, generative formats describe what the agent
108
+ produces — the output type, constraints, and what inputs it accepts. A generative
109
+ format might be "display_300x250_generative" that accepts a brief and produces
110
+ a finished banner, or "social_post_generative" that creates platform-native content.
111
+
112
+ steps:
113
+ - id: discover_formats
114
+ title: "Discover available generative formats"
115
+ narrative: |
116
+ The buyer asks: "What can you generate?" Your platform returns the formats
117
+ you support. Each format describes the output type, dimensions, and what
118
+ inputs it needs (brief text, brand reference, seed images, etc.).
119
+ task: list_creative_formats
120
+ schema_ref: "creative/list-creative-formats-request.json"
121
+ response_schema_ref: "creative/list-creative-formats-response.json"
122
+ doc_ref: "/creative/task-reference/list_creative_formats"
123
+ comply_scenario: creative_sync
124
+ stateful: false
125
+ expected: |
126
+ Return your generative formats. Each format should include:
127
+ - format_id with your agent_url and a unique id
128
+ - Human-readable name and description
129
+ - Asset slots describing what inputs are accepted (brief text, images, etc.)
130
+ - Render dimensions for the output
131
+ - Variables for any dynamic fields the buyer can control
132
+
133
+ sample_request:
134
+ context:
135
+ correlation_id: "creative_generative--discover_formats"
136
+
137
+ validations:
138
+ - check: response_schema
139
+ description: "Response matches list-creative-formats-response.json schema"
140
+ - check: field_present
141
+ path: "formats"
142
+ description: "Response contains a formats array"
143
+ - check: field_present
144
+ path: "formats[0].format_id.agent_url"
145
+ description: "Each format has a format_id with agent_url"
146
+
147
+ - check: field_present
148
+ path: "context"
149
+ description: "Response echoes back the context object"
150
+ - check: field_value
151
+ path: "context.correlation_id"
152
+ value: "creative_generative--discover_formats"
153
+ description: "Context correlation_id returned unchanged"
154
+ - id: generate_from_brief
155
+ title: "Generate from brief"
156
+ narrative: |
157
+ The buyer describes what they want in natural language and your agent generates
158
+ a creative from scratch. The brief includes the campaign message, target audience
159
+ context, and a brand reference so your agent can resolve visual identity.
160
+
161
+ This is the core generative flow. The buyer doesn't provide finished assets —
162
+ they provide intent, and your agent creates.
163
+
164
+ steps:
165
+ - id: build_draft
166
+ title: "Generate a draft creative from brief"
167
+ narrative: |
168
+ The buyer sends a brief describing the campaign and a target format. Your
169
+ agent generates a draft creative — fast, lower-fidelity output the buyer can
170
+ review before committing to a production build.
171
+
172
+ The brief is passed as a message alongside the target format. The brand
173
+ reference lets your agent resolve brand.json for visual identity.
174
+ task: build_creative
175
+ schema_ref: "media-buy/build-creative-request.json"
176
+ response_schema_ref: "media-buy/build-creative-response.json"
177
+ doc_ref: "/creative/task-reference/build_creative"
178
+ comply_scenario: creative_flow
179
+ stateful: false
180
+ expected: |
181
+ Return a generated creative manifest:
182
+ - creative_manifest with the generated assets (images, copy, serving code)
183
+ - format_id matching the target format
184
+ - If include_preview is true, include a preview render
185
+
186
+ The output should be a coherent creative that reflects the brief and brand
187
+ identity — not a template with placeholder text.
188
+
189
+ sample_request:
190
+ message: "Create a display banner for a summer outdoor gear sale. Bold, adventurous tone. Headline should emphasize 40% off. Target audience: active adults 25-54."
191
+ target_format_id:
192
+ agent_url: "https://your-agent.example.com"
193
+ id: "display_300x250_generative"
194
+ account:
195
+ brand:
196
+ domain: "acmeoutdoor.example"
197
+ operator: "pinnacle-agency.example"
198
+ quality: "draft"
199
+ include_preview: true
200
+
201
+ idempotency_key: "$generate:uuid_v4#creative_generative_generate_from_brief_build_draft"
202
+ context:
203
+ correlation_id: "creative_generative--build_draft"
204
+ validations:
205
+ - check: response_schema
206
+ description: "Response matches build-creative-response.json schema"
207
+ - check: field_present
208
+ path: "creative_manifest.assets"
209
+ description: "Output manifest includes generated assets"
210
+ - check: field_present
211
+ path: "creative_manifest.format_id"
212
+ description: "Output manifest includes format_id"
213
+
214
+ - check: field_present
215
+ path: "context"
216
+ description: "Response echoes back the context object"
217
+ - check: field_value
218
+ path: "context.correlation_id"
219
+ value: "creative_generative--build_draft"
220
+ description: "Context correlation_id returned unchanged"
221
+ - id: refine
222
+ title: "Refine the creative"
223
+ narrative: |
224
+ The buyer reviews the draft and wants changes. They send the generated manifest
225
+ back with refinement instructions. Your agent modifies the creative based on the
226
+ feedback — adjusting copy, swapping imagery, or changing the layout.
227
+
228
+ This is iterative: the buyer can refine multiple times until they're satisfied,
229
+ then request a production-quality build.
230
+
231
+ steps:
232
+ - id: refine_creative
233
+ title: "Refine with feedback"
234
+ narrative: |
235
+ The buyer passes the generated manifest back with a message describing what
236
+ to change. Your agent applies the refinements and returns an updated creative.
237
+ task: build_creative
238
+ schema_ref: "media-buy/build-creative-request.json"
239
+ response_schema_ref: "media-buy/build-creative-response.json"
240
+ doc_ref: "/creative/task-reference/build_creative"
241
+ comply_scenario: creative_flow
242
+ stateful: false
243
+ expected: |
244
+ Return a refined creative manifest reflecting the requested changes.
245
+ The output should preserve what worked in the original while applying
246
+ the refinements.
247
+
248
+ sample_request:
249
+ message: "Make the headline larger. Replace the mountain imagery with a trail running scene. Add a CTA button that says 'Shop Now'."
250
+ creative_manifest:
251
+ format_id:
252
+ agent_url: "https://your-agent.example.com"
253
+ id: "display_300x250_generative"
254
+ assets:
255
+ generated_image:
256
+ asset_type: "image"
257
+ url: "https://your-agent.example.com/generated/abc123.jpg"
258
+ width: 300
259
+ height: 250
260
+ headline:
261
+ asset_type: "text"
262
+ content: "Summer Sale — 40% Off All Gear"
263
+ target_format_id:
264
+ agent_url: "https://your-agent.example.com"
265
+ id: "display_300x250_generative"
266
+ account:
267
+ brand:
268
+ domain: "acmeoutdoor.example"
269
+ operator: "pinnacle-agency.example"
270
+ quality: "draft"
271
+ include_preview: true
272
+
273
+ idempotency_key: "$generate:uuid_v4#creative_generative_refine_refine_creative"
274
+ context:
275
+ correlation_id: "creative_generative--refine_creative"
276
+ validations:
277
+ - check: response_schema
278
+ description: "Response matches build-creative-response.json schema"
279
+ - check: field_present
280
+ path: "creative_manifest.assets"
281
+ description: "Refined manifest includes assets"
282
+
283
+ - check: field_present
284
+ path: "context"
285
+ description: "Response echoes back the context object"
286
+ - check: field_value
287
+ path: "context.correlation_id"
288
+ value: "creative_generative--refine_creative"
289
+ description: "Context correlation_id returned unchanged"
290
+ - id: multi_format
291
+ title: "Multi-format generation"
292
+ narrative: |
293
+ The buyer needs the creative in multiple sizes. Instead of generating each
294
+ format separately, they pass target_format_ids (plural) and your agent produces
295
+ all formats in a single call. This is where generative agents shine — adapting
296
+ a concept across formats while maintaining visual coherence.
297
+
298
+ steps:
299
+ - id: build_multi_format
300
+ title: "Generate for multiple formats"
301
+ narrative: |
302
+ The buyer passes the refined manifest with multiple target formats. Your
303
+ agent generates a creative for each format, adapting layout, copy, and
304
+ imagery to fit each size while maintaining brand consistency.
305
+ task: build_creative
306
+ schema_ref: "media-buy/build-creative-request.json"
307
+ response_schema_ref: "media-buy/build-creative-response.json"
308
+ doc_ref: "/creative/task-reference/build_creative"
309
+ comply_scenario: creative_flow
310
+ stateful: false
311
+ expected: |
312
+ Return creative manifests for each requested format in creative_manifests
313
+ (plural). Each manifest should:
314
+ - Have a format_id matching one of the target formats
315
+ - Contain complete, format-appropriate assets
316
+ - Maintain visual coherence across formats
317
+
318
+ If a format cannot be produced, include it with an error — don't fail
319
+ the entire request.
320
+
321
+ sample_request:
322
+ message: "Generate production-ready versions for all three sizes."
323
+ creative_manifest:
324
+ format_id:
325
+ agent_url: "https://your-agent.example.com"
326
+ id: "display_300x250_generative"
327
+ assets:
328
+ generated_image:
329
+ asset_type: "image"
330
+ url: "https://your-agent.example.com/generated/abc123-refined.jpg"
331
+ width: 300
332
+ height: 250
333
+ headline:
334
+ asset_type: "text"
335
+ content: "Summer Sale — 40% Off All Gear"
336
+ cta:
337
+ asset_type: "text"
338
+ content: "Shop Now"
339
+ target_format_ids:
340
+ - agent_url: "https://your-agent.example.com"
341
+ id: "display_300x250_generative"
342
+ - agent_url: "https://your-agent.example.com"
343
+ id: "display_728x90_generative"
344
+ - agent_url: "https://your-agent.example.com"
345
+ id: "display_320x50_generative"
346
+ account:
347
+ brand:
348
+ domain: "acmeoutdoor.example"
349
+ operator: "pinnacle-agency.example"
350
+ quality: "production"
351
+
352
+ idempotency_key: "$generate:uuid_v4#creative_generative_multi_format_build_multi_format"
353
+ context:
354
+ correlation_id: "creative_generative--build_multi_format"
355
+ validations:
356
+ - check: response_schema
357
+ description: "Response matches build-creative-response.json schema"
358
+ - check: field_present
359
+ path: "creative_manifests"
360
+ description: "Response contains creative_manifests array (plural)"
361
+
362
+ - check: field_present
363
+ path: "context"
364
+ description: "Response echoes back the context object"
365
+ - check: field_value
366
+ path: "context.correlation_id"
367
+ value: "creative_generative--build_multi_format"
368
+ description: "Context correlation_id returned unchanged"
369
+ - id: production_build
370
+ title: "Production build"
371
+ narrative: |
372
+ The buyer is satisfied with the concept and needs a final, production-quality
373
+ creative ready for trafficking. They switch quality from draft to production.
374
+ Your agent generates the finished output with full-fidelity assets.
375
+
376
+ steps:
377
+ - id: build_production
378
+ title: "Build at production quality"
379
+ narrative: |
380
+ The buyer requests a production-quality build of the approved concept. Your
381
+ agent generates the final creative with full-fidelity rendering, polished
382
+ assets, and serving code ready for trafficking.
383
+ task: build_creative
384
+ schema_ref: "media-buy/build-creative-request.json"
385
+ response_schema_ref: "media-buy/build-creative-response.json"
386
+ doc_ref: "/creative/task-reference/build_creative"
387
+ comply_scenario: creative_flow
388
+ stateful: false
389
+ expected: |
390
+ Return a production-quality creative manifest:
391
+ - Full-fidelity generated assets
392
+ - Serving code (HTML, JavaScript, or VAST) ready for trafficking
393
+ - Provenance metadata if AI-generated (digital_source_type, ai_tool)
394
+
395
+ sample_request:
396
+ message: "Final production build. No changes needed."
397
+ creative_manifest:
398
+ format_id:
399
+ agent_url: "https://your-agent.example.com"
400
+ id: "display_300x250_generative"
401
+ assets:
402
+ generated_image:
403
+ asset_type: "image"
404
+ url: "https://your-agent.example.com/generated/abc123-refined.jpg"
405
+ width: 300
406
+ height: 250
407
+ headline:
408
+ asset_type: "text"
409
+ content: "Summer Sale — 40% Off All Gear"
410
+ cta:
411
+ asset_type: "text"
412
+ content: "Shop Now"
413
+ target_format_id:
414
+ agent_url: "https://your-agent.example.com"
415
+ id: "display_300x250_generative"
416
+ account:
417
+ brand:
418
+ domain: "acmeoutdoor.example"
419
+ operator: "pinnacle-agency.example"
420
+ quality: "production"
421
+ include_preview: true
422
+
423
+ idempotency_key: "$generate:uuid_v4#creative_generative_production_build_build_production"
424
+ context:
425
+ correlation_id: "creative_generative--build_production"
426
+ validations:
427
+ - check: response_schema
428
+ description: "Response matches build-creative-response.json schema"
429
+ - check: field_present
430
+ path: "creative_manifest.assets"
431
+ description: "Production manifest includes assets"
432
+ - check: field_present
433
+ path: "creative_manifest.format_id"
434
+ description: "Production manifest includes format_id"
435
+
436
+ - check: field_present
437
+ path: "context"
438
+ description: "Response echoes back the context object"
439
+ - check: field_value
440
+ path: "context.correlation_id"
441
+ value: "creative_generative--build_production"
442
+ description: "Context correlation_id returned unchanged"
443
+
444
+ - id: catalog_augmented_generation
445
+ title: "Catalog-augmented generation"
446
+ narrative: |
447
+ Generative platforms routinely hydrate catalog items into the generation context:
448
+ the buyer pushes a product catalog, and each generated creative references a specific
449
+ catalog item (via `{SKU}`, `{GTIN}`, or the catalog-item family) in its impression
450
+ trackers and click trackers. This is how generative DSPs produce per-SKU dynamic
451
+ creative at scale.
452
+
453
+ This phase exercises the catalog-acceptance leg and emits a generative build that
454
+ includes catalog-item macros in its tracker URL assets. `preview_creative` is the
455
+ natural observation point for the runtime substitution-safety check tracked in
456
+ #2638 — when the substitution-observer contract lands, a runner can assert that
457
+ the previewed HTML contains percent-encoded catalog-item values per
458
+ `docs/creative/universal-macros#substitution-safety-catalog-item-macros`.
459
+
460
+ steps:
461
+ - id: sync_generation_catalog
462
+ title: "Push a product catalog for generation"
463
+ narrative: |
464
+ The buyer pushes a small inline catalog. Your agent will use these items as the
465
+ hydration targets for subsequent generated creatives.
466
+ task: sync_catalogs
467
+ schema_ref: "media-buy/sync-catalogs-request.json"
468
+ response_schema_ref: "media-buy/sync-catalogs-response.json"
469
+ doc_ref: "/media-buy/task-reference/sync_catalogs"
470
+ stateful: true
471
+ expected: |
472
+ Return per-catalog results with catalog_id, action, item_count, and
473
+ items_approved counts.
474
+
475
+ sample_request:
476
+ account:
477
+ brand:
478
+ domain: "acmeoutdoor.example"
479
+ operator: "pinnacle-agency.example"
480
+ catalogs:
481
+ - catalog_id: "acme_generative_source"
482
+ type: "product"
483
+ content_id_type: "sku"
484
+ name: "Acme Outdoor — Generative source feed"
485
+ items:
486
+ - item_id: "peak_jacket_x"
487
+ title: "Peak Jacket X"
488
+ description: "Goretex 3L shell, seam-taped, 280g."
489
+ url: "https://acmeoutdoor.example/gear/peak-jacket-x"
490
+ image_url: "https://cdn.acmeoutdoor.example/gear/peak-jacket-x.jpg"
491
+ price:
492
+ amount: 449.00
493
+ currency: "USD"
494
+
495
+ idempotency_key: "$generate:uuid_v4#creative_generative_catalog_augmented_generation_sync_generation_catalog"
496
+ context:
497
+ correlation_id: "creative_generative--sync_generation_catalog"
498
+ validations:
499
+ - check: response_schema
500
+ description: "Response matches sync-catalogs-response.json schema"
501
+ - check: field_present
502
+ path: "catalogs[0].catalog_id"
503
+ description: "Catalog has an ID"
504
+ - check: field_present
505
+ path: "context"
506
+ description: "Response echoes back the context object"
507
+ - check: field_value
508
+ path: "context.correlation_id"
509
+ value: "creative_generative--sync_generation_catalog"
510
+ description: "Context correlation_id returned unchanged"
511
+
512
+ - id: build_catalog_aware_creative
513
+ title: "Generate a creative bound to a catalog item"
514
+ narrative: |
515
+ The buyer asks your agent to build a creative for a specific catalog item.
516
+ The generated manifest MUST include tracker URLs with catalog-item macros
517
+ (`{SKU}`, `{GTIN}`) so impression-time substitution renders per-SKU output.
518
+
519
+ Per #2620, the substitution step MUST percent-encode catalog-item values
520
+ against the RFC 3986 unreserved set — but the substitution itself happens at
521
+ serve time, not in the build_creative response. Runtime observability is
522
+ tracked in #2638.
523
+ task: build_creative
524
+ schema_ref: "media-buy/build-creative-request.json"
525
+ response_schema_ref: "media-buy/build-creative-response.json"
526
+ doc_ref: "/creative/task-reference/build_creative"
527
+ comply_scenario: creative_flow
528
+ stateful: true
529
+ expected: |
530
+ Return a creative manifest whose tracker assets include catalog-item
531
+ macros ({SKU} or {GTIN}) and whose format references a catalog-capable
532
+ format declared by the agent.
533
+
534
+ sample_request:
535
+ message: "Generate a 300x250 display ad for the Peak Jacket X, using our catalog feed for product fields and tracker URLs."
536
+ target_format_id:
537
+ agent_url: "https://your-agent.example.com"
538
+ id: "display_300x250_generative"
539
+ account:
540
+ brand:
541
+ domain: "acmeoutdoor.example"
542
+ operator: "pinnacle-agency.example"
543
+ quality: "draft"
544
+ include_preview: true
545
+
546
+ idempotency_key: "$generate:uuid_v4#creative_generative_catalog_augmented_generation_build_catalog_aware_creative"
547
+ context:
548
+ correlation_id: "creative_generative--build_catalog_aware_creative"
549
+ validations:
550
+ - check: response_schema
551
+ description: "Response matches build-creative-response.json schema"
552
+ - check: field_present
553
+ path: "creative_manifest.format_id"
554
+ description: "Generated manifest includes format_id"
555
+ - check: field_present
556
+ path: "context"
557
+ description: "Response echoes back the context object"
558
+ - check: field_value
559
+ path: "context.correlation_id"
560
+ value: "creative_generative--build_catalog_aware_creative"
561
+ description: "Context correlation_id returned unchanged"
562
+
563
+ - id: catalog_substitution_safety
564
+ title: "Catalog-item macro substitution safety"
565
+ narrative: |
566
+ Per docs/creative/universal-macros#substitution-safety-catalog-item-macros,
567
+ sales and creative agents MUST percent-encode catalog-item macro values
568
+ such that only RFC 3986 `unreserved` characters remain unescaped before
569
+ substituting them into a URL context. Nested macro expansion is prohibited.
570
+
571
+ This phase exercises the rule with five canonical attacker-shaped
572
+ catalog values drawn from the fixture at
573
+ `static/test-vectors/catalog-macro-substitution.json`:
574
+ reserved-char breakout, nested-expansion preservation, non-ASCII UTF-8,
575
+ CRLF injection, and bidi-override neutralization. Generative pipelines
576
+ have a higher risk profile on bidi-override than template pipelines
577
+ (LLM-generated copy with embedded user text can round-trip bidi
578
+ controls into attribute contexts), so this phase exercises bidi
579
+ alongside the baseline vectors. The two remaining fixture vectors —
580
+ `mixed-path-and-query-contexts` (requires the same macro in two URL
581
+ positions) and `url-scheme-injection-neutralized` (requires an
582
+ href-whole-value macro binding) — are unit-test-layer conformance only;
583
+ runtime observation in a storyboard requires specialism-specific
584
+ template shapes tracked as follow-ups.
585
+
586
+ `build_creative`-with-`include_preview: true` is the natural observation
587
+ point on a generative specialism — the substitution-observer runner
588
+ (#2638) parses the returned `preview_html` and asserts each macro
589
+ position carries the fixture's `expected_encoded` form, not the raw
590
+ attacker bytes.
591
+
592
+ Scope note: this phase validates substitution on the PREVIEW surface
593
+ only. Sellers with divergent preview vs impression-time substitution
594
+ paths MAY pass here while failing at serve time; serve-time attestation
595
+ or log-introspection observability is deferred (#2651, out-of-scope v1
596
+ per the observer contract).
597
+
598
+ The `expect_substitution_safe` step is gated on the
599
+ `substitution_observer_runner` test-kit contract (see
600
+ `test-kits/substitution-observer-runner.yaml`). Runners that do not
601
+ advertise the contract grade the step as `not_applicable` — the earlier
602
+ `sync_substitution_probe_catalog` and `build_substitution_probe_creative`
603
+ steps still run (exercising the catalog-acceptance and build paths),
604
+ but the substituted-URL assertion is skipped.
605
+
606
+ steps:
607
+ - id: sync_substitution_probe_catalog
608
+ title: "Push a probe catalog with attacker-shaped values"
609
+ narrative: |
610
+ Push a small probe catalog whose `sku` fields contain three of the
611
+ canonical attacker-shaped values from the substitution-safety
612
+ fixture. The agent MUST accept the payload at sync_catalogs — the
613
+ encoding rule applies at substitution time, not at ingest — but
614
+ subsequent build_creative output must percent-encode each value.
615
+ task: sync_catalogs
616
+ schema_ref: "media-buy/sync-catalogs-request.json"
617
+ response_schema_ref: "media-buy/sync-catalogs-response.json"
618
+ doc_ref: "/media-buy/task-reference/sync_catalogs"
619
+ stateful: true
620
+ expected: |
621
+ Catalog accepted with per-item counts. Runner captures the
622
+ catalog_id + item_ids for the downstream assertion binding.
623
+
624
+ sample_request:
625
+ account:
626
+ brand:
627
+ domain: "acmeoutdoor.example"
628
+ operator: "pinnacle-agency.example"
629
+ catalogs:
630
+ - catalog_id: "creative_generative_substitution_probe_v1"
631
+ type: "product"
632
+ content_id_type: "sku"
633
+ name: "Substitution safety probe"
634
+ items:
635
+ # item_id names the vector; the `sku` field carries the
636
+ # attacker-shaped value that substitution must encode.
637
+ - item_id: "reserved_char_breakout"
638
+ sku: "00013&cmd=drop"
639
+ title: "Reserved-char breakout probe"
640
+ url: "https://acmeoutdoor.example/probe/reserved"
641
+ image_url: "https://cdn.acmeoutdoor.example/probe/reserved.jpg"
642
+ price: { amount: 1.00, currency: "USD" }
643
+ - item_id: "nested_expansion"
644
+ sku: "vacancy-{DEVICE_ID}-42"
645
+ title: "Nested-expansion probe"
646
+ url: "https://acmeoutdoor.example/probe/nested"
647
+ image_url: "https://cdn.acmeoutdoor.example/probe/nested.jpg"
648
+ price: { amount: 1.00, currency: "USD" }
649
+ - item_id: "non_ascii"
650
+ sku: "café-amsterdam"
651
+ title: "Non-ASCII UTF-8 probe"
652
+ url: "https://acmeoutdoor.example/probe/non-ascii"
653
+ image_url: "https://cdn.acmeoutdoor.example/probe/non-ascii.jpg"
654
+ price: { amount: 1.00, currency: "USD" }
655
+ - item_id: "crlf_injection"
656
+ sku: "abc\r\nHost: evil.example"
657
+ title: "CRLF injection probe"
658
+ url: "https://acmeoutdoor.example/probe/crlf"
659
+ image_url: "https://cdn.acmeoutdoor.example/probe/crlf.jpg"
660
+ price: { amount: 1.00, currency: "USD" }
661
+ - item_id: "bidi_override"
662
+ sku: "VIN-\u202E1234"
663
+ title: "Bidi-override probe"
664
+ url: "https://acmeoutdoor.example/probe/bidi"
665
+ image_url: "https://cdn.acmeoutdoor.example/probe/bidi.jpg"
666
+ price: { amount: 1.00, currency: "USD" }
667
+
668
+ idempotency_key: "$generate:uuid_v4#creative_generative_catalog_substitution_safety_sync_substitution_probe_catalog"
669
+ context:
670
+ correlation_id: "creative_generative--sync_substitution_probe_catalog"
671
+ validations:
672
+ - check: response_schema
673
+ description: "Response matches sync-catalogs-response.json schema"
674
+ - check: field_present
675
+ path: "catalogs[0].catalog_id"
676
+ description: "Probe catalog accepted"
677
+
678
+ - id: build_substitution_probe_creative
679
+ title: "Generate a creative with catalog-item macros bound to the probe"
680
+ narrative: |
681
+ Generate a draft creative that uses `{SKU}` in its impression tracker
682
+ URL and request `include_preview: true` so the substitution-observer
683
+ runner has a preview surface to inspect.
684
+
685
+ The `message` is a natural-language brief; a generative agent that
686
+ ignores the `{SKU}` directive (generates its own macro, inlines an
687
+ encoded value, omits the tracker) fails the downstream
688
+ `expect_substitution_safe` step with `substitution_binding_missing`.
689
+ To keep that failure mode diagnostically clear, this step validates
690
+ the creative_manifest contains `{SKU}` unsubstituted in at least
691
+ one tracker asset before the observer runs.
692
+ task: build_creative
693
+ schema_ref: "media-buy/build-creative-request.json"
694
+ response_schema_ref: "media-buy/build-creative-response.json"
695
+ doc_ref: "/creative/task-reference/build_creative"
696
+ comply_scenario: creative_flow
697
+ stateful: true
698
+ expected: |
699
+ Creative manifest returned with preview_html populated. Impression
700
+ tracker asset includes {SKU} unsubstituted in its template (to be
701
+ resolved at impression time against catalog items).
702
+
703
+ sample_request:
704
+ message: "Generate a 300x250 display ad for the creative_generative_substitution_probe_v1 catalog. Include the `{SKU}` macro as a literal token in the impression tracker URL — the platform resolves it per-impression against catalog items."
705
+ target_format_id:
706
+ agent_url: "https://your-agent.example.com"
707
+ id: "display_300x250_generative"
708
+ account:
709
+ brand:
710
+ domain: "acmeoutdoor.example"
711
+ operator: "pinnacle-agency.example"
712
+ quality: "draft"
713
+ include_preview: true
714
+
715
+ idempotency_key: "$generate:uuid_v4#creative_generative_catalog_substitution_safety_build_substitution_probe_creative"
716
+ context:
717
+ correlation_id: "creative_generative--build_substitution_probe_creative"
718
+ validations:
719
+ - check: response_schema
720
+ description: "Response matches build-creative-response.json schema"
721
+ - check: field_present
722
+ path: "creative_manifest.format_id"
723
+ description: "Creative manifest returned"
724
+
725
+ - id: expect_substitution_safe
726
+ title: "Assert substituted tracker URLs percent-encode attacker shapes"
727
+ narrative: |
728
+ The runner inspects the preview_html from the previous step, extracts
729
+ tracker URLs that bind `{SKU}` to a probe catalog item, and asserts
730
+ each value is percent-encoded per RFC 3986 (unreserved-whitelist).
731
+ Raw-byte leakage fails. Every declared binding MUST be observed — a
732
+ generative agent that silently strips `{SKU}` rather than
733
+ substituting it fails with `substitution_binding_missing`.
734
+ task: expect_substitution_safe
735
+ requires_contract: substitution_observer_runner
736
+ source: html_inline
737
+ source_path: "/creative_manifest/preview_html"
738
+ macro_template: "https://track.example/imp?sku={SKU}"
739
+ require_every_binding_observed: true
740
+ catalog_bindings:
741
+ # Each binding: `catalog_item_id` is the item_id in the probe
742
+ # catalog; `vector_name` is the fixture entry whose raw_value and
743
+ # expected_encoded the runner loads from the unit-test fixture.
744
+ - macro: "{SKU}"
745
+ catalog_item_id: "reserved_char_breakout"
746
+ vector_name: "reserved-character-breakout"
747
+ - macro: "{SKU}"
748
+ catalog_item_id: "nested_expansion"
749
+ vector_name: "nested-expansion-preserved-as-literal"
750
+ - macro: "{SKU}"
751
+ catalog_item_id: "non_ascii"
752
+ vector_name: "non-ascii-utf8-percent-encoding"
753
+ - macro: "{SKU}"
754
+ catalog_item_id: "crlf_injection"
755
+ vector_name: "crlf-injection-neutralized"
756
+ - macro: "{SKU}"
757
+ catalog_item_id: "bidi_override"
758
+ vector_name: "bidi-override-neutralized"