@adcp/sdk 14.0.0-rc.38 → 14.0.0-rc.39

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 (600) hide show
  1. package/bin/adcp-storyboard-summary.js +286 -0
  2. package/bin/adcp.js +221 -10
  3. package/dist/lib/conformance/schemaLoader.d.mts +1 -1
  4. package/dist/lib/conformance/schemaLoader.d.ts +1 -1
  5. package/dist/lib/core/AgentClient.d.mts +6 -1
  6. package/dist/lib/core/AgentClient.d.ts +6 -1
  7. package/dist/lib/core/AgentClient.js +9 -0
  8. package/dist/lib/core/AgentClient.mjs +9 -0
  9. package/dist/lib/core/ConversationTypes.d.mts +29 -0
  10. package/dist/lib/core/ConversationTypes.d.ts +29 -0
  11. package/dist/lib/core/SingleAgentClient.d.mts +3 -1
  12. package/dist/lib/core/SingleAgentClient.d.ts +3 -1
  13. package/dist/lib/core/SingleAgentClient.js +9 -1
  14. package/dist/lib/core/SingleAgentClient.mjs +9 -1
  15. package/dist/lib/core/TaskExecutor.d.mts +13 -1
  16. package/dist/lib/core/TaskExecutor.d.ts +13 -1
  17. package/dist/lib/core/TaskExecutor.js +216 -18
  18. package/dist/lib/core/TaskExecutor.mjs +216 -19
  19. package/dist/lib/index.d.mts +5 -2
  20. package/dist/lib/index.d.ts +5 -2
  21. package/dist/lib/index.js +10 -1
  22. package/dist/lib/index.mjs +10 -1
  23. package/dist/lib/media-buy/action-assessment.d.mts +77 -0
  24. package/dist/lib/media-buy/action-assessment.d.ts +77 -0
  25. package/dist/lib/media-buy/action-assessment.js +300 -0
  26. package/dist/lib/media-buy/action-assessment.mjs +284 -0
  27. package/dist/lib/media-buy/action-constraints.d.mts +9 -0
  28. package/dist/lib/media-buy/action-constraints.d.ts +9 -0
  29. package/dist/lib/media-buy/action-constraints.js +170 -0
  30. package/dist/lib/media-buy/action-constraints.mjs +146 -0
  31. package/dist/lib/media-buy/action-contracts.d.mts +40 -0
  32. package/dist/lib/media-buy/action-contracts.d.ts +40 -0
  33. package/dist/lib/media-buy/action-contracts.js +304 -0
  34. package/dist/lib/media-buy/action-contracts.mjs +267 -0
  35. package/dist/lib/media-buy/action-metadata.generated.d.mts +37 -0
  36. package/dist/lib/media-buy/action-metadata.generated.d.ts +37 -0
  37. package/dist/lib/media-buy/action-metadata.generated.js +128 -0
  38. package/dist/lib/media-buy/action-metadata.generated.mjs +101 -0
  39. package/dist/lib/media-buy/action-types.d.mts +106 -0
  40. package/dist/lib/media-buy/action-types.d.ts +106 -0
  41. package/dist/lib/{types/v3-1-beta/tools.generated.js → media-buy/action-types.js} +2 -2
  42. package/dist/lib/media-buy/actions.d.mts +6 -0
  43. package/dist/lib/media-buy/actions.d.ts +6 -0
  44. package/dist/lib/media-buy/actions.js +38 -0
  45. package/dist/lib/media-buy/actions.mjs +9 -0
  46. package/dist/lib/media-buy/available-actions.d.mts +2 -1
  47. package/dist/lib/media-buy/available-actions.d.ts +2 -1
  48. package/dist/lib/media-buy/available-actions.js +4 -3
  49. package/dist/lib/media-buy/available-actions.mjs +4 -3
  50. package/dist/lib/media-buy/compatibility.js +3 -0
  51. package/dist/lib/media-buy/compatibility.mjs +3 -0
  52. package/dist/lib/media-buy/index.d.mts +4 -0
  53. package/dist/lib/media-buy/index.d.ts +4 -0
  54. package/dist/lib/media-buy/index.js +3 -1
  55. package/dist/lib/media-buy/index.mjs +1 -0
  56. package/dist/lib/media-buy/legacy-action-ids.d.mts +1 -0
  57. package/dist/lib/media-buy/legacy-action-ids.d.ts +1 -0
  58. package/dist/lib/media-buy/legacy-action-ids.js +50 -0
  59. package/dist/lib/media-buy/legacy-action-ids.mjs +26 -0
  60. package/dist/lib/media-buy/mutations.d.mts +70 -0
  61. package/dist/lib/media-buy/mutations.d.ts +70 -0
  62. package/dist/lib/media-buy/mutations.js +525 -0
  63. package/dist/lib/media-buy/mutations.mjs +498 -0
  64. package/dist/lib/media-buy/preflight.d.mts +20 -69
  65. package/dist/lib/media-buy/preflight.d.ts +20 -69
  66. package/dist/lib/media-buy/preflight.js +100 -336
  67. package/dist/lib/media-buy/preflight.mjs +111 -333
  68. package/dist/lib/media-buy/targeting-input.d.mts +7 -4
  69. package/dist/lib/media-buy/targeting-input.d.ts +7 -4
  70. package/dist/lib/media-buy/types.d.mts +55 -7
  71. package/dist/lib/media-buy/types.d.ts +55 -7
  72. package/dist/lib/protocols/rawResponseCapture.d.mts +12 -0
  73. package/dist/lib/protocols/rawResponseCapture.d.ts +12 -0
  74. package/dist/lib/protocols/rawResponseCapture.js +33 -3
  75. package/dist/lib/protocols/rawResponseCapture.mjs +32 -3
  76. package/dist/lib/registry/types.generated.d.mts +377 -9
  77. package/dist/lib/registry/types.generated.d.ts +377 -9
  78. package/dist/lib/reporting/evidence.d.mts +1 -0
  79. package/dist/lib/reporting/evidence.d.ts +1 -0
  80. package/dist/lib/reporting/evidence.js +32 -3
  81. package/dist/lib/reporting/evidence.mjs +31 -3
  82. package/dist/lib/reporting/ledger/handler.d.mts +51 -1
  83. package/dist/lib/reporting/ledger/handler.d.ts +51 -1
  84. package/dist/lib/reporting/ledger/handler.js +306 -38
  85. package/dist/lib/reporting/ledger/handler.mjs +304 -37
  86. package/dist/lib/reporting/ledger/health.d.mts +12 -0
  87. package/dist/lib/reporting/ledger/health.d.ts +12 -0
  88. package/dist/lib/reporting/ledger/health.js +15 -2
  89. package/dist/lib/reporting/ledger/health.mjs +13 -1
  90. package/dist/lib/reporting/ledger/index.d.mts +3 -0
  91. package/dist/lib/reporting/ledger/index.d.ts +3 -0
  92. package/dist/lib/reporting/ledger/index.js +7 -1
  93. package/dist/lib/reporting/ledger/index.mjs +3 -0
  94. package/dist/lib/reporting/ledger/lifecycle.d.mts +31 -4
  95. package/dist/lib/reporting/ledger/lifecycle.d.ts +31 -4
  96. package/dist/lib/reporting/ledger/lifecycle.js +244 -37
  97. package/dist/lib/reporting/ledger/lifecycle.mjs +244 -37
  98. package/dist/lib/reporting/ledger/managed-postgres.d.mts +231 -0
  99. package/dist/lib/reporting/ledger/managed-postgres.d.ts +231 -0
  100. package/dist/lib/reporting/ledger/managed-postgres.js +1797 -0
  101. package/dist/lib/reporting/ledger/managed-postgres.mjs +1776 -0
  102. package/dist/lib/reporting/ledger/managed.d.mts +355 -0
  103. package/dist/lib/reporting/ledger/managed.d.ts +355 -0
  104. package/dist/lib/reporting/ledger/managed.js +661 -0
  105. package/dist/lib/reporting/ledger/managed.mjs +633 -0
  106. package/dist/lib/reporting/ledger/notification-activity.d.mts +222 -0
  107. package/dist/lib/reporting/ledger/notification-activity.d.ts +222 -0
  108. package/dist/lib/reporting/ledger/notification-activity.js +1139 -0
  109. package/dist/lib/reporting/ledger/notification-activity.mjs +1110 -0
  110. package/dist/lib/reporting/ledger/postgres.d.mts +161 -1
  111. package/dist/lib/reporting/ledger/postgres.d.ts +161 -1
  112. package/dist/lib/reporting/ledger/postgres.js +1153 -21
  113. package/dist/lib/reporting/ledger/postgres.mjs +1152 -21
  114. package/dist/lib/reporting/ledger/producer.d.mts +8 -0
  115. package/dist/lib/reporting/ledger/producer.d.ts +8 -0
  116. package/dist/lib/reporting/ledger/producer.js +146 -52
  117. package/dist/lib/reporting/ledger/producer.mjs +146 -51
  118. package/dist/lib/reporting/ledger/types.d.mts +358 -1
  119. package/dist/lib/reporting/ledger/types.d.ts +358 -1
  120. package/dist/lib/reporting/ledger/types.js +3 -0
  121. package/dist/lib/reporting/ledger/types.mjs +2 -0
  122. package/dist/lib/reporting/service/conformance.d.mts +35 -0
  123. package/dist/lib/reporting/service/conformance.d.ts +35 -0
  124. package/dist/lib/reporting/service/conformance.js +89 -0
  125. package/dist/lib/reporting/service/conformance.mjs +68 -0
  126. package/dist/lib/reporting/service/index.d.mts +182 -0
  127. package/dist/lib/reporting/service/index.d.ts +182 -0
  128. package/dist/lib/reporting/service/index.js +793 -0
  129. package/dist/lib/reporting/service/index.mjs +787 -0
  130. package/dist/lib/reporting/source/index.d.mts +2 -1
  131. package/dist/lib/reporting/source/index.d.ts +2 -1
  132. package/dist/lib/reporting/source/index.js +16 -3
  133. package/dist/lib/reporting/source/index.mjs +12 -1
  134. package/dist/lib/reporting/source/inline.d.mts +88 -1
  135. package/dist/lib/reporting/source/inline.d.ts +88 -1
  136. package/dist/lib/reporting/source/inline.js +1161 -163
  137. package/dist/lib/reporting/source/inline.mjs +1166 -163
  138. package/dist/lib/reporting/source/manifest.js +12 -7
  139. package/dist/lib/reporting/source/manifest.mjs +12 -7
  140. package/dist/lib/reporting/source/source.d.mts +26 -0
  141. package/dist/lib/reporting/source/source.d.ts +26 -0
  142. package/dist/lib/reporting/source/source.js +71 -2
  143. package/dist/lib/reporting/source/source.mjs +65 -1
  144. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  145. package/dist/lib/server/create-adcp-server.d.mts +18 -0
  146. package/dist/lib/server/create-adcp-server.d.ts +18 -0
  147. package/dist/lib/server/create-adcp-server.js +52 -2
  148. package/dist/lib/server/create-adcp-server.mjs +52 -2
  149. package/dist/lib/server/decisioning/account.d.mts +1 -1
  150. package/dist/lib/server/decisioning/account.d.ts +1 -1
  151. package/dist/lib/server/decisioning/index.d.mts +1 -0
  152. package/dist/lib/server/decisioning/index.d.ts +1 -0
  153. package/dist/lib/server/decisioning/platform.d.mts +3 -0
  154. package/dist/lib/server/decisioning/platform.d.ts +3 -0
  155. package/dist/lib/server/decisioning/runtime/from-platform.js +88 -10
  156. package/dist/lib/server/decisioning/runtime/from-platform.mjs +88 -10
  157. package/dist/lib/server/decisioning/specialisms/reporting.d.mts +38 -0
  158. package/dist/lib/server/decisioning/specialisms/reporting.d.ts +38 -0
  159. package/dist/lib/{types/v3-1-beta/index.js → server/decisioning/specialisms/reporting.js} +2 -8
  160. package/dist/lib/server/decisioning/specialisms/reporting.mjs +0 -0
  161. package/dist/lib/server/index.d.mts +4 -2
  162. package/dist/lib/server/index.d.ts +4 -2
  163. package/dist/lib/server/index.js +5 -0
  164. package/dist/lib/server/index.mjs +4 -0
  165. package/dist/lib/server/media-buy-action-resolver.d.mts +63 -0
  166. package/dist/lib/server/media-buy-action-resolver.d.ts +63 -0
  167. package/dist/lib/server/media-buy-action-resolver.js +297 -0
  168. package/dist/lib/server/media-buy-action-resolver.mjs +285 -0
  169. package/dist/lib/server/media-buy-actions.d.mts +7 -8
  170. package/dist/lib/server/media-buy-actions.d.ts +7 -8
  171. package/dist/lib/server/media-buy-actions.js +57 -14
  172. package/dist/lib/server/media-buy-actions.mjs +63 -14
  173. package/dist/lib/server/notification-subscriptions/index.d.mts +2 -2
  174. package/dist/lib/server/notification-subscriptions/index.d.ts +2 -2
  175. package/dist/lib/server/notification-subscriptions/index.js +2 -0
  176. package/dist/lib/server/notification-subscriptions/index.mjs +2 -0
  177. package/dist/lib/server/notification-subscriptions/postgres-runtime.d.mts +3 -1
  178. package/dist/lib/server/notification-subscriptions/postgres-runtime.d.ts +3 -1
  179. package/dist/lib/server/notification-subscriptions/postgres-runtime.js +1 -0
  180. package/dist/lib/server/notification-subscriptions/postgres-runtime.mjs +1 -0
  181. package/dist/lib/server/notification-subscriptions/runtime.d.mts +12 -1
  182. package/dist/lib/server/notification-subscriptions/runtime.d.ts +12 -1
  183. package/dist/lib/server/notification-subscriptions/runtime.js +102 -16
  184. package/dist/lib/server/notification-subscriptions/runtime.mjs +101 -16
  185. package/dist/lib/server/notification-subscriptions/types.d.mts +104 -1
  186. package/dist/lib/server/notification-subscriptions/types.d.ts +104 -1
  187. package/dist/lib/server/webhook-emitter.d.mts +40 -5
  188. package/dist/lib/server/webhook-emitter.d.ts +40 -5
  189. package/dist/lib/server/webhook-emitter.js +23 -12
  190. package/dist/lib/server/webhook-emitter.mjs +23 -12
  191. package/dist/lib/storage/interfaces.d.mts +14 -2
  192. package/dist/lib/storage/interfaces.d.ts +14 -2
  193. package/dist/lib/testing/compliance/comply.d.mts +9 -3
  194. package/dist/lib/testing/compliance/comply.d.ts +9 -3
  195. package/dist/lib/testing/compliance/comply.js +158 -3
  196. package/dist/lib/testing/compliance/comply.mjs +159 -4
  197. package/dist/lib/testing/compliance/storyboard-tracks.js +7 -5
  198. package/dist/lib/testing/compliance/storyboard-tracks.mjs +7 -5
  199. package/dist/lib/testing/compliance/summary.js +10 -1
  200. package/dist/lib/testing/compliance/summary.mjs +10 -1
  201. package/dist/lib/testing/index.d.mts +1 -1
  202. package/dist/lib/testing/index.d.ts +1 -1
  203. package/dist/lib/testing/index.js +2 -0
  204. package/dist/lib/testing/index.mjs +3 -1
  205. package/dist/lib/testing/storyboard/agent-routing.d.mts +12 -43
  206. package/dist/lib/testing/storyboard/agent-routing.d.ts +12 -43
  207. package/dist/lib/testing/storyboard/agent-routing.js +75 -13
  208. package/dist/lib/testing/storyboard/agent-routing.mjs +70 -12
  209. package/dist/lib/testing/storyboard/index.d.mts +1 -0
  210. package/dist/lib/testing/storyboard/index.d.ts +1 -0
  211. package/dist/lib/testing/storyboard/index.js +3 -0
  212. package/dist/lib/testing/storyboard/index.mjs +2 -0
  213. package/dist/lib/testing/storyboard/junit.d.mts +1 -1
  214. package/dist/lib/testing/storyboard/junit.d.ts +1 -1
  215. package/dist/lib/testing/storyboard/junit.js +21 -2
  216. package/dist/lib/testing/storyboard/junit.mjs +21 -2
  217. package/dist/lib/testing/storyboard/probes.d.mts +130 -0
  218. package/dist/lib/testing/storyboard/probes.d.ts +130 -0
  219. package/dist/lib/testing/storyboard/probes.js +682 -10
  220. package/dist/lib/testing/storyboard/probes.mjs +683 -3
  221. package/dist/lib/testing/storyboard/request-signing/builder.d.mts +16 -5
  222. package/dist/lib/testing/storyboard/request-signing/builder.d.ts +16 -5
  223. package/dist/lib/testing/storyboard/request-signing/grader.d.mts +44 -1
  224. package/dist/lib/testing/storyboard/request-signing/grader.d.ts +44 -1
  225. package/dist/lib/testing/storyboard/request-signing/grader.js +46 -22
  226. package/dist/lib/testing/storyboard/request-signing/grader.mjs +43 -21
  227. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.mts +86 -11
  228. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts +86 -11
  229. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js +119 -25
  230. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +117 -26
  231. package/dist/lib/testing/storyboard/request-signing/synthesize.js +22 -2
  232. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +22 -2
  233. package/dist/lib/testing/storyboard/runner.d.mts +103 -0
  234. package/dist/lib/testing/storyboard/runner.d.ts +103 -0
  235. package/dist/lib/testing/storyboard/runner.js +1090 -268
  236. package/dist/lib/testing/storyboard/runner.mjs +1096 -261
  237. package/dist/lib/testing/storyboard/seeding.d.mts +4 -1
  238. package/dist/lib/testing/storyboard/seeding.d.ts +4 -1
  239. package/dist/lib/testing/storyboard/seeding.js +55 -24
  240. package/dist/lib/testing/storyboard/seeding.mjs +55 -24
  241. package/dist/lib/testing/storyboard/test-kit.d.mts +37 -3
  242. package/dist/lib/testing/storyboard/test-kit.d.ts +37 -3
  243. package/dist/lib/testing/storyboard/test-kit.js +8 -2
  244. package/dist/lib/testing/storyboard/test-kit.mjs +7 -2
  245. package/dist/lib/testing/storyboard/types.d.mts +132 -10
  246. package/dist/lib/testing/storyboard/types.d.ts +132 -10
  247. package/dist/lib/testing/storyboard/types.js +17 -0
  248. package/dist/lib/testing/storyboard/types.mjs +16 -0
  249. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  250. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  251. package/dist/lib/testing/storyboard/validations.js +16 -0
  252. package/dist/lib/testing/storyboard/validations.mjs +16 -0
  253. package/dist/lib/testing/test-controller.d.mts +1 -1
  254. package/dist/lib/testing/test-controller.d.ts +1 -1
  255. package/dist/lib/types/buy-products.d.ts +71 -6
  256. package/dist/lib/types/control-media-buy.d.ts +25 -11
  257. package/dist/lib/types/core.generated.d.mts +69 -10
  258. package/dist/lib/types/core.generated.d.ts +69 -10
  259. package/dist/lib/types/create-media-buy.d.ts +71 -6
  260. package/dist/lib/types/forward-compat-error-codes.d.mts +7 -6
  261. package/dist/lib/types/forward-compat-error-codes.d.ts +7 -6
  262. package/dist/lib/types/index.d.mts +2 -2
  263. package/dist/lib/types/index.d.ts +2 -2
  264. package/dist/lib/types/schemas.generated.d.ts +8040 -8116
  265. package/dist/lib/types/schemas.generated.js +1074 -309
  266. package/dist/lib/types/schemas.generated.mjs +1068 -309
  267. package/dist/lib/types/tools.generated.d.mts +65 -6
  268. package/dist/lib/types/tools.generated.d.ts +65 -6
  269. package/dist/lib/types/update-media-buy.d.ts +71 -6
  270. package/dist/lib/utils/redact-secrets.d.mts +1 -1
  271. package/dist/lib/utils/redact-secrets.d.ts +1 -1
  272. package/dist/lib/utils/redact-secrets.js +1 -1
  273. package/dist/lib/utils/redact-secrets.mjs +1 -1
  274. package/dist/lib/v2/projection/cache-versions.d.mts +0 -1
  275. package/dist/lib/v2/projection/cache-versions.d.ts +0 -1
  276. package/dist/lib/v2/projection/cache-versions.js +1 -15
  277. package/dist/lib/v2/projection/cache-versions.mjs +1 -14
  278. package/dist/lib/v2/projection/canonical-properties.js +2 -2
  279. package/dist/lib/v2/projection/canonical-properties.mjs +3 -3
  280. package/dist/lib/v2/projection/registry.d.mts +1 -1
  281. package/dist/lib/v2/projection/registry.d.ts +1 -1
  282. package/dist/lib/v2/projection/registry.js +2 -2
  283. package/dist/lib/v2/projection/registry.mjs +3 -3
  284. package/dist/lib/version.d.mts +5 -5
  285. package/dist/lib/version.d.ts +5 -5
  286. package/dist/lib/version.js +3 -8
  287. package/dist/lib/version.mjs +3 -8
  288. package/dist/lib/wholesale-feed-sync/index.d.mts +1 -0
  289. package/dist/lib/wholesale-feed-sync/index.d.ts +1 -0
  290. package/dist/lib/wholesale-feed-sync/protocol-types.d.mts +42 -0
  291. package/dist/lib/wholesale-feed-sync/protocol-types.d.ts +42 -0
  292. package/dist/lib/wholesale-feed-sync/protocol-types.js +16 -0
  293. package/dist/lib/wholesale-feed-sync/protocol-types.mjs +0 -0
  294. package/dist/lib/wholesale-feed-sync/sync.d.mts +6 -6
  295. package/dist/lib/wholesale-feed-sync/sync.d.ts +6 -6
  296. package/dist/lib/wholesale-feed-sync/sync.js +3 -1
  297. package/dist/lib/wholesale-feed-sync/sync.mjs +3 -1
  298. package/dist/lib/wholesale-feed-sync/types.d.mts +15 -14
  299. package/dist/lib/wholesale-feed-sync/types.d.ts +15 -14
  300. package/dist/lib/wholesale-feed-sync/webhook-notification.d.mts +7 -5
  301. package/dist/lib/wholesale-feed-sync/webhook-notification.d.ts +7 -5
  302. package/dist/lib/wholesale-feed-sync/webhook-notification.js +45 -0
  303. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +44 -0
  304. package/docs/CLI.md +1 -1
  305. package/docs/TYPE-SUMMARY.md +118 -4
  306. package/docs/guides/ASYNC-API-REFERENCE.md +62 -1
  307. package/docs/guides/ASYNC-DEVELOPER-GUIDE.md +25 -0
  308. package/docs/guides/ASYNC-DOCUMENTATION-INDEX.md +3 -0
  309. package/docs/guides/BUYER-QUICKSTART-3.2.md +5 -0
  310. package/docs/guides/DURABLE-BUYER-WRITES.md +337 -0
  311. package/docs/guides/EXISTING-PLATFORM.md +35 -0
  312. package/docs/guides/MEDIA-BUY-3.2-COMPATIBILITY.md +7 -3
  313. package/docs/guides/MEDIA-BUY-ACTION-ASSESSMENT.md +300 -0
  314. package/docs/guides/REPORTING-LEDGER.md +654 -3
  315. package/docs/guides/REPORTING-SOURCE-EXECUTOR.md +63 -1
  316. package/docs/guides/SELLER-QUICKSTART-3.2.md +2 -0
  317. package/docs/guides/VALIDATE-YOUR-AGENT.md +35 -0
  318. package/docs/guides/idempotency-crash-recovery.md +4 -0
  319. package/docs/llms.txt +4 -2
  320. package/docs/migration-14.x-rc-worksheet.md +5 -5
  321. package/docs/migration-7.9-to-7.10.md +7 -5
  322. package/examples/README.md +17 -0
  323. package/examples/durable-buyer-writes/caller.ts +745 -0
  324. package/examples/durable-buyer-writes/worker.ts +240 -0
  325. package/examples/reliable-reporting-service/README.md +100 -0
  326. package/examples/seller-3.2-starter.ts +7 -8
  327. package/examples/targeting-input-existing-platform.ts +153 -0
  328. package/package.json +41 -29
  329. package/skills/build-seller-agent/specialisms/signed-requests.md +11 -1
  330. package/skills/cross-cutting.md +28 -11
  331. package/compliance/cache/3.1.0-beta.7/domains/brand/index.yaml +0 -160
  332. package/compliance/cache/3.1.0-beta.7/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -415
  333. package/compliance/cache/3.1.0-beta.7/domains/brand/scenarios/single_side_trust_extension.yaml +0 -454
  334. package/compliance/cache/3.1.0-beta.7/domains/creative/index.yaml +0 -339
  335. package/compliance/cache/3.1.0-beta.7/domains/creative/scenarios/billing_out_of_band.yaml +0 -153
  336. package/compliance/cache/3.1.0-beta.7/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -389
  337. package/compliance/cache/3.1.0-beta.7/domains/creative/scenarios/native_in_feed.yaml +0 -543
  338. package/compliance/cache/3.1.0-beta.7/domains/governance/index.yaml +0 -682
  339. package/compliance/cache/3.1.0-beta.7/domains/media-buy/index.yaml +0 -781
  340. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -380
  341. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/available_actions.yaml +0 -565
  342. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -354
  343. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/canonical_formats.yaml +0 -711
  344. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -264
  345. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -344
  346. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -234
  347. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -419
  348. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/creative_reception.yaml +0 -247
  349. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/delivery_reporting.yaml +0 -357
  350. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/dependency_impairment.yaml +0 -633
  351. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -800
  352. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -399
  353. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -309
  354. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_approved.yaml +0 -214
  355. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_conditions.yaml +0 -199
  356. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_denied.yaml +0 -204
  357. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -252
  358. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/invalid_transitions.yaml +0 -289
  359. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  360. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -276
  361. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/measurement_accountability.yaml +0 -244
  362. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -203
  363. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -274
  364. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -500
  365. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -428
  366. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -470
  367. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -373
  368. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/proposal_finalize.yaml +0 -399
  369. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -264
  370. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -257
  371. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -333
  372. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -517
  373. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -294
  374. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -823
  375. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -360
  376. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/refine_products.yaml +0 -148
  377. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -293
  378. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -307
  379. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -576
  380. package/compliance/cache/3.1.0-beta.7/domains/media-buy/state-machine.yaml +0 -442
  381. package/compliance/cache/3.1.0-beta.7/domains/signals/index.yaml +0 -266
  382. package/compliance/cache/3.1.0-beta.7/domains/sponsored-intelligence/index.yaml +0 -256
  383. package/compliance/cache/3.1.0-beta.7/index.json +0 -356
  384. package/compliance/cache/3.1.0-beta.7/protocols/brand/index.yaml +0 -160
  385. package/compliance/cache/3.1.0-beta.7/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -415
  386. package/compliance/cache/3.1.0-beta.7/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -454
  387. package/compliance/cache/3.1.0-beta.7/protocols/creative/index.yaml +0 -339
  388. package/compliance/cache/3.1.0-beta.7/protocols/creative/scenarios/billing_out_of_band.yaml +0 -153
  389. package/compliance/cache/3.1.0-beta.7/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -389
  390. package/compliance/cache/3.1.0-beta.7/protocols/creative/scenarios/native_in_feed.yaml +0 -543
  391. package/compliance/cache/3.1.0-beta.7/protocols/governance/index.yaml +0 -682
  392. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/index.yaml +0 -781
  393. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -380
  394. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/available_actions.yaml +0 -565
  395. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -354
  396. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/canonical_formats.yaml +0 -711
  397. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -264
  398. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -344
  399. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -234
  400. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -419
  401. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/creative_reception.yaml +0 -247
  402. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -357
  403. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -633
  404. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -800
  405. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -399
  406. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -309
  407. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_approved.yaml +0 -214
  408. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_conditions.yaml +0 -199
  409. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_denied.yaml +0 -204
  410. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -252
  411. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -289
  412. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  413. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -276
  414. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -244
  415. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -203
  416. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -274
  417. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -500
  418. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -428
  419. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -470
  420. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -373
  421. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -399
  422. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -264
  423. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -257
  424. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -333
  425. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -517
  426. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -294
  427. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -823
  428. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -360
  429. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/refine_products.yaml +0 -148
  430. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -293
  431. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -307
  432. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -576
  433. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/state-machine.yaml +0 -442
  434. package/compliance/cache/3.1.0-beta.7/protocols/signals/index.yaml +0 -266
  435. package/compliance/cache/3.1.0-beta.7/protocols/sponsored-intelligence/index.yaml +0 -256
  436. package/compliance/cache/3.1.0-beta.7/specialisms/audience-sync/index.yaml +0 -313
  437. package/compliance/cache/3.1.0-beta.7/specialisms/brand-rights/index.yaml +0 -350
  438. package/compliance/cache/3.1.0-beta.7/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -226
  439. package/compliance/cache/3.1.0-beta.7/specialisms/collection-lists/index.yaml +0 -359
  440. package/compliance/cache/3.1.0-beta.7/specialisms/content-standards/index.yaml +0 -572
  441. package/compliance/cache/3.1.0-beta.7/specialisms/creative-ad-server/index.yaml +0 -409
  442. package/compliance/cache/3.1.0-beta.7/specialisms/creative-generative/generative-seller.yaml +0 -807
  443. package/compliance/cache/3.1.0-beta.7/specialisms/creative-generative/index.yaml +0 -758
  444. package/compliance/cache/3.1.0-beta.7/specialisms/creative-template/index.yaml +0 -510
  445. package/compliance/cache/3.1.0-beta.7/specialisms/governance-aware-seller/index.yaml +0 -143
  446. package/compliance/cache/3.1.0-beta.7/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -117
  447. package/compliance/cache/3.1.0-beta.7/specialisms/governance-delivery-monitor/index.yaml +0 -441
  448. package/compliance/cache/3.1.0-beta.7/specialisms/governance-spend-authority/denied.yaml +0 -221
  449. package/compliance/cache/3.1.0-beta.7/specialisms/governance-spend-authority/index.yaml +0 -330
  450. package/compliance/cache/3.1.0-beta.7/specialisms/property-lists/index.yaml +0 -482
  451. package/compliance/cache/3.1.0-beta.7/specialisms/sales-broadcast-tv/index.yaml +0 -738
  452. package/compliance/cache/3.1.0-beta.7/specialisms/sales-catalog-driven/index.yaml +0 -840
  453. package/compliance/cache/3.1.0-beta.7/specialisms/sales-guaranteed/index.yaml +0 -601
  454. package/compliance/cache/3.1.0-beta.7/specialisms/sales-non-guaranteed/index.yaml +0 -546
  455. package/compliance/cache/3.1.0-beta.7/specialisms/sales-proposal-mode/index.yaml +0 -586
  456. package/compliance/cache/3.1.0-beta.7/specialisms/sales-social/index.yaml +0 -919
  457. package/compliance/cache/3.1.0-beta.7/specialisms/signal-marketplace/index.yaml +0 -424
  458. package/compliance/cache/3.1.0-beta.7/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -211
  459. package/compliance/cache/3.1.0-beta.7/specialisms/signal-owned/index.yaml +0 -317
  460. package/compliance/cache/3.1.0-beta.7/specialisms/sponsored-intelligence/index.yaml +0 -59
  461. package/compliance/cache/3.1.0-beta.7/test-kits/acme-outdoor-live.yaml +0 -78
  462. package/compliance/cache/3.1.0-beta.7/test-kits/acme-outdoor.yaml +0 -223
  463. package/compliance/cache/3.1.0-beta.7/test-kits/billing-gate-runner.yaml +0 -115
  464. package/compliance/cache/3.1.0-beta.7/test-kits/bistro-oranje.yaml +0 -126
  465. package/compliance/cache/3.1.0-beta.7/test-kits/distributed-brand-runner.yaml +0 -281
  466. package/compliance/cache/3.1.0-beta.7/test-kits/nova-motors.yaml +0 -262
  467. package/compliance/cache/3.1.0-beta.7/test-kits/osei-natural.yaml +0 -126
  468. package/compliance/cache/3.1.0-beta.7/test-kits/parallel-dispatch-runner.yaml +0 -196
  469. package/compliance/cache/3.1.0-beta.7/test-kits/rate-limit-trip-runner.yaml +0 -172
  470. package/compliance/cache/3.1.0-beta.7/test-kits/signed-requests-runner.yaml +0 -155
  471. package/compliance/cache/3.1.0-beta.7/test-kits/single-side-trust-runner.yaml +0 -294
  472. package/compliance/cache/3.1.0-beta.7/test-kits/substitution-observer-runner.yaml +0 -688
  473. package/compliance/cache/3.1.0-beta.7/test-kits/summit-foods.yaml +0 -125
  474. package/compliance/cache/3.1.0-beta.7/test-kits/webhook-receiver-runner.yaml +0 -265
  475. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/001-minimal-plan.json +0 -43
  476. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/002-full-plan.json +0 -217
  477. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -60
  478. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/004a-human-review-omitted.json +0 -43
  479. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -49
  480. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -53
  481. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -57
  482. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -49
  483. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -53
  484. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/007-unicode-objectives.json +0 -43
  485. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -65
  486. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/README.md +0 -220
  487. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/canonicalization.json +0 -241
  488. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/keys.json +0 -60
  489. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/001-no-signature-header.json +0 -24
  490. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/002-wrong-tag.json +0 -26
  491. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/003-expired-signature.json +0 -26
  492. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/004-window-too-long.json +0 -26
  493. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -26
  494. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -26
  495. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -26
  496. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -26
  497. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -27
  498. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -33
  499. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/011-malformed-header.json +0 -27
  500. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -26
  501. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/013-expires-le-created.json +0 -27
  502. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -27
  503. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/015-signature-invalid.json +0 -28
  504. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -35
  505. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/017-key-revoked.json +0 -38
  506. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -28
  507. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -26
  508. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/020-rate-abuse.json +0 -34
  509. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -31
  510. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -31
  511. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -32
  512. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -31
  513. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -43
  514. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -31
  515. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -25
  516. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -26
  517. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/001-basic-post.json +0 -30
  518. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -31
  519. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/003-es256-post.json +0 -30
  520. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -26
  521. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -30
  522. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -30
  523. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -30
  524. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -30
  525. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -30
  526. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -30
  527. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -30
  528. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -30
  529. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/README.md +0 -211
  530. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/keys.json +0 -61
  531. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -26
  532. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -26
  533. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -26
  534. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -26
  535. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -26
  536. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -25
  537. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -26
  538. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -26
  539. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -26
  540. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -26
  541. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -25
  542. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -26
  543. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -26
  544. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -26
  545. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -26
  546. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -37
  547. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -32
  548. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -33
  549. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -32
  550. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -41
  551. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -26
  552. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/001-basic-post.json +0 -24
  553. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/002-es256-post.json +0 -24
  554. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -24
  555. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -24
  556. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -24
  557. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -24
  558. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -25
  559. package/compliance/cache/3.1.0-beta.7/universal/billing-gate-dispatch.yaml +0 -450
  560. package/compliance/cache/3.1.0-beta.7/universal/canonical-format-validate-input.yaml +0 -640
  561. package/compliance/cache/3.1.0-beta.7/universal/capability-discovery.yaml +0 -125
  562. package/compliance/cache/3.1.0-beta.7/universal/collection-lists-pagination-integrity.yaml +0 -306
  563. package/compliance/cache/3.1.0-beta.7/universal/comply-controller-mode-gate.yaml +0 -141
  564. package/compliance/cache/3.1.0-beta.7/universal/content-standards-pagination-integrity.yaml +0 -326
  565. package/compliance/cache/3.1.0-beta.7/universal/deterministic-testing.yaml +0 -1430
  566. package/compliance/cache/3.1.0-beta.7/universal/error-compliance-signals.yaml +0 -377
  567. package/compliance/cache/3.1.0-beta.7/universal/error-compliance.yaml +0 -528
  568. package/compliance/cache/3.1.0-beta.7/universal/fictional-entities.yaml +0 -307
  569. package/compliance/cache/3.1.0-beta.7/universal/get-media-buys-pagination-integrity.yaml +0 -160
  570. package/compliance/cache/3.1.0-beta.7/universal/get-signals-pagination-integrity.yaml +0 -211
  571. package/compliance/cache/3.1.0-beta.7/universal/idempotency.yaml +0 -861
  572. package/compliance/cache/3.1.0-beta.7/universal/notification-config-event-scope.yaml +0 -119
  573. package/compliance/cache/3.1.0-beta.7/universal/notification-config-lifecycle.yaml +0 -337
  574. package/compliance/cache/3.1.0-beta.7/universal/notification-config-rejections.yaml +0 -107
  575. package/compliance/cache/3.1.0-beta.7/universal/pagination-integrity-creative-formats.yaml +0 -265
  576. package/compliance/cache/3.1.0-beta.7/universal/pagination-integrity-list-accounts.yaml +0 -245
  577. package/compliance/cache/3.1.0-beta.7/universal/pagination-integrity.yaml +0 -263
  578. package/compliance/cache/3.1.0-beta.7/universal/property-lists-pagination-integrity.yaml +0 -307
  579. package/compliance/cache/3.1.0-beta.7/universal/read-tool-idempotency.yaml +0 -405
  580. package/compliance/cache/3.1.0-beta.7/universal/runner-output-contract.yaml +0 -1266
  581. package/compliance/cache/3.1.0-beta.7/universal/schema-validation-signals.yaml +0 -181
  582. package/compliance/cache/3.1.0-beta.7/universal/schema-validation.yaml +0 -548
  583. package/compliance/cache/3.1.0-beta.7/universal/security.yaml +0 -539
  584. package/compliance/cache/3.1.0-beta.7/universal/signed-requests.yaml +0 -217
  585. package/compliance/cache/3.1.0-beta.7/universal/stale-response-advisory.yaml +0 -295
  586. package/compliance/cache/3.1.0-beta.7/universal/storyboard-schema.yaml +0 -2136
  587. package/compliance/cache/3.1.0-beta.7/universal/v3-envelope-integrity.yaml +0 -117
  588. package/compliance/cache/3.1.0-beta.7/universal/version-negotiation.yaml +0 -130
  589. package/compliance/cache/3.1.0-beta.7/universal/webhook-emission.yaml +0 -411
  590. package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-bulk-webhooks.yaml +0 -82
  591. package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-product-webhooks.yaml +0 -83
  592. package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-products.yaml +0 -151
  593. package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-signal-webhooks.yaml +0 -83
  594. package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-signals.yaml +0 -149
  595. package/dist/lib/types/v3-1-beta/index.d.mts +0 -1
  596. package/dist/lib/types/v3-1-beta/index.d.ts +0 -1
  597. package/dist/lib/types/v3-1-beta/index.mjs +0 -1
  598. package/dist/lib/types/v3-1-beta/tools.generated.d.mts +0 -26788
  599. package/dist/lib/types/v3-1-beta/tools.generated.d.ts +0 -26788
  600. /package/dist/lib/{types/v3-1-beta/tools.generated.mjs → media-buy/action-types.mjs} +0 -0
