@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
package/bin/adcp.js CHANGED
@@ -694,6 +694,13 @@ function parseAgentOptions(args) {
694
694
  ? args[formatIdx + 1]
695
695
  : null;
696
696
 
697
+ // --summary-output is parsed locally inside `runFullAssessment`, but its
698
+ // value must be excluded from `positionalArgs` here so it doesn't
699
+ // accidentally get treated as a storyboard ID.
700
+ const summaryOutputIdx = args.indexOf('--summary-output');
701
+ const summaryOutputValue =
702
+ summaryOutputIdx !== -1 && summaryOutputIdx + 1 < args.length ? args[summaryOutputIdx + 1] : null;
703
+
697
704
  // Filter out flags and their values to find positional args. The `--file=PATH`
698
705
  // form is already removed by the `startsWith('--')` check; only the
699
706
  // space-separated value needs explicit exclusion. Use explicit nullish check
@@ -715,6 +722,7 @@ function parseAgentOptions(args) {
715
722
  invariantsValue,
716
723
  localAgentValue,
717
724
  formatValue,
725
+ summaryOutputValue,
718
726
  fileIndex !== -1 ? file : null,
719
727
  ].filter(v => v !== null && v !== undefined);
720
728
  const positionalArgs = args.filter(arg => !arg.startsWith('--') && !flagValues.includes(arg));
@@ -1145,6 +1153,7 @@ USAGE:
1145
1153
 
1146
1154
  COMMANDS:
1147
1155
  storyboard <subcommand> Test agent flows (run, list, show, step)
1156
+ specialism <subcommand> Inspect a compliance specialism (list, show)
1148
1157
  grade <subject> <url> Conformance graders (e.g. request-signing)
1149
1158
  fuzz <url> Property-based conformance fuzzing against schemas
1150
1159
  resolve <agent-url> Walk the brand_json_url discovery chain
@@ -1241,6 +1250,22 @@ RUN OPTIONS (full assessment):
1241
1250
  fallbacks, brand-domain heuristics, fixture
1242
1251
  substitutes). Agents that don't recognize the
1243
1252
  ext.adcp.disable_sandbox field ignore it.
1253
+ --summary-output PATH
1254
+ Write a narrow, schema-stable summary artifact
1255
+ to PATH (JSON: { schema_version, passed, failed,
1256
+ failures: [{storyboard_id, step_id, reason}] }).
1257
+ Pin downstream tooling (badges, Slack bots,
1258
+ dashboards) to this contract — the full
1259
+ ComplianceResult on stdout in --json mode evolves
1260
+ with the protocol. Independent of --json.
1261
+
1262
+ OUTPUT (always-on):
1263
+ Every run writes a compact summary to stderr with a greppable
1264
+ STORYBOARD-FAIL prefix when any step fails — visible regardless of
1265
+ --json mode or workflow continue-on-error wiring. When
1266
+ $GITHUB_STEP_SUMMARY is set (GitHub Actions), the same summary is
1267
+ appended as a markdown table so PR reviewers see failures without
1268
+ opening the run log.
1244
1269
 
1245
1270
  WEBHOOK OPTIONS:
1246
1271
  --webhook-receiver [MODE] Host an ephemeral receiver so expect_webhook*
@@ -1357,6 +1382,176 @@ EXAMPLES:
1357
1382
  }
1358
1383
  }
1359
1384
 
