@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,769 @@
1
+ id: media_buy_seller
2
+ version: "1.0.0"
3
+ title: "Media buy seller agent"
4
+ category: media_buy_seller
5
+ summary: "Seller agent that receives briefs, returns products, accepts media buys, and reports delivery."
6
+ track: media_buy
7
+ required_tools:
8
+ - get_products
9
+ - create_media_buy
10
+ requires_scenarios:
11
+ - media_buy_seller/refine_products
12
+ - media_buy_seller/delivery_reporting
13
+ - media_buy_seller/measurement_terms_rejected
14
+ - media_buy_seller/pending_creatives_to_start
15
+ - media_buy_seller/inventory_list_targeting
16
+ - media_buy_seller/inventory_list_no_match
17
+ - media_buy_seller/invalid_transitions
18
+ - media_buy_seller/creative_fate_after_cancellation
19
+ - media_buy_seller/create_media_buy_async
20
+
21
+ narrative: |
22
+ You run a sell-side platform — a publisher, SSP, retail media network, or any system that
23
+ sells advertising inventory. A buyer agent connects to discover your products, create
24
+ media buys, sync creatives, and monitor delivery. Your agent handles the full lifecycle
25
+ from brief to reporting.
26
+
27
+ This storyboard walks through the core media buy flow: account setup, product discovery,
28
+ buy creation, creative sync, and delivery monitoring.
29
+
30
+ Governance integration, product refinement, and proposal finalization are tested by
31
+ required scenarios that run alongside this storyboard. See requires_scenarios for the
32
+ full set of seller behaviors validated.
33
+
34
+ agent:
35
+ interaction_model: media_buy_seller
36
+ capabilities:
37
+ - sells_media
38
+ - accepts_briefs
39
+ - supports_guaranteed
40
+ - supports_non_guaranteed
41
+ examples:
42
+ - "Yahoo"
43
+ - "Retail media networks"
44
+ - "Publisher platforms"
45
+ - "SSPs"
46
+
47
+ caller:
48
+ role: buyer_agent
49
+ example: "Scope3 (DSP)"
50
+
51
+ prerequisites:
52
+ description: |
53
+ The caller needs a brand identity and operator credentials for account setup.
54
+ The test kit provides a sample brand (Acme Outdoor) with campaign parameters
55
+ suitable for testing the full media buy flow.
56
+ test_kit: "test-kits/acme-outdoor.yaml"
57
+ controller_seeding: true
58
+
59
+ fixtures:
60
+ products:
61
+ - product_id: "sports_preroll_q2"
62
+ delivery_type: "guaranteed"
63
+ channels: ["video"]
64
+ format_ids:
65
+ - id: "video_30s"
66
+ - product_id: "lifestyle_display_q2"
67
+ delivery_type: "guaranteed"
68
+ channels: ["display"]
69
+ format_ids:
70
+ - id: "display_300x250"
71
+ pricing_options:
72
+ - product_id: "sports_preroll_q2"
73
+ pricing_option_id: "cpm_guaranteed"
74
+ pricing_model: "cpm"
75
+ currency: "USD"
76
+ fixed_price: 22.0
77
+ - product_id: "lifestyle_display_q2"
78
+ pricing_option_id: "cpm_standard"
79
+ pricing_model: "cpm"
80
+ currency: "USD"
81
+ fixed_price: 8.0
82
+
83
+ phases:
84
+ - id: capability_discovery
85
+ title: "Capability discovery"
86
+ narrative: |
87
+ The buyer calls get_adcp_capabilities to confirm the agent supports media buying before sending briefs or creating buys.
88
+
89
+ steps:
90
+ - id: get_capabilities
91
+ title: "Check agent capabilities"
92
+ narrative: |
93
+ Verify that the agent declares the expected protocol support before
94
+ proceeding with domain-specific operations.
95
+ task: get_adcp_capabilities
96
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
97
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
98
+ doc_ref: "/protocol/get_adcp_capabilities"
99
+ comply_scenario: capability_discovery
100
+ stateful: false
101
+ expected: |
102
+ Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
103
+ sample_request:
104
+ context:
105
+ correlation_id: "media_buy_seller--get_capabilities"
106
+ validations:
107
+ - check: response_schema
108
+ description: "Response matches get-adcp-capabilities-response.json schema"
109
+ - check: field_present
110
+ path: "supported_protocols"
111
+ description: "Agent declares supported protocols"
112
+ - check: field_present
113
+ path: "context"
114
+ description: "Response echoes back the context object"
115
+ - check: field_value
116
+ path: "context.correlation_id"
117
+ value: "media_buy_seller--get_capabilities"
118
+ description: "Context correlation_id returned unchanged"
119
+
120
+ - id: account_setup
121
+ title: "Account setup"
122
+ narrative: |
123
+ Before buying anything, the buyer establishes an account relationship with
124
+ your platform. This is the handshake: the buyer tells you which brand and
125
+ agency (operator) they represent, and you return an account ID, status, and
126
+ any setup requirements.
127
+
128
+ Some platforms approve accounts instantly. Others require human review — the
129
+ buyer gets back a pending_approval status and a URL to complete setup. The
130
+ buyer polls or waits for a webhook until the account is active.
131
+
132
+ steps:
133
+ - id: sync_accounts
134
+ title: "Establish account relationship"
135
+ narrative: |
136
+ The buyer registers their brand and operator with your platform. This is
137
+ the first call in any new relationship. Your platform validates the request,
138
+ provisions the account, and returns its status.
139
+
140
+ If your platform requires manual approval (credit checks, sales team review),
141
+ return the account with status pending_approval and account.setup.url populated.
142
+ The buyer directs the human to that URL to complete setup, then polls list_accounts
143
+ until the account status changes to active.
144
+ task: sync_accounts
145
+ schema_ref: "account/sync-accounts-request.json"
146
+ response_schema_ref: "account/sync-accounts-response.json"
147
+ doc_ref: "/accounts/tasks/sync_accounts"
148
+ # No TestScenario exists for account setup
149
+ stateful: true
150
+ expected: |
151
+ Return the account with:
152
+ - account_id: your platform's identifier for this relationship
153
+ - action: created or updated
154
+ - status: active (instant approval) or pending_approval (requires human review)
155
+ - account_scope: operator, brand, operator_brand, or agent
156
+ - setup.url and setup.message: populated on the account when status is pending_approval (where the human completes onboarding)
157
+ - rate_card: pricing tiers if applicable
158
+ - payment_terms: net_30, prepay, etc.
159
+
160
+ sample_request:
161
+ accounts:
162
+ - brand:
163
+ domain: "acmeoutdoor.example"
164
+ operator: "pinnacle-agency.example"
165
+ billing: "operator"
166
+ payment_terms: "net_30"
167
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_account_setup_sync_accounts"
168
+ context:
169
+ correlation_id: "media_buy_seller--sync_accounts"
170
+
171
+ validations:
172
+ - check: response_schema
173
+ description: "Response matches sync-accounts-response.json schema"
174
+ - check: field_present
175
+ path: "accounts[0].account_id"
176
+ description: "Account has a platform-assigned ID"
177
+ - check: field_present
178
+ path: "accounts[0].status"
179
+ description: "Account has a status (active or pending_approval)"
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: "media_buy_seller--sync_accounts"
186
+ description: "Context correlation_id returned unchanged"
187
+
188
+ - id: governance_setup
189
+ title: "Governance agent registration"
190
+ narrative: |
191
+ The buyer registers their governance agent with your platform. This tells your
192
+ platform where to call check_governance before confirming media buys.
193
+
194
+ steps:
195
+ - id: sync_governance
196
+ title: "Register governance agents"
197
+ narrative: |
198
+ The buyer tells your platform: "Before you confirm any media buy for this
199
+ account, call this governance agent to validate it."
200
+ task: sync_governance
201
+ schema_ref: "account/sync-governance-request.json"
202
+ response_schema_ref: "account/sync-governance-response.json"
203
+ doc_ref: "/accounts/tasks/sync_governance"
204
+ requires_tool: sync_governance
205
+ stateful: true
206
+ expected: |
207
+ Acknowledge the governance agents. Your platform should:
208
+ - Store the governance agent URLs for the specified accounts
209
+ - Return confirmation that agents were registered
210
+
211
+ sample_request:
212
+ accounts:
213
+ - account:
214
+ brand:
215
+ domain: "acmeoutdoor.example"
216
+ operator: "pinnacle-agency.example"
217
+ governance_agents:
218
+ - url: "https://governance.pinnacle-agency.example"
219
+ authentication:
220
+ schemes: ["Bearer"]
221
+ credentials: "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
222
+ categories: ["budget_authority", "brand_policy"]
223
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_setup_sync_governance"
224
+ context:
225
+ correlation_id: "media_buy_seller--sync_governance"
226
+ ext:
227
+ test_platform:
228
+ governance_tier: "standard"
229
+
230
+ validations:
231
+ - check: response_schema
232
+ description: "Response matches sync-governance-response.json schema"
233
+ - check: field_present
234
+ path: "context"
235
+ description: "Response echoes back the context object"
236
+ - check: field_value
237
+ path: "context.correlation_id"
238
+ value: "media_buy_seller--sync_governance"
239
+ description: "Context correlation_id returned unchanged"
240
+
241
+ - id: product_discovery
242
+ title: "Product discovery"
243
+ narrative: |
244
+ The buyer sends a natural-language brief describing what they want to buy.
245
+ Your platform interprets the brief against your inventory and returns products —
246
+ structured representations of what you can sell, with pricing, delivery forecasts,
247
+ targeting options, and creative requirements.
248
+
249
+ This is where seller differentiation happens. The same brief sent to three sellers
250
+ produces three different product sets. Your AI interprets "premium video on sports
251
+ and outdoor lifestyle" against your specific inventory, audiences, and pricing.
252
+
253
+ steps:
254
+ - id: get_products_brief
255
+ title: "Send a brief"
256
+ narrative: |
257
+ The buyer describes what they want in natural language. Your platform returns
258
+ products that match the brief, including pricing options, delivery forecasts,
259
+ and creative format requirements.
260
+
261
+ This call may take up to 60 seconds — your platform is running AI inference
262
+ against your inventory catalog. If the brief is ambiguous, you can return
263
+ input-required to ask clarifying questions before producing results.
264
+ task: get_products
265
+ schema_ref: "media-buy/get-products-request.json"
266
+ response_schema_ref: "media-buy/get-products-response.json"
267
+ doc_ref: "/media-buy/task-reference/get_products"
268
+ comply_scenario: full_sales_flow
269
+ stateful: false
270
+ expected: |
271
+ Return products matching the brief. Each product should include:
272
+ - product_id: unique identifier
273
+ - name and description
274
+ - delivery_type: guaranteed or non_guaranteed
275
+ - pricing_models: available pricing options (CPM, CPC, etc.)
276
+ - forecast: estimated impressions, reach
277
+ - creative_format_ids: what creative formats this product requires
278
+ - targeting: what audiences or contexts this product reaches
279
+
280
+ Optionally return proposals — curated media plans that bundle products
281
+ with budget allocations the buyer can accept or refine.
282
+
283
+ If the brief is unclear, return input-required with clarifying questions.
284
+
285
+ sample_request:
286
+ buying_mode: "brief"
287
+ brief: "Premium video inventory on sports and outdoor lifestyle publishers. Q2 flight, $50K budget. Adults 25-54, US and Canada."
288
+ account:
289
+ brand:
290
+ domain: "acmeoutdoor.example"
291
+ operator: "pinnacle-agency.example"
292
+ context:
293
+ correlation_id: "media_buy_seller--get_products_brief"
294
+
295
+ context_outputs:
296
+ - name: product_format_id
297
+ path: 'products[0].format_ids[0]'
298
+ - name: product_id
299
+ path: 'products[0].product_id'
300
+ - name: pricing_option_id
301
+ path: 'products[0].pricing_options[0].pricing_option_id'
302
+ validations:
303
+ - check: response_schema
304
+ description: "Response matches get-products-response.json schema"
305
+ - check: field_present
306
+ path: "products"
307
+ description: "Response contains a products array"
308
+ - check: field_present
309
+ path: "products[0].product_id"
310
+ description: "Each product has a product_id"
311
+ - check: field_present
312
+ path: "products[0].delivery_type"
313
+ description: "Each product declares guaranteed or non_guaranteed delivery"
314
+ - check: field_present
315
+ path: "products[0].format_ids"
316
+ description: "Products include format_ids for creative requirements"
317
+ - check: field_present
318
+ path: "products[0].format_ids[0].agent_url"
319
+ description: "Format IDs include agent_url — must match this agent's URL"
320
+ - check: field_present
321
+ path: "products[0].format_ids[0].id"
322
+ description: "Format IDs include id — must be accepted back in sync_creatives"
323
+ - check: field_present
324
+ path: "context"
325
+ description: "Response echoes back the context object"
326
+ - check: field_value
327
+ path: "context.correlation_id"
328
+ value: "media_buy_seller--get_products_brief"
329
+ description: "Context correlation_id returned unchanged"
330
+
331
+ - check: field_present
332
+ path: "products[0].publisher_properties"
333
+ description: "Products include publisher_properties"
334
+ - id: list_formats_integrity
335
+ title: "Verify format_ids on products resolve to real formats"
336
+ narrative: |
337
+ The buyer asks the sales agent to filter `list_creative_formats` by
338
+ `products[0].format_ids[0]`. The sales agent MUST return the format
339
+ it advertised on its own product — whether it hosts that format
340
+ directly or proxies to the creative agent named in
341
+ `format_ids[0].agent_url`. An empty `formats[]` means the sales
342
+ agent's product catalog references a format that does not resolve —
343
+ a stale or typo'd entry that would have failed silently at
344
+ `sync_creatives` after the media buy was already committed.
345
+ task: list_creative_formats
346
+ schema_ref: "creative/list-creative-formats-request.json"
347
+ response_schema_ref: "creative/list-creative-formats-response.json"
348
+ doc_ref: "/creative/task-reference/list_creative_formats"
349
+ comply_scenario: creative_lifecycle
350
+ stateful: false
351
+ expected: |
352
+ The sales agent resolves `products[0].format_ids[0]` and returns
353
+ the matching format entry:
354
+ - formats[] contains at least one entry
355
+ - formats[0].format_id matches the id captured from get_products
356
+
357
+ An empty formats[] means the sales agent's product catalog references
358
+ a format that does not resolve — a common production failure mode
359
+ when creative agents deprecate formats without sellers updating
360
+ their product catalog.
361
+ sample_request:
362
+ format_ids:
363
+ - "$context.product_format_id"
364
+ context:
365
+ correlation_id: "media_buy_seller--list_formats_integrity"
366
+ # The @adcp/client `list_creative_formats` request builder up
367
+ # through 5.10.0 (the currently-published release) returns `{}`,
368
+ # and the runner's post-builder merge only forwards envelope
369
+ # fields (context / ext / idempotency_key /
370
+ # push_notification_config) from sample_request — so `format_ids`
371
+ # above never reaches the wire and the seller answers with its
372
+ # full format catalog. `context_inputs` is applied after the
373
+ # builder runs, so this injects the captured `product_format_id`
374
+ # (the `{agent_url, id}` object from `products[0].format_ids[0]`)
375
+ # at `format_ids[0]` and lets the round-trip invariant actually
376
+ # grade. Drop once we bump past the @adcp/client release that
377
+ # ships adcontextprotocol/adcp-client#789.
378
+ context_inputs:
379
+ - key: product_format_id
380
+ inject_at: "format_ids[0]"
381
+ validations:
382
+ - check: response_schema
383
+ description: "Response matches list-creative-formats-response.json schema"
384
+ - check: field_present
385
+ path: "formats[0]"
386
+ description: "Sales agent resolves the format_id — products[0].format_ids[0] exists in the catalog"
387
+ - check: field_value
388
+ path: "formats[0].format_id"
389
+ value: "$context.product_format_id"
390
+ description: "Returned format_id round-trips verbatim — the agent cannot substitute a different format in response to the filter"
391
+ - check: field_present
392
+ path: "context"
393
+ description: "Response echoes back the context object"
394
+ - check: field_value
395
+ path: "context.correlation_id"
396
+ value: "media_buy_seller--list_formats_integrity"
397
+ description: "Context correlation_id returned unchanged"
398
+ - id: create_buy
399
+ title: "Create the media buy"
400
+ narrative: |
401
+ The buyer is satisfied with the products and creates a media buy. This is the
402
+ equivalent of signing an IO — the buyer commits to specific products, budgets,
403
+ and flight dates.
404
+
405
+ This operation may be synchronous (completed immediately), short-async (working
406
+ while your platform processes), or long-async (task stays submitted while a human
407
+ signs the IO internally; task completion delivers the final media_buy_id). There
408
+ is no "pending_approval" media buy status — IO review is modelled at the task
409
+ layer, not as a MediaBuy.status value.
410
+
411
+ If the buyer registered governance agents in Phase 2, your platform calls
412
+ check_governance before confirming the buy. The governance agent validates budget
413
+ authority, brand safety, and compliance. If governance denies the buy, return the
414
+ denial — don't override it.
415
+
416
+ steps:
417
+ - id: create_media_buy
418
+ title: "Create a media buy"
419
+ narrative: |
420
+ The buyer commits to specific products with budgets and flight dates. Your
421
+ platform validates the request, optionally calls governance, and either confirms
422
+ the buy or sends it through an approval workflow.
423
+
424
+ Two creation modes:
425
+ - Manual: buyer specifies packages array with explicit product selections
426
+ - Proposal: buyer passes a proposal_id from get_products to execute a proposal
427
+
428
+ The response status tells the buyer what happens next:
429
+ - completed: buy is active and live
430
+ - working: your platform is processing (poll or wait for webhook)
431
+ - submitted: long-running async — approval workflow, IO signing, etc.
432
+ - input-required: need more information (budget clarification, approval)
433
+ task: create_media_buy
434
+ schema_ref: "media-buy/create-media-buy-request.json"
435
+ response_schema_ref: "media-buy/create-media-buy-response.json"
436
+ doc_ref: "/media-buy/task-reference/create_media_buy"
437
+ comply_scenario: create_media_buy
438
+ stateful: true
439
+ expected: |
440
+ Process the media buy request and return one of:
441
+
442
+ Synchronous (completed):
443
+ - media_buy_id: your platform's identifier
444
+ - status: active or pending_creatives
445
+ - packages: line items with pricing
446
+ - confirmed_at: timestamp
447
+ - valid_actions: what the buyer can do next
448
+
449
+ Asynchronous (working):
450
+ - percentage: 0-100 completion
451
+ - current_step: what's happening ("Validating inventory", "Checking governance")
452
+
453
+ Async with human approval (submitted):
454
+ - task_id / taskId: handle the buyer polls or receives webhooks on
455
+ - message (optional): explanation of what the seller is waiting on (e.g., "Awaiting IO signature from sales team; typical turnaround 2–4 hours")
456
+ - No media_buy_id yet — it is issued on task completion
457
+ - Seller-side IO signing is modelled here (task stays submitted until signed). Do not emit a "pending_approval" media buy status — that value is not in MediaBuy.status
458
+
459
+ Needs input (input-required):
460
+ - reason: APPROVAL_REQUIRED, BUDGET_EXCEEDS_LIMIT, CLARIFICATION_NEEDED
461
+ - errors: what needs to be resolved
462
+ - Used only when the seller needs the buyer to respond (e.g., confirm a budget). If the blocker is account-level (credit application, funding), the resolution path is list_accounts / sync_accounts, where account.setup.url surfaces on the pending_approval account
463
+
464
+ sample_request:
465
+ brand:
466
+ domain: "acmeoutdoor.example"
467
+ account:
468
+ brand:
469
+ domain: "acmeoutdoor.example"
470
+ operator: "pinnacle-agency.example"
471
+ sandbox: true
472
+ start_time: "2026-04-01T00:00:00Z"
473
+ end_time: "2026-06-30T23:59:59Z"
474
+ packages:
475
+ - product_id: "sports_preroll_q2"
476
+ budget: 25000
477
+ pricing_option_id: "cpm_guaranteed"
478
+ creative_assignments:
479
+ - creative_id: "video_30s_trail_pro"
480
+ - product_id: "lifestyle_display_q2"
481
+ budget: 15000
482
+ pricing_option_id: "cpm_standard"
483
+ push_notification_config:
484
+ url: "https://buyer.example/webhooks/adcp"
485
+ authentication:
486
+ schemes:
487
+ - "HMAC-SHA256"
488
+ credentials: "media-buy-seller-webhook-secret-token"
489
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_create_buy_create_media_buy"
490
+ context:
491
+ correlation_id: "media_buy_seller--create_media_buy"
492
+
493
+ context_outputs:
494
+ - name: media_buy_id
495
+ path: 'media_buy_id'
496
+ validations:
497
+ - check: response_schema
498
+ description: "Response matches create-media-buy-response.json schema"
499
+ - check: field_present
500
+ path: "context"
501
+ description: "Response echoes back the context object"
502
+ - check: field_value
503
+ path: "context.correlation_id"
504
+ value: "media_buy_seller--create_media_buy"
505
+ description: "Context correlation_id returned unchanged"
506
+
507
+ - id: check_buy_status
508
+ title: "Check media buy status"
509
+ narrative: |
510
+ Once create_media_buy has completed and a media_buy_id is issued, the buyer
511
+ calls get_media_buys to read current state — pending_creatives, pending_start,
512
+ active, paused, completed, rejected, or canceled.
513
+
514
+ While the create_media_buy task is still submitted (e.g., waiting on internal
515
+ IO signing), the media buy does not exist as a queryable MediaBuy yet. IO
516
+ review is tracked at the task layer, not as a MediaBuy.status value. The buyer
517
+ polls tasks/get or waits on the webhook until the task completes and a
518
+ media_buy_id is delivered.
519
+ task: get_media_buys
520
+ schema_ref: "media-buy/get-media-buys-request.json"
521
+ response_schema_ref: "media-buy/get-media-buys-response.json"
522
+ doc_ref: "/media-buy/task-reference/get_media_buys"
523
+ comply_scenario: media_buy_lifecycle
524
+ stateful: true
525
+ expected: |
526
+ Return the current state of the media buy:
527
+ - media_buy_id: matches what was returned from create_media_buy
528
+ - status: pending_creatives, pending_start, active, paused, completed, rejected, canceled
529
+ - packages: line items with current delivery status
530
+ - valid_actions: what operations are available in this state
531
+
532
+ If pending_creatives:
533
+ - Include message explaining what creatives are needed
534
+ - valid_actions should include sync_creatives
535
+
536
+ sample_request:
537
+ account:
538
+ brand:
539
+ domain: "acmeoutdoor.example"
540
+ operator: "pinnacle-agency.example"
541
+ media_buy_ids:
542
+ - "$context.media_buy_id"
543
+ context:
544
+ correlation_id: "media_buy_seller--check_buy_status"
545
+
546
+ validations:
547
+ - check: response_schema
548
+ description: "Response matches get-media-buys-response.json schema"
549
+ - check: field_present
550
+ path: "media_buys[0].status"
551
+ description: "Each media buy has a status"
552
+ - check: field_present
553
+ path: "context"
554
+ description: "Response echoes back the context object"
555
+ - check: field_value
556
+ path: "context.correlation_id"
557
+ value: "media_buy_seller--check_buy_status"
558
+ description: "Context correlation_id returned unchanged"
559
+
560
+ - id: creative_sync
561
+ title: "Creative sync"
562
+ narrative: |
563
+ With the media buy confirmed, the buyer syncs creative assets to your platform.
564
+ Each package in the buy has creative format requirements — the buyer discovered
565
+ these during product discovery and now pushes matching assets.
566
+
567
+ The format_ids used in sync_creatives must match those returned by your platform
568
+ in get_products and list_creative_formats. If your platform returns a format_id
569
+ in a product but rejects it when the buyer echoes it back in sync_creatives, the
570
+ buyer cannot fulfill the creative requirements. This is a common compliance failure.
571
+
572
+ Your platform validates each creative against the format specs and returns
573
+ per-creative status. If assets need review or transcoding, the operation may
574
+ go async.
575
+
576
+ steps:
577
+ - id: list_formats
578
+ title: "Check creative format requirements"
579
+ narrative: |
580
+ The buyer confirms what creative formats the confirmed packages require.
581
+ Your platform returns format specs with asset requirements, dimensions,
582
+ and constraints.
583
+ task: list_creative_formats
584
+ schema_ref: "creative/list-creative-formats-request.json"
585
+ response_schema_ref: "creative/list-creative-formats-response.json"
586
+ doc_ref: "/creative/task-reference/list_creative_formats"
587
+ comply_scenario: creative_lifecycle
588
+ stateful: false
589
+ expected: |
590
+ Return creative formats your platform accepts. Each format should define:
591
+ - format_id with your agent_url and unique id
592
+ - Asset requirements (dimensions, file sizes, mime types)
593
+ - Render dimensions
594
+
595
+ sample_request:
596
+ context:
597
+ correlation_id: "media_buy_seller--list_formats"
598
+
599
+ validations:
600
+ - check: response_schema
601
+ description: "Response matches list-creative-formats-response.json schema"
602
+ - check: field_present
603
+ path: "formats"
604
+ description: "Response contains formats array"
605
+ - check: field_present
606
+ path: "formats[0].format_id.agent_url"
607
+ description: "Format IDs include agent_url"
608
+ - check: field_present
609
+ path: "formats[0].format_id.id"
610
+ description: "Format IDs include id — must match those in get_products"
611
+ - check: field_present
612
+ path: "context"
613
+ description: "Response echoes back the context object"
614
+ - check: field_value
615
+ path: "context.correlation_id"
616
+ value: "media_buy_seller--list_formats"
617
+ description: "Context correlation_id returned unchanged"
618
+ - check: refs_resolve
619
+ description: |
620
+ Every format_id returned on products resolves to a format in this
621
+ agent's list_creative_formats. Broken references here surface as a
622
+ grading failure instead of a silent mismatch that only breaks at
623
+ sync_creatives time, after the buy is committed. Third-party
624
+ format_ids (agent_url pointing at a different creative agent)
625
+ can't be verified without calling that agent and are reported as
626
+ observations rather than failures.
627
+ source:
628
+ from: context
629
+ path: "products[*].format_ids[*]"
630
+ target:
631
+ from: current_step
632
+ path: "formats[*].format_id"
633
+ match_keys: [agent_url, id]
634
+ scope:
635
+ key: agent_url
636
+ equals: $agent_url
637
+ on_out_of_scope: warn
638
+
639
+ - id: sync_creatives
640
+ title: "Push creative assets (format_id roundtrip)"
641
+ narrative: |
642
+ The buyer uploads creative assets for the confirmed packages. The first
643
+ creative uses $context.product_format_id — the exact format_id object
644
+ returned by get_products. This is the roundtrip test: the seller must
645
+ accept its own format_ids without modification. If the seller's validation
646
+ rejects a format_id that it returned in products, this step fails.
647
+
648
+ Your platform validates each creative against the format specs, transcodes
649
+ if necessary, and returns per-creative status.
650
+ task: sync_creatives
651
+ schema_ref: "creative/sync-creatives-request.json"
652
+ response_schema_ref: "creative/sync-creatives-response.json"
653
+ doc_ref: "/creative/task-reference/sync_creatives"
654
+ comply_scenario: creative_sync
655
+ stateful: true
656
+ expected: |
657
+ Accept and validate creatives:
658
+ - Per-creative action: created or updated
659
+ - Per-creative status: accepted, pending_review, or rejected
660
+ - Validation errors for rejected creatives
661
+ - Platform-assigned IDs if applicable
662
+
663
+ The first creative uses a format_id extracted from get_products.
664
+ If this is rejected, your format_ids do not roundtrip correctly.
665
+
666
+ sample_request:
667
+ account:
668
+ brand:
669
+ domain: "acmeoutdoor.example"
670
+ operator: "pinnacle-agency.example"
671
+ creatives:
672
+ - creative_id: "video_30s_trail_pro"
673
+ name: "Trail Pro 3000 - 30s CTV Spot"
674
+ format_id: "$context.product_format_id"
675
+ assets:
676
+ video:
677
+ asset_type: "video"
678
+ url: "https://cdn.pinnacle-agency.example/trail-pro-30s.mp4"
679
+ width: 1920
680
+ height: 1080
681
+ duration_ms: 30000
682
+ mime_type: "video/mp4"
683
+ - creative_id: "display_trail_pro_300x250"
684
+ name: "Trail Pro 3000 - Display 300x250"
685
+ format_id:
686
+ agent_url: "https://your-platform.example.com"
687
+ id: "display_300x250"
688
+ assets:
689
+ image:
690
+ asset_type: "image"
691
+ url: "https://cdn.pinnacle-agency.example/trail-pro-300x250.png"
692
+ width: 300
693
+ height: 250
694
+ mime_type: "image/png"
695
+ idempotency_key: "$generate:uuid_v4#media_buy_seller_creative_sync_sync_creatives"
696
+ context:
697
+ correlation_id: "media_buy_seller--sync_creatives"
698
+
699
+ validations:
700
+ - check: response_schema
701
+ description: "Response matches sync-creatives-response.json schema"
702
+ - check: field_present
703
+ path: "creatives[0].action"
704
+ description: "Each creative has an action (created/updated)"
705
+ - check: field_present
706
+ path: "context"
707
+ description: "Response echoes back the context object"
708
+ - check: field_value
709
+ path: "context.correlation_id"
710
+ value: "media_buy_seller--sync_creatives"
711
+ description: "Context correlation_id returned unchanged"
712
+
713
+ - id: delivery_monitoring
714
+ title: "Delivery and reporting"
715
+ narrative: |
716
+ The campaign is live. The buyer monitors delivery through two tasks:
717
+ get_media_buys for status and get_media_buy_delivery for performance metrics.
718
+
719
+ Your platform reports in a standard format — impressions, clicks, spend,
720
+ completion rates — so the buyer can compare delivery across multiple sellers
721
+ in a single view.
722
+
723
+ steps:
724
+ - id: get_delivery
725
+ title: "Check delivery metrics"
726
+ narrative: |
727
+ The buyer requests delivery data for the active media buy. Your platform
728
+ returns performance metrics — impressions, clicks, spend, completion rates —
729
+ broken down by package and optionally by day.
730
+
731
+ This call may take up to 60 seconds as your platform aggregates reporting
732
+ data across delivery systems.
733
+ task: get_media_buy_delivery
734
+ schema_ref: "media-buy/get-media-buy-delivery-request.json"
735
+ response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
736
+ doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
737
+ comply_scenario: reporting_flow
738
+ stateful: true
739
+ expected: |
740
+ Return delivery metrics for the media buy:
741
+ - Per-package delivery: impressions, clicks, spend, completion rates
742
+ - Daily breakdown if requested (include_package_daily_breakdown)
743
+ - Pacing information: on track, ahead, behind
744
+ - Budget utilization: spent vs. committed
745
+
746
+ sample_request:
747
+ account:
748
+ brand:
749
+ domain: "acmeoutdoor.example"
750
+ operator: "pinnacle-agency.example"
751
+ media_buy_ids:
752
+ - "$context.media_buy_id"
753
+ include_package_daily_breakdown: true
754
+ context:
755
+ correlation_id: "media_buy_seller--get_delivery"
756
+
757
+ validations:
758
+ - check: response_schema
759
+ description: "Response matches get-media-buy-delivery-response.json schema"
760
+ - check: field_present
761
+ path: "media_buy_deliveries"
762
+ description: "Response contains media buy delivery data"
763
+ - check: field_present
764
+ path: "context"
765
+ description: "Response echoes back the context object"
766
+ - check: field_value
767
+ path: "context.correlation_id"
768
+ value: "media_buy_seller--get_delivery"
769
+ description: "Context correlation_id returned unchanged"