@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,316 @@
1
+ id: signal_owned
2
+ version: "1.0.0"
3
+ title: "Owned signal agent"
4
+ protocol: signals
5
+ category: signal_owned
6
+ summary: "Signal agent serving first-party or proprietary audience data without external catalog verification."
7
+ track: signals
8
+ required_tools:
9
+ - get_signals
10
+
11
+ narrative: |
12
+ You operate a first-party data platform — a retailer CDP, publisher contextual data
13
+ provider, or proprietary audience platform. Your signals are agent-native: they come
14
+ from your own data, not from third-party catalogs.
15
+
16
+ Buyers trust your agent directly. There's no external adagents.json to verify against —
17
+ provenance is the agent itself. This simplifies the flow: discovery and activation,
18
+ without the verification step that marketplace agents require.
19
+
20
+ Owned signal agents often have richer signal types. A retailer might expose purchase
21
+ frequency as a numeric signal (0-30 visits/month) or loyalty tier as categorical
22
+ (platinum/gold/silver/bronze). A publisher might expose content category, subscriber
23
+ tenure, or engagement scores.
24
+
25
+ This storyboard walks through discovery and both activation patterns.
26
+
27
+ Pricing is hard-required here for the same reason as signal marketplaces: signals
28
+ are rate-carded goods. Buyers cannot activate without a pricing_option_id to anchor
29
+ billing. Agents distributing first-party signals without commercial terms belong on
30
+ list_authorized_properties or a different specialism, not this one.
31
+
32
+ agent:
33
+ interaction_model: owned_signals
34
+ capabilities: []
35
+ examples:
36
+ - "Retailer CDPs (e.g., loyalty and purchase data)"
37
+ - "Publisher contextual platforms (e.g., content category, subscriber data)"
38
+ - "First-party audience platforms (e.g., CRM-derived segments)"
39
+
40
+ caller:
41
+ role: buyer_agent
42
+ example: "Scope3 (DSP)"
43
+
44
+ prerequisites:
45
+ description: |
46
+ The buyer has a campaign brief with targeting objectives. The test kit provides
47
+ sample owned signal definitions with various value types (binary, categorical,
48
+ numeric) and pricing models.
49
+ test_kit: "test-kits/nova-motors.yaml"
50
+
51
+ phases:
52
+ - id: capability_discovery
53
+ title: "Capability discovery"
54
+ narrative: |
55
+ The buyer calls get_adcp_capabilities to confirm the agent supports signals before discovering or activating audience data.
56
+
57
+ steps:
58
+ - id: get_capabilities
59
+ title: "Check agent capabilities"
60
+ narrative: |
61
+ Verify that the agent declares the expected protocol support before
62
+ proceeding with domain-specific operations.
63
+ task: get_adcp_capabilities
64
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
65
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
66
+ doc_ref: "/protocol/get_adcp_capabilities"
67
+ comply_scenario: capability_discovery
68
+ stateful: false
69
+ expected: |
70
+ Return capabilities declaring signals in supported_protocols, confirming the agent serves audience signals.
71
+ sample_request:
72
+ context:
73
+ correlation_id: "signal_owned--get_capabilities"
74
+ validations:
75
+ - check: response_schema
76
+ description: "Response matches get-adcp-capabilities-response.json schema"
77
+ - check: field_present
78
+ path: "supported_protocols"
79
+ description: "Agent declares supported protocols"
80
+
81
+ - check: field_present
82
+ path: "context"
83
+ description: "Response echoes back the context object"
84
+ - check: field_value
85
+ path: "context.correlation_id"
86
+ value: "signal_owned--get_capabilities"
87
+ description: "Context correlation_id returned unchanged"
88
+ - id: discovery
89
+ title: "Signal discovery"
90
+ narrative: |
91
+ The buyer describes targeting objectives and your agent returns matching signals
92
+ from your proprietary data. Unlike marketplace agents, these signals have
93
+ signal_type "owned" — provenance is the agent itself.
94
+
95
+ Owned signals often include richer value types. A retailer can expose loyalty
96
+ tiers as categorical signals and purchase frequency as numeric signals, giving
97
+ buyers more precise targeting than binary include/exclude.
98
+
99
+ steps:
100
+ - id: search_owned_signals
101
+ title: "Discover owned signals"
102
+ narrative: |
103
+ The buyer searches for audience segments using a natural language description.
104
+ Your agent returns signals from your proprietary data — loyalty tiers, purchase
105
+ history, engagement scores, contextual categories.
106
+ task: get_signals
107
+ schema_ref: "signals/get-signals-request.json"
108
+ response_schema_ref: "signals/get-signals-response.json"
109
+ doc_ref: "/signals/tasks/get_signals"
110
+ comply_scenario: signals_flow
111
+ stateful: false
112
+ expected: |
113
+ Return matching signals from your proprietary data. Each signal must include:
114
+ - signal_agent_segment_id for activation
115
+ - signal_id with source: "agent_native"
116
+ - name, description, and value_type
117
+ - coverage_percentage
118
+ - pricing_options
119
+ - signal_type: "owned"
120
+
121
+ For categorical signals, include the allowed_values.
122
+ For numeric signals, include the range (min/max).
123
+
124
+ sample_request:
125
+ account:
126
+ brand:
127
+ domain: "novamotors.example"
128
+ operator: "pinnacle-agency.example"
129
+ signal_spec: "High-value customers likely to purchase electronics, with loyalty program data"
130
+
131
+ context:
132
+ correlation_id: "signal_owned--search_owned_signals"
133
+ validations:
134
+ - check: response_schema
135
+ description: "Response matches get-signals-response.json schema"
136
+ - check: field_present
137
+ path: "signals[0].signal_agent_segment_id"
138
+ description: "Each signal has a signal_agent_segment_id"
139
+ - check: field_present
140
+ path: "signals[0].pricing_options"
141
+ description: "Each signal has pricing options"
142
+
143
+ - check: field_present
144
+ path: "context"
145
+ description: "Response echoes back the context object"
146
+ - check: field_value
147
+ path: "context.correlation_id"
148
+ value: "signal_owned--search_owned_signals"
149
+ description: "Context correlation_id returned unchanged"
150
+ - check: field_present
151
+ path: "signals[0].signal_id.source"
152
+ description: "Signal ID includes source discriminator"
153
+ - id: filter_by_criteria
154
+ title: "Filter signals by criteria"
155
+ narrative: |
156
+ The buyer narrows the search using filters — maximum CPM, specific signal
157
+ types, or coverage thresholds. This tests that your agent handles filter
158
+ parameters correctly and returns only matching signals.
159
+ task: get_signals
160
+ schema_ref: "signals/get-signals-request.json"
161
+ response_schema_ref: "signals/get-signals-response.json"
162
+ doc_ref: "/signals/tasks/get_signals"
163
+ comply_scenario: signals_flow
164
+ stateful: false
165
+ expected: |
166
+ Return only signals matching the filter criteria. If no signals match,
167
+ return an empty signals array — not an error.
168
+
169
+ sample_request:
170
+ account:
171
+ brand:
172
+ domain: "novamotors.example"
173
+ operator: "pinnacle-agency.example"
174
+ signal_spec: "Purchase behavior signals"
175
+ filters:
176
+ max_cpm: 5.00
177
+
178
+ context:
179
+ correlation_id: "signal_owned--filter_by_criteria"
180
+ validations:
181
+ - check: response_schema
182
+ description: "Response matches schema"
183
+ - check: field_present
184
+ path: "signals"
185
+ description: "Response contains a signals array"
186
+
187
+ - check: field_present
188
+ path: "context"
189
+ description: "Response echoes back the context object"
190
+ - check: field_value
191
+ path: "context.correlation_id"
192
+ value: "signal_owned--filter_by_criteria"
193
+ description: "Context correlation_id returned unchanged"
194
+ - id: platform_activation
195
+ title: "Activate on a DSP"
196
+ narrative: |
197
+ The buyer activates a signal directly on a DSP. Your agent pushes the segment
198
+ to the platform and returns a segment_id the buyer uses for campaign targeting.
199
+
200
+ Use platform destinations when the buyer manages DSP campaigns directly.
201
+
202
+ steps:
203
+ - id: activate_on_platform
204
+ title: "Activate owned signal on a DSP"
205
+ narrative: |
206
+ The buyer selects a signal and activates it on a DSP. For owned signals,
207
+ this means your platform pushes first-party segment data to the DSP. The
208
+ buyer gets back a segment_id for targeting.
209
+ task: activate_signal
210
+ schema_ref: "signals/activate-signal-request.json"
211
+ response_schema_ref: "signals/activate-signal-response.json"
212
+ doc_ref: "/signals/tasks/activate_signal"
213
+ comply_scenario: signals_flow
214
+ stateful: true
215
+ expected: |
216
+ Return a deployment with:
217
+ - type: "platform"
218
+ - is_live status (may be async)
219
+ - activation_key with type: "segment_id" when live
220
+ - estimated_activation_duration_minutes if not immediately live
221
+
222
+ sample_request:
223
+ account:
224
+ brand:
225
+ domain: "novamotors.example"
226
+ operator: "pinnacle-agency.example"
227
+ signal_agent_segment_id: "prism_high_ltv"
228
+ pricing_option_id: "po_prism_flat_monthly"
229
+ destinations:
230
+ - type: "platform"
231
+ platform: "the-trade-desk"
232
+ account: "agency-123-ttd"
233
+ idempotency_key: "$generate:uuid_v4#signal_owned_activate_platform"
234
+ context:
235
+ correlation_id: "signal_owned--activate_on_platform"
236
+ ext:
237
+ test_platform:
238
+ test_run: true
239
+ validations:
240
+ - check: response_schema
241
+ description: "Response matches activate-signal-response.json schema"
242
+ - check: field_present
243
+ path: "deployments[0].type"
244
+ description: "Deployment includes type"
245
+
246
+ - check: field_present
247
+ path: "context"
248
+ description: "Response echoes back the context object"
249
+ - check: field_value
250
+ path: "context.correlation_id"
251
+ value: "signal_owned--activate_on_platform"
252
+ description: "Context correlation_id returned unchanged"
253
+ - id: agent_activation
254
+ title: "Activate on a sales agent"
255
+ narrative: |
256
+ The buyer activates a signal on a sales agent. The SA records the activation
257
+ and handles downstream DSP coordination — the buyer doesn't need to know which
258
+ platform the SA uses.
259
+
260
+ This is the right pattern when buying media through a sales agent.
261
+
262
+ steps:
263
+ - id: activate_on_agent
264
+ title: "Activate owned signal on a sales agent"
265
+ narrative: |
266
+ The buyer activates a signal with the SA's URL as the destination. The
267
+ activation is typically synchronous. The SA records it internally and
268
+ applies the targeting when the buyer later calls create_media_buy.
269
+ task: activate_signal
270
+ schema_ref: "signals/activate-signal-request.json"
271
+ response_schema_ref: "signals/activate-signal-response.json"
272
+ doc_ref: "/signals/tasks/activate_signal"
273
+ comply_scenario: signals_flow
274
+ stateful: true
275
+ expected: |
276
+ Return a deployment with:
277
+ - type: "agent"
278
+ - agent_url matching the SA
279
+ - is_live: true (sync activation)
280
+ - activation_key with type: "key_value"
281
+ - deployed_at timestamp
282
+
283
+ sample_request:
284
+ account:
285
+ brand:
286
+ domain: "novamotors.example"
287
+ operator: "pinnacle-agency.example"
288
+ signal_agent_segment_id: "prism_cart_abandoner"
289
+ pricing_option_id: "po_prism_abandoner_cpm"
290
+ destinations:
291
+ - type: "agent"
292
+ agent_url: "https://wonderstruck.salesagents.example"
293
+ idempotency_key: "$generate:uuid_v4#signal_owned_activate_agent"
294
+ context:
295
+ correlation_id: "signal_owned--activate_on_agent"
296
+ ext:
297
+ test_platform:
298
+ test_run: true
299
+ validations:
300
+ - check: response_schema
301
+ description: "Response matches activate-signal-response.json schema"
302
+ - check: field_present
303
+ path: "deployments[0].activation_key"
304
+ description: "Deployment includes activation key"
305
+ - check: field_value
306
+ path: "deployments[0].type"
307
+ value: "agent"
308
+ description: "Deployment type is 'agent'"
309
+
310
+ - check: field_present
311
+ path: "context"
312
+ description: "Response echoes back the context object"
313
+ - check: field_value
314
+ path: "context.correlation_id"
315
+ value: "signal_owned--activate_on_agent"
316
+ description: "Context correlation_id returned unchanged"
@@ -0,0 +1,210 @@
1
+ # Acme Outdoor — Sample Advertiser Test Kit
2
+ #
3
+ # Entity definition: fictional-entities.yaml → advertisers[acme_outdoor]
4
+ #
5
+ # Provides the "ingredients" needed to test creative agent storyboards:
6
+ # a brand identity, sample assets at common dimensions, and sample text.
7
+ #
8
+ # This brand is registered as a sandbox brand in AgenticAdvertising.org (AAO).
9
+ # Agents resolve acmeoutdoor.example via the standard AAO brand resolution path.
10
+ # AAO returns the brand.json below but excludes sandbox brands from production
11
+ # brand discovery results.
12
+
13
+ id: acme_outdoor
14
+ name: "Acme Outdoor"
15
+ description: "Fictional outdoor gear brand for storyboard testing"
16
+ sandbox: true
17
+
18
+ # Authentication fixture for the universal security_baseline storyboard
19
+ # (universal/security.yaml). Declares:
20
+ # - api_key: the demo Bearer the runner sends on the positive api-key
21
+ # probe. The conformance handle is the `demo-<kit>-` prefix — agents
22
+ # SHOULD accept any Bearer matching that prefix (not this literal
23
+ # value) so the suffix can rotate across spec versions without
24
+ # breaking previously-conformant agents.
25
+ # - probe_task: the protected, auth-required read the runner calls under
26
+ # `auth: none` and with a random-invalid key. Default is list_creatives;
27
+ # declare explicitly so the api_key phase runs instead of being skipped
28
+ # via `skip_if: "!test_kit.auth.api_key"`.
29
+ auth:
30
+ api_key: "demo-acme-outdoor-v1"
31
+ probe_task: list_creatives
32
+
33
+ brand:
34
+ house:
35
+ domain: "acmeoutdoor.example"
36
+ name: "Acme Outdoor"
37
+ brand_id: "acme_outdoor"
38
+ names:
39
+ - en: "Acme Outdoor"
40
+ description: "Premium outdoor gear for every adventure. From trail to summit, we make gear that performs."
41
+ industry: "retail"
42
+ keller_type: "master"
43
+ logos:
44
+ - url: "https://test-assets.adcontextprotocol.org/acme-outdoor/logo-primary.png"
45
+ orientation: "horizontal"
46
+ background: "light-bg"
47
+ variant: "primary"
48
+ width: 400
49
+ height: 100
50
+ - url: "https://test-assets.adcontextprotocol.org/acme-outdoor/logo-icon.png"
51
+ orientation: "square"
52
+ background: "transparent-bg"
53
+ variant: "icon"
54
+ width: 200
55
+ height: 200
56
+ colors:
57
+ primary: "#1B5E20"
58
+ secondary: "#FF6F00"
59
+ accent: "#FDD835"
60
+ background: "#FAFAFA"
61
+ text: "#212121"
62
+ fonts:
63
+ heading:
64
+ family: "Montserrat"
65
+ weight: 700
66
+ url: "https://fonts.googleapis.com/css2?family=Montserrat:wght@700"
67
+ body:
68
+ family: "Open Sans"
69
+ weight: 400
70
+ url: "https://fonts.googleapis.com/css2?family=Open+Sans"
71
+ tone:
72
+ voice: "Confident and adventurous, but never pretentious. We talk to people who do things, not people who buy things."
73
+ attributes:
74
+ - "active"
75
+ - "direct"
76
+ - "warm"
77
+ dos:
78
+ - "Use action verbs"
79
+ - "Reference real outdoor activities"
80
+ - "Keep it short"
81
+ donts:
82
+ - "Use superlatives without evidence"
83
+ - "Talk down to the reader"
84
+ - "Use corporate jargon"
85
+
86
+ # Sample assets at common ad dimensions.
87
+ # These are placeholder URLs — in production, these would point to actual hosted test images.
88
+ assets:
89
+ images:
90
+ - id: "hero_300x250"
91
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-300x250.jpg"
92
+ width: 300
93
+ height: 250
94
+ mime_type: "image/jpeg"
95
+ description: "Medium rectangle hero — hiker on mountain trail"
96
+
97
+ - id: "hero_728x90"
98
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-728x90.jpg"
99
+ width: 728
100
+ height: 90
101
+ mime_type: "image/jpeg"
102
+ description: "Leaderboard hero — panoramic mountain vista"
103
+
104
+ - id: "hero_320x50"
105
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-320x50.jpg"
106
+ width: 320
107
+ height: 50
108
+ mime_type: "image/jpeg"
109
+ description: "Mobile banner hero — trail gear close-up"
110
+
111
+ - id: "hero_160x600"
112
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-160x600.jpg"
113
+ width: 160
114
+ height: 600
115
+ mime_type: "image/jpeg"
116
+ description: "Wide skyscraper hero — vertical trail scene"
117
+
118
+ - id: "hero_master"
119
+ url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-master.jpg"
120
+ width: 1200
121
+ height: 628
122
+ mime_type: "image/jpeg"
123
+ description: "Master hero image — high-res source for any size"
124
+
125
+ text:
126
+ headlines:
127
+ - "Summer Sale — 40% Off All Gear"
128
+ - "Built for the Trail"
129
+ - "Adventure Starts Here"
130
+ descriptions:
131
+ - "Premium outdoor gear tested on the world's toughest trails. Shop the summer collection."
132
+ - "From daypacks to expedition tents, gear that performs when it matters."
133
+ cta:
134
+ - "Shop Now"
135
+ - "Explore the Collection"
136
+ - "Find Your Gear"
137
+
138
+ click_url: "https://acmeoutdoor.example/summer-sale"
139
+
140
+ # Inventory list fixtures for property_list / collection_list targeting tests.
141
+ #
142
+ # These reference lists a fictional governance/inventory agent would publish.
143
+ # They let storyboards exercise the full PropertyListReference / CollectionListReference
144
+ # contract without needing a live list server: scenarios point at list_id values
145
+ # and the seller's test engine returns canned contents.
146
+ #
147
+ # Both matching and non-matching sets are provided so a single test fixture
148
+ # covers targeting (buy should include listed inventory) and no-match behaviour
149
+ # (buy references a list that resolves to zero matches in this seller's catalog).
150
+ inventory_targets:
151
+ # --- Matching sets (Acme Outdoor's intended audience) ---
152
+ matching_properties:
153
+ agent_url: "https://governance.pinnacle-agency.example"
154
+ list_id: "acme_outdoor_allowlist_v1"
155
+ description: "Outdoor lifestyle properties relevant to Acme Outdoor campaigns."
156
+ # Expected contents when the list is fetched via get_property_list.
157
+ expected_identifiers:
158
+ - type: domain
159
+ value: "outdoormagazine.example"
160
+ - type: domain
161
+ value: "hikingtrails.example"
162
+ - type: domain
163
+ value: "campinggear.example"
164
+ - type: domain
165
+ value: "mountaineering.example"
166
+
167
+ matching_collections:
168
+ agent_url: "https://governance.pinnacle-agency.example"
169
+ list_id: "acme_outdoor_collections_v1"
170
+ description: "Outdoor programming the buyer wants to run alongside."
171
+ # Expected collection entries when fetched via get_collection_list.
172
+ expected_collections:
173
+ - collection_rid: "rid:outdoor:trail_life"
174
+ name: "Trail Life"
175
+ kind: "series"
176
+ genre: "outdoor"
177
+ distribution_ids:
178
+ - type: imdb_id
179
+ value: "tt9100001"
180
+ - collection_rid: "rid:outdoor:summit_stories"
181
+ name: "Summit Stories"
182
+ kind: "series"
183
+ genre: "outdoor"
184
+ distribution_ids:
185
+ - type: imdb_id
186
+ value: "tt9100002"
187
+
188
+ # --- No-match sets (nothing in this seller's catalog matches) ---
189
+ no_match_properties:
190
+ agent_url: "https://governance.pinnacle-agency.example"
191
+ list_id: "acme_outdoor_no_match_v1"
192
+ description: "Properties outside this seller's inventory — should yield zero matches."
193
+ expected_identifiers:
194
+ - type: domain
195
+ value: "never-sold-here.example"
196
+ - type: domain
197
+ value: "also-not-indexed.example"
198
+
199
+ no_match_collections:
200
+ agent_url: "https://governance.pinnacle-agency.example"
201
+ list_id: "acme_outdoor_no_match_collections_v1"
202
+ description: "Collections not carried by this seller — should yield zero matches."
203
+ expected_collections:
204
+ - collection_rid: "rid:food:bistro_kitchen"
205
+ name: "Bistro Kitchen"
206
+ kind: "series"
207
+ genre: "food"
208
+ distribution_ids:
209
+ - type: imdb_id
210
+ value: "tt9200001"
@@ -0,0 +1,126 @@
1
+ # Bistro Oranje — Hospitality Advertiser Test Kit
2
+ #
3
+ # Entity definition: fictional-entities.yaml → advertisers[bistro_oranje]
4
+ #
5
+ # Dutch restaurant chain used in rights licensing scenarios.
6
+ #
7
+ # This brand is registered as a sandbox brand in AgenticAdvertising.org (AAO).
8
+ # Agents resolve bistro-oranje.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: bistro_oranje
13
+ name: "Bistro Oranje"
14
+ description: "Dutch restaurant chain for rights licensing storyboard testing"
15
+ sandbox: true
16
+
17
+ # security_baseline auth fixture — see acme-outdoor.yaml for semantics.
18
+ auth:
19
+ api_key: "demo-bistro-oranje-v1"
20
+ probe_task: list_creatives
21
+
22
+ brand:
23
+ house:
24
+ domain: "bistro-oranje.example"
25
+ name: "Bistro Oranje"
26
+ brand_id: "bistro_oranje"
27
+ names:
28
+ - en: "Bistro Oranje"
29
+ - nl: "Bistro Oranje"
30
+ description: "Modern Dutch dining — seasonal menus inspired by the Netherlands, served with warmth."
31
+ industry: "hospitality"
32
+ keller_type: "master"
33
+ logos:
34
+ - url: "https://test-assets.adcontextprotocol.org/bistro-oranje/logo-primary.png"
35
+ orientation: "horizontal"
36
+ background: "light-bg"
37
+ variant: "primary"
38
+ width: 400
39
+ height: 100
40
+ - url: "https://test-assets.adcontextprotocol.org/bistro-oranje/logo-icon.png"
41
+ orientation: "square"
42
+ background: "transparent-bg"
43
+ variant: "icon"
44
+ width: 200
45
+ height: 200
46
+ colors:
47
+ primary: "#E65100"
48
+ secondary: "#1B5E20"
49
+ accent: "#FFC107"
50
+ background: "#FFF8E1"
51
+ text: "#212121"
52
+ fonts:
53
+ heading:
54
+ family: "Playfair Display"
55
+ weight: 700
56
+ url: "https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700"
57
+ body:
58
+ family: "Source Sans Pro"
59
+ weight: 400
60
+ url: "https://fonts.googleapis.com/css2?family=Source+Sans+Pro"
61
+ tone:
62
+ voice: "Warm and inviting, with understated confidence. We let the food speak — no excess, no pretension."
63
+ attributes:
64
+ - "welcoming"
65
+ - "seasonal"
66
+ - "unpretentious"
67
+ dos:
68
+ - "Mention seasonal ingredients by name"
69
+ - "Reference Dutch culinary traditions"
70
+ - "Keep descriptions sensory and specific"
71
+ donts:
72
+ - "Use fine-dining jargon"
73
+ - "Overuse superlatives"
74
+ - "Promise exclusivity — Bistro Oranje is for everyone"
75
+
76
+ assets:
77
+ images:
78
+ - id: "hero_300x250"
79
+ url: "https://test-assets.adcontextprotocol.org/bistro-oranje/hero-300x250.jpg"
80
+ width: 300
81
+ height: 250
82
+ mime_type: "image/jpeg"
83
+ description: "Medium rectangle hero — seasonal dish on rustic table"
84
+
85
+ - id: "hero_728x90"
86
+ url: "https://test-assets.adcontextprotocol.org/bistro-oranje/hero-728x90.jpg"
87
+ width: 728
88
+ height: 90
89
+ mime_type: "image/jpeg"
90
+ description: "Leaderboard hero — bistro exterior with canal backdrop"
91
+
92
+ - id: "hero_320x50"
93
+ url: "https://test-assets.adcontextprotocol.org/bistro-oranje/hero-320x50.jpg"
94
+ width: 320
95
+ height: 50
96
+ mime_type: "image/jpeg"
97
+ description: "Mobile banner hero — close-up of signature stamppot"
98
+
99
+ - id: "hero_160x600"
100
+ url: "https://test-assets.adcontextprotocol.org/bistro-oranje/hero-160x600.jpg"
101
+ width: 160
102
+ height: 600
103
+ mime_type: "image/jpeg"
104
+ description: "Wide skyscraper hero — vertical dining room scene"
105
+
106
+ - id: "hero_master"
107
+ url: "https://test-assets.adcontextprotocol.org/bistro-oranje/hero-master.jpg"
108
+ width: 1200
109
+ height: 628
110
+ mime_type: "image/jpeg"
111
+ description: "Master hero image — high-res chef plating seasonal dish"
112
+
113
+ text:
114
+ headlines:
115
+ - "Taste the Season at Bistro Oranje"
116
+ - "Dutch Comfort, Modern Kitchen"
117
+ - "Reserve Your Table Tonight"
118
+ descriptions:
119
+ - "Seasonal menus inspired by Dutch tradition, made with ingredients sourced within 50km. Bistro Oranje — Amsterdam, Rotterdam, Utrecht."
120
+ - "From stamppot to stroopwafel, every dish tells a story. Book your table at Bistro Oranje."
121
+ cta:
122
+ - "Reserve a Table"
123
+ - "View the Menu"
124
+ - "Find a Location"
125
+
126
+ click_url: "https://bistro-oranje.example/reservations"