@adcp/sdk 6.9.0 → 6.10.0

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 (233) hide show
  1. package/bin/adcp.js +285 -5
  2. package/compliance/cache/3.0.6.previous/domains/brand/index.yaml +163 -0
  3. package/compliance/cache/3.0.6.previous/domains/creative/index.yaml +412 -0
  4. package/compliance/cache/3.0.6.previous/domains/governance/index.yaml +683 -0
  5. package/compliance/cache/3.0.6.previous/domains/media-buy/creative-reception.yaml +247 -0
  6. package/compliance/cache/3.0.6.previous/domains/media-buy/index.yaml +769 -0
  7. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
  8. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
  9. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
  10. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
  11. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
  12. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
  13. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
  14. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
  15. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
  16. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
  17. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
  18. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
  19. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
  20. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
  21. package/compliance/cache/3.0.6.previous/domains/media-buy/state-machine.yaml +442 -0
  22. package/compliance/cache/3.0.6.previous/domains/signals/index.yaml +266 -0
  23. package/compliance/cache/3.0.6.previous/domains/sponsored-intelligence/index.yaml +256 -0
  24. package/compliance/cache/3.0.6.previous/index.json +324 -0
  25. package/compliance/cache/3.0.6.previous/protocols/brand/index.yaml +163 -0
  26. package/compliance/cache/3.0.6.previous/protocols/creative/index.yaml +412 -0
  27. package/compliance/cache/3.0.6.previous/protocols/governance/index.yaml +683 -0
  28. package/compliance/cache/3.0.6.previous/protocols/media-buy/creative-reception.yaml +247 -0
  29. package/compliance/cache/3.0.6.previous/protocols/media-buy/index.yaml +769 -0
  30. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
  31. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
  32. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
  33. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
  34. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
  35. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
  36. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
  37. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
  38. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
  39. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
  40. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
  41. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
  42. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
  43. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  44. package/compliance/cache/3.0.6.previous/protocols/media-buy/state-machine.yaml +442 -0
  45. package/compliance/cache/3.0.6.previous/protocols/signals/index.yaml +266 -0
  46. package/compliance/cache/3.0.6.previous/protocols/sponsored-intelligence/index.yaml +256 -0
  47. package/compliance/cache/3.0.6.previous/specialisms/audience-sync/index.yaml +280 -0
  48. package/compliance/cache/3.0.6.previous/specialisms/brand-rights/index.yaml +350 -0
  49. package/compliance/cache/3.0.6.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
  50. package/compliance/cache/3.0.6.previous/specialisms/collection-lists/index.yaml +359 -0
  51. package/compliance/cache/3.0.6.previous/specialisms/content-standards/index.yaml +572 -0
  52. package/compliance/cache/3.0.6.previous/specialisms/creative-ad-server/index.yaml +383 -0
  53. package/compliance/cache/3.0.6.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
  54. package/compliance/cache/3.0.6.previous/specialisms/creative-generative/index.yaml +746 -0
  55. package/compliance/cache/3.0.6.previous/specialisms/creative-template/index.yaml +413 -0
  56. package/compliance/cache/3.0.6.previous/specialisms/governance-aware-seller/index.yaml +136 -0
  57. package/compliance/cache/3.0.6.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
  58. package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
  59. package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/index.yaml +330 -0
  60. package/compliance/cache/3.0.6.previous/specialisms/property-lists/index.yaml +482 -0
  61. package/compliance/cache/3.0.6.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
  62. package/compliance/cache/3.0.6.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
  63. package/compliance/cache/3.0.6.previous/specialisms/sales-guaranteed/index.yaml +504 -0
  64. package/compliance/cache/3.0.6.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
  65. package/compliance/cache/3.0.6.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
  66. package/compliance/cache/3.0.6.previous/specialisms/sales-social/index.yaml +584 -0
  67. package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/index.yaml +415 -0
  68. package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
  69. package/compliance/cache/3.0.6.previous/specialisms/signal-owned/index.yaml +316 -0
  70. package/compliance/cache/3.0.6.previous/test-kits/acme-outdoor.yaml +210 -0
  71. package/compliance/cache/3.0.6.previous/test-kits/bistro-oranje.yaml +126 -0
  72. package/compliance/cache/3.0.6.previous/test-kits/nova-motors.yaml +262 -0
  73. package/compliance/cache/3.0.6.previous/test-kits/osei-natural.yaml +126 -0
  74. package/compliance/cache/3.0.6.previous/test-kits/signed-requests-runner.yaml +155 -0
  75. package/compliance/cache/3.0.6.previous/test-kits/substitution-observer-runner.yaml +690 -0
  76. package/compliance/cache/3.0.6.previous/test-kits/summit-foods.yaml +125 -0
  77. package/compliance/cache/3.0.6.previous/test-kits/webhook-receiver-runner.yaml +265 -0
  78. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  79. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
  80. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  81. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  82. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  83. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  84. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  85. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  86. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  87. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  88. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  89. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/README.md +219 -0
  90. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/canonicalization.json +241 -0
  91. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/keys.json +60 -0
  92. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  93. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  94. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  95. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  96. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  97. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  98. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  99. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  100. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  101. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  102. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  103. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  104. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  105. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  106. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  107. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  108. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  109. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  110. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  111. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  112. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  113. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  114. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  115. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  116. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  117. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  118. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  119. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  120. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  121. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  122. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  123. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  124. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  125. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  126. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  127. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  128. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  129. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  130. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  131. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/README.md +211 -0
  132. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/keys.json +61 -0
  133. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  134. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  135. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  136. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  137. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  138. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  139. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  140. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  141. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  142. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  143. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  144. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  145. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  146. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  147. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  148. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  149. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  150. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  151. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  152. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  153. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  154. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  155. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  156. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  157. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  158. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  159. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  160. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  161. package/compliance/cache/3.0.6.previous/universal/capability-discovery.yaml +125 -0
  162. package/compliance/cache/3.0.6.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
  163. package/compliance/cache/3.0.6.previous/universal/content-standards-pagination-integrity.yaml +326 -0
  164. package/compliance/cache/3.0.6.previous/universal/deterministic-testing.yaml +1343 -0
  165. package/compliance/cache/3.0.6.previous/universal/error-compliance.yaml +474 -0
  166. package/compliance/cache/3.0.6.previous/universal/fictional-entities.yaml +307 -0
  167. package/compliance/cache/3.0.6.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
  168. package/compliance/cache/3.0.6.previous/universal/get-signals-pagination-integrity.yaml +211 -0
  169. package/compliance/cache/3.0.6.previous/universal/idempotency.yaml +593 -0
  170. package/compliance/cache/3.0.6.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
  171. package/compliance/cache/3.0.6.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
  172. package/compliance/cache/3.0.6.previous/universal/pagination-integrity.yaml +263 -0
  173. package/compliance/cache/3.0.6.previous/universal/property-lists-pagination-integrity.yaml +307 -0
  174. package/compliance/cache/3.0.6.previous/universal/runner-output-contract.yaml +358 -0
  175. package/compliance/cache/3.0.6.previous/universal/schema-validation.yaml +526 -0
  176. package/compliance/cache/3.0.6.previous/universal/security.yaml +431 -0
  177. package/compliance/cache/3.0.6.previous/universal/signed-requests.yaml +205 -0
  178. package/compliance/cache/3.0.6.previous/universal/storyboard-schema.yaml +1176 -0
  179. package/compliance/cache/3.0.6.previous/universal/v3-envelope-integrity.yaml +106 -0
  180. package/compliance/cache/3.0.6.previous/universal/webhook-emission.yaml +337 -0
  181. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  182. package/dist/lib/server/create-adcp-server.d.ts +33 -0
  183. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  184. package/dist/lib/server/create-adcp-server.js +127 -1
  185. package/dist/lib/server/create-adcp-server.js.map +1 -1
  186. package/dist/lib/server/credential-policy.d.ts +221 -0
  187. package/dist/lib/server/credential-policy.d.ts.map +1 -0
  188. package/dist/lib/server/credential-policy.js +260 -0
  189. package/dist/lib/server/credential-policy.js.map +1 -0
  190. package/dist/lib/server/dynamic-registry.d.ts +219 -0
  191. package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
  192. package/dist/lib/server/dynamic-registry.js +245 -0
  193. package/dist/lib/server/dynamic-registry.js.map +1 -0
  194. package/dist/lib/server/index.d.ts +8 -0
  195. package/dist/lib/server/index.d.ts.map +1 -1
  196. package/dist/lib/server/index.js +15 -4
  197. package/dist/lib/server/index.js.map +1 -1
  198. package/dist/lib/server/operational-platform.d.ts +239 -0
  199. package/dist/lib/server/operational-platform.d.ts.map +1 -0
  200. package/dist/lib/server/operational-platform.js +94 -0
  201. package/dist/lib/server/operational-platform.js.map +1 -0
  202. package/dist/lib/server/wire-safe.d.ts +211 -0
  203. package/dist/lib/server/wire-safe.d.ts.map +1 -0
  204. package/dist/lib/server/wire-safe.js +231 -0
  205. package/dist/lib/server/wire-safe.js.map +1 -0
  206. package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
  207. package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
  208. package/dist/lib/server/wire-spec-fields.generated.js +172 -0
  209. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
  210. package/dist/lib/testing/compliance/index.d.ts +2 -0
  211. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  212. package/dist/lib/testing/compliance/index.js +6 -1
  213. package/dist/lib/testing/compliance/index.js.map +1 -1
  214. package/dist/lib/testing/compliance/summary.d.ts +77 -0
  215. package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
  216. package/dist/lib/testing/compliance/summary.js +176 -0
  217. package/dist/lib/testing/compliance/summary.js.map +1 -0
  218. package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
  219. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  220. package/dist/lib/testing/storyboard/compliance.js +51 -0
  221. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  222. package/dist/lib/testing/storyboard/index.d.ts +2 -2
  223. package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
  224. package/dist/lib/testing/storyboard/index.js +4 -2
  225. package/dist/lib/testing/storyboard/index.js.map +1 -1
  226. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  227. package/dist/lib/testing/storyboard/runner.js +58 -5
  228. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  229. package/dist/lib/version.d.ts +3 -3
  230. package/dist/lib/version.d.ts.map +1 -1
  231. package/dist/lib/version.js +3 -3
  232. package/dist/lib/version.js.map +1 -1
  233. package/package.json +2 -2