1385
+ // ────────────────────────────────────────────────────────────
1386
+ // Specialism command: inspect what CI will exercise per specialism slug.
1387
+ // ────────────────────────────────────────────────────────────
1388
+
1389
+ async function handleSpecialismCommand(args) {
1390
+ if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
1391
+ console.log(`
1392
+ Inspect a compliance specialism — what CI will actually exercise against
1393
+ your server, before you run anything.
1394
+
1395
+ USAGE:
1396
+ adcp specialism list [--json]
1397
+ adcp specialism show <slug> [--json]
1398
+
1399
+ SUBCOMMANDS:
1400
+ list Enumerate every specialism the compliance cache
1401
+ knows about (slug, protocol, status, title).
1402
+ show <slug> Print the resolved required scenarios, required
1403
+ tools, and storyboard phases for a specialism.
1404
+
1405
+ EXAMPLES:
1406
+ adcp specialism list
1407
+ adcp specialism show sales-guaranteed
1408
+ adcp specialism show creative-template --json
1409
+
1410
+ Specialism slugs are kebab-case (e.g. sales-guaranteed). Storyboard
1411
+ category IDs in the YAML are snake_case (e.g. sales_guaranteed) — same
1412
+ concept, two names. \`adcp specialism list\` always prints the slug.
1413
+ `);
1414
+ process.exit(0);
1415
+ }
1416
+
1417
+ const subcommand = args[0];
1418
+ const subArgs = args.slice(1);
1419
+ switch (subcommand) {
1420
+ case 'list':
1421
+ await handleSpecialismList(subArgs);
1422
+ break;
1423
+ case 'show':
1424
+ await handleSpecialismShow(subArgs);
1425
+ break;
1426
+ default:
1427
+ console.error(`Unknown specialism subcommand: ${subcommand}`);
1428
+ console.error(`Run 'adcp specialism --help' for usage.`);
1429
+ process.exit(2);
1430
+ }
1431
+ }
1432
+
1433
+ async function handleSpecialismList(args) {
1434
+ const { listSpecialisms } = await import('../dist/lib/testing/storyboard/index.js');
1435
+ const jsonOutput = args.includes('--json');
1436
+ const specialisms = listSpecialisms();
1437
+
1438
+ if (jsonOutput) {
1439
+ await writeJsonOutput(specialisms);
1440
+ return;
1441
+ }
1442
+
1443
+ console.log(`\nSpecialisms (${specialisms.length}) — from compliance cache:\n`);
1444
+ const slugWidth = Math.max(...specialisms.map(s => s.id.length), 'SLUG'.length);
1445
+ const protocolWidth = Math.max(...specialisms.map(s => s.protocol.length), 'PROTOCOL'.length);
1446
+ console.log(` ${'SLUG'.padEnd(slugWidth)} ${'PROTOCOL'.padEnd(protocolWidth)} STATUS TITLE`);
1447
+ console.log(` ${'─'.repeat(slugWidth)} ${'─'.repeat(protocolWidth)} ──────── ─────`);
1448
+ for (const s of specialisms) {
1449
+ console.log(
1450
+ ` ${s.id.padEnd(slugWidth)} ${s.protocol.padEnd(protocolWidth)} ${(s.status || '').padEnd(8)} ${s.title ?? ''}`
1451
+ );
1452
+ }
1453
+ console.log(`\n→ Run 'adcp specialism show <slug>' to see required scenarios, tools, and phases for a specialism.\n`);
1454
+ }
1455
+
1456
+ async function handleSpecialismShow(args) {
1457
+ const { loadSpecialismDetail } = await import('../dist/lib/testing/storyboard/index.js');
1458
+ const slug = args.find(a => !a.startsWith('--'));
1459
+ const jsonOutput = args.includes('--json');
1460
+
1461
+ if (!slug) {
1462
+ console.error('Usage: adcp specialism show <slug> [--json]');
1463
+ process.exit(2);
1464
+ }
1465
+
1466
+ let detail;
1467
+ try {
1468
+ detail = loadSpecialismDetail(slug);
1469
+ } catch (err) {
1470
+ console.error(err.message);
1471
+ process.exit(2);
1472
+ }
1473
+
1474
+ if (jsonOutput) {
1475
+ await writeJsonOutput({
1476
+ slug: detail.slug,
1477
+ protocol: detail.protocol,
1478
+ status: detail.status,
1479
+ title: detail.index_title ?? detail.storyboard.title,
1480
+ summary: detail.storyboard.summary,
1481
+ track: detail.storyboard.track,
1482
+ required_tools: detail.required_tools,
1483
+ invariants: detail.storyboard.invariants ?? null,
1484
+ phases: detail.storyboard.phases.map(p => ({
1485
+ id: p.id,
1486
+ title: p.title,
1487
+ steps: p.steps.map(s => ({ id: s.id, task: s.task })),
1488
+ })),
1489
+ required_scenarios: detail.required_scenarios.map(sb => ({
1490
+ id: sb.id,
1491
+ title: sb.title,
1492
+ category: sb.category,
1493
+ track: sb.track,
1494
+ step_count: sb.phases.reduce((n, p) => n + p.steps.length, 0),
1495
+ })),
1496
+ unresolved_scenarios: detail.unresolved_scenarios,
1497
+ });
1498
+ return;
1499
+ }
1500
+
1501
+ const sb = detail.storyboard;
1502
+ const title = detail.index_title ?? sb.title;
1503
+ console.log(`\n${title}`);
1504
+ console.log('─'.repeat(title.length));
1505
+ console.log(`Slug: ${detail.slug}`);
1506
+ console.log(`Protocol: ${detail.protocol}`);
1507
+ console.log(`Status: ${detail.status}`);
1508
+ if (sb.track) console.log(`Track: ${sb.track}`);
1509
+ console.log(`\n${sb.summary}`);
1510
+
1511
+ if (detail.required_tools.length > 0) {
1512
+ console.log(`\nRequired Tools`);
1513
+ console.log('─'.repeat(50));
1514
+ for (const tool of detail.required_tools) console.log(` • ${tool}`);
1515
+ }
1516
+
1517
+ console.log(`\nStoryboard Phases (${sb.phases.length})`);
1518
+ console.log('─'.repeat(50));
1519
+ for (const phase of sb.phases) {
1520
+ console.log(` ${phase.id} — ${phase.title} (${phase.steps.length} step${phase.steps.length === 1 ? '' : 's'})`);
1521
+ }
1522
+
1523
+ console.log(`\nRequired Scenarios (${detail.required_scenarios.length})`);
1524
+ console.log('─'.repeat(50));
1525
+ if (detail.required_scenarios.length === 0) {
1526
+ console.log(' (none)');
1527
+ } else {
1528
+ for (const scn of detail.required_scenarios) {
1529
+ const stepCount = scn.phases.reduce((n, p) => n + p.steps.length, 0);
1530
+ console.log(` • ${scn.id} — ${scn.title} (${stepCount} step${stepCount === 1 ? '' : 's'})`);
1531
+ }
1532
+ }
1533
+ if (detail.unresolved_scenarios.length > 0) {
1534
+ console.log(`\n⚠️ Unresolved (${detail.unresolved_scenarios.length}):`);
1535
+ for (const ref of detail.unresolved_scenarios) console.log(` • ${ref}`);
1536
+ console.log(
1537
+ ` Run \`npm run sync-schemas\` to refresh the cache, or these scenarios may be on a newer AdCP version.`
1538
+ );
1539
+ }
1540
+
1541
+ if (sb.invariants) {
1542
+ console.log(`\nInvariants`);
1543
+ console.log('─'.repeat(50));
1544
+ const inv = sb.invariants;
1545
+ if (Array.isArray(inv)) {
1546
+ for (const id of inv) console.log(` + ${id}`);
1547
+ } else {
1548
+ if (inv.enable?.length) for (const id of inv.enable) console.log(` + ${id}`);
1549
+ if (inv.disable?.length) for (const id of inv.disable) console.log(` − ${id}`);
1550
+ }
1551
+ }
1552
+ console.log('');
1553
+ }
1554
+
1360
1555
  async function handleStoryboardList(args) {
1361
1556
  const { listBundles, loadBundleStoryboards } = await import('../dist/lib/testing/storyboard/index.js');
1362
1557
  const jsonOutput = args.includes('--json');
@@ -3296,11 +3491,56 @@ async function runFullAssessment(agentArg, rawArgs, parsedOpts) {
3296
3491
  console.log('');
3297
3492
  }
3298
3493
 
3494
+ // --summary-output <path>: write the narrow ComplianceSummaryArtifact JSON
3495
+ // (schema-stable: { schema_version, passed, failed, failures: [...] }) to
3496
+ // a file. The full ComplianceResult on stdout in --json mode evolves with
3497
+ // the protocol; the summary contract is what downstream tooling
3498
+ // (badges, Slack bots, dashboards) should pin to.
3499
+ const summaryOutputIndex = rawArgs.indexOf('--summary-output');
3500
+ let summaryOutputPath = null;
3501
+ if (summaryOutputIndex !== -1) {
3502
+ if (summaryOutputIndex + 1 >= rawArgs.length) {
3503
+ console.error('ERROR: --summary-output requires a file path\n');
3504
+ process.exit(2);
3505
+ }
3506
+ summaryOutputPath = rawArgs[summaryOutputIndex + 1];
3507
+ }
3508
+
3509
+ const {
3510
+ comply,
3511
+ formatComplianceResults,
3512
+ formatComplianceResultsJSON,
3513
+ buildComplianceSummary,
3514
+ buildCrashSummary,
3515
+ formatComplianceSummaryText,
3516
+ formatComplianceSummaryMarkdown,
3517
+ } = await import('../dist/lib/testing/compliance/index.js');
3518
+ const { ADCP_VERSION } = await import('../dist/lib/version.js');
3519
+
3520
+ function emitSummary(summary) {
3521
+ process.stderr.write(formatComplianceSummaryText(summary));
3522
+ if (process.env.GITHUB_STEP_SUMMARY) {
3523
+ try {
3524
+ const fs = require('fs');
3525
+ fs.appendFileSync(process.env.GITHUB_STEP_SUMMARY, formatComplianceSummaryMarkdown(summary) + '\n');
3526
+ } catch (err) {
3527
+ process.stderr.write(`\nWarning: could not write GITHUB_STEP_SUMMARY: ${err.message}\n`);
3528
+ }
3529
+ }
3530
+ if (summaryOutputPath) {
3531
+ try {
3532
+ const fs = require('fs');
3533
+ fs.writeFileSync(summaryOutputPath, JSON.stringify(summary, null, 2) + '\n');
3534
+ } catch (err) {
3535
+ process.stderr.write(`\nWarning: could not write --summary-output to ${summaryOutputPath}: ${err.message}\n`);
3536
+ }
3537
+ }
3538
+ }
3539
+
3299
3540
  const restoreLogs = opts.jsonOutput ? captureStdoutLogs() : null;
3541
+ const startedAt = new Date().toISOString();
3542
+ const runStartTime = Date.now();
3300
3543
  try {
3301
- const { comply, formatComplianceResults, formatComplianceResultsJSON } =
3302
- await import('../dist/lib/testing/compliance/index.js');
3303
-
3304
3544
  const { setAgentTesterLogger } = await import('../dist/lib/testing/client.js');
3305
3545
  if (!opts.debug) {
3306
3546
  setAgentTesterLogger({ info: () => {}, error: () => {}, warn: () => {}, debug: () => {} });
@@ -3315,12 +3555,47 @@ async function runFullAssessment(agentArg, rawArgs, parsedOpts) {
3315
3555
  console.log(formatComplianceResults(result));
3316
3556
  }
3317
3557
 
3318
- const hasFailures = result.summary.tracks_failed > 0;
3319
- process.exit(hasFailures ? 3 : 0);
3558
+ // Always-on summary. STORYBOARD-FAIL fires on any non-passing run so
3559
+ // CI greppers see failures regardless of `continue-on-error: true` or
3560
+ // `|| true` shenanigans.
3561
+ const summary = buildComplianceSummary(result, {
3562
+ sdkVersion: LIBRARY_VERSION,
3563
+ adcpVersion: ADCP_VERSION,
3564
+ });
3565
+ emitSummary(summary);
3566
+
3567
+ // Exit code policy: anything that doesn't represent "the agent
3568
+ // exercised its tracks and they passed" is a CI failure. `partial`
3569
+ // is preserved as exit 0 because some tracks were silent (wired but
3570
+ // unexercised) — that's a reportable observation, not a hard failure.
3571
+ const exitCode =
3572
+ result.overall_status === 'failing' ||
3573
+ result.overall_status === 'unreachable' ||
3574
+ result.overall_status === 'auth_required'
3575
+ ? 3
3576
+ : 0;
3577
+ process.exit(exitCode);
3320
3578
  } catch (error) {
3321
3579
  if (restoreLogs) restoreLogs();
3322
3580
  console.error(`\nAssessment failed: ${error.message}`);
3323
3581
  if (opts.debug) console.error(error.stack);
3582
+
3583
+ // Crash-path summary. Without this, a network drop or capabilities
3584
+ // parse error silently exits 1 with no `STORYBOARD-FAIL` marker —
3585
+ // breaking the always-on promise on the path where it matters most.
3586
+ try {
3587
+ const crashSummary = buildCrashSummary({
3588
+ sdkVersion: LIBRARY_VERSION,
3589
+ adcpVersion: ADCP_VERSION,
3590
+ agentUrl,
3591
+ error,
3592
+ startedAt,
3593
+ durationMs: Date.now() - runStartTime,
3594
+ });
3595
+ emitSummary(crashSummary);
3596
+ } catch {
3597
+ // Summary emission must never mask the original crash.
3598
+ }
3324
3599
  process.exit(1);
3325
3600
  }
3326
3601
  }
@@ -3839,6 +4114,11 @@ async function main() {
3839
4114
  return;
3840
4115
  }
3841
4116
 
4117
+ if (args[0] === 'specialism') {
4118
+ await handleSpecialismCommand(args.slice(1));
4119
+ return;
4120
+ }
4121
+
3842
4122
  if (args[0] === 'check-network') {
3843
4123
  await handleCheckNetworkCommand(args.slice(1));
3844
4124
  return;
@@ -0,0 +1,163 @@
1
+ id: brand_baseline
2
+ version: "1.0.0"
3
+ title: "Brand baseline"
4
+ protocol: brand
5
+ category: brand_baseline
6
+ summary: "Baseline protocol storyboard — every brand agent must declare the brand protocol in capabilities and return a schema-valid brand identity."
7
+ track: brand
8
+ required_tools:
9
+ - get_brand_identity
10
+
11
+ narrative: |
12
+ Brand protocol agents are the identity layer of AdCP. Their job is to hold
13
+ brand identity data (names, logos, colors, fonts, tone) and expose it to
14
+ other agents — buyer agents, creative agents, DSPs — that need to render
15
+ on-brand creative or verify who a campaign is for.
16
+
17
+ The baseline tests the minimum contract that every brand agent honors,
18
+ regardless of what additional capabilities (rights licensing, creative
19
+ approval) it layers on top:
20
+
21
+ 1. Declare `brand` in `supported_protocols` on `get_adcp_capabilities`.
22
+ 2. Respond to `get_brand_identity` with a schema-valid identity manifest.
23
+ 3. Reject unknown `brand_id` values with a structured error.
24
+
25
+ Rights licensing (`get_rights`, `acquire_rights`, `update_rights`,
26
+ `creative_approval`) ships experimentally in 3.0 and is covered by the
27
+ `brand-rights` specialism storyboard, not this baseline.
28
+
29
+ agent:
30
+ interaction_model: brand_agent
31
+ capabilities: []
32
+ examples:
33
+ - "Any brand agent (simple identity host or full rights platform)"
34
+ - "Brand-owned agents (Acme Outdoor)"
35
+ - "Third-party brand identity platforms"
36
+ - "Agency-hosted brand agents"
37
+
38
+ caller:
39
+ role: buyer_agent
40
+ example: "Any buyer, creative agent, or DSP needing brand identity"
41
+
42
+ prerequisites:
43
+ description: |
44
+ The test kit provides a sample brand (Nova Motors) that any brand agent
45
+ can serve identity for.
46
+ test_kit: "test-kits/nova-motors.yaml"
47
+
48
+ phases:
49
+ - id: capability_discovery
50
+ title: "Capability discovery"
51
+ narrative: |
52
+ The buyer calls `get_adcp_capabilities` to confirm the agent declares
53
+ the brand protocol before issuing any brand-identity call.
54
+
55
+ steps:
56
+ - id: get_capabilities
57
+ title: "Check agent capabilities"
58
+ narrative: |
59
+ Verify that the agent declares `brand` in `supported_protocols`.
60
+ Without this claim the buyer MUST NOT send `get_brand_identity`.
61
+ task: get_adcp_capabilities
62
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
63
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
64
+ doc_ref: "/protocol/get_adcp_capabilities"
65
+ comply_scenario: capability_discovery
66
+ stateful: false
67
+ expected: |
68
+ Return capabilities declaring `brand` in `supported_protocols`.
69
+
70
+ sample_request:
71
+ context:
72
+ correlation_id: "brand_baseline--get_capabilities"
73
+ validations:
74
+ - check: response_schema
75
+ description: "Response matches get-adcp-capabilities-response.json schema"
76
+ - check: field_present
77
+ path: "supported_protocols"
78
+ description: "Response declares supported_protocols"
79
+
80
+ - id: brand_identity_retrieval
81
+ title: "Brand identity retrieval"
82
+ narrative: |
83
+ The buyer calls `get_brand_identity` to retrieve the brand's identity
84
+ manifest. The minimum contract is a schema-valid response that echoes
85
+ the requested `brand_id` and carries at least one name.
86
+
87
+ steps:
88
+ - id: get_brand_identity
89
+ title: "Retrieve brand identity"
90
+ narrative: |
91
+ The buyer calls `get_brand_identity` with a known `brand_id`. The
92
+ response MUST match the brand-identity schema and echo the
93
+ requested `brand_id`. Rich fields (logos, colors, fonts, tone,
94
+ visual_guidelines) are optional at the baseline level — the
95
+ minimum bar is that identity resolution works and is schema-valid.
96
+ task: get_brand_identity
97
+ schema_ref: "brand/get-brand-identity-request.json"
98
+ response_schema_ref: "brand/get-brand-identity-response.json"
99
+ doc_ref: "/brand-protocol/tasks/get_brand_identity"
100
+ stateful: false
101
+ expected: |
102
+ Return a schema-valid brand identity that echoes the requested
103
+ brand_id and includes at least one name.
104
+
105
+ sample_request:
106
+ brand_id: "nova_motors"
107
+ context:
108
+ correlation_id: "brand_baseline--get_brand_identity"
109
+ context_outputs:
110
+ - path: "brand_id"
111
+ key: "brand_id"
112
+
113
+ validations:
114
+ - check: response_schema
115
+ description: "Response matches get-brand-identity-response.json schema"
116
+ - check: field_present
117
+ path: "brand_id"
118
+ description: "Response includes brand_id"
119
+ - check: field_value
120
+ path: "brand_id"
121
+ value: "nova_motors"
122
+ description: "Returned brand_id echoes the requested brand"
123
+ - check: field_present
124
+ path: "names"
125
+ description: "Response includes brand names"
126
+
127
+ - id: unknown_brand_rejection
128
+ title: "Unknown brand rejection"
129
+ narrative: |
130
+ Agents MUST reject unknown `brand_id` values with a structured
131
+ AdCP error rather than returning an empty or fabricated manifest.
132
+
133
+ steps:
134
+ - id: get_brand_identity_unknown
135
+ title: "Reject unknown brand ID"
136
+ narrative: |
137
+ The buyer calls `get_brand_identity` with a `brand_id` the agent
138
+ does not serve. The response MUST be a structured error with a
139
+ recovery classification — not a success response with empty
140
+ fields.
141
+ task: get_brand_identity
142
+ schema_ref: "brand/get-brand-identity-request.json"
143
+ response_schema_ref: "brand/get-brand-identity-response.json"
144
+ doc_ref: "/brand-protocol/tasks/get_brand_identity"
145
+ stateful: false
146
+ expected: |
147
+ Return an AdCP error response indicating the brand is not known
148
+ to this agent.
149
+
150
+ sample_request:
151
+ brand_id: "brand_that_does_not_exist_12345"
152
+ context:
153
+ correlation_id: "brand_baseline--get_brand_identity_unknown"
154
+
155
+ expect_error: true
156
+ negative_path: payload_well_formed
157
+ validations:
158
+ - check: error_code
159
+ allowed_values:
160
+ - "brand_not_found"
161
+ - "BRAND_NOT_FOUND"
162
+ - "NOT_FOUND"
163
+ description: "Error code indicates brand-not-found"