@@ -1,1266 +0,0 @@
1
- # Runner Output Contract
2
- #
3
- # Defines the failure-result shape that any AdCP compliance runner MUST emit
4
- # when it reports storyboard results to a user or coding agent. Applies to
5
- # evaluate_agent_quality, `@adcp/client storyboard run`, and any other harness
6
- # that executes the storyboards published under /compliance/{version}/.
7
- #
8
- # Rationale
9
- # ---------
10
- # A failing validation is only actionable if the implementor can see:
11
- # 1. The exact request the runner sent.
12
- # 2. The exact response the agent returned.
13
- # 3. Which field failed (as an RFC 6901 JSON Pointer).
14
- # 4. What the runner expected vs. what it observed.
15
- # 5. The identity of the schema applied (so the implementor can re-validate
16
- # locally against the same artifact).
17
- #
18
- # Without these, a buyer building an agent cannot diagnose failures even when
19
- # their own local validation passes — a mismatch between the schema they tested
20
- # against and the schema the runner used is indistinguishable from a genuine
21
- # agent bug.
22
- #
23
- # Storyboard AUTHORING is covered in storyboard-schema.yaml. This contract
24
- # covers runner OUTPUT.
25
- #
26
- # --- Schema definition ---
27
-
28
- id: runner_output_contract
29
- version: "2.3.0"
30
- title: "Runner output contract"
31
- summary: "Required failure-detail shape that AdCP storyboard runners MUST emit so implementors can self-diagnose validation failures."
32
-
33
- # Single source of truth for the storyboard-authored check enum.
34
- # Storyboards MUST only declare step.validations[].check values from this
35
- # list. Synthesized codes (capture_path_not_resolvable,
36
- # unresolved_substitution) are emitted by the runner — not authored — and
37
- # MUST NOT appear here. The build-time lint
38
- # `scripts/lint-storyboard-check-enum.cjs` reads this field and rejects any
39
- # storyboard that declares an unknown check kind, complementing the runtime
40
- # forward-compat default (which exists for cross-version skew between
41
- # storyboard and runner, not for catching typos at publish time).
42
- authored_check_kinds:
43
- - response_schema
44
- - field_present
45
- - field_absent
46
- - envelope_field_present
47
- - envelope_field_absent
48
- - field_value
49
- - field_value_or_absent
50
- - status_code
51
- - http_status
52
- - http_status_in
53
- - error_code
54
- - on_401_require_header
55
- - resource_equals_agent_url
56
- - any_of
57
- - refs_resolve
58
- - a2a_submitted_artifact
59
- - a2a_context_continuity
60
- - field_less_than
61
- - field_equals_context
62
- - upstream_traffic
63
-
64
- # Cross-response check kinds — applied across the response set of a
65
- # step that dispatches multiple requests under a runner contract that
66
- # produces a structured multi-response observation, today either
67
- # `parallel_dispatch_runner` (N parallel dispatches with the same
68
- # idempotency_key) or `rate_limit_trip_runner` (sequential burst +
69
- # replay). These kinds are NOT applicable to single-dispatch steps: a
70
- # runner that applies them per-response produces nonsense (a single
71
- # response trivially has cardinality 1 on any field). Runners MUST gate
72
- # dispatch of these checks on the step declaring the appropriate
73
- # `requires_contract:` and its accompanying parameter block
74
- # (`parallel_dispatch:` or `rate_limit_trip:`); otherwise grade the
75
- # validation `not_applicable` per the forward-compat clause.
76
- #
77
- # The `lint-storyboard-check-enum.cjs` lint reads BOTH this list and
78
- # `authored_check_kinds` as the canonical published-time enum, so
79
- # storyboards declaring either kind pass the typo gate.
80
- cross_response_check_kinds:
81
- - cross_response_field_equal
82
- - cross_response_count_distinct
83
- - replay_not_cached_rate_limit
84
-
85
- # Conforming implementation: adcp-client PR #611
86
- # (src/lib/testing/storyboard/types.ts — RunnerRequestRecord,
87
- # RunnerResponseRecord, ValidationResult, RunnerSkipResult, etc.).
88
- # The concrete shapes, redaction pattern, and header allowlist below are
89
- # taken from that implementation.
90
-
91
- # A storyboard step result is produced per step the runner executes. Each
92
- # step result carries zero or more validation results — one per `check` in
93
- # the storyboard's step.validations array, plus any transport-level check
94
- # the runner performs (e.g., extraction path).
95
-
96
- step_result:
97
- description: |
98
- Runners MUST emit one step result per executed step. Skipped steps MUST
99
- include a skip result block. Failed steps MUST include at least one
100
- validation result with passed: false. Not-selected steps are not step
101
- results; they are reported in run_summary.not_selected with
102
- selection_result records.
103
- required_fields:
104
- - storyboard_id # e.g. "capability_discovery"
105
- - phase_id # e.g. "protocol_discovery"
106
- - step_id # e.g. "get_capabilities"
107
- - task # AdCP task name invoked, e.g. "get_adcp_capabilities"
108
- - passed # boolean — all required validations passed
109
- - duration_ms # wall-clock time for this step
110
- - validations # array of validation_result objects (see below)
111
- - extraction # transport extraction record (see below)
112
- optional_fields:
113
- - skip # skip_result block when the step was not run
114
- # after being selected for this run
115
- - error # transport-level error (no validations attempted)
116
- - request # exact request the runner sent (see request block)
117
- - response # exact response observed (see response block)
118
- - notices # array of notice objects attached to this step's
119
- # result — informational signals that MUST NOT
120
- # change `passed`. See the notice block below for
121
- # the field shape and the canonical first-day codes.
122
-
123
- validation_result:
124
- description: |
125
- Every validation result — whether passed or failed — MUST carry the fields
126
- below. Failed validations MUST include request, response, json_pointer,
127
- expected, and actual unless the failure is transport-level (in which case
128
- json_pointer, expected, and actual MAY be null and the step-level error
129
- field carries the transport failure).
130
-
131
- Forward compatibility: when a runner encounters an authored `check` value
132
- it does not recognize (e.g., a storyboard declares a check type added in a
133
- later spec minor version than the runner implements), the runner MUST emit
134
- a validation_result with passed: true, check: <the unrecognized value>,
135
- description: copied from the storyboard, and a `note` field describing the
136
- coverage gap (e.g., "runner does not implement check type
137
- 'upstream_traffic' — graded as not_applicable to preserve forward
138
- compatibility"). The result MUST contribute to a per-step `not_applicable`
139
- counter the runner exposes alongside steps_passed/failed/skipped/not_selected, so
140
- consumers can distinguish "runner is older than the storyboard" from
141
- "storyboard validations passed cleanly." Runners MUST NOT fail steps
142
- on unrecognized check values — additive check-type extensions are
143
- explicitly part of the spec evolution model.
144
- required_fields:
145
- - check # Validation kind. For storyboard-authored checks,
146
- # mirrors the storyboard's step.validations[].check:
147
- # response_schema | field_present |
148
- # field_absent | envelope_field_present |
149
- # envelope_field_absent | field_value |
150
- # field_value_or_absent | status_code | http_status |
151
- # http_status_in | error_code | on_401_require_header |
152
- # resource_equals_agent_url | any_of | refs_resolve |
153
- # a2a_submitted_artifact | field_less_than |
154
- # field_equals_context | upstream_traffic |
155
- # cross_response_field_equal |
156
- # cross_response_count_distinct (the last two are
157
- # cross-response checks; see cross_response_check_kinds
158
- # above and storyboard-schema.yaml > Cross-response
159
- # assertions for semantics).
160
- #
161
- # For runner-synthesized grading (not authored in the
162
- # storyboard validations array, generated by the runner
163
- # after the authored checks complete):
164
- # capture_path_not_resolvable | unresolved_substitution
165
- #
166
- # See storyboard-schema.yaml > "Runner grading codes"
167
- # for the semantics of each synthesized code, and
168
- # storyboard-schema.yaml > "upstream_traffic" for the
169
- # authored upstream-side-effect check.
170
- - passed # boolean
171
- - description # human-readable description copied from the
172
- # storyboard validation entry (so the implementor
173
- # sees the same text the author wrote).
174
- # For synthesized checks, the runner MUST generate
175
- # a descriptive string naming the affected path or
176
- # substitution token.
177
- required_on_failure:
178
- - request # exact request the runner sent (see request block).
179
- # NULL for unresolved_substitution — the request was
180
- # never sent (pre-wire failure).
181
- # For upstream_traffic: the comply_test_controller
182
- # query_upstream_traffic request the runner issued,
183
- # not the storyboard step's AdCP request.
184
- - response # exact response observed (see response block).
185
- # NULL for unresolved_substitution — no response
186
- # exists (pre-wire failure).
187
- # For upstream_traffic: the query_upstream_traffic
188
- # response carrying the recorded_calls array.
189
- - json_pointer # RFC 6901 pointer to the failing field in the
190
- # response, or the request for input-level
191
- # failures. Null when the failure is transport-level
192
- # and no payload was returned. Also null for
193
- # unresolved_substitution (pre-wire; no response
194
- # path implicated) — see notes.synthesized_checks.
195
- # For upstream_traffic, points into the recorded_calls
196
- # array (e.g., "/recorded_calls/0/payload") when a
197
- # specific call's payload failed payload_must_contain;
198
- # null when the failure is a count mismatch
199
- # (no specific call implicated).
200
- - expected # machine-readable expected value:
201
- # response_schema → schema $id that was applied
202
- # field_value → expected value (any JSON type)
203
- # field_value_or_absent → value or allowed_values array
204
- # from the storyboard validation
205
- # field_present → the path that should resolve
206
- # field_absent → null (the field must not be present)
207
- # envelope_field_present → the path that should resolve
208
- # in the protocol envelope
209
- # envelope_field_absent → null (the envelope field must
210
- # not be present)
211
- # status_code → expected status
212
- # error_code → expected error code
213
- # any_of → array of acceptable forms
214
- # field_less_than → comparand the field MUST be
215
- # strictly less than. When the
216
- # comparand was resolved from
217
- # `context_key`, the runtime
218
- # value (a finite number) is
219
- # captured here; when from a
220
- # literal `value`, that literal.
221
- # field_equals_context → comparand the field MUST
222
- # deep-equal. The runtime value
223
- # resolved from
224
- # `validation.context_key` in the
225
- # storyboard accumulator.
226
- # capture_path_not_resolvable → the context_outputs path
227
- # string that failed to resolve
228
- # (e.g. "signals[0].signal_agent_segment_id")
229
- # unresolved_substitution → the unresolved token string
230
- # (e.g. "$context.first_signal_agent_segment_id"
231
- # or "{{prior_step.search.id}}")
232
- # upstream_traffic → object with the declared
233
- # assertion: { min_count,
234
- # endpoint_pattern, payload_must_contain,
235
- # identifier_paths, purpose_filter,
236
- # since, attestation_mode_required } —
237
- # whichever fields the storyboard set.
238
- # cross_response_field_equal
239
- # → object { path } — the JSON path
240
- # asserted equal across every
241
- # resolved response in the step's
242
- # dispatch set.
243
- # cross_response_count_distinct
244
- # → object { path, allowed_values } —
245
- # the path scanned, plus the
246
- # permitted cardinalities of
247
- # distinct values observed at
248
- # that path across the resolved
249
- # response set (typically [1]
250
- # for rule-9 tests).
251
- - actual # machine-readable actual value observed:
252
- # response_schema → array of schema errors
253
- # (each { instance_path,
254
- # schema_path, keyword,
255
- # message })
256
- # field_value → actual value (any JSON type)
257
- # field_value_or_absent → actual value (any JSON type);
258
- # null when the field was absent
259
- # field_present → null (the field was missing)
260
- # or the observed non-object
261
- # value
262
- # field_absent → observed value at path (any JSON
263
- # type); emitted only on failure
264
- # envelope_field_present → null (the field was missing)
265
- # or the observed non-object
266
- # value (scoped to envelope)
267
- # envelope_field_absent → observed value at path (any JSON
268
- # type); emitted only on failure
269
- # and scoped to envelope
270
- # field_less_than → the observed value at `path`
271
- # (number when resolvable, null
272
- # when the field was missing).
273
- # field_equals_context → the observed value at `path`
274
- # (any JSON type, null when the
275
- # field was missing).
276
- # capture_path_not_resolvable → the value that was
277
- # resolved at the path, or null
278
- # when the path did not exist.
279
- # Runners MUST treat null, "",
280
- # and structurally-absent paths
281
- # as equally non-resolvable for
282
- # this check — capture of a null
283
- # or empty-string value produces
284
- # fabricated state and is as
285
- # incorrect as a missing path.
286
- # unresolved_substitution → null (no response payload
287
- # available at substitution time)
288
- # upstream_traffic → object summarizing what was
289
- # observed: { matched_count,
290
- # total_calls, missing_payload_paths,
291
- # missing_identifier_values }.
292
- # The full recorded_calls array
293
- # lives in `response.payload`;
294
- # cross_response_field_equal
295
- # → object { observed_values: [...] } —
296
- # the values observed at `path` on
297
- # each resolved response, in dispatch
298
- # order. Empty when no response
299
- # carried the path.
300
- # cross_response_count_distinct
301
- # → object { observed_cardinality,
302
- # observed_values: [...] } — the
303
- # number of distinct values seen at
304
- # `path` across the resolved response
305
- # set, plus the values themselves.
306
- # `actual` is the diagnostic summary.
307
- - schema_id # $id of the response schema applied. Required
308
- # when check == response_schema, null otherwise.
309
- # MUST be null for capture_path_not_resolvable,
310
- # unresolved_substitution, and upstream_traffic.
311
- - schema_url # Resolvable URL the implementor can fetch to
312
- # validate locally. Required when
313
- # check == response_schema, null otherwise.
314
- # MUST be null for capture_path_not_resolvable,
315
- # unresolved_substitution, and upstream_traffic.
316
- notes:
317
- synthesized_checks: |
318
- capture_path_not_resolvable and unresolved_substitution are emitted by
319
- the runner after storyboard-authored checks complete. They MUST appear in
320
- the step's validations array so the "failed steps MUST include at least
321
- one validation result with passed: false" invariant is satisfied.
322
- For capture_path_not_resolvable, json_pointer MUST be the RFC 6901 form
323
- of the context_outputs path that failed to resolve (e.g. "/signals/0/
324
- signal_agent_segment_id"). For unresolved_substitution, json_pointer MUST
325
- be null (the substitution is pre-wire and no response path is implicated).
326
- cross_step_comparison_checks: |
327
- field_less_than and field_equals_context are authored checks that compare
328
- a field on this step's response against a value from the storyboard
329
- accumulator (populated by prior steps' `context_outputs`). Three
330
- consumer-facing rendering rules runners MUST follow:
331
-
332
- 1. `expected` carries the RESOLVED RUNTIME comparand, not the storyboard's
333
- `context_key` string. A consumer diffing `validation_result.expected`
334
- across two storyboard runs will see different values when the prior
335
- step's response differed — that's load-bearing for diagnosing
336
- filtered-vs-baseline regressions. The `context_key` field on the
337
- storyboard validation is authoring-time metadata; it is NOT echoed
338
- into validation_result.
339
-
340
- 2. `context_key_absent` observation: when the storyboard sets
341
- `context_key` and the named entry is missing from the accumulator
342
- (the prior capturing step was legitimately skipped on a branch-set
343
- path), the validation_result MUST carry `passed: true` with an
344
- `observations: [<descriptive string>]` entry naming the absent key.
345
- `expected` and `actual` MAY be omitted in this path. A genuinely
346
- missing capture (prior step ran but its capture path didn't resolve)
347
- is NOT this case — that grades `capture_path_not_resolvable` ON THE
348
- PRIOR STEP per the synthesized_checks rule.
349
-
350
- 3. Step-ordering dependency: cross-step comparison checks read from the
351
- accumulator built up over prior step executions. Runners that
352
- parallelize step execution MUST honour the storyboard's declared
353
- ordering for any step that names a `context_key` referencing an
354
- earlier step's `context_outputs`.
355
- upstream_traffic_check: |
356
- upstream_traffic is an authored check (declared in the storyboard's
357
- step.validations array) that asserts side-effects against a sandbox the
358
- adopter exposes through the comply_test_controller tool's
359
- query_upstream_traffic scenario. The runner queries the controller after
360
- the step completes, scoped to traffic recorded since the step's request
361
- timestamp, and applies the assertion. Adopters who do not advertise
362
- query_upstream_traffic in list_scenarios grade the check
363
- not_applicable (skip_result.reason: missing_test_controller with detail
364
- naming the scenario) — the contract is opt-in by adopter capability.
365
- See storyboard-schema.yaml > "upstream_traffic" for the authored shape
366
- and comply-test-controller-request.json > query_upstream_traffic for
367
- the controller-side query contract.
368
- upstream_traffic_timestamp_boundary: |
369
- The runner's lower-bound timestamp for query_upstream_traffic MUST be
370
- the runner's own wall-clock at the moment it issued the storyboard
371
- step's AdCP request (or the prior step's request timestamp when the
372
- storyboard declares `since: <prior_step_id>`). The bound is INCLUSIVE.
373
- Runners SHOULD subtract a clock-skew tolerance (50ms minimum, 250ms
374
- recommended) before sending the bound to the controller, so a recorded
375
- call timestamped microseconds before the runner's clock measurement is
376
- not silently excluded. Controllers MUST emit recorded_calls timestamps
377
- matching the wall clock at outbound-request-send time (not log-flush
378
- time) and MUST order them monotonically non-decreasing. Runners MUST
379
- attribute calls to a step using their own clock-bracket of when they
380
- issued and received the AdCP request, not the controller's
381
- since_timestamp echo (which is informational only — see
382
- comply-test-controller-response.json > UpstreamTrafficSuccess >
383
- since_timestamp).
384
- upstream_traffic_threat_model: |
385
- upstream_traffic raises the bar against UNINTENTIONAL façades —
386
- adapters that satisfy AdCP schema requirements with synthetic
387
- placeholders without forwarding payloads upstream. It is NOT an
388
- adversarial integrity check. Adopters self-report their own traffic
389
- through query_upstream_traffic; a determined façade can fabricate
390
- recorded_calls entries. Spec consumers — compliance dashboards,
391
- adapter directories, conformance-tier UIs — MUST NOT present
392
- upstream_traffic passing as cryptographic proof of adapter behavior.
393
- The conformance value is "unintentional façades fail this check"; an
394
- adversarial-integrity attestation path (signed traffic-summary
395
- endpoint, agent-side telemetry digest, etc.) is its own future RFC,
396
- not this contract.
397
- upstream_traffic_digest_mode: |
398
- Recorded calls returned in `attestation_mode: digest` (see
399
- comply-test-controller-response.json > UpstreamTrafficSuccess >
400
- recorded_calls > DigestAttestation) swap raw payload introspection
401
- for digest-based echo verification:
402
- - `recorded_calls[].payload_length` MUST be the byte length of the
403
- exact payload bytes covered by `payload_digest_sha256`: RFC 8785
404
- (JCS) canonical bytes for JSON-shaped content after redaction, or
405
- post-redaction raw body bytes for non-JSON content. It is not the
406
- original outbound body length before JSON parsing, redaction, or
407
- canonicalization.
408
- - The runner verifies `identifier_paths` by computing SHA-256 of each
409
- resolved identifier value, sending the digests in the controller
410
- query's `params.identifier_value_digests`, and reading the
411
- per-digest `found: true | false` proof from
412
- `recorded_calls[].identifier_match_proofs[]`. Plaintext
413
- identifiers never reach the controller in this path.
414
- - `payload_must_contain` arbitrary path assertions are NOT
415
- supported in digest mode — the runner emits a per-affected-entry
416
- validation_result with `passed: true`, `check: payload_must_contain`,
417
- and a `note` field explaining the mode constraint, contributing
418
- to `validations_not_applicable` on run_summary (NOT
419
- steps_failed). The same validation continues to grade against
420
- recorded_calls returned in raw mode, so a mixed-mode response
421
- (some calls raw, some digest) produces partial coverage rather
422
- than blanket not_applicable.
423
- - If the controller cannot produce a digest-mode upstream_traffic
424
- response because the parsed JSON-like value tree contains a
425
- non-finite numeric value (`NaN`, `+Infinity`, or `-Infinity`),
426
- it MUST NOT coerce that value to `null`, a string, or any other
427
- placeholder for digest computation; it returns ControllerError
428
- with error code `JCS_NON_FINITE_NUMBER`. The runner emits the affected
429
- upstream_traffic validation_result with `passed: true` and a
430
- `note` citing the RFC 8785/JCS non-finite-number constraint,
431
- contributing to `validations_not_applicable` on run_summary
432
- (NOT steps_failed).
433
- - `min_count` and `endpoint_pattern` are unchanged — count and URL
434
- matching work identically in both modes.
435
- Storyboards that strictly require raw introspection set
436
- `attestation_mode_required: "raw"` on the storyboard upstream_traffic
437
- check; runners then grade calls returned in digest mode as
438
- not_applicable for the entire check (not just per-assertion). Use
439
- sparingly — see storyboard-schema.yaml > "upstream_traffic" >
440
- `attestation_mode_required` for the rationale.
441
- response_schema_validator_semantics: |
442
- Runners MUST apply the referenced JSON schema using a JSON Schema
443
- draft-07 compliant validator configured to honour the schema's own
444
- `additionalProperties` declaration without global override. When a
445
- schema or any sub-schema reached via `$ref`, `allOf`, `oneOf`, or
446
- `anyOf` declares `"additionalProperties": true` (explicitly or by
447
- omission — draft-07 default is `true`), the runner MUST NOT fail a
448
- response that includes fields beyond those enumerated in `properties`.
449
- In draft-07, `oneOf` branch-selection does not grant a validator
450
- licence to apply stricter `additionalProperties` constraints than
451
- those declared on the selected branch.
452
-
453
- Configuring the validator in a way that contradicts the schema's own
454
- `additionalProperties` declaration is a conformance violation of this
455
- contract (e.g., AJV `removeAdditional: 'all'` or a schema-level
456
- `additionalProperties: false` override; Zod `.strict()` on a derived
457
- schema object). A seller returning a spec-valid response with optional
458
- or newly-added fields (such as `authorization` or `sandbox` on
459
- sync-accounts items) is conformant. A runner that fails such a
460
- response because its internal schema representation is stricter than
461
- the canonical JSON Schema produces a false negative that blocks
462
- legitimate conformance progress.
463
-
464
- The AdCP spec-side lint (`scripts/lint-storyboard-response-schema.cjs`,
465
- AJV `strict: false`, no `removeAdditional`) sets the precedent. This
466
- clause makes the same requirement normative for all conforming runners.
467
- Any runner correctly implementing draft-07 JSON Schema validation
468
- already satisfies it.
469
- optional_fields:
470
- - remediation # runner-suggested fix when the failure maps to
471
- # a well-known cause (e.g., "agent did not echo
472
- # context.correlation_id — see
473
- # docs/building/implementation/task-lifecycle")
474
- - severity # "required" | "advisory" — copied from the
475
- # storyboard validation entry's severity field
476
- # (default: "required"). When "advisory", a
477
- # passed: false validation_result MUST NOT
478
- # cause its step to grade as failed; the step
479
- # grades on its remaining required validations.
480
- # Advisory failures contribute to
481
- # validations_advisory_failed on run_summary
482
- # and MUST NOT contribute to steps_failed,
483
- # validations_failed, or any other
484
- # required-failure counter — the two counter
485
- # surfaces are deliberately separate so a
486
- # consumer aggregating "passed: false" across
487
- # validations_failed never double-counts
488
- # advisory results.
489
- #
490
- # Rendered-output rule: when a runner emits
491
- # advisory results to a human-facing surface
492
- # (chat transcripts, markdown reports,
493
- # compliance dashboards, LLM summaries),
494
- # advisory entries MUST be visually
495
- # distinguished from required failures —
496
- # prefix with the literal `[ADVISORY]`,
497
- # render in a muted style, or section them
498
- # under a separate "advisory findings"
499
- # header. The machine-readable step_result
500
- # carries severity verbatim for programmatic
501
- # consumers; this rule applies only to
502
- # rendered surfaces. Without this, a façade
503
- # that declares its anti-façade validations
504
- # as advisory produces a stream of
505
- # `passed: false` entries indistinguishable
506
- # from required failures, eroding the
507
- # conformance signal.
508
- #
509
- # See storyboard-schema.yaml > "Validation"
510
- # for the author-side semantics and use case
511
- # (rollout gating during runner adoption
512
- # windows).
513
- - severity_promoted_from_advisory
514
- # boolean | absent. Tri-state contract:
515
- # true — storyboard declared
516
- # expires_after_version AND
517
- # runner_capability_version >=
518
- # that value, so the runner
519
- # promoted severity to "required"
520
- # at execution time. `severity`
521
- # MUST also be "required" (the
522
- # promoted value).
523
- # false — storyboard declared
524
- # expires_after_version but
525
- # runner_capability_version is
526
- # older, so promotion did not fire.
527
- # `severity` is the storyboard's
528
- # declared advisory.
529
- # absent — storyboard did not declare
530
- # expires_after_version (severity
531
- # applied verbatim) OR the check
532
- # grades not_applicable due to
533
- # forward-compat (no grading
534
- # occurred, so no promotion was
535
- # evaluated; per
536
- # storyboard-schema.yaml >
537
- # expires_after_version
538
- # forward-compat ordering rule).
539
- # The tri-state is required so consumers can
540
- # distinguish "promoted" from "not promoted
541
- # because runner is too old" from "not
542
- # applicable" without re-reading the
543
- # storyboard. Reports SHOULD render the
544
- # promotion provenance on the true case —
545
- # e.g., "[REQUIRED — was advisory through
546
- # capability v{expires_after_version};
547
- # promoted at v{runner_capability_version}]".
548
-
549
- request:
550
- description: |
551
- Exact request the runner sent, per transport. Runners MUST redact secrets
552
- before emission — see the `security` block below.
553
- required_fields:
554
- - transport # "mcp" | "a2a" | "http"
555
- - operation # task/tool/skill name actually invoked (matches
556
- # step.task after any test-kit interpolation)
557
- - payload # fully-resolved JSON payload after test-kit
558
- # substitution and context injection, with
559
- # secret-bearing fields replaced per the
560
- # redaction policy in the security block.
561
- optional_fields:
562
- - headers # Runners SHOULD NOT populate this field by
563
- # default — see security.request_headers. The
564
- # field exists for future auth-override captures
565
- # that carry a fully-redacted form.
566
- - url # full URL for http/a2a; omit for stdio MCP
567
-
568
- response:
569
- description: |
570
- Exact response observed from the agent, per transport.
571
- required_fields:
572
- - transport # "mcp" | "a2a" | "http"
573
- - payload # MCP: { isError, structuredContent, content }
574
- # A2A: the Task object — record task.status.state
575
- # alongside payload. Extract from
576
- # task.artifacts[0].parts[] DataPart for final
577
- # states and task.status.message.parts[] for
578
- # interim states (per
579
- # docs/building/implementation/a2a-response-extraction.mdx).
580
- # http: parsed body
581
- optional_fields:
582
- - status # HTTP status where applicable
583
- - headers # observed response headers, filtered through
584
- # the allowlist in security.response_headers
585
- - duration_ms # wall-clock time for this request
586
-
587
- extraction:
588
- description: |
589
- Runners MUST follow the MCP response-extraction algorithm at
590
- docs/building/implementation/mcp-response-extraction.mdx and the A2A
591
- equivalent. When both structuredContent and content[].text are present,
592
- structuredContent wins. Recording the path that was actually used lets
593
- the implementor distinguish a runner extraction bug from an agent bug.
594
- required_fields:
595
- - path # "structured_content" | "text_fallback" |
596
- # "error" | "none"
597
- optional_fields:
598
- - note # e.g. "structuredContent contained only
599
- # adcp_error — treated as error"
600
-
601
- security:
602
- description: |
603
- Runner output is consumed in compliance reports, chat transcripts, and
604
- shared dashboards where credentials or breadcrumbs a hostile agent plants
605
- in a response must not surface. A runner claiming contract conformance
606
- without the rules below could leak tokens through a compliant-looking
607
- report — defeating the contract's purpose. These rules are normative.
608
-
609
- payload_redaction:
610
- description: |
611
- Runners MUST recursively redact key-value pairs from request.payload
612
- and response.payload before emitting the step result. Values at keys
613
- matching the pattern below are replaced with the literal string
614
- "[redacted]". Matching is case-insensitive and applies at any depth.
615
- pattern: |
616
- ^(authorization|credentials?|token|api[_-]?key|password|secret|
617
- client[_-]secret|refresh[_-]token|access[_-]token|bearer|
618
- session[_-]token|offering[_-]token|cookie|set[_-]cookie)$
619
- notes: |
620
- The pattern above is the MINIMUM floor taken from the adcp-client#611
621
- conforming implementation. Runners MAY extend it for operator-
622
- specific key names (e.g., internal vendor headers) but MUST NOT
623
- narrow it. Redaction happens after the payload is serialized for
624
- the report, not at transport time — the wire request carries real
625
- credentials; the emitted record does not.
626
-
627
- response_headers:
628
- description: |
629
- Response headers MUST pass through an allowlist before emission. Any
630
- header not in the allowlist MUST be dropped (not redacted — absent).
631
- Dropping rather than redacting avoids publishing the set of header
632
- names a hostile agent added, which itself can be a breadcrumb.
633
- allowlist:
634
- - content-type
635
- - content-length
636
- - content-encoding
637
- - www-authenticate
638
- - location
639
- - retry-after
640
- - x-request-id
641
- - x-correlation-id
642
- notes: |
643
- www-authenticate is retained because it's load-bearing for auth-probe
644
- validations (on_401_require_header). Matching is case-insensitive.
645
-
646
- request_headers:
647
- description: |
648
- Runners SHOULD NOT populate request.headers. A runner that builds
649
- `Authorization: Bearer <token>` headers in-flight would leak the token
650
- by echoing the observed request into a shared report. When a runner
651
- does populate request.headers (e.g., for auth-override probes that
652
- intentionally send bogus credentials), values at keys matching the
653
- payload_redaction pattern MUST be replaced with "[redacted]" and all
654
- other headers MUST pass through the response_headers allowlist.
655
-
656
- rendered_output_fencing:
657
- description: |
658
- Several validation_result and skip_result fields carry strings whose
659
- origin is not the runner: the agent under test, the storyboard author,
660
- or an adopter-supplied test controller. When a runner renders these
661
- into a shared surface (chat transcript, markdown report, summary fed
662
- to another LLM), the strings MUST be fenced with a nonce or otherwise
663
- isolated so a hostile message cannot inject instructions into a
664
- downstream summarizer. This applies to rendered output, not to the
665
- machine-readable step_result — raw strings stay in the JSON for
666
- programmatic consumers.
667
-
668
- Load-bearing fields that MUST be fenced when rendered:
669
- - validation_result.error (transport-level errors,
670
- agent-controlled when the
671
- error message is echoed)
672
- - validation_result.actual (agent-controlled response
673
- values, including string
674
- forms)
675
- - validation_result.description (storyboard-author-controlled
676
- — copied verbatim from the
677
- storyboard validation entry)
678
- - validation_result.note (runner-generated but
679
- interpolates the
680
- storyboard's unrecognized
681
- check value verbatim — see
682
- forward-compat clause above)
683
- - skip_result.detail (runner-generated but
684
- interpolates storyboard
685
- IDs and adopter-supplied
686
- strings)
687
- - response.payload (for upstream_traffic checks)
688
- (carries recorded_calls[]
689
- where url, payload, and
690
- endpoint are all
691
- agent-controlled — a
692
- hostile adapter that hits
693
- an attacker-controlled URL
694
- plants the URL string in
695
- the payload, and a
696
- hostile adopter controller
697
- returns whatever it wants)
698
-
699
- Inversion rule: any field whose value is copied from storyboard input,
700
- agent-under-test output, or an adopter-supplied test controller MUST be
701
- fenced when rendered. Runner-generated identifiers (step_id, schema_id,
702
- check enum values from the spec's known list) are exempt.
703
-
704
- Advisory-severity differentiation: validation_result entries with
705
- severity: advisory MUST render visually distinct from required-severity
706
- results (literal `[ADVISORY]` prefix, muted style, or grouped under a
707
- separate "advisory findings" section). This is orthogonal to fencing —
708
- both rules apply to advisory results that carry agent- or
709
- storyboard-controlled strings. See validation_result.severity above for
710
- the rationale (façade-resistance: a façade declaring its anti-façade
711
- validations as advisory must not blend visually into required failures).
712
-
713
- Promotion-provenance rendering: when a renderer constructs human
714
- copy describing severity_promoted_from_advisory: true (e.g., "was
715
- advisory through capability v{expires_after_version}; promoted at
716
- v{runner_capability_version}"), the storyboard-supplied
717
- expires_after_version value MUST be fenced. The semver lint rejects
718
- malformed values at publish time, but defense-in-depth treats the
719
- string as untrusted-author input when interpolated into LLM-rendered
720
- surfaces. permanent_advisory.reason is also storyboard-author-controlled
721
- and MUST be fenced when rendered.
722
-
723
- skip_result:
724
- description: |
725
- When a track, storyboard, phase, or step is skipped, runners MUST
726
- distinguish between the reasons below so an implementor knows whether
727
- the skip is informative (the agent did not claim the protocol) or
728
- masking (the runner could not apply the storyboard even though the
729
- agent claimed the protocol).
730
-
731
- Selection is separate from skipping. If the caller asks for a narrower
732
- suite or run mode (for example, "Sandbox only") and the runner excludes
733
- live-only storyboards before execution, those items are `not_selected`,
734
- not `skipped`. A `skip_result` is emitted only after an item was selected
735
- for this run and the runner could not execute it because an applicability
736
- gate, required tool, test controller, prerequisite, or harness contract
737
- was unavailable.
738
- required_fields:
739
- - reason # not_applicable | no_phases |
740
- # prerequisite_failed | missing_tool |
741
- # missing_test_controller |
742
- # unsatisfied_contract | peer_branch_taken |
743
- # peer_substituted | requirement_unmet
744
- - detail # human-readable explanation citing the
745
- # declared supported_protocols / specialisms
746
- # and, if relevant, the missing tool,
747
- # prerequisite step id, or contract key.
748
- reasons:
749
- not_applicable: |
750
- The item was selected for this run, but an applicability gate evaluated
751
- false. Examples: the agent did not declare the protocol or specialism
752
- this storyboard targets, or a scenario's requires_capability check found
753
- an optional capability set to false. detail MUST cite the failed gate
754
- and the agent's relevant declared supported_protocols, specialisms, or
755
- capability value.
756
-
757
- When the runner excludes an item before execution because it is outside
758
- the caller's requested suite, run mode, AdCP version, or verification
759
- profile, use selection_result instead. Do not report run-mode exclusions
760
- as not_applicable skips.
761
-
762
- Branch-set grading uses `peer_branch_taken` (see below), not this
763
- reason — keeping the two distinct lets dashboards filter coverage
764
- gaps (not_applicable) separately from runtime branch routing
765
- (peer_branch_taken).
766
- no_phases: |
767
- The storyboard is a placeholder with no phases to run (e.g., a
768
- protocol baseline that has not been populated yet). detail MUST cite
769
- the storyboard id and version.
770
- prerequisite_failed: |
771
- A prior step this one depends on did not pass. detail MUST cite the
772
- prerequisite step id.
773
- missing_tool: |
774
- The agent declared the protocol or specialism but does not expose a
775
- required tool. detail MUST cite the tool name declared in the
776
- storyboard's required_tools and the agent's advertised tool list.
777
- missing_test_controller: |
778
- The storyboard requires comply_test_controller and the agent did not
779
- advertise it. Applies only to deterministic_testing phases.
780
- unsatisfied_contract: |
781
- A test-kit harness contract (e.g., signed-requests-runner) is not in
782
- scope for this grading run. detail MUST cite the contract key. Per
783
- the signed-requests-runner contract, unsatisfied contracts grade as
784
- FAIL, not SKIP, for the storyboards that declare them — this reason
785
- applies only where the contract explicitly permits SKIP.
786
- peer_branch_taken: |
787
- The step is part of an `any_of` branch set (see storyboard-schema.yaml
788
- > "Branch sets") whose `branch_set.id` was already contributed by a
789
- peer optional phase, making this non-chosen branch moot. detail MUST
790
- follow the shape
791
- "<branch_set.id> contributed by <peer_phase_id>.<peer_step_id> —
792
- <this_phase_id> is moot" so downstream tooling can parse which peer
793
- carried the contribution. Kept distinct from not_applicable: coverage
794
- gaps (agent doesn't support a protocol) and runtime branch routing
795
- (agent took the other path) are different signals and must not be
796
- conflated in dashboards or summaries.
797
- peer_substituted: |
798
- The step would otherwise grade `missing_tool` or
799
- `missing_test_controller`, but a same-phase peer step declared
800
- `provides_state_for: <this_step_id>` (see storyboard-schema.yaml >
801
- `provides_state_for`) and passed — the substitute established
802
- equivalent state for downstream stateful steps, so the cascade is
803
- waived. detail MUST follow the shape
804
- "<this_step_id> state provided by <peer_phase_id>.<peer_step_id>"
805
- so downstream tooling can parse which substitute carried the state.
806
- Kept distinct from peer_branch_taken (branch-set routing for
807
- mutually exclusive behaviors) and not_applicable (coverage gap):
808
- this signal indicates the agent did declare the specialism but
809
- offers an interchangeable tool that the storyboard accepts as an
810
- equivalent state contract.
811
- requirement_unmet: |
812
- A storyboard-level load-time precondition was not satisfied. Two
813
- storyboard-schema fields produce this reason, distinguished by the
814
- `detail` sub-reason prefix so dashboards can aggregate independently:
815
-
816
- requires: — runtime context gates
817
- (see storyboard-schema.yaml > `requires`).
818
- detail names the unmet requirement value
819
- directly, e.g. "controller",
820
- "seeded_state", or an unrecognized
821
- forward-compat value. This legacy form
822
- is BARE — no `requires:` prefix is
823
- synthesized — and remains the canonical
824
- wire shape for single-gate `requires:`
825
- failures.
826
-
827
- required_any_of_tools: — tool-family advertisement gates
828
- (see storyboard-schema.yaml >
829
- `required_any_of_tools`). detail
830
- carries the canonical sub-reason prefix
831
- "missing_required_tool_family:" followed
832
- by " needs <tool_a> or <tool_b>[ or
833
- <tool_c>...]" and, when a rationale was
834
- declared, a trailing " (<rationale>)"
835
- parenthetical. Canonical single-line
836
- example:
837
- `missing_required_tool_family: needs list_accounts or sync_accounts (AdCP 3.0.9 §accounts/overview)`
838
-
839
- Family-list separator. When a family contains more than two tools,
840
- runners MUST join names with the literal three-character " or "
841
- separator (no Oxford comma; no list-style punctuation). Dashboards
842
- that parse the family list MAY split on " or " safely. Tool names
843
- are constrained by the spec's tool-name charset and do not contain
844
- the literal " or " substring.
845
-
846
- Wire-shape posture for aggregation. Runners SHOULD emit a single
847
- sub-reason in `detail` even when multiple gates are unmet —
848
- surfacing the first-evaluated gate is the canonical wire shape and
849
- keeps `detail` programmatically parseable. When a runner aggregates
850
- multiple unmet gates into one `detail` string for human display,
851
- it MUST use "; " (semicolon + space) as the sub-reason separator
852
- and MUST preserve each sub-reason's standalone form (the bare
853
- `requires:` legacy value, or the prefixed `missing_required_tool_family:
854
- …` shape). Example multi-gate aggregation:
855
- `controller; missing_required_tool_family: needs list_accounts or sync_accounts (AdCP 3.0.9 §accounts/overview)`.
856
-
857
- Automated consumers SHOULD parse only the first sub-reason from
858
- aggregated `detail` (everything up to the first "; ") and surface
859
- multi-gate state through a separate UI affordance rather than
860
- treating `detail` as a structured list.
861
-
862
- The sub-reason prefix is the canonical attribution string —
863
- dashboards and skip-cause aggregators MUST switch on the prefix to
864
- separate tool-family gates from `requires:` gates when summarizing
865
- the first sub-reason.
866
-
867
- Distinct from missing_test_controller (which fires mid-run at a
868
- specific step when comply_test_controller is absent) — this reason
869
- fires at load time for the whole storyboard, before any step
870
- executes. When `requires: [controller]` is set, the runner MUST
871
- emit this reason at storyboard scope, not missing_test_controller
872
- at step scope.
873
-
874
- Distinct from missing_tool (which fires at step scope when a tool
875
- declared in the storyboard's `required_tools` is absent — a coverage
876
- skip). `required_any_of_tools` is a load-time gate on tool
877
- advertisement, not a per-step coverage signal.
878
-
879
- Forward compatibility: runners that encounter a `requires` value
880
- they do not recognize MUST emit this reason with the unrecognized
881
- value in detail, rather than fail-loading the storyboard. Using
882
- requirement_unmet (not not_applicable) correctly signals "an unmet
883
- gate" vs. "agent did not claim the protocol" — the two are distinct
884
- signals for dashboards and summaries.
885
- description: |
886
- Runners MAY internally track narrower skip reasons (e.g., a grader
887
- distinguishing `rate_abuse_opt_out` from `live_side_effect_opt_in_required`).
888
- Such runners MUST still populate `reason` with one of the canonical
889
- values above and encode the narrower cause in `detail`. Machine-
890
- readable consumers can then switch on a stable enum; human-readable
891
- consumers still see the specific cause. See
892
- DETAILED_SKIP_TO_CANONICAL in the conforming implementation for a
893
- concrete mapping.
894
-
895
- selection_result:
896
- description: |
897
- When a track, storyboard, phase, or step is outside the run the caller
898
- requested, runners MUST report it as not_selected rather than skipped.
899
- Not-selected items are not attempted, do not imply an agent capability
900
- gap, and MUST NOT contribute to steps_skipped or any skip-by-reason
901
- counter.
902
-
903
- This distinction is load-bearing for Sandbox verification and buyer
904
- dashboards. "Sandbox only" means live-only probes are excluded by the
905
- selected suite; it does not mean the seller skipped or failed those
906
- probes. By contrast, a selected storyboard that cannot run because the
907
- seller did not advertise an optional capability, omitted
908
- comply_test_controller, or lacks a required tool remains a skip_result
909
- with its own reason.
910
- required_fields:
911
- - reason # run_mode_excluded | explicit_scope_excluded |
912
- # version_excluded | profile_excluded
913
- - detail # human-readable explanation citing the
914
- # selected run mode, explicit storyboard scope,
915
- # AdCP version, or verification profile rule
916
- # that excluded the item.
917
- reasons:
918
- run_mode_excluded: |
919
- The item is incompatible with the selected run mode. Example:
920
- a live-only probe is outside a Sandbox-only run. detail MUST cite
921
- both the selected mode and the excluded mode requirement.
922
- explicit_scope_excluded: |
923
- The caller supplied an explicit storyboard, track, protocol, or
924
- specialism scope that does not include this item. detail MUST cite
925
- the selected scope.
926
- version_excluded: |
927
- The item is not applicable to the AdCP version selected for this run.
928
- detail MUST cite the selected AdCP version and the item's
929
- introduced_in or removed_in bound when known.
930
- profile_excluded: |
931
- A named verification profile intentionally excludes this item before
932
- execution. detail MUST cite the profile name and profile rule.
933
-
934
- notice:
935
- description: |
936
- Advisory signal attached to a storyboard step result or run summary.
937
- Notices are informational — they MUST NOT contribute to steps_failed,
938
- validations_failed, or any other required-failure counter, and they
939
- MUST NOT change `step_result.passed` or run-level pass/fail counters.
940
-
941
- Notices fill the gap between three existing signals:
942
- - Validation failures (passed: false) — the agent did something wrong.
943
- - Skip reasons — the runner could not apply the storyboard.
944
- - Advisory-severity validations — the storyboard author marked a check
945
- as non-blocking during a runner adoption window.
946
-
947
- A notice is none of those: it is a forward-looking or migration advisory
948
- about a passing observation. Examples: an agent still advertising a
949
- deprecated specialism that the spec recommends dropping; an agent that
950
- passes today but advertises a capability shape that will be required at
951
- a named future spec version; an adopter using a legacy fallback that is
952
- scheduled for removal at a named future version.
953
-
954
- Spec storyboards that motivate canonical notices SHOULD reference the
955
- notice `code` (not the prose). The reference adopter currently
956
- motivating the contract is the `signed_requests_specialism_deprecated`
957
- notice in `universal/signed-requests.yaml` — the runner SHOULD emit
958
- this notice when an agent claims the deprecated `signed-requests`
959
- specialism alongside `request_signing.supported: true`, advising
960
- the agent to drop the now-redundant specialism claim.
961
-
962
- Forward compatibility: receivers MUST treat an unknown `code` or
963
- `severity` value as well-formed and surface the notice verbatim. New
964
- codes and severities ship additively; rejecting on unknown values
965
- defeats the contract.
966
-
967
- required_fields:
968
- - severity # "info" | "deprecation" | "future_required"
969
- # info — passing behavior is fine
970
- # today; advisory context only
971
- # (e.g., "this agent is using
972
- # an alternate but supported
973
- # pathway").
974
- # deprecation — agent-side claim or behavior
975
- # is allowed today but the
976
- # spec recommends migration
977
- # (e.g., legacy specialism
978
- # enum values still accepted
979
- # for back-compat).
980
- # future_required — capability that is optional
981
- # today will be required at a
982
- # named future spec version;
983
- # agents that do not advertise
984
- # it will fail compliance
985
- # after the cut. `effective_version`
986
- # MUST be populated.
987
- - code # stable machine-readable identifier
988
- # (SCREAMING_SNAKE-or-lowercase_snake; the
989
- # canonical first-day codes below use
990
- # lowercase_snake). Runners MUST NOT change
991
- # the code for the same advisory across
992
- # versions — consumers aggregate by code.
993
- # Unknown codes from a forward-compat runner
994
- # MUST be surfaced verbatim by receivers, not
995
- # rejected.
996
- - message # human-readable description. Runners MUST
997
- # fence this string when rendering to a
998
- # shared LLM-fed surface per the same rules
999
- # as skip_result.detail — the storyboard
1000
- # author controls the substring.
1001
- optional_fields:
1002
- - effective_version # When severity is "future_required", the
1003
- # AdCP version that flips the requirement
1004
- # (e.g., "4.0"). REQUIRED for future_required
1005
- # severity, MAY be present on "deprecation"
1006
- # to name the removal version, MUST NOT be
1007
- # set on "info".
1008
- - requirement # When the notice is tied to a structured
1009
- # `requires:` name in storyboard-schema.yaml,
1010
- # repeat the requirement value here so
1011
- # dashboards can correlate notices with the
1012
- # gate that motivated them.
1013
- - capability_path # Dotted path into the agent's
1014
- # `get_adcp_capabilities` response that
1015
- # motivated the notice
1016
- # (e.g., "request_signing.supported",
1017
- # "webhook_signing.legacy_hmac_fallback").
1018
- # Lets consumers link the notice to the
1019
- # exact capability flag without parsing the
1020
- # message string.
1021
- - reference_url # optional spec or issue URL with more context
1022
- # (e.g., the upstream issue tracking the
1023
- # deprecation, or the relevant section in
1024
- # /docs/building/by-layer/L3/error-handling.mdx).
1025
- canonical_codes:
1026
- description: |
1027
- First-day published codes runners SHOULD emit when the underlying
1028
- condition holds. Additional codes are registered by adding entries
1029
- here in subsequent spec revisions; runners MAY emit codes outside
1030
- this list (consumers must accept unknown codes per the forward-compat
1031
- rule above), but SHOULD prefer canonical codes when one fits.
1032
- signed_requests_specialism_deprecated:
1033
- severity: deprecation
1034
- spec_source: universal/signed-requests.yaml
1035
- capability_path: specialisms
1036
- message_template: |
1037
- Agent advertises the deprecated `signed-requests` specialism
1038
- enum value. Drop it and rely solely on
1039
- `request_signing.supported: true`. The enum value is removed
1040
- in AdCP 4.0 (see adcontextprotocol/adcp#3078).
1041
- request_signing_required_in_4_0:
1042
- severity: future_required
1043
- effective_version: "4.0"
1044
- spec_source: protocol/get-adcp-capabilities-response.json#request_signing
1045
- capability_path: request_signing.supported
1046
- message_template: |
1047
- `request_signing.supported: true` is optional in 3.x but required
1048
- for spend-committing operations in AdCP 4.0. Agents that do not
1049
- advertise support will fail compliance on the 4.0 cut.
1050
- legacy_hmac_fallback_removed_in_4_0:
1051
- severity: deprecation
1052
- effective_version: "4.0"
1053
- spec_source: protocol/get-adcp-capabilities-response.json#webhook_signing.legacy_hmac_fallback
1054
- capability_path: webhook_signing.legacy_hmac_fallback
1055
- message_template: |
1056
- Agent advertises `webhook_signing.legacy_hmac_fallback: true`.
1057
- The HMAC fallback path is deprecated and removed in AdCP 4.0;
1058
- receivers SHOULD migrate to RFC 9421 signatures only.
1059
-
1060
- cascade_rules:
1061
- description: |
1062
- Rules governing when a runner MUST propagate `prerequisite_failed` to
1063
- downstream stateful steps and when it MUST NOT. These complement the
1064
- per-reason text in `skip_result.reasons`: the skip reason describes WHY
1065
- a step was skipped; cascade rules describe what effect that skip has on
1066
- later phases. Runners MUST evaluate these rules after per-step grading
1067
- completes, before downstream skip propagation runs.
1068
- default_cascade: |
1069
- When a stateful step produces `passed: false` (a genuine failure), or
1070
- skips with `prerequisite_failed`, `unsatisfied_contract`, or
1071
- `peer_branch_taken`, the runner MUST cascade `prerequisite_failed` to
1072
- downstream stateful phases so implementors know that dependent coverage
1073
- collapsed. Steps that skip with `peer_substituted` do NOT trigger the
1074
- cascade — the `provides_state_for` mechanism already waived it (see
1075
- `skip_result.reasons.peer_substituted`). Steps that skip with
1076
- `not_applicable`, `missing_tool`, or `missing_test_controller` do NOT
1077
- trigger the cascade when the `sole_stateful_step_exemption` below applies.
1078
- sole_stateful_step_exemption: |
1079
- When ALL of the following hold, the runner MUST NOT cascade
1080
- `prerequisite_failed` to downstream stateful phases:
1081
-
1082
- 1. The step grades `not_applicable`, `missing_tool`, or
1083
- `missing_test_controller`.
1084
- 2. It is the sole stateful step in its phase (no other stateful step
1085
- exists in the same phase that could have established substitute state).
1086
- 3. No same-phase peer step has declared `provides_state_for:
1087
- <this_step_id>`.
1088
-
1089
- When these conditions are met, downstream phases evaluate independently —
1090
- their stateful steps do NOT receive `prerequisite_failed` from this step
1091
- and are graded on their own merits. The skipping step still emits its own
1092
- skip_result with the original reason (`not_applicable | missing_tool |
1093
- missing_test_controller`); the exemption suppresses only the cascade, not
1094
- the step's own skip reason.
1095
-
1096
- Rationale: a sole stateful step has no peer that could have established
1097
- substitute state. The platform legitimately does not implement this pathway
1098
- (e.g., proposal-mode / implicit-account adopters that materialize account
1099
- state via the first `get_products` call rather than `sync_accounts`).
1100
- Cascading `prerequisite_failed` to all downstream stateful phases collapses
1101
- useful coverage on the framework paths the adopter does implement.
1102
-
1103
- When the skipping step has at least one stateful peer in the phase, the
1104
- existing rules apply: `provides_state_for` declarations defer the cascade
1105
- (see `skip_result.reasons.peer_substituted`), and unrescued hard-missing
1106
- or real failures trip it.
1107
-
1108
- Note on `not_applicable`: unlike `missing_tool` and
1109
- `missing_test_controller` (where the agent declared the specialism but
1110
- lacks the tool/controller), `not_applicable` means the agent did not
1111
- declare the specialism at all. The cascade exemption still applies because
1112
- the structural condition — no peer available to establish substitute state —
1113
- is identical. A sole-stateful-step `not_applicable` that cascades to all
1114
- downstream phases would collapse coverage for agents that legitimately omit
1115
- a pathway; the exemption prevents this collapse regardless of the specific
1116
- skip reason. Dashboard consumers that need to distinguish "agent does not
1117
- support the specialism" from "agent supports it via an alternate tool"
1118
- should read the step's `reason` field rather than inferring from whether
1119
- downstream phases ran.
1120
-
1121
- References: adcp-client#1146 (original `not_applicable` exemption);
1122
- adcp-client#1545 (extension to `missing_tool` / `missing_test_controller`);
1123
- adcp-client-python#550 (adopter pattern that surfaced the cross-runner gap).
1124
-
1125
- run_summary:
1126
- description: |
1127
- Runners MUST expose a top-level summary for every run. UI surfaces
1128
- (Addie, CLI, web) may present a condensed form, but the full summary
1129
- MUST be available in the machine-readable (--json / structuredContent)
1130
- output.
1131
- notes:
1132
- capture_failures_count_as_failed: |
1133
- Steps that fail due to capture_path_not_resolvable or
1134
- unresolved_substitution MUST contribute to steps_failed, not
1135
- steps_skipped. The capturing step failing is a conformance failure
1136
- on that step; the downstream consumer step that cannot run due to
1137
- the missing context value uses the skip_result.reason:
1138
- prerequisite_failed path and contributes to steps_skipped. This
1139
- attribution is load-bearing — silently swallowing a capture failure
1140
- and reporting only the downstream skip points the diagnostic at the
1141
- wrong place.
1142
- upstream_traffic_not_applicable: |
1143
- Steps whose only failing validation is upstream_traffic against an
1144
- adopter that did not advertise query_upstream_traffic via
1145
- list_scenarios MUST NOT contribute to steps_failed. The runner
1146
- grades the upstream_traffic validation as not_applicable (with
1147
- skip_result.reason: missing_test_controller, detail:
1148
- "query_upstream_traffic scenario not advertised") and the step
1149
- grades on its remaining authored checks. An adopter that exposes
1150
- the scenario but returns an empty recorded_calls array DOES grade
1151
- as failed for upstream_traffic — the difference is "controller
1152
- not present" (opt-out) vs "controller present and observed nothing"
1153
- (façade signal).
1154
- required_fields:
1155
- - total_steps
1156
- - steps_passed
1157
- - steps_failed
1158
- - steps_skipped
1159
- - steps_not_selected # count of steps excluded before execution by
1160
- # suite selection, run mode, AdCP version, or
1161
- # verification profile. MUST NOT be included
1162
- # in steps_skipped.
1163
- - tracks # per-track status with the skip distinctions above
1164
- - schemas_used # array of { schema_id, schema_url } so an
1165
- # implementor can re-validate locally against
1166
- # the exact artifacts the runner applied
1167
- - runner_capability_version
1168
- # semver self-declared by the runner so
1169
- # consumers can correlate a run's grading
1170
- # behavior with the spec capability the
1171
- # runner offers. Authors target capability
1172
- # versions when they write
1173
- # expires_after_version on advisory
1174
- # validations (see storyboard-schema.yaml >
1175
- # expires_after_version) and the runner's
1176
- # promotion logic compares its declared
1177
- # value against the storyboard's expiry. The
1178
- # runner chooses what its capability version
1179
- # corresponds to — @adcp/sdk semver, the
1180
- # AdCP spec version it implements, or a
1181
- # runner-binary version — and is responsible
1182
- # for advancing it as new check kinds and
1183
- # grading semantics ship. Adopters who run
1184
- # multiple runners against the same agent
1185
- # SHOULD select the highest-capability runner
1186
- # for conformance grading.
1187
- optional_fields:
1188
- - not_selected # array of selection_result objects, or
1189
- # implementation-specific objects carrying at
1190
- # least selection_result.reason/detail plus the
1191
- # storyboard/phase/step identity. Required for
1192
- # human-facing reports that mention a
1193
- # not-selected count; otherwise the count is not
1194
- # actionable.
1195
- - not_selected_by_reason # object mapping selection_result.reason values
1196
- # to counts. Recommended for dashboards and
1197
- # buyer profile evaluators.
1198
- - skipped_by_reason # object mapping skip_result.reason values to
1199
- # counts. Recommended whenever steps_skipped > 0
1200
- # so consumers can distinguish optional
1201
- # capability skips from missing required
1202
- # surfaces without parsing prose detail strings.
1203
- - validations_not_applicable # count of validation_result entries graded
1204
- # not_applicable due to forward-compat
1205
- # (runner does not implement the storyboard's
1206
- # declared check type). Surfaces "runner is
1207
- # older than the storyboard" as a distinct
1208
- # signal from clean passes.
1209
- - notices # array of notice objects scoped to the run
1210
- # rather than a specific step (e.g., a
1211
- # `request_signing_required_in_4_0` notice
1212
- # emitted once per run when the agent does
1213
- # not advertise `request_signing.supported`,
1214
- # regardless of which storyboard the
1215
- # observation surfaced on). Runners MAY
1216
- # emit the same code on step_result.notices
1217
- # AND run_summary.notices when an advisory
1218
- # is both step-specific and run-wide;
1219
- # consumers dedupe by `code`. See the
1220
- # notice block above for shape and
1221
- # canonical_codes.
1222
- - validations_advisory_failed # count of validation_result entries with
1223
- # passed: false and severity: advisory.
1224
- # These do NOT contribute to steps_failed
1225
- # (the step grades on its required
1226
- # validations); this counter surfaces them
1227
- # for visibility without polluting the
1228
- # conformance verdict.
1229
- #
1230
- # Rendered-summary rule: when the runner
1231
- # renders a human-facing summary line
1232
- # (CLI, dashboard, chat surface),
1233
- # validations_advisory_failed MUST be
1234
- # displayed adjacent to steps_failed in
1235
- # the same line or section, NOT buried
1236
- # at the bottom of the summary. Otherwise
1237
- # a façade declaring its anti-façade
1238
- # validations as advisory produces a
1239
- # passing summary line that hides the
1240
- # advisory failures from human
1241
- # reviewers. The two counters together
1242
- # are the conformance signal.
1243
- #
1244
- # Use case: author-managed rollout
1245
- # gating during runner adoption windows
1246
- # — see storyboard-schema.yaml >
1247
- # "Validation" severity field.
1248
-
1249
- # --- Non-goals ---
1250
- #
1251
- # This contract does NOT specify:
1252
- # - Output formatting (markdown, JSON shape in the outer envelope, colors).
1253
- # - Storage or retention of run artifacts.
1254
- # - Scoring weights or pass/fail thresholds for a "compliant" verdict.
1255
- # - How to render results in conversational interfaces.
1256
- # Runners remain free to add fields, nest them under implementation-specific
1257
- # keys, and render them however best fits the surface. The contract is about
1258
- # minimum actionability.
1259
-
1260
- references:
1261
- storyboard_schema: static/compliance/source/universal/storyboard-schema.yaml
1262
- mcp_extraction: docs/building/implementation/mcp-response-extraction.mdx
1263
- a2a_extraction: docs/building/implementation/a2a-response-extraction.mdx
1264
- transport_errors: docs/building/implementation/transport-errors.mdx
1265
- signed_requests_runner: static/compliance/source/test-kits/signed-requests-runner.yaml
1266
- conforming_implementation: https://github.com/adcontextprotocol/adcp-client/pull/611