@adcp/sdk 6.9.0 → 6.11.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 (261) 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/decisioning/async-outcome.d.ts +17 -0
  191. package/dist/lib/server/decisioning/async-outcome.d.ts.map +1 -1
  192. package/dist/lib/server/decisioning/async-outcome.js +23 -18
  193. package/dist/lib/server/decisioning/async-outcome.js.map +1 -1
  194. package/dist/lib/server/decisioning/context.d.ts +8 -2
  195. package/dist/lib/server/decisioning/context.d.ts.map +1 -1
  196. package/dist/lib/server/decisioning/index.d.ts +1 -0
  197. package/dist/lib/server/decisioning/index.d.ts.map +1 -1
  198. package/dist/lib/server/decisioning/index.js.map +1 -1
  199. package/dist/lib/server/decisioning/runtime/from-platform.js +6 -4
  200. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  201. package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts.map +1 -1
  202. package/dist/lib/server/decisioning/runtime/postgres-task-registry.js +5 -2
  203. package/dist/lib/server/decisioning/runtime/postgres-task-registry.js.map +1 -1
  204. package/dist/lib/server/decisioning/runtime/task-registry.d.ts +5 -0
  205. package/dist/lib/server/decisioning/runtime/task-registry.d.ts.map +1 -1
  206. package/dist/lib/server/decisioning/runtime/task-registry.js +4 -1
  207. package/dist/lib/server/decisioning/runtime/task-registry.js.map +1 -1
  208. package/dist/lib/server/decisioning/runtime/to-context.d.ts.map +1 -1
  209. package/dist/lib/server/decisioning/runtime/to-context.js +10 -2
  210. package/dist/lib/server/decisioning/runtime/to-context.js.map +1 -1
  211. package/dist/lib/server/dynamic-registry.d.ts +219 -0
  212. package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
  213. package/dist/lib/server/dynamic-registry.js +245 -0
  214. package/dist/lib/server/dynamic-registry.js.map +1 -0
  215. package/dist/lib/server/index.d.ts +8 -0
  216. package/dist/lib/server/index.d.ts.map +1 -1
  217. package/dist/lib/server/index.js +15 -4
  218. package/dist/lib/server/index.js.map +1 -1
  219. package/dist/lib/server/operational-platform.d.ts +239 -0
  220. package/dist/lib/server/operational-platform.d.ts.map +1 -0
  221. package/dist/lib/server/operational-platform.js +94 -0
  222. package/dist/lib/server/operational-platform.js.map +1 -0
  223. package/dist/lib/server/test-controller.d.ts +2 -0
  224. package/dist/lib/server/test-controller.d.ts.map +1 -1
  225. package/dist/lib/server/test-controller.js +6 -11
  226. package/dist/lib/server/test-controller.js.map +1 -1
  227. package/dist/lib/server/wire-safe.d.ts +211 -0
  228. package/dist/lib/server/wire-safe.d.ts.map +1 -0
  229. package/dist/lib/server/wire-safe.js +231 -0
  230. package/dist/lib/server/wire-safe.js.map +1 -0
  231. package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
  232. package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
  233. package/dist/lib/server/wire-spec-fields.generated.js +172 -0
  234. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
  235. package/dist/lib/testing/compliance/index.d.ts +2 -0
  236. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  237. package/dist/lib/testing/compliance/index.js +6 -1
  238. package/dist/lib/testing/compliance/index.js.map +1 -1
  239. package/dist/lib/testing/compliance/summary.d.ts +77 -0
  240. package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
  241. package/dist/lib/testing/compliance/summary.js +176 -0
  242. package/dist/lib/testing/compliance/summary.js.map +1 -0
  243. package/dist/lib/testing/comply-controller.d.ts +2 -0
  244. package/dist/lib/testing/comply-controller.d.ts.map +1 -1
  245. package/dist/lib/testing/comply-controller.js.map +1 -1
  246. package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
  247. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  248. package/dist/lib/testing/storyboard/compliance.js +51 -0
  249. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  250. package/dist/lib/testing/storyboard/index.d.ts +2 -2
  251. package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
  252. package/dist/lib/testing/storyboard/index.js +4 -2
  253. package/dist/lib/testing/storyboard/index.js.map +1 -1
  254. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  255. package/dist/lib/testing/storyboard/runner.js +58 -5
  256. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  257. package/dist/lib/version.d.ts +3 -3
  258. package/dist/lib/version.d.ts.map +1 -1
  259. package/dist/lib/version.js +3 -3
  260. package/dist/lib/version.js.map +1 -1
  261. package/package.json +2 -2