@@ -0,0 +1,758 @@
1
+ id: creative_generative/seller
2
+ version: "1.0.0"
3
+ title: "Generative seller agent"
4
+ category: creative_generative
5
+ summary: "Seller agent that generates creatives from briefs at buy time — no pre-built assets required."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+ - list_creative_formats
11
+ - sync_creatives
12
+ - get_media_buy_delivery
13
+ requires_scenarios:
14
+ - media_buy_seller/refine_products
15
+ - media_buy_seller/delivery_reporting
16
+
17
+ # Cross-step assertion (adcp#2664). status.monotonic rejects resource
18
+ # status transitions observed across steps that aren't on the spec
19
+ # lifecycle graph — e.g. active → pending_creatives on a media_buy or
20
+ # approved → processing on a creative asset.
21
+ invariants:
22
+ - status.monotonic
23
+
24
+ narrative: |
25
+ You run a generative sell-side platform — an AI ad network, generative DSP, or any system that
26
+ both sells inventory and generates creatives from a brief. The buyer doesn't upload finished
27
+ assets. Instead, they describe what they want via a creative brief, point you at a brand.json,
28
+ and your platform produces finished creatives ready for delivery.
29
+
30
+ This is the media buy seller flow with generative creative capabilities. Your platform handles
31
+ the full lifecycle from brief to reporting, but the creative sync step accepts briefs instead
32
+ of static assets. Your formats declare what brief inputs they accept, and your platform
33
+ generates the creative — potentially asynchronously.
34
+
35
+ A programmatic seller with generative capabilities should also support standard IAB formats
36
+ (display, video, VAST, etc.) for buyers who bring their own assets. A platform that sells
37
+ programmatic inventory but can't accept a pre-built VAST tag or display banner is incoherent.
38
+ The generative capability is additive to standard programmatic creative acceptance.
39
+
40
+ This storyboard focuses on the generative creative delta. Governance agent registration and
41
+ proposal refinement work identically to the base media_buy_seller storyboard — see that
42
+ storyboard for those phases.
43
+
44
+ agent:
45
+ interaction_model: media_buy_seller
46
+ capabilities:
47
+ - sells_media
48
+ - accepts_briefs
49
+ - supports_generation
50
+ - supports_guaranteed
51
+ - supports_non_guaranteed
52
+ examples:
53
+ - "OpenAds"
54
+ - "AI ad networks"
55
+ - "Generative DSPs"
56
+
57
+ caller:
58
+ role: buyer_agent
59
+ example: "Scope3 (DSP)"
60
+
61
+ prerequisites:
62
+ description: |
63
+ The caller needs a brand identity hosted at the brand's domain (brand.json) or resolvable
64
+ via AgenticAdvertising.org. The brand.json provides visual identity — logos, colors, fonts,
65
+ tone — that the generative seller uses to produce on-brand creatives. The test kit provides
66
+ a sample brand with campaign parameters.
67
+ test_kit: "test-kits/acme-outdoor.yaml"
68
+ controller_seeding: true
69
+
70
+ fixtures:
71
+ products:
72
+ - product_id: "outdoor_display_q2"
73
+ delivery_type: "guaranteed"
74
+ channels: ["display"]
75
+ format_ids:
76
+ - id: "display_300x250"
77
+ - product_id: "outdoor_video_q2"
78
+ delivery_type: "guaranteed"
79
+ channels: ["video"]
80
+ format_ids:
81
+ - id: "video_15s"
82
+ pricing_options:
83
+ - product_id: "outdoor_display_q2"
84
+ pricing_option_id: "cpm_guaranteed"
85
+ pricing_model: "cpm"
86
+ currency: "USD"
87
+ fixed_price: 12.0
88
+ - product_id: "outdoor_video_q2"
89
+ pricing_option_id: "cpm_standard"
90
+ pricing_model: "cpm"
91
+ currency: "USD"
92
+ fixed_price: 12.0
93
+
94
+ phases:
95
+ - id: capability_discovery
96
+ title: "Capability discovery"
97
+ narrative: |
98
+ The buyer calls get_adcp_capabilities to confirm the agent supports media buying before sending briefs or creating buys.
99
+
100
+ steps:
101
+ - id: get_capabilities
102
+ title: "Check agent capabilities"
103
+ narrative: |
104
+ Verify that the agent declares the expected protocol support before
105
+ proceeding with domain-specific operations.
106
+ task: get_adcp_capabilities
107
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
108
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
109
+ doc_ref: "/protocol/get_adcp_capabilities"
110
+ comply_scenario: capability_discovery
111
+ stateful: false
112
+ expected: |
113
+ Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
114
+ sample_request:
115
+ context:
116
+ correlation_id: "creative_generative--seller--get_capabilities"
117
+ validations:
118
+ - check: response_schema
119
+ description: "Response matches get-adcp-capabilities-response.json schema"
120
+ - check: field_present
121
+ path: "supported_protocols"
122
+ description: "Agent declares supported protocols"
123
+
124
+ - check: field_present
125
+ path: "context"
126
+ description: "Response echoes back the context object"
127
+ - check: field_value
128
+ path: "context.correlation_id"
129
+ value: "creative_generative--seller--get_capabilities"
130
+ description: "Context correlation_id returned unchanged"
131
+ - id: account_setup
132
+ title: "Account setup"
133
+ narrative: |
134
+ Before buying anything, the buyer establishes an account relationship with your platform.
135
+ This is the same handshake as any media buy seller — the buyer identifies the brand and
136
+ operator, and you provision the account.
137
+
138
+ steps:
139
+ - id: sync_accounts
140
+ title: "Establish account relationship"
141
+ narrative: |
142
+ The buyer registers their brand and operator with your platform. Your platform should
143
+ resolve the brand via AgenticAdvertising.org to pull brand identity for creative
144
+ generation. If the brand domain doesn't resolve, return an error — don't generate
145
+ creatives for unknown brands.
146
+ task: sync_accounts
147
+ schema_ref: "account/sync-accounts-request.json"
148
+ response_schema_ref: "account/sync-accounts-response.json"
149
+ doc_ref: "/accounts/tasks/sync_accounts"
150
+ stateful: true
151
+ expected: |
152
+ Return the account with:
153
+ - account_id: your platform's identifier for this relationship
154
+ - action: created or updated
155
+ - status: active (instant approval) or pending_approval (requires human review)
156
+ - account_scope: operator, brand, operator_brand, or agent
157
+ - setup: URL and message if pending_approval
158
+
159
+ sample_request:
160
+ accounts:
161
+ - brand:
162
+ domain: "acmeoutdoor.example"
163
+ operator: "pinnacle-agency.example"
164
+ billing: "operator"
165
+ payment_terms: "net_30"
166
+
167
+ idempotency_key: "$generate:uuid_v4#creative_generative_seller_account_setup_sync_accounts"
168
+ context:
169
+ correlation_id: "creative_generative--seller--sync_accounts"
170
+ validations:
171
+ - check: response_schema
172
+ description: "Response matches sync-accounts-response.json schema"
173
+ - check: field_present
174
+ path: "accounts[0].account_id"
175
+ description: "Account has a platform-assigned ID"
176
+ - check: field_present
177
+ path: "accounts[0].status"
178
+ description: "Account has a status (active or pending_approval)"
179
+
180
+ - check: field_present
181
+ path: "context"
182
+ description: "Response echoes back the context object"
183
+ - check: field_value
184
+ path: "context.correlation_id"
185
+ value: "creative_generative--seller--sync_accounts"
186
+ description: "Context correlation_id returned unchanged"
187
+ - id: format_discovery
188
+ title: "Format discovery"
189
+ narrative: |
190
+ The buyer discovers what your platform can accept. A generative seller's format catalog
191
+ has two parts: generative formats that accept briefs as inputs, and standard IAB formats
192
+ that accept pre-built assets.
193
+
194
+ Generative formats declare brief asset slots. Standard formats declare image, video, or
195
+ HTML asset slots. The buyer uses this to decide whether to send a brief or upload finished
196
+ assets for each package.
197
+
198
+ A platform selling programmatic inventory should support both. Generative-only is fine for
199
+ a pure creative agent, but a seller that takes media buys needs to accept pre-built assets
200
+ from buyers who already have creatives.
201
+
202
+ steps:
203
+ - id: list_formats
204
+ title: "Discover creative formats"
205
+ narrative: |
206
+ The buyer asks what formats your platform supports. Your response should include both
207
+ generative formats (accepting brief inputs) and standard IAB formats (accepting image,
208
+ video, VAST, etc.).
209
+
210
+ A programmatic seller that only returns generative formats means the buyer can never
211
+ bring their own assets. If you sell inventory, you should accept pre-built creatives
212
+ too — the generative capability is additive.
213
+ task: list_creative_formats
214
+ schema_ref: "creative/list-creative-formats-request.json"
215
+ response_schema_ref: "creative/list-creative-formats-response.json"
216
+ doc_ref: "/creative/task-reference/list_creative_formats"
217
+ comply_scenario: creative_lifecycle
218
+ stateful: false
219
+ expected: |
220
+ Return your format catalog. It should include:
221
+
222
+ Generative formats:
223
+ - format_id with your agent_url and a unique id (e.g., "display_300x250_generative")
224
+ - Asset slots accepting brief asset types
225
+ - Render dimensions for the output
226
+ - Description indicating this is a generative format
227
+
228
+ Standard formats:
229
+ - Standard IAB display formats (300x250, 728x90, etc.)
230
+ - Video formats (VAST, pre-roll, etc.) if applicable
231
+ - Asset slots accepting image, video, html, etc.
232
+
233
+ Both types should be present for a programmatic seller. Buyers who already
234
+ have creatives need to be able to upload them directly.
235
+
236
+ sample_request:
237
+ context:
238
+ correlation_id: "creative_generative--seller--list_formats"
239
+
240
+ validations:
241
+ - check: response_schema
242
+ description: "Response matches list-creative-formats-response.json schema"
243
+ - check: field_present
244
+ path: "formats"
245
+ description: "Response contains a formats array"
246
+ - check: field_present
247
+ path: "formats[0].format_id.agent_url"
248
+ description: "Each format has a format_id with agent_url"
249
+
250
+ - check: field_present
251
+ path: "context"
252
+ description: "Response echoes back the context object"
253
+ - check: field_value
254
+ path: "context.correlation_id"
255
+ value: "creative_generative--seller--list_formats"
256
+ description: "Context correlation_id returned unchanged"
257
+ - id: product_discovery
258
+ title: "Product discovery"
259
+ narrative: |
260
+ The buyer sends a natural-language brief describing what they want to buy. Your platform
261
+ interprets the brief against your inventory and returns products with pricing, delivery
262
+ forecasts, and creative format requirements.
263
+
264
+ Products from a generative seller should reference generative format IDs — telling the
265
+ buyer that this product accepts a brief rather than requiring pre-built assets. Products
266
+ may also reference standard formats for buyers who prefer to supply their own creatives.
267
+
268
+ steps:
269
+ - id: get_products_brief
270
+ title: "Send a brief"
271
+ narrative: |
272
+ The buyer describes what they want. Your platform returns products. Each product's
273
+ creative_format_ids should reference formats from the catalog — some generative,
274
+ some standard. The buyer uses this to decide the creative approach per product.
275
+ task: get_products
276
+ schema_ref: "media-buy/get-products-request.json"
277
+ response_schema_ref: "media-buy/get-products-response.json"
278
+ doc_ref: "/media-buy/task-reference/get_products"
279
+ comply_scenario: full_sales_flow
280
+ stateful: false
281
+ expected: |
282
+ Return products matching the brief. Each product should include:
283
+ - product_id: unique identifier
284
+ - name and description
285
+ - delivery_type: guaranteed or non_guaranteed
286
+ - pricing_models: available pricing options
287
+ - forecast: estimated impressions, reach
288
+ - creative_format_ids: formats this product accepts (including generative formats)
289
+
290
+ sample_request:
291
+ buying_mode: "brief"
292
+ brief: "Premium display and video inventory on outdoor lifestyle content. Q2 flight, $50K budget. Adults 25-54, US. We want your platform to generate the creatives from our brand brief."
293
+ account:
294
+ brand:
295
+ domain: "acmeoutdoor.example"
296
+ operator: "pinnacle-agency.example"
297
+
298
+ context:
299
+ correlation_id: "creative_generative--seller--get_products_brief"
300
+ validations:
301
+ - check: response_schema
302
+ description: "Response matches get-products-response.json schema"
303
+ - check: field_present
304
+ path: "products"
305
+ description: "Response contains a products array"
306
+ - check: field_present
307
+ path: "products[0].product_id"
308
+ description: "Each product has a product_id"
309
+
310
+ - check: field_present
311
+ path: "context"
312
+ description: "Response echoes back the context object"
313
+ - check: field_value
314
+ path: "context.correlation_id"
315
+ value: "creative_generative--seller--get_products_brief"
316
+ description: "Context correlation_id returned unchanged"
317
+ - check: field_present
318
+ path: "products[0].format_ids"
319
+ description: "Products include format_ids for creative requirements"
320
+ - check: field_present
321
+ path: "products[0].format_ids[0].agent_url"
322
+ description: "Format IDs include agent_url — must match this agent's URL"
323
+ - check: field_present
324
+ path: "products[0].format_ids[0].id"
325
+ description: "Format IDs include id — must be accepted back in sync_creatives"
326
+ - id: create_buy
327
+ title: "Create the media buy"
328
+ narrative: |
329
+ The buyer commits to specific products with budgets and flight dates. This is the same
330
+ create_media_buy flow as any seller — the generative aspect doesn't change the buy
331
+ creation. The buy may return pending_creatives status, indicating the buyer needs to
332
+ sync creatives (via brief) before the campaign can go live.
333
+
334
+ steps:
335
+ - id: create_media_buy
336
+ title: "Create a media buy"
337
+ narrative: |
338
+ The buyer commits to products. The response may include pending_creatives status
339
+ for packages that require creative sync before activation.
340
+ task: create_media_buy
341
+ schema_ref: "media-buy/create-media-buy-request.json"
342
+ response_schema_ref: "media-buy/create-media-buy-response.json"
343
+ doc_ref: "/media-buy/task-reference/create_media_buy"
344
+ comply_scenario: create_media_buy
345
+ stateful: true
346
+ expected: |
347
+ Process the media buy request and return one of:
348
+ - completed: buy confirmed, packages may be pending_creatives
349
+ - working: platform is processing (poll for status)
350
+ - submitted: long-running async (approval workflow, IO signing)
351
+ - input-required: need more information
352
+
353
+ sample_request:
354
+ brand:
355
+ domain: "acmeoutdoor.example"
356
+ account:
357
+ brand:
358
+ domain: "acmeoutdoor.example"
359
+ operator: "pinnacle-agency.example"
360
+ start_time: "2026-04-01T00:00:00Z"
361
+ end_time: "2026-06-30T23:59:59Z"
362
+ packages:
363
+ - product_id: "outdoor_display_q2"
364
+ budget: 30000
365
+ pricing_option_id: "cpm_guaranteed"
366
+ - product_id: "outdoor_video_q2"
367
+ budget: 20000
368
+ pricing_option_id: "cpm_standard"
369
+ push_notification_config:
370
+ url: "https://buyer.example/webhooks/adcp"
371
+ authentication:
372
+ schemes:
373
+ - "HMAC-SHA256"
374
+ credentials: "creative-generative-seller-webhook-secret-token"
375
+
376
+ idempotency_key: "$generate:uuid_v4#creative_generative_seller_create_buy_create_media_buy"
377
+ context:
378
+ correlation_id: "creative_generative--seller--create_media_buy"
379
+ context_outputs:
380
+ - name: media_buy_id
381
+ path: "media_buy_id"
382
+ validations:
383
+ - check: response_schema
384
+ description: "Response matches create-media-buy-response.json schema"
385
+
386
+ - check: field_present
387
+ path: "context"
388
+ description: "Response echoes back the context object"
389
+ - check: field_value
390
+ path: "context.correlation_id"
391
+ value: "creative_generative--seller--create_media_buy"
392
+ description: "Context correlation_id returned unchanged"
393
+ - id: creative_brief_sync
394
+ title: "Creative brief sync"
395
+ narrative: |
396
+ This is where a generative seller diverges from the standard flow. Instead of the buyer
397
+ uploading finished assets, they send a creative brief through sync_creatives. The brief
398
+ describes campaign messaging, tone, audience, and compliance requirements. The format_id
399
+ points to a generative format that accepts brief asset types.
400
+
401
+ Your platform resolves the brand via AgenticAdvertising.org (using the account's brand
402
+ domain), pulls brand.json for visual identity, and generates the creative. This may be
403
+ synchronous (accepted immediately) or asynchronous (pending_review while generation
404
+ completes). The buyer polls or waits for a webhook to know when the creative is ready.
405
+
406
+ steps:
407
+ - id: sync_creatives_brief
408
+ title: "Send creative brief via sync_creatives"
409
+ narrative: |
410
+ The buyer sends a creative brief through sync_creatives, using a generative format_id
411
+ that accepts brief asset types. The account's brand domain tells your platform where
412
+ to resolve brand identity for generation.
413
+
414
+ Your platform should actually read the operator and brand from the request — not
415
+ ignore them. If the brand domain is invalid or unresolvable, return a rejection
416
+ with a clear error rather than generating with defaults.
417
+ task: sync_creatives
418
+ schema_ref: "creative/sync-creatives-request.json"
419
+ response_schema_ref: "creative/sync-creatives-response.json"
420
+ doc_ref: "/creative/task-reference/sync_creatives"
421
+ comply_scenario: creative_sync
422
+ stateful: true
423
+ expected: |
424
+ Accept the creative brief and begin generation:
425
+ - Per-creative action: created
426
+ - Per-creative status: pending_review (generation in progress) or accepted (instant)
427
+ - The brand domain from the account should be resolved via AgenticAdvertising.org
428
+ - If the brand domain is invalid, reject with a clear error
429
+ - If the brief references a non-generative format, reject with format mismatch error
430
+
431
+ sample_request:
432
+ account:
433
+ brand:
434
+ domain: "acmeoutdoor.example"
435
+ operator: "pinnacle-agency.example"
436
+ creatives:
437
+ - creative_id: "gen_display_summer_sale"
438
+ name: "Summer Sale - Generated Display 300x250"
439
+ format_id:
440
+ agent_url: "https://your-platform.example.com"
441
+ id: "display_300x250_generative"
442
+ assets:
443
+ brief:
444
+ asset_type: "brief"
445
+ name: "Acme Outdoor Summer Sale Q2"
446
+ objective: "conversion"
447
+ tone: "Bold, adventurous, urgent"
448
+ audience: "Active adults 25-54, outdoor enthusiasts"
449
+ territory: "Summer gear clearance"
450
+ messaging:
451
+ headline: "Summer Sale — 40% Off All Gear"
452
+ tagline: "Gear up for less"
453
+ cta: "Shop Now"
454
+ key_messages:
455
+ - "40% off all trail running and hiking gear"
456
+ - "Free shipping on orders over $75"
457
+ compliance:
458
+ required_disclosures:
459
+ - text: "Sale ends June 30, 2026. Exclusions apply."
460
+ position: "footer"
461
+ jurisdictions: ["US"]
462
+ prohibited_claims:
463
+ - "Best price guaranteed"
464
+ - creative_id: "gen_video_summer_sale"
465
+ name: "Summer Sale - Generated Video 30s"
466
+ format_id:
467
+ agent_url: "https://your-platform.example.com"
468
+ id: "video_30s_generative"
469
+ assets:
470
+ brief:
471
+ asset_type: "brief"
472
+ name: "Acme Outdoor Summer Sale Q2 - Video"
473
+ objective: "awareness"
474
+ tone: "Cinematic, energetic"
475
+ audience: "Active adults 25-54"
476
+ territory: "Summer adventure"
477
+ messaging:
478
+ headline: "Your Next Adventure Starts Here"
479
+ tagline: "Acme Outdoor — Gear up for less"
480
+ cta: "Shop the Sale"
481
+ key_messages:
482
+ - "40% off all gear this summer"
483
+ compliance:
484
+ required_disclosures:
485
+ - text: "Sale ends June 30, 2026. Exclusions apply."
486
+ position: "audio"
487
+ jurisdictions: ["US"]
488
+ assignments:
489
+ - creative_id: "gen_display_summer_sale"
490
+ package_id: "outdoor_display_q2"
491
+ - creative_id: "gen_video_summer_sale"
492
+ package_id: "outdoor_video_q2"
493
+
494
+ idempotency_key: "$generate:uuid_v4#creative_generative_seller_creative_brief_sync_sync_creatives_brief"
495
+ context:
496
+ correlation_id: "creative_generative--seller--sync_creatives_brief"
497
+ validations:
498
+ - check: response_schema
499
+ description: "Response matches sync-creatives-response.json schema"
500
+ - check: field_present
501
+ path: "creatives[0].action"
502
+ description: "Each creative has an action (created/updated)"
503
+ - check: field_present
504
+ path: "creatives[0].action"
505
+ description: "Each creative has a status (pending_review or accepted)"
506
+
507
+ - check: field_present
508
+ path: "context"
509
+ description: "Response echoes back the context object"
510
+ - check: field_value
511
+ path: "context.correlation_id"
512
+ value: "creative_generative--seller--sync_creatives_brief"
513
+ description: "Context correlation_id returned unchanged"
514
+ - id: sync_creatives_standard
515
+ title: "Sync standard creatives alongside generative"
516
+ narrative: |
517
+ The buyer sends a pre-built creative using a standard format — verifying that this
518
+ programmatic seller also accepts traditional asset uploads alongside generative briefs.
519
+ task: sync_creatives
520
+ schema_ref: "creative/sync-creatives-request.json"
521
+ response_schema_ref: "creative/sync-creatives-response.json"
522
+ doc_ref: "/creative/task-reference/sync_creatives"
523
+ comply_scenario: creative_sync
524
+ stateful: true
525
+ expected: |
526
+ Accept the standard creative:
527
+ - Per-creative action: created
528
+ - Per-creative status: accepted or pending_review
529
+ - Standard asset validation (dimensions, file size, mime type)
530
+
531
+ sample_request:
532
+ account:
533
+ brand:
534
+ domain: "acmeoutdoor.example"
535
+ operator: "pinnacle-agency.example"
536
+ creatives:
537
+ - creative_id: "static_display_300x250"
538
+ name: "Trail Pro 3000 - Pre-built Display 300x250"
539
+ format_id:
540
+ agent_url: "https://your-platform.example.com"
541
+ id: "display_300x250"
542
+ assets:
543
+ image:
544
+ asset_type: "image"
545
+ url: "https://cdn.pinnacle-agency.example/trail-pro-300x250.png"
546
+ format: "png"
547
+ width: 300
548
+ height: 250
549
+
550
+ idempotency_key: "$generate:uuid_v4#creative_generative_seller_creative_brief_sync_sync_creatives_standard"
551
+ context:
552
+ correlation_id: "creative_generative--seller--sync_creatives_standard"
553
+ validations:
554
+ - check: response_schema
555
+ description: "Response matches sync-creatives-response.json schema"
556
+ - check: field_present
557
+ path: "creatives[0].action"
558
+ description: "Standard creative has an action"
559
+
560
+ - check: field_present
561
+ path: "context"
562
+ description: "Response echoes back the context object"
563
+ - check: field_value
564
+ path: "context.correlation_id"
565
+ value: "creative_generative--seller--sync_creatives_standard"
566
+ description: "Context correlation_id returned unchanged"
567
+ - id: sync_creatives_invalid_brand
568
+ title: "Reject brief with invalid brand"
569
+ narrative: |
570
+ The buyer sends a brief referencing a brand domain that doesn't exist in
571
+ AgenticAdvertising.org. The seller should reject the creative rather than
572
+ generating with unknown brand identity.
573
+ task: sync_creatives
574
+ schema_ref: "creative/sync-creatives-request.json"
575
+ response_schema_ref: "creative/sync-creatives-response.json"
576
+ doc_ref: "/creative/task-reference/sync_creatives"
577
+ comply_scenario: creative_sync
578
+ stateful: true
579
+ expected: |
580
+ Reject the creative with a clear error:
581
+ - Per-creative status: rejected
582
+ - Validation error indicating the brand domain could not be resolved
583
+ - The seller should not generate creatives for unknown brands
584
+
585
+ sample_request:
586
+ account:
587
+ brand:
588
+ domain: "nonexistent-brand-xyz.example"
589
+ operator: "pinnacle-agency.example"
590
+ creatives:
591
+ - creative_id: "gen_invalid_brand"
592
+ name: "Invalid Brand Test"
593
+ format_id:
594
+ agent_url: "https://your-platform.example.com"
595
+ id: "display_300x250_generative"
596
+ assets:
597
+ brief:
598
+ asset_type: "brief"
599
+ name: "Test brief"
600
+ objective: "awareness"
601
+ tone: "Neutral"
602
+ messaging:
603
+ headline: "Test"
604
+ cta: "Click"
605
+
606
+ idempotency_key: "$generate:uuid_v4#creative_generative_seller_creative_brief_sync_sync_creatives_invalid_brand"
607
+ context:
608
+ correlation_id: "creative_generative--seller--sync_creatives_invalid_brand"
609
+ validations:
610
+ - check: response_schema
611
+ description: "Response matches sync-creatives-response.json schema"
612
+ - check: field_present
613
+ path: "creatives[0].action"
614
+ description: "Creative has a status (expected: rejected)"
615
+
616
+ - check: field_present
617
+ path: "context"
618
+ description: "Response echoes back the context object"
619
+ - check: field_value
620
+ path: "context.correlation_id"
621
+ value: "creative_generative--seller--sync_creatives_invalid_brand"
622
+ description: "Context correlation_id returned unchanged"
623
+ - id: creative_generation_lifecycle
624
+ title: "Creative generation lifecycle"
625
+ narrative: |
626
+ If creative generation is asynchronous, the buyer monitors progress. The seller
627
+ transitions creatives through processing → pending_review → approved as generation
628
+ completes. The comply_test_controller can force these transitions for deterministic
629
+ testing via force_creative_status.
630
+
631
+ The buyer polls by re-calling sync_creatives with the same creatives. Because
632
+ sync_creatives has upsert semantics, re-sending the same brief is idempotent — the
633
+ seller returns the current status without restarting generation.
634
+
635
+ steps:
636
+ - id: check_creative_status
637
+ title: "Poll creative generation status"
638
+ narrative: |
639
+ The buyer re-sends the same creatives via sync_creatives. Because sync has upsert
640
+ semantics, this is idempotent — the seller returns updated statuses without
641
+ restarting generation. If the creative was pending_review after the initial sync,
642
+ it should transition to approved once generation completes. In testing, the
643
+ comply_test_controller forces this transition via force_creative_status.
644
+ task: sync_creatives
645
+ schema_ref: "creative/sync-creatives-request.json"
646
+ response_schema_ref: "creative/sync-creatives-response.json"
647
+ doc_ref: "/creative/task-reference/sync_creatives"
648
+ comply_scenario: creative_sync
649
+ stateful: true
650
+ expected: |
651
+ Return updated creative statuses:
652
+ - Generative creatives should transition from pending_review to approved
653
+ - Approved creatives should include generated assets (image URLs, VAST tags, etc.)
654
+ - The generated output should reflect the brand identity from the original brief
655
+
656
+ sample_request:
657
+ account:
658
+ brand:
659
+ domain: "acmeoutdoor.example"
660
+ operator: "pinnacle-agency.example"
661
+ creatives:
662
+ - creative_id: "gen_display_summer_sale"
663
+ name: "Summer Sale - Generated Display 300x250"
664
+ format_id:
665
+ agent_url: "https://your-platform.example.com"
666
+ id: "display_300x250_generative"
667
+ assets:
668
+ brief:
669
+ asset_type: "brief"
670
+ name: "Acme Outdoor Summer Sale Q2"
671
+ objective: "conversion"
672
+ tone: "Bold, adventurous, urgent"
673
+ messaging:
674
+ headline: "Summer Sale — 40% Off All Gear"
675
+ cta: "Shop Now"
676
+ - creative_id: "gen_video_summer_sale"
677
+ name: "Summer Sale - Generated Video 30s"
678
+ format_id:
679
+ agent_url: "https://your-platform.example.com"
680
+ id: "video_30s_generative"
681
+ assets:
682
+ brief:
683
+ asset_type: "brief"
684
+ name: "Acme Outdoor Summer Sale Q2 - Video"
685
+ objective: "awareness"
686
+ tone: "Cinematic, energetic"
687
+ messaging:
688
+ headline: "Your Next Adventure Starts Here"
689
+ cta: "Shop the Sale"
690
+
691
+ idempotency_key: "$generate:uuid_v4#creative_generative_seller_creative_generation_lifecycle_check_creative_status"
692
+ context:
693
+ correlation_id: "creative_generative--seller--check_creative_status"
694
+ validations:
695
+ - check: response_schema
696
+ description: "Response matches sync-creatives-response.json schema"
697
+ - check: field_present
698
+ path: "creatives[0].action"
699
+ description: "Each creative has a current status"
700
+
701
+ - check: field_present
702
+ path: "context"
703
+ description: "Response echoes back the context object"
704
+ - check: field_value
705
+ path: "context.correlation_id"
706
+ value: "creative_generative--seller--check_creative_status"
707
+ description: "Context correlation_id returned unchanged"
708
+ - id: delivery_monitoring
709
+ title: "Delivery and reporting"
710
+ narrative: |
711
+ The campaign is live. Delivery monitoring is identical to any media buy seller —
712
+ the generative aspect doesn't change how delivery is reported. The buyer monitors
713
+ impressions, clicks, spend, and pacing.
714
+
715
+ steps:
716
+ - id: get_delivery
717
+ title: "Check delivery metrics"
718
+ narrative: |
719
+ The buyer requests delivery data for the active media buy. Reporting is the same
720
+ regardless of whether creatives were generated or uploaded.
721
+ task: get_media_buy_delivery
722
+ schema_ref: "media-buy/get-media-buy-delivery-request.json"
723
+ response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
724
+ doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
725
+ comply_scenario: reporting_flow
726
+ stateful: true
727
+ expected: |
728
+ Return delivery metrics for the media buy:
729
+ - Per-package delivery: impressions, clicks, spend, completion rates
730
+ - Daily breakdown if requested
731
+ - Pacing information
732
+ - Budget utilization
733
+
734
+ sample_request:
735
+ account:
736
+ brand:
737
+ domain: "acmeoutdoor.example"
738
+ operator: "pinnacle-agency.example"
739
+ media_buy_ids:
740
+ - "$context.media_buy_id"
741
+ include_package_daily_breakdown: true
742
+
743
+ context:
744
+ correlation_id: "creative_generative--seller--get_delivery"
745
+ validations:
746
+ - check: response_schema
747
+ description: "Response matches get-media-buy-delivery-response.json schema"
748
+ - check: field_present
749
+ path: "media_buy_deliveries"
750
+ description: "Response contains media buy delivery data"
751
+
752
+ - check: field_present
753
+ path: "context"
754
+ description: "Response echoes back the context object"
755
+ - check: field_value
756
+ path: "context.correlation_id"
757
+ value: "creative_generative--seller--get_delivery"
758
+ description: "Context correlation_id returned unchanged"