@@ -0,0 +1,125 @@
1
+ # Summit Foods — CPG Advertiser Test Kit
2
+ #
3
+ # Entity definition: fictional-entities.yaml → advertisers[summit_foods]
4
+ #
5
+ # Organic food / CPG brand that buys retail media inventory on ShopGrid.
6
+ #
7
+ # This brand is registered as a sandbox brand in AgenticAdvertising.org (AAO).
8
+ # Agents resolve summitfoods.example via the standard AAO brand resolution path.
9
+ # AAO returns the brand.json below but excludes sandbox brands from production
10
+ # brand discovery results.
11
+
12
+ id: summit_foods
13
+ name: "Summit Foods"
14
+ description: "Organic food CPG brand for retail media storyboard testing"
15
+ sandbox: true
16
+
17
+ # security_baseline auth fixture — see acme-outdoor.yaml for semantics.
18
+ auth:
19
+ api_key: "demo-summit-foods-v1"
20
+ probe_task: list_creatives
21
+
22
+ brand:
23
+ house:
24
+ domain: "summitfoods.example"
25
+ name: "Summit Foods"
26
+ brand_id: "summit_foods"
27
+ names:
28
+ - en: "Summit Foods"
29
+ description: "Organic pantry staples made from ingredients you can pronounce. From farm to shelf, nothing artificial."
30
+ industry: "cpg"
31
+ keller_type: "master"
32
+ logos:
33
+ - url: "https://test-assets.adcontextprotocol.org/summit-foods/logo-primary.png"
34
+ orientation: "horizontal"
35
+ background: "light-bg"
36
+ variant: "primary"
37
+ width: 400
38
+ height: 100
39
+ - url: "https://test-assets.adcontextprotocol.org/summit-foods/logo-icon.png"
40
+ orientation: "square"
41
+ background: "transparent-bg"
42
+ variant: "icon"
43
+ width: 200
44
+ height: 200
45
+ colors:
46
+ primary: "#33691E"
47
+ secondary: "#F9A825"
48
+ accent: "#BF360C"
49
+ background: "#FAFAF5"
50
+ text: "#1B1B1B"
51
+ fonts:
52
+ heading:
53
+ family: "Nunito"
54
+ weight: 700
55
+ url: "https://fonts.googleapis.com/css2?family=Nunito:wght@700"
56
+ body:
57
+ family: "Nunito"
58
+ weight: 400
59
+ url: "https://fonts.googleapis.com/css2?family=Nunito"
60
+ tone:
61
+ voice: "Honest and approachable. We talk like a farmer at a market stall — proud of the product, plain about what's in it."
62
+ attributes:
63
+ - "transparent"
64
+ - "approachable"
65
+ - "earthy"
66
+ dos:
67
+ - "Name specific ingredients and sourcing"
68
+ - "Use plain language over marketing speak"
69
+ - "Emphasize taste alongside health"
70
+ donts:
71
+ - "Use 'clean eating' or diet-culture language"
72
+ - "Make unsubstantiated health claims"
73
+ - "Position as premium or exclusive — Summit Foods is everyday food"
74
+
75
+ assets:
76
+ images:
77
+ - id: "hero_300x250"
78
+ url: "https://test-assets.adcontextprotocol.org/summit-foods/hero-300x250.jpg"
79
+ width: 300
80
+ height: 250
81
+ mime_type: "image/jpeg"
82
+ description: "Medium rectangle hero — product lineup on kitchen counter"
83
+
84
+ - id: "hero_728x90"
85
+ url: "https://test-assets.adcontextprotocol.org/summit-foods/hero-728x90.jpg"
86
+ width: 728
87
+ height: 90
88
+ mime_type: "image/jpeg"
89
+ description: "Leaderboard hero — harvest field with Summit Foods packaging"
90
+
91
+ - id: "hero_320x50"
92
+ url: "https://test-assets.adcontextprotocol.org/summit-foods/hero-320x50.jpg"
93
+ width: 320
94
+ height: 50
95
+ mime_type: "image/jpeg"
96
+ description: "Mobile banner hero — close-up of organic granola bar"
97
+
98
+ - id: "hero_160x600"
99
+ url: "https://test-assets.adcontextprotocol.org/summit-foods/hero-160x600.jpg"
100
+ width: 160
101
+ height: 600
102
+ mime_type: "image/jpeg"
103
+ description: "Wide skyscraper hero — vertical pantry shelf with Summit products"
104
+
105
+ - id: "hero_master"
106
+ url: "https://test-assets.adcontextprotocol.org/summit-foods/hero-master.jpg"
107
+ width: 1200
108
+ height: 628
109
+ mime_type: "image/jpeg"
110
+ description: "Master hero image — high-res breakfast spread with Summit products"
111
+
112
+ text:
113
+ headlines:
114
+ - "Organic. Honest. Delicious."
115
+ - "Ingredients You Can Pronounce"
116
+ - "From Our Farm to Your Shelf"
117
+ descriptions:
118
+ - "Organic pantry staples made with five ingredients or fewer. Summit Foods — real food for real kitchens."
119
+ - "No fillers, no artificial anything. Just honest food that tastes like food should."
120
+ cta:
121
+ - "Shop Now"
122
+ - "Find in Store"
123
+ - "Try the Sampler"
124
+
125
+ click_url: "https://summitfoods.example/shop"
@@ -0,0 +1,265 @@
1
+ # Webhook Receiver Runner — Harness Contract Test Kit
2
+ #
3
+ # Applies to:
4
+ # - universal/webhook-emission.yaml (primary consumer — grades outbound
5
+ # webhook conformance: idempotency_key presence, stability across retries,
6
+ # and RFC 9421 signature validity when 9421 is in effect)
7
+ # - universal/idempotency.yaml (replay-side-effect invariant — "no duplicate
8
+ # webhooks on replay" step is gated on this contract being in scope)
9
+ # - Any future storyboard that needs to observe outbound webhooks.
10
+ #
11
+ # The webhook-emission universal grades an agent's outbound-webhook
12
+ # conformance: idempotency_key presence and stability across retries, and —
13
+ # when the 9421 webhook profile is in effect — RFC 9421 signature validity per
14
+ # docs/building/implementation/security.mdx#webhook-callbacks.
15
+ #
16
+ # Storyboards are unidirectional by default (runner → agent). Verifying what
17
+ # the agent sends back requires the runner to host a webhook receiver during
18
+ # test execution and observe inbound deliveries. This test-kit defines the
19
+ # coordination contract between that receiver and a webhook-emitting agent
20
+ # under test.
21
+ #
22
+ # Clean seam: the runner does NOT reimplement signature verification or dedup.
23
+ # It delegates to `@adcp/client` primitives (AsyncHandler, WebhookMetadata,
24
+ # IdempotencyBackend) so the same code that production receivers use is what
25
+ # the conformance runner exercises. A single bug fix in the library covers both.
26
+
27
+ id: webhook_receiver_runner
28
+ applies_to:
29
+ universals:
30
+ - webhook-emission
31
+ - idempotency
32
+
33
+ description: |
34
+ Coordination contract between a black-box runner hosting a webhook receiver
35
+ and a webhook-emitting agent under test. The runner mints per-step HTTPS
36
+ endpoints, injects them into push_notification_config.url on the steps that
37
+ trigger webhooks, observes incoming deliveries via @adcp/client AsyncHandler
38
+ hooks, and asserts on idempotency_key presence, idempotency_key stability
39
+ across retries, and (when advertised) 9421 signature validity.
40
+
41
+ endpoint_scope: sandbox
42
+ # Storyboards that drive webhook emission typically call spend-committing
43
+ # operations (create_media_buy, acquire_*, activate_signal). Running those
44
+ # against production would create real commitments. Graders MUST target a
45
+ # sandbox/staging endpoint. Agents claiming the specialism SHOULD expose a
46
+ # dedicated grading endpoint.
47
+
48
+ harness_mode: black_box
49
+
50
+ # --- Ephemeral endpoint mechanism ---
51
+ #
52
+ # Three viable shapes with materially different operational costs. The runner
53
+ # selects per run mode; storyboard authors SHOULD NOT assume a specific mode.
54
+ #
55
+ # loopback_mock (default for lint/fast runs):
56
+ # The runner intercepts the agent's outbound HTTP at the library-client
57
+ # level (via @adcp/client AsyncHandler) before the request leaves the
58
+ # process. Zero network dependencies. Exercises serialization, signature
59
+ # math, and idempotency-key logic, but not real wire behavior (no TLS
60
+ # handshake, no proxy interposition, no real DNS). Appropriate for CI lint
61
+ # gates and SDK self-tests.
62
+ #
63
+ # proxy_url (default for full conformance runs):
64
+ # The CI environment exposes an HTTPS URL that routes into the runner
65
+ # process. The runner mints per-step paths under that base. Exercises real
66
+ # wire behavior end-to-end, including TLS, proxies, and body preservation.
67
+ # Appropriate for AdCP Verified grading where the agent under test is a
68
+ # remote service.
69
+ #
70
+ # tunnel (optional wrapper, NOT a hard dep):
71
+ # ngrok, cloudflared, or similar. Operators MAY configure a tunnel as the
72
+ # proxy_url provider, but the runner MUST NOT require a specific tunnel
73
+ # vendor. Adding a tunnel is a wrapper concern outside the spec.
74
+ #
75
+ # The specialism grades observable agent behavior; the receiver mechanism is
76
+ # an implementation detail below the conformance seam. An agent that passes
77
+ # under loopback_mock MUST also pass under proxy_url for the same storyboard —
78
+ # any divergence is a conformance bug in the runner or the client library, not
79
+ # a legitimate agent-behavior difference.
80
+
81
+ endpoint_modes:
82
+ - mode: loopback_mock
83
+ default_for: [lint, fast]
84
+ description: |
85
+ Intercepts the agent's outbound HTTP at the @adcp/client AsyncHandler
86
+ layer. No external network exposure. Zero CI setup cost.
87
+ runner_config:
88
+ intercept_layer: adcp_client_async_handler
89
+
90
+ - mode: proxy_url
91
+ default_for: [full_conformance, adcp_verified]
92
+ description: |
93
+ Operator-supplied HTTPS URL routing to the runner process. The runner
94
+ mints per-step paths under this base.
95
+ runner_config:
96
+ base_url_env: ADCP_RUNNER_WEBHOOK_BASE_URL
97
+ required_for_adcp_verified: true
98
+ scheme: https
99
+ # HTTPS is REQUIRED for proxy_url. Runners MUST reject an
100
+ # ADCP_RUNNER_WEBHOOK_BASE_URL with an http:// scheme unless the runner
101
+ # is started with an explicit local-dev flag (not exposed in AdCP
102
+ # Verified grading). The loopback_mock mode operates in-process and has
103
+ # no TLS surface; this rule applies only to proxy_url.
104
+
105
+ # --- Per-step receiver URLs ---
106
+ #
107
+ # The runner exposes two substitution variables to storyboards:
108
+ #
109
+ # {{runner.webhook_base}} HTTPS base for the current run
110
+ # {{runner.webhook_url:<step_id>}} Per-step URL unique to step <step_id>
111
+ #
112
+ # Per-step URLs scope assertions cleanly: an expect_webhook on step_A matches
113
+ # only webhooks delivered to step_A's URL. Fan-in scenarios (one URL receiving
114
+ # from multiple emitting steps) are deferred — see storyboard-schema.yaml
115
+ # "shared_receiver (deferred / out of scope v1)."
116
+
117
+ receiver_urls:
118
+ per_step_url_template: "{{runner.webhook_base}}/step/<step_id>/<operation_id>"
119
+ operation_id_source: push_notification_config.url
120
+ # <operation_id> in the URL template is the ID the RUNNER (acting as caller)
121
+ # sets in the path segment of push_notification_config.url when it registers
122
+ # the webhook on the triggering step. This is NOT a server-generated ID — the
123
+ # agent under test MUST NOT mint its own operation_id. The agent's webhook
124
+ # payload MUST echo this operation_id back verbatim so the runner can match
125
+ # inbound deliveries to the step that triggered them.
126
+
127
+ # --- Retry-replay assertion shape ---
128
+ #
129
+ # expect_webhook_retry_keys_stable is the only step that requires a specific
130
+ # receiver-behavior contract. The runner's webhook receiver deterministically
131
+ # returns HTTP 5xx for the first `count` deliveries, then 2xx, and records the
132
+ # idempotency_key on every delivery. The runner then asserts all recorded keys
133
+ # are byte-identical.
134
+ #
135
+ # The sender's retry back-off is out of scope for the contract — the runner
136
+ # sets a sufficient timeout_seconds on the step to cover reasonable back-off
137
+ # schedules (default 90s). Any conformant at-least-once sender will retry
138
+ # within that window.
139
+
140
+ retry_replay_contract:
141
+ mechanism: receiver_returns_5xx_then_2xx
142
+ default_count: 3
143
+ min_count: 1
144
+ max_count: 10
145
+ # Hard ceiling on retry_trigger.count. Runners MUST reject storyboards whose
146
+ # retry_trigger.count falls outside [min_count, max_count] with a storyboard
147
+ # validation error at load time. The ceiling prevents a typo (count: 1000000)
148
+ # from turning a runner into a DoS amplifier against a real seller in
149
+ # proxy_url mode. Sellers exercise retry back-off with N=3 routinely;
150
+ # higher counts do not add meaningful conformance signal.
151
+ default_http_status: 503
152
+ allowed_statuses: [429, 500, 502, 503, 504]
153
+ # Runners MUST reject retry_trigger.http_status values outside this
154
+ # allowlist. Statuses like 400 or 404 are not retryable signals for
155
+ # at-least-once senders — a storyboard declaring one is a bug, not a
156
+ # legitimate test shape.
157
+ default_timeout_seconds: 90
158
+ expected_behavior: |
159
+ The sender retries on each 5xx response. Every retry MUST carry the
160
+ byte-identical idempotency_key the first delivery carried. The runner
161
+ records all deliveries and asserts key stability; a key rotation across
162
+ retries fails the step with `idempotency_key_rotated`.
163
+
164
+ When 9421 is in effect for the storyboard, the runner ALSO verifies the
165
+ signature on every retry delivery using the run-scoped replay store (see
166
+ client_primitives.signature_replay_store). A sender that reuses the 9421
167
+ `nonce` sig-param across retries fails the step with `signature_replayed`
168
+ on the second delivery even though idempotency_key is stable — nonce
169
+ freshness is a separate invariant.
170
+
171
+ # --- @adcp/client primitives the runner hooks ---
172
+ #
173
+ # The runner does NOT reimplement signature verification or dedup. It consumes
174
+ # the following primitives from @adcp/client (see adcontextprotocol/adcp-client)
175
+ # so the conformance surface matches what production receivers use:
176
+
177
+ client_primitives:
178
+ async_handler_config:
179
+ # AdCPClient is constructed with an AsyncHandlerConfig whose webhookDedup
180
+ # uses a runner-owned IdempotencyBackend. The runner's backend wraps the
181
+ # standard memoryBackend() and records every (agent_id, idempotency_key)
182
+ # observed for later assertion.
183
+ reference: AsyncHandlerConfig.webhookDedup
184
+ doc: https://github.com/adcontextprotocol/adcp-client/pull/629
185
+
186
+ webhook_metadata:
187
+ # Every onXxxStatusChange handler receives a WebhookMetadata second arg
188
+ # carrying idempotency_key. The runner's handlers write this into the
189
+ # per-step observation buffer.
190
+ reference: WebhookMetadata.idempotency_key
191
+ doc: https://github.com/adcontextprotocol/adcp-client/pull/629
192
+
193
+ activity_webhook_duplicate:
194
+ # The client emits Activity { type: "webhook_duplicate" } when a repeat
195
+ # idempotency_key hits the dedup backend. The runner counts these to
196
+ # assert that retries triggered by expect_webhook_retry_keys_stable do
197
+ # reach the client (indicating the sender is retrying) AND are suppressed
198
+ # as duplicates (indicating the key stayed stable).
199
+ reference: Activity.type == "webhook_duplicate"
200
+ doc: https://github.com/adcontextprotocol/adcp-client/pull/629
201
+
202
+ webhook_signature_verifier:
203
+ # Once RFC 9421 webhook signing lands in the client library (follow-up to
204
+ # adcontextprotocol/adcp#2423), the runner hooks the verifier to surface
205
+ # webhook_signature_* error codes on failure. Until that lands,
206
+ # expect_webhook_signature_valid grades as preview / skip with a stable
207
+ # non-applicable marker.
208
+ reference: 9421 webhook verifier (TBD in @adcp/client)
209
+ status: pending
210
+ blocked_on: "@adcp/client implementation of docs/building/implementation/security.mdx#webhook-callbacks"
211
+
212
+ signature_replay_store:
213
+ # The runner MUST maintain ONE (keyid, nonce) replay store shared across
214
+ # every webhook delivery it observes in a storyboard run — including
215
+ # every expect_webhook_signature_valid step AND every retry delivery
216
+ # produced under expect_webhook_retry_keys_stable.
217
+ #
218
+ # Rationale: without a shared store, a publisher emitting the same signed
219
+ # bytes at two different expect_webhook_signature_valid steps would pass
220
+ # both in isolation, silently missing cross-step nonce replay. The 9421
221
+ # profile's (keyid, nonce) uniqueness guarantee is per-signer, not
222
+ # per-step — scoping replay state per-step in the runner would redefine
223
+ # the guarantee in a way production receivers don't.
224
+ #
225
+ # Scope: one store per storyboard run; destroyed at run end. Not shared
226
+ # across runs (a fresh run is a fresh counterparty-session from the
227
+ # publisher's perspective).
228
+ reference: Run-scoped (keyid, nonce) replay store
229
+ required_for:
230
+ - expect_webhook_signature_valid
231
+ - expect_webhook_retry_keys_stable (when 9421 in effect)
232
+
233
+ # --- Claim scope ---
234
+
235
+ scope:
236
+ in_scope: |
237
+ - Per-step receiver URL template and operation_id echo pattern.
238
+ - Retry-replay receiver-behavior contract (5xx-then-2xx, count and status).
239
+ - @adcp/client primitives the runner delegates to for observation and
240
+ verification.
241
+ - Endpoint mode selection (loopback_mock vs. proxy_url) and which mode
242
+ AdCP Verified grading runs under.
243
+ - Black-box-only harness mode (white_box is out of scope for webhook
244
+ receiver testing because the seam is the client library, not the
245
+ agent's internals).
246
+ out_of_scope: |
247
+ - The agent's internal webhook emission code path — the contract grades
248
+ observable behavior only.
249
+ - Which 9421 library the client uses — the client is free to pin any
250
+ validated RFC 9421 implementation.
251
+ - HTTP retry back-off schedules — the runner's timeout_seconds is
252
+ sufficient; precise back-off is sender-implementation-specific.
253
+ - Webhook-signing negative conformance vectors — those live at
254
+ /compliance/{version}/test-vectors/webhook-signing/ (follow-up) and
255
+ are graded per-vector, not via this contract.
256
+ - Production webhook receiver configuration — this contract configures
257
+ test counterparties only.
258
+
259
+ references:
260
+ universal: static/compliance/source/universal/webhook-emission.yaml
261
+ spec_section: /docs/building/implementation/security.mdx#webhook-callbacks
262
+ client_receiver_pr: https://github.com/adcontextprotocol/adcp-client/pull/629
263
+ signing_upstream_pr: https://github.com/adcontextprotocol/adcp/pull/2423
264
+ idempotency_upstream_pr: https://github.com/adcontextprotocol/adcp/pull/2417
265
+ runner_implementation_tracking: https://github.com/adcontextprotocol/adcp/issues/2426
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "Minimal plan with required fields only",
3
+ "spec_reference": "#plan-state-binding",
4
+ "description": "Baseline canonicalization over the required plan fields (plan_id, brand, objectives, budget, flight). No optionals set.",
5
+ "plan_as_supplied": {
6
+ "plan_id": "plan_minimal_2026",
7
+ "brand": {
8
+ "domain": "example.com"
9
+ },
10
+ "objectives": "Drive awareness for Q1 launch.",
11
+ "budget": {
12
+ "total": 100000,
13
+ "currency": "USD",
14
+ "reallocation_threshold": 5000
15
+ },
16
+ "flight": {
17
+ "start": "2026-04-01T00:00:00Z",
18
+ "end": "2026-06-30T00:00:00Z"
19
+ }
20
+ },
21
+ "expected": {
22
+ "preimage": {
23
+ "plan_id": "plan_minimal_2026",
24
+ "brand": {
25
+ "domain": "example.com"
26
+ },
27
+ "objectives": "Drive awareness for Q1 launch.",
28
+ "budget": {
29
+ "total": 100000,
30
+ "currency": "USD",
31
+ "reallocation_threshold": 5000
32
+ },
33
+ "flight": {
34
+ "start": "2026-04-01T00:00:00Z",
35
+ "end": "2026-06-30T00:00:00Z"
36
+ }
37
+ },
38
+ "jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"currency\":\"USD\",\"reallocation_threshold\":5000,\"total\":100000},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"objectives\":\"Drive awareness for Q1 launch.\",\"plan_id\":\"plan_minimal_2026\"}",
39
+ "sha256_hex": "a11d2314312dcdcc203db35ff8e7ddfdf64761f0320f54d16f318e1415421be7",
40
+ "plan_hash": "oR0jFDEtzcwgPbNf-Ofd_fZHYfAyD1TRbzGOFBVCG-c"
41
+ },
42
+ "$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
43
+ }
@@ -0,0 +1,217 @@
1
+ {
2
+ "name": "Plan exercising every optional field",
3
+ "spec_reference": "#plan-state-binding",
4
+ "description": "All optional fields populated including delegations[], custom_policies[], channels.mix_targets{}, budget.allocations{}, and ext{}.",
5
+ "plan_as_supplied": {
6
+ "plan_id": "plan_full_2026",
7
+ "brand": {
8
+ "domain": "acmecorp.com",
9
+ "industries": [
10
+ "consumer_finance"
11
+ ],
12
+ "data_subject_contestation": {
13
+ "url": "https://acmecorp.com/contest",
14
+ "email": "privacy@acmecorp.com"
15
+ }
16
+ },
17
+ "objectives": "Drive awareness for spring launch across premium video.",
18
+ "budget": {
19
+ "total": 500000,
20
+ "currency": "USD",
21
+ "reallocation_threshold": 25000,
22
+ "per_seller_max_pct": 40,
23
+ "allocations": {
24
+ "media_buy": {
25
+ "amount": 400000
26
+ },
27
+ "rights_license": {
28
+ "amount": 75000,
29
+ "max_pct": 20
30
+ },
31
+ "signal_activation": {
32
+ "amount": 25000
33
+ }
34
+ }
35
+ },
36
+ "human_review_required": true,
37
+ "channels": {
38
+ "required": [
39
+ "olv"
40
+ ],
41
+ "allowed": [
42
+ "audio",
43
+ "ctv",
44
+ "display",
45
+ "olv"
46
+ ],
47
+ "mix_targets": {
48
+ "olv": {
49
+ "min_pct": 40,
50
+ "max_pct": 70
51
+ },
52
+ "display": {
53
+ "min_pct": 10,
54
+ "max_pct": 30
55
+ }
56
+ }
57
+ },
58
+ "flight": {
59
+ "start": "2026-03-15T00:00:00Z",
60
+ "end": "2026-06-15T00:00:00Z"
61
+ },
62
+ "countries": [
63
+ "US"
64
+ ],
65
+ "regions": [
66
+ "US-CA",
67
+ "US-MA",
68
+ "US-NY"
69
+ ],
70
+ "policy_ids": [
71
+ "alcohol_advertising",
72
+ "eu_ai_act_annex_iii",
73
+ "us_coppa"
74
+ ],
75
+ "policy_categories": [
76
+ "fair_lending"
77
+ ],
78
+ "custom_policies": [
79
+ {
80
+ "policy_id": "no_competitor_adjacency",
81
+ "policy": "No advertising adjacent to direct competitor content.",
82
+ "enforcement": "must"
83
+ }
84
+ ],
85
+ "mode": "enforce",
86
+ "approved_sellers": [
87
+ "https://publisher-a.example",
88
+ "https://publisher-b.example"
89
+ ],
90
+ "delegations": [
91
+ {
92
+ "agent_url": "https://buying.agency.example",
93
+ "authority": "execute_only",
94
+ "budget_limit": {
95
+ "amount": 200000,
96
+ "currency": "USD"
97
+ },
98
+ "markets": [
99
+ "US"
100
+ ],
101
+ "expires_at": "2026-12-31T23:59:59Z"
102
+ }
103
+ ],
104
+ "ext": {
105
+ "trace_id": "trace_abc123"
106
+ }
107
+ },
108
+ "expected": {
109
+ "preimage": {
110
+ "plan_id": "plan_full_2026",
111
+ "brand": {
112
+ "domain": "acmecorp.com",
113
+ "industries": [
114
+ "consumer_finance"
115
+ ],
116
+ "data_subject_contestation": {
117
+ "url": "https://acmecorp.com/contest",
118
+ "email": "privacy@acmecorp.com"
119
+ }
120
+ },
121
+ "objectives": "Drive awareness for spring launch across premium video.",
122
+ "budget": {
123
+ "total": 500000,
124
+ "currency": "USD",
125
+ "reallocation_threshold": 25000,
126
+ "per_seller_max_pct": 40,
127
+ "allocations": {
128
+ "media_buy": {
129
+ "amount": 400000
130
+ },
131
+ "rights_license": {
132
+ "amount": 75000,
133
+ "max_pct": 20
134
+ },
135
+ "signal_activation": {
136
+ "amount": 25000
137
+ }
138
+ }
139
+ },
140
+ "human_review_required": true,
141
+ "channels": {
142
+ "required": [
143
+ "olv"
144
+ ],
145
+ "allowed": [
146
+ "audio",
147
+ "ctv",
148
+ "display",
149
+ "olv"
150
+ ],
151
+ "mix_targets": {
152
+ "olv": {
153
+ "min_pct": 40,
154
+ "max_pct": 70
155
+ },
156
+ "display": {
157
+ "min_pct": 10,
158
+ "max_pct": 30
159
+ }
160
+ }
161
+ },
162
+ "flight": {
163
+ "start": "2026-03-15T00:00:00Z",
164
+ "end": "2026-06-15T00:00:00Z"
165
+ },
166
+ "countries": [
167
+ "US"
168
+ ],
169
+ "regions": [
170
+ "US-CA",
171
+ "US-MA",
172
+ "US-NY"
173
+ ],
174
+ "policy_ids": [
175
+ "alcohol_advertising",
176
+ "eu_ai_act_annex_iii",
177
+ "us_coppa"
178
+ ],
179
+ "policy_categories": [
180
+ "fair_lending"
181
+ ],
182
+ "custom_policies": [
183
+ {
184
+ "policy_id": "no_competitor_adjacency",
185
+ "policy": "No advertising adjacent to direct competitor content.",
186
+ "enforcement": "must"
187
+ }
188
+ ],
189
+ "mode": "enforce",
190
+ "approved_sellers": [
191
+ "https://publisher-a.example",
192
+ "https://publisher-b.example"
193
+ ],
194
+ "delegations": [
195
+ {
196
+ "agent_url": "https://buying.agency.example",
197
+ "authority": "execute_only",
198
+ "budget_limit": {
199
+ "amount": 200000,
200
+ "currency": "USD"
201
+ },
202
+ "markets": [
203
+ "US"
204
+ ],
205
+ "expires_at": "2026-12-31T23:59:59Z"
206
+ }
207
+ ],
208
+ "ext": {
209
+ "trace_id": "trace_abc123"
210
+ }
211
+ },
212
+ "jcs_bytes": "{\"approved_sellers\":[\"https://publisher-a.example\",\"https://publisher-b.example\"],\"brand\":{\"data_subject_contestation\":{\"email\":\"privacy@acmecorp.com\",\"url\":\"https://acmecorp.com/contest\"},\"domain\":\"acmecorp.com\",\"industries\":[\"consumer_finance\"]},\"budget\":{\"allocations\":{\"media_buy\":{\"amount\":400000},\"rights_license\":{\"amount\":75000,\"max_pct\":20},\"signal_activation\":{\"amount\":25000}},\"currency\":\"USD\",\"per_seller_max_pct\":40,\"reallocation_threshold\":25000,\"total\":500000},\"channels\":{\"allowed\":[\"audio\",\"ctv\",\"display\",\"olv\"],\"mix_targets\":{\"display\":{\"max_pct\":30,\"min_pct\":10},\"olv\":{\"max_pct\":70,\"min_pct\":40}},\"required\":[\"olv\"]},\"countries\":[\"US\"],\"custom_policies\":[{\"enforcement\":\"must\",\"policy\":\"No advertising adjacent to direct competitor content.\",\"policy_id\":\"no_competitor_adjacency\"}],\"delegations\":[{\"agent_url\":\"https://buying.agency.example\",\"authority\":\"execute_only\",\"budget_limit\":{\"amount\":200000,\"currency\":\"USD\"},\"expires_at\":\"2026-12-31T23:59:59Z\",\"markets\":[\"US\"]}],\"ext\":{\"trace_id\":\"trace_abc123\"},\"flight\":{\"end\":\"2026-06-15T00:00:00Z\",\"start\":\"2026-03-15T00:00:00Z\"},\"human_review_required\":true,\"mode\":\"enforce\",\"objectives\":\"Drive awareness for spring launch across premium video.\",\"plan_id\":\"plan_full_2026\",\"policy_categories\":[\"fair_lending\"],\"policy_ids\":[\"alcohol_advertising\",\"eu_ai_act_annex_iii\",\"us_coppa\"],\"regions\":[\"US-CA\",\"US-MA\",\"US-NY\"]}",
213
+ "sha256_hex": "15ef2c87895e763dc4be0f410b0e62d943112bff5c8c27667c77a979b9907673",
214
+ "plan_hash": "Fe8sh4ledj3Evg9BCw5i2UMRK_9cjCdmfHepebmQdnM"
215
+ },
216
+ "$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
217
+ }