@adcp/sdk 13.0.1 → 13.0.3

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 (1411) hide show
  1. package/ADCP_VERSION +1 -1
  2. package/bin/adcp.js +37 -2
  3. package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/index.yaml +5 -1
  4. package/compliance/cache/{3.1.15.previous/protocols → 3.1.20/domains}/media-buy/scenarios/creative_fate_after_cancellation.yaml +5 -1
  5. package/compliance/cache/{3.1.15/protocols → 3.1.20/domains}/media-buy/scenarios/dependency_impairment.yaml +14 -13
  6. package/compliance/cache/{3.1.15/protocols → 3.1.20/domains}/media-buy/scenarios/dependency_impairment_cardinality.yaml +14 -13
  7. package/compliance/cache/3.1.20/domains/media-buy/scenarios/inventory_list_no_match.yaml +229 -0
  8. package/compliance/cache/{3.1.15.previous/protocols → 3.1.20/domains}/media-buy/scenarios/inventory_list_targeting.yaml +44 -61
  9. package/compliance/cache/{3.1.15/protocols → 3.1.20/domains}/media-buy/scenarios/measurement_terms_rejected.yaml +7 -73
  10. package/compliance/cache/{3.1.15.previous → 3.1.20}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +12 -7
  11. package/compliance/cache/{3.1.15.previous → 3.1.20}/domains/media-buy/scenarios/refine_products.yaml +5 -1
  12. package/compliance/cache/{3.1.15 → 3.1.20}/index.json +3 -3
  13. package/compliance/cache/{3.1.15.previous/domains → 3.1.20/protocols}/media-buy/index.yaml +5 -1
  14. package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +5 -1
  15. package/compliance/cache/{3.1.15.previous/domains → 3.1.20/protocols}/media-buy/scenarios/dependency_impairment.yaml +14 -13
  16. package/compliance/cache/{3.1.15.previous → 3.1.20}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +14 -13
  17. package/compliance/cache/3.1.20/protocols/media-buy/scenarios/inventory_list_no_match.yaml +229 -0
  18. package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +44 -61
  19. package/compliance/cache/{3.1.15.previous → 3.1.20}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +7 -73
  20. package/compliance/cache/{3.1.15.previous → 3.1.20}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +12 -7
  21. package/compliance/cache/{3.1.15.previous → 3.1.20}/protocols/media-buy/scenarios/refine_products.yaml +5 -1
  22. package/compliance/cache/{3.1.15.previous → 3.1.20}/specialisms/sales-broadcast-tv/index.yaml +6 -1
  23. package/compliance/cache/{3.1.15.previous → 3.1.20}/specialisms/sales-guaranteed/index.yaml +5 -1
  24. package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/sales-proposal-mode/index.yaml +5 -1
  25. package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/acme-outdoor.yaml +10 -0
  26. package/compliance/cache/{3.1.15.previous → 3.1.20}/universal/pagination-integrity-creative-formats.yaml +2 -2
  27. package/compliance/cache/{3.1.15/protocols → 3.1.20.previous/domains}/media-buy/index.yaml +5 -1
  28. package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +5 -1
  29. package/compliance/cache/{3.1.15 → 3.1.20.previous}/domains/media-buy/scenarios/dependency_impairment.yaml +14 -13
  30. package/compliance/cache/{3.1.15 → 3.1.20.previous}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +14 -13
  31. package/compliance/cache/3.1.20.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +229 -0
  32. package/compliance/cache/{3.1.15 → 3.1.20.previous}/domains/media-buy/scenarios/inventory_list_targeting.yaml +44 -61
  33. package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +7 -73
  34. package/compliance/cache/{3.1.15 → 3.1.20.previous}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +12 -7
  35. package/compliance/cache/{3.1.15 → 3.1.20.previous}/domains/media-buy/scenarios/refine_products.yaml +5 -1
  36. package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/index.json +3 -3
  37. package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/index.yaml +5 -1
  38. package/compliance/cache/{3.1.15/domains → 3.1.20.previous/protocols}/media-buy/scenarios/creative_fate_after_cancellation.yaml +5 -1
  39. package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/dependency_impairment.yaml +14 -13
  40. package/compliance/cache/{3.1.15.previous/domains → 3.1.20.previous/protocols}/media-buy/scenarios/dependency_impairment_cardinality.yaml +14 -13
  41. package/compliance/cache/3.1.20.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +229 -0
  42. package/compliance/cache/{3.1.15.previous/domains → 3.1.20.previous/protocols}/media-buy/scenarios/inventory_list_targeting.yaml +44 -61
  43. package/compliance/cache/{3.1.15/domains → 3.1.20.previous/protocols}/media-buy/scenarios/measurement_terms_rejected.yaml +7 -73
  44. package/compliance/cache/{3.1.15 → 3.1.20.previous}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +12 -7
  45. package/compliance/cache/{3.1.15 → 3.1.20.previous}/protocols/media-buy/scenarios/refine_products.yaml +5 -1
  46. package/compliance/cache/{3.1.15 → 3.1.20.previous}/specialisms/sales-broadcast-tv/index.yaml +6 -1
  47. package/compliance/cache/{3.1.15 → 3.1.20.previous}/specialisms/sales-guaranteed/index.yaml +5 -1
  48. package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/sales-proposal-mode/index.yaml +5 -1
  49. package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/acme-outdoor.yaml +10 -0
  50. package/compliance/cache/{3.1.15 → 3.1.20.previous}/universal/pagination-integrity-creative-formats.yaml +2 -2
  51. package/dist/lib/schemas-data/3.1/a2ui/bound-value.json +1 -1
  52. package/dist/lib/schemas-data/3.1/a2ui/component.json +1 -1
  53. package/dist/lib/schemas-data/3.1/a2ui/si-catalog.json +25 -25
  54. package/dist/lib/schemas-data/3.1/a2ui/surface.json +2 -2
  55. package/dist/lib/schemas-data/3.1/a2ui/user-action.json +1 -1
  56. package/dist/lib/schemas-data/3.1/aao/agent-publishers.json +1 -1
  57. package/dist/lib/schemas-data/3.1/account/get-account-financials-request.json +6 -6
  58. package/dist/lib/schemas-data/3.1/account/get-account-financials-response.json +12 -12
  59. package/dist/lib/schemas-data/3.1/account/list-accounts-request.json +6 -6
  60. package/dist/lib/schemas-data/3.1/account/list-accounts-response.json +8 -8
  61. package/dist/lib/schemas-data/3.1/account/report-usage-request.json +6 -6
  62. package/dist/lib/schemas-data/3.1/account/report-usage-response.json +6 -6
  63. package/dist/lib/schemas-data/3.1/account/sync-accounts-request.json +12 -12
  64. package/dist/lib/schemas-data/3.1/account/sync-accounts-response.json +16 -16
  65. package/dist/lib/schemas-data/3.1/account/sync-governance-request.json +6 -6
  66. package/dist/lib/schemas-data/3.1/account/sync-governance-response.json +10 -10
  67. package/dist/lib/schemas-data/3.1/adagents.json +29 -29
  68. package/dist/lib/schemas-data/3.1/brand/acquire-rights-request.json +10 -10
  69. package/dist/lib/schemas-data/3.1/brand/acquire-rights-response.json +16 -16
  70. package/dist/lib/schemas-data/3.1/brand/creative-approval-request.json +5 -5
  71. package/dist/lib/schemas-data/3.1/brand/creative-approval-response.json +12 -12
  72. package/dist/lib/schemas-data/3.1/brand/get-brand-identity-request.json +4 -4
  73. package/dist/lib/schemas-data/3.1/brand/get-brand-identity-response.json +10 -10
  74. package/dist/lib/schemas-data/3.1/brand/get-rights-request.json +8 -8
  75. package/dist/lib/schemas-data/3.1/brand/get-rights-response.json +11 -11
  76. package/dist/lib/schemas-data/3.1/brand/revocation-notification.json +4 -4
  77. package/dist/lib/schemas-data/3.1/brand/rights-pricing-option.json +5 -5
  78. package/dist/lib/schemas-data/3.1/brand/rights-terms.json +3 -3
  79. package/dist/lib/schemas-data/3.1/brand/search-brands-request.json +6 -6
  80. package/dist/lib/schemas-data/3.1/brand/search-brands-response.json +11 -11
  81. package/dist/lib/schemas-data/3.1/brand/update-rights-request.json +6 -6
  82. package/dist/lib/schemas-data/3.1/brand/update-rights-response.json +11 -11
  83. package/dist/lib/schemas-data/3.1/brand/verification-status.json +1 -1
  84. package/dist/lib/schemas-data/3.1/brand/verify-brand-claim-request.json +2 -2
  85. package/dist/lib/schemas-data/3.1/brand/verify-brand-claim-response.json +13 -13
  86. package/dist/lib/schemas-data/3.1/brand/verify-brand-claims-request.json +2 -2
  87. package/dist/lib/schemas-data/3.1/brand/verify-brand-claims-response.json +13 -13
  88. package/dist/lib/schemas-data/3.1/brand.json +21 -21
  89. package/dist/lib/schemas-data/3.1/bundled/content-standards/calibrate-content-request.json +12 -12
  90. package/dist/lib/schemas-data/3.1/bundled/content-standards/calibrate-content-response.json +12 -12
  91. package/dist/lib/schemas-data/3.1/bundled/content-standards/create-content-standards-request.json +16 -16
  92. package/dist/lib/schemas-data/3.1/bundled/content-standards/create-content-standards-response.json +10 -10
  93. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-content-standards-request.json +5 -5
  94. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-content-standards-response.json +23 -23
  95. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-media-buy-artifacts-request.json +16 -16
  96. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-media-buy-artifacts-response.json +18 -18
  97. package/dist/lib/schemas-data/3.1/bundled/content-standards/list-content-standards-request.json +7 -7
  98. package/dist/lib/schemas-data/3.1/bundled/content-standards/list-content-standards-response.json +24 -24
  99. package/dist/lib/schemas-data/3.1/bundled/content-standards/update-content-standards-request.json +16 -16
  100. package/dist/lib/schemas-data/3.1/bundled/content-standards/update-content-standards-response.json +10 -10
  101. package/dist/lib/schemas-data/3.1/bundled/content-standards/validate-content-delivery-request.json +12 -12
  102. package/dist/lib/schemas-data/3.1/bundled/content-standards/validate-content-delivery-response.json +12 -12
  103. package/dist/lib/schemas-data/3.1/bundled/core/tasks-get-request.json +16 -16
  104. package/dist/lib/schemas-data/3.1/bundled/core/tasks-get-response.json +183 -183
  105. package/dist/lib/schemas-data/3.1/bundled/core/tasks-list-request.json +21 -21
  106. package/dist/lib/schemas-data/3.1/bundled/core/tasks-list-response.json +11 -11
  107. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-delivery-request.json +17 -17
  108. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-delivery-response.json +56 -56
  109. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-features-request.json +44 -44
  110. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-features-response.json +13 -13
  111. package/dist/lib/schemas-data/3.1/bundled/creative/list-creative-formats-request.json +16 -16
  112. package/dist/lib/schemas-data/3.1/bundled/creative/list-creative-formats-response.json +48 -48
  113. package/dist/lib/schemas-data/3.1/bundled/creative/list-creatives-request.json +17 -17
  114. package/dist/lib/schemas-data/3.1/bundled/creative/list-creatives-response.json +58 -58
  115. package/dist/lib/schemas-data/3.1/bundled/creative/list-transformers-request.json +18 -18
  116. package/dist/lib/schemas-data/3.1/bundled/creative/list-transformers-response.json +16 -16
  117. package/dist/lib/schemas-data/3.1/bundled/creative/preview-creative-request.json +44 -44
  118. package/dist/lib/schemas-data/3.1/bundled/creative/preview-creative-response.json +50 -50
  119. package/dist/lib/schemas-data/3.1/bundled/creative/sync-creatives-request.json +46 -46
  120. package/dist/lib/schemas-data/3.1/bundled/creative/sync-creatives-response.json +27 -27
  121. package/dist/lib/schemas-data/3.1/bundled/creative/validate-input-request.json +42 -42
  122. package/dist/lib/schemas-data/3.1/bundled/creative/validate-input-response.json +10 -10
  123. package/dist/lib/schemas-data/3.1/bundled/media-buy/build-creative-request.json +53 -53
  124. package/dist/lib/schemas-data/3.1/bundled/media-buy/build-creative-response.json +54 -54
  125. package/dist/lib/schemas-data/3.1/bundled/media-buy/create-media-buy-request.json +83 -83
  126. package/dist/lib/schemas-data/3.1/bundled/media-buy/create-media-buy-response.json +77 -77
  127. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buy-delivery-request.json +25 -25
  128. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buy-delivery-response.json +40 -40
  129. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buys-request.json +18 -18
  130. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buys-response.json +65 -65
  131. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-products-request.json +50 -50
  132. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-products-response.json +101 -101
  133. package/dist/lib/schemas-data/3.1/bundled/media-buy/list-creative-formats-request.json +12 -12
  134. package/dist/lib/schemas-data/3.1/bundled/media-buy/list-creative-formats-response.json +48 -48
  135. package/dist/lib/schemas-data/3.1/bundled/media-buy/log-event-request.json +13 -13
  136. package/dist/lib/schemas-data/3.1/bundled/media-buy/log-event-response.json +10 -10
  137. package/dist/lib/schemas-data/3.1/bundled/media-buy/package-request.json +79 -79
  138. package/dist/lib/schemas-data/3.1/bundled/media-buy/provide-performance-feedback-request.json +8 -8
  139. package/dist/lib/schemas-data/3.1/bundled/media-buy/provide-performance-feedback-response.json +10 -10
  140. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-audiences-request.json +19 -19
  141. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-audiences-response.json +13 -13
  142. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-catalogs-request.json +26 -26
  143. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-catalogs-response.json +12 -12
  144. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-event-sources-request.json +19 -19
  145. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-event-sources-response.json +16 -16
  146. package/dist/lib/schemas-data/3.1/bundled/media-buy/update-media-buy-request.json +79 -79
  147. package/dist/lib/schemas-data/3.1/bundled/media-buy/update-media-buy-response.json +71 -71
  148. package/dist/lib/schemas-data/3.1/bundled/property/create-property-list-request.json +18 -18
  149. package/dist/lib/schemas-data/3.1/bundled/property/create-property-list-response.json +26 -26
  150. package/dist/lib/schemas-data/3.1/bundled/property/delete-property-list-request.json +16 -16
  151. package/dist/lib/schemas-data/3.1/bundled/property/delete-property-list-response.json +10 -10
  152. package/dist/lib/schemas-data/3.1/bundled/property/get-property-list-request.json +16 -16
  153. package/dist/lib/schemas-data/3.1/bundled/property/get-property-list-response.json +27 -27
  154. package/dist/lib/schemas-data/3.1/bundled/property/list-property-lists-request.json +17 -17
  155. package/dist/lib/schemas-data/3.1/bundled/property/list-property-lists-response.json +27 -27
  156. package/dist/lib/schemas-data/3.1/bundled/property/update-property-list-request.json +18 -18
  157. package/dist/lib/schemas-data/3.1/bundled/property/update-property-list-response.json +26 -26
  158. package/dist/lib/schemas-data/3.1/bundled/property/validate-property-delivery-request.json +19 -19
  159. package/dist/lib/schemas-data/3.1/bundled/property/validate-property-delivery-response.json +15 -15
  160. package/dist/lib/schemas-data/3.1/bundled/protocol/get-adcp-capabilities-request.json +5 -5
  161. package/dist/lib/schemas-data/3.1/bundled/protocol/get-adcp-capabilities-response.json +40 -40
  162. package/dist/lib/schemas-data/3.1/bundled/protocol/get-task-status-request.json +16 -16
  163. package/dist/lib/schemas-data/3.1/bundled/protocol/get-task-status-response.json +183 -183
  164. package/dist/lib/schemas-data/3.1/bundled/protocol/list-tasks-request.json +21 -21
  165. package/dist/lib/schemas-data/3.1/bundled/protocol/list-tasks-response.json +11 -11
  166. package/dist/lib/schemas-data/3.1/bundled/signals/activate-signal-request.json +17 -17
  167. package/dist/lib/schemas-data/3.1/bundled/signals/activate-signal-response.json +12 -12
  168. package/dist/lib/schemas-data/3.1/bundled/signals/get-signals-request.json +24 -24
  169. package/dist/lib/schemas-data/3.1/bundled/signals/get-signals-response.json +53 -53
  170. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-get-offering-request.json +5 -5
  171. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-get-offering-response.json +23 -23
  172. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-initiate-session-request.json +18 -18
  173. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-initiate-session-response.json +25 -25
  174. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-send-message-request.json +16 -16
  175. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-send-message-response.json +26 -26
  176. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-terminate-session-request.json +5 -5
  177. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-terminate-session-response.json +11 -11
  178. package/dist/lib/schemas-data/3.1/collection/base-collection-source.json +3 -3
  179. package/dist/lib/schemas-data/3.1/collection/collection-list-changed-webhook.json +2 -2
  180. package/dist/lib/schemas-data/3.1/collection/collection-list-filters.json +7 -7
  181. package/dist/lib/schemas-data/3.1/collection/collection-list.json +5 -5
  182. package/dist/lib/schemas-data/3.1/collection/create-collection-list-request.json +8 -8
  183. package/dist/lib/schemas-data/3.1/collection/create-collection-list-response.json +6 -6
  184. package/dist/lib/schemas-data/3.1/collection/delete-collection-list-request.json +5 -5
  185. package/dist/lib/schemas-data/3.1/collection/delete-collection-list-response.json +5 -5
  186. package/dist/lib/schemas-data/3.1/collection/get-collection-list-request.json +5 -5
  187. package/dist/lib/schemas-data/3.1/collection/get-collection-list-response.json +12 -12
  188. package/dist/lib/schemas-data/3.1/collection/list-collection-lists-request.json +6 -6
  189. package/dist/lib/schemas-data/3.1/collection/list-collection-lists-response.json +7 -7
  190. package/dist/lib/schemas-data/3.1/collection/update-collection-list-request.json +8 -8
  191. package/dist/lib/schemas-data/3.1/collection/update-collection-list-response.json +6 -6
  192. package/dist/lib/schemas-data/3.1/content-standards/artifact-webhook-payload.json +3 -3
  193. package/dist/lib/schemas-data/3.1/content-standards/artifact.json +7 -7
  194. package/dist/lib/schemas-data/3.1/content-standards/calibrate-content-request.json +5 -5
  195. package/dist/lib/schemas-data/3.1/content-standards/calibrate-content-response.json +10 -10
  196. package/dist/lib/schemas-data/3.1/content-standards/content-standards.json +7 -7
  197. package/dist/lib/schemas-data/3.1/content-standards/create-content-standards-request.json +8 -8
  198. package/dist/lib/schemas-data/3.1/content-standards/create-content-standards-response.json +8 -8
  199. package/dist/lib/schemas-data/3.1/content-standards/get-content-standards-request.json +4 -4
  200. package/dist/lib/schemas-data/3.1/content-standards/get-content-standards-response.json +9 -9
  201. package/dist/lib/schemas-data/3.1/content-standards/get-media-buy-artifacts-request.json +5 -5
  202. package/dist/lib/schemas-data/3.1/content-standards/get-media-buy-artifacts-response.json +10 -10
  203. package/dist/lib/schemas-data/3.1/content-standards/list-content-standards-request.json +6 -6
  204. package/dist/lib/schemas-data/3.1/content-standards/list-content-standards-response.json +10 -10
  205. package/dist/lib/schemas-data/3.1/content-standards/update-content-standards-request.json +8 -8
  206. package/dist/lib/schemas-data/3.1/content-standards/update-content-standards-response.json +8 -8
  207. package/dist/lib/schemas-data/3.1/content-standards/validate-content-delivery-request.json +5 -5
  208. package/dist/lib/schemas-data/3.1/content-standards/validate-content-delivery-response.json +10 -10
  209. package/dist/lib/schemas-data/3.1/core/account-authorization.json +1 -1
  210. package/dist/lib/schemas-data/3.1/core/account-ref.json +2 -2
  211. package/dist/lib/schemas-data/3.1/core/account-with-authorization.json +3 -3
  212. package/dist/lib/schemas-data/3.1/core/account.json +10 -10
  213. package/dist/lib/schemas-data/3.1/core/activation-key.json +1 -1
  214. package/dist/lib/schemas-data/3.1/core/ad-inventory-config.json +1 -1
  215. package/dist/lib/schemas-data/3.1/core/agent-encryption-key.json +1 -1
  216. package/dist/lib/schemas-data/3.1/core/agent-signing-key.json +1 -1
  217. package/dist/lib/schemas-data/3.1/core/app-item.json +4 -4
  218. package/dist/lib/schemas-data/3.1/core/asset-group-vocabulary.json +1 -1
  219. package/dist/lib/schemas-data/3.1/core/assets/asset-union.json +21 -21
  220. package/dist/lib/schemas-data/3.1/core/assets/audio-asset.json +3 -3
  221. package/dist/lib/schemas-data/3.1/core/assets/brief-asset.json +2 -2
  222. package/dist/lib/schemas-data/3.1/core/assets/card-asset.json +6 -6
  223. package/dist/lib/schemas-data/3.1/core/assets/catalog-asset.json +2 -2
  224. package/dist/lib/schemas-data/3.1/core/assets/css-asset.json +2 -2
  225. package/dist/lib/schemas-data/3.1/core/assets/daast-asset.json +4 -4
  226. package/dist/lib/schemas-data/3.1/core/assets/daast-tracker-asset.json +3 -3
  227. package/dist/lib/schemas-data/3.1/core/assets/html-asset.json +2 -2
  228. package/dist/lib/schemas-data/3.1/core/assets/image-asset.json +2 -2
  229. package/dist/lib/schemas-data/3.1/core/assets/javascript-asset.json +3 -3
  230. package/dist/lib/schemas-data/3.1/core/assets/markdown-asset.json +2 -2
  231. package/dist/lib/schemas-data/3.1/core/assets/pixel-tracker-asset.json +2 -2
  232. package/dist/lib/schemas-data/3.1/core/assets/published-post-asset.json +2 -2
  233. package/dist/lib/schemas-data/3.1/core/assets/text-asset.json +2 -2
  234. package/dist/lib/schemas-data/3.1/core/assets/url-asset.json +3 -3
  235. package/dist/lib/schemas-data/3.1/core/assets/vast-asset.json +4 -4
  236. package/dist/lib/schemas-data/3.1/core/assets/vast-tracker-asset.json +3 -3
  237. package/dist/lib/schemas-data/3.1/core/assets/video-asset.json +7 -7
  238. package/dist/lib/schemas-data/3.1/core/assets/webhook-asset.json +7 -7
  239. package/dist/lib/schemas-data/3.1/core/assets/zip-asset.json +2 -2
  240. package/dist/lib/schemas-data/3.1/core/async-response-data.json +29 -29
  241. package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-input-required.json +3 -3
  242. package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-submitted.json +4 -4
  243. package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-working.json +3 -3
  244. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-input-required.json +4 -4
  245. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-submitted.json +4 -4
  246. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-working.json +3 -3
  247. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-input-required.json +4 -4
  248. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-submitted.json +4 -4
  249. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-working.json +3 -3
  250. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-input-required.json +4 -4
  251. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-submitted.json +4 -4
  252. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-working.json +3 -3
  253. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  254. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  255. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-working.json +3 -3
  256. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-input-required.json +3 -3
  257. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-submitted.json +4 -4
  258. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-working.json +3 -3
  259. package/dist/lib/schemas-data/3.1/core/async-response-refs/signals/get-signals-async-response-submitted.json +4 -4
  260. package/dist/lib/schemas-data/3.1/core/async-response-refs/signals/get-signals-async-response-working.json +3 -3
  261. package/dist/lib/schemas-data/3.1/core/attribution-window.json +4 -4
  262. package/dist/lib/schemas-data/3.1/core/audience-member.json +3 -3
  263. package/dist/lib/schemas-data/3.1/core/audience-selector.json +7 -7
  264. package/dist/lib/schemas-data/3.1/core/authorized-agent-base.json +3 -3
  265. package/dist/lib/schemas-data/3.1/core/brand-id.json +1 -1
  266. package/dist/lib/schemas-data/3.1/core/brand-ref.json +3 -3
  267. package/dist/lib/schemas-data/3.1/core/business-entity.json +2 -2
  268. package/dist/lib/schemas-data/3.1/core/cancellation-policy.json +2 -2
  269. package/dist/lib/schemas-data/3.1/core/canonical-format-kind.json +1 -1
  270. package/dist/lib/schemas-data/3.1/core/canonical-projection-ref.json +3 -3
  271. package/dist/lib/schemas-data/3.1/core/canonical-projection-slot-override.json +1 -1
  272. package/dist/lib/schemas-data/3.1/core/catalog-field-mapping.json +2 -2
  273. package/dist/lib/schemas-data/3.1/core/catalog-item-delivery-metrics.json +3 -3
  274. package/dist/lib/schemas-data/3.1/core/catalog.json +7 -7
  275. package/dist/lib/schemas-data/3.1/core/catchment.json +5 -5
  276. package/dist/lib/schemas-data/3.1/core/collection-distribution.json +2 -2
  277. package/dist/lib/schemas-data/3.1/core/collection-list-ref.json +1 -1
  278. package/dist/lib/schemas-data/3.1/core/collection-selector.json +1 -1
  279. package/dist/lib/schemas-data/3.1/core/collection.json +13 -13
  280. package/dist/lib/schemas-data/3.1/core/committed-metric.json +9 -9
  281. package/dist/lib/schemas-data/3.1/core/content-rating.json +2 -2
  282. package/dist/lib/schemas-data/3.1/core/context.json +1 -1
  283. package/dist/lib/schemas-data/3.1/core/creative-asset.json +10 -10
  284. package/dist/lib/schemas-data/3.1/core/creative-assignment.json +2 -2
  285. package/dist/lib/schemas-data/3.1/core/creative-brief.json +4 -4
  286. package/dist/lib/schemas-data/3.1/core/creative-consumption.json +1 -1
  287. package/dist/lib/schemas-data/3.1/core/creative-delivery-metrics.json +2 -2
  288. package/dist/lib/schemas-data/3.1/core/creative-filters.json +5 -5
  289. package/dist/lib/schemas-data/3.1/core/creative-item.json +1 -1
  290. package/dist/lib/schemas-data/3.1/core/creative-manifest.json +11 -11
  291. package/dist/lib/schemas-data/3.1/core/creative-policy.json +3 -3
  292. package/dist/lib/schemas-data/3.1/core/creative-variable.json +1 -1
  293. package/dist/lib/schemas-data/3.1/core/creative-variant.json +5 -5
  294. package/dist/lib/schemas-data/3.1/core/data-provider-signal-selector.json +1 -1
  295. package/dist/lib/schemas-data/3.1/core/date-range.json +1 -1
  296. package/dist/lib/schemas-data/3.1/core/datetime-range.json +1 -1
  297. package/dist/lib/schemas-data/3.1/core/daypart-target.json +2 -2
  298. package/dist/lib/schemas-data/3.1/core/deadline-policy.json +1 -1
  299. package/dist/lib/schemas-data/3.1/core/delivery-forecast.json +7 -7
  300. package/dist/lib/schemas-data/3.1/core/delivery-metric-aggregate.json +9 -9
  301. package/dist/lib/schemas-data/3.1/core/delivery-metrics.json +8 -8
  302. package/dist/lib/schemas-data/3.1/core/deployment.json +3 -3
  303. package/dist/lib/schemas-data/3.1/core/destination-item.json +4 -4
  304. package/dist/lib/schemas-data/3.1/core/destination.json +1 -1
  305. package/dist/lib/schemas-data/3.1/core/diagnostic-issue.json +1 -1
  306. package/dist/lib/schemas-data/3.1/core/downstream-connection-requirement.json +1 -1
  307. package/dist/lib/schemas-data/3.1/core/duration.json +1 -1
  308. package/dist/lib/schemas-data/3.1/core/education-item.json +4 -4
  309. package/dist/lib/schemas-data/3.1/core/error.json +1 -1
  310. package/dist/lib/schemas-data/3.1/core/evaluator-spec.json +5 -5
  311. package/dist/lib/schemas-data/3.1/core/event-custom-data.json +2 -2
  312. package/dist/lib/schemas-data/3.1/core/event-source-health.json +3 -3
  313. package/dist/lib/schemas-data/3.1/core/event-surface.json +2 -2
  314. package/dist/lib/schemas-data/3.1/core/event.json +8 -8
  315. package/dist/lib/schemas-data/3.1/core/ext.json +1 -1
  316. package/dist/lib/schemas-data/3.1/core/feature-requirement.json +1 -1
  317. package/dist/lib/schemas-data/3.1/core/flight-item.json +4 -4
  318. package/dist/lib/schemas-data/3.1/core/forecast-dimension-audience.json +2 -2
  319. package/dist/lib/schemas-data/3.1/core/forecast-dimension-device-platform.json +2 -2
  320. package/dist/lib/schemas-data/3.1/core/forecast-dimension-device-type.json +2 -2
  321. package/dist/lib/schemas-data/3.1/core/forecast-dimension-geo.json +5 -5
  322. package/dist/lib/schemas-data/3.1/core/forecast-dimension-placement.json +2 -2
  323. package/dist/lib/schemas-data/3.1/core/forecast-dimension-signal.json +2 -2
  324. package/dist/lib/schemas-data/3.1/core/forecast-point-dimensions.json +7 -7
  325. package/dist/lib/schemas-data/3.1/core/forecast-point.json +27 -27
  326. package/dist/lib/schemas-data/3.1/core/forecast-range.json +1 -1
  327. package/dist/lib/schemas-data/3.1/core/forecast-vendor-metric-value.json +5 -5
  328. package/dist/lib/schemas-data/3.1/core/format-id.json +1 -1
  329. package/dist/lib/schemas-data/3.1/core/format-option-ref.json +1 -1
  330. package/dist/lib/schemas-data/3.1/core/format-shape-vocabulary.json +1 -1
  331. package/dist/lib/schemas-data/3.1/core/format.json +44 -44
  332. package/dist/lib/schemas-data/3.1/core/frequency-cap.json +4 -4
  333. package/dist/lib/schemas-data/3.1/core/generation-credential.json +3 -3
  334. package/dist/lib/schemas-data/3.1/core/geo-breakdown-support.json +3 -3
  335. package/dist/lib/schemas-data/3.1/core/geo-delivery-metrics.json +6 -6
  336. package/dist/lib/schemas-data/3.1/core/hotel-item.json +4 -4
  337. package/dist/lib/schemas-data/3.1/core/identifier.json +2 -2
  338. package/dist/lib/schemas-data/3.1/core/impairment.json +3 -3
  339. package/dist/lib/schemas-data/3.1/core/industry-identifier.json +2 -2
  340. package/dist/lib/schemas-data/3.1/core/insertion-order.json +1 -1
  341. package/dist/lib/schemas-data/3.1/core/installment-deadlines.json +2 -2
  342. package/dist/lib/schemas-data/3.1/core/installment.json +9 -9
  343. package/dist/lib/schemas-data/3.1/core/job-item.json +3 -3
  344. package/dist/lib/schemas-data/3.1/core/keyword-delivery-metrics.json +3 -3
  345. package/dist/lib/schemas-data/3.1/core/limited-series.json +1 -1
  346. package/dist/lib/schemas-data/3.1/core/material-deadline.json +1 -1
  347. package/dist/lib/schemas-data/3.1/core/mcp-webhook-payload.json +5 -5
  348. package/dist/lib/schemas-data/3.1/core/measurement-readiness.json +5 -5
  349. package/dist/lib/schemas-data/3.1/core/measurement-terms.json +3 -3
  350. package/dist/lib/schemas-data/3.1/core/measurement-window.json +1 -1
  351. package/dist/lib/schemas-data/3.1/core/media-buy-available-action.json +4 -4
  352. package/dist/lib/schemas-data/3.1/core/media-buy-features.json +2 -2
  353. package/dist/lib/schemas-data/3.1/core/media-buy.json +10 -10
  354. package/dist/lib/schemas-data/3.1/core/missing-metric.json +9 -9
  355. package/dist/lib/schemas-data/3.1/core/notification-config.json +4 -4
  356. package/dist/lib/schemas-data/3.1/core/offering-asset-group.json +16 -16
  357. package/dist/lib/schemas-data/3.1/core/offering.json +5 -5
  358. package/dist/lib/schemas-data/3.1/core/optimization-goal.json +7 -7
  359. package/dist/lib/schemas-data/3.1/core/outcome-measurement.json +2 -2
  360. package/dist/lib/schemas-data/3.1/core/overlay.json +1 -1
  361. package/dist/lib/schemas-data/3.1/core/package-signal-targeting-group.json +2 -2
  362. package/dist/lib/schemas-data/3.1/core/package-signal-targeting-groups.json +2 -2
  363. package/dist/lib/schemas-data/3.1/core/package-signal-targeting.json +3 -3
  364. package/dist/lib/schemas-data/3.1/core/package.json +17 -17
  365. package/dist/lib/schemas-data/3.1/core/pagination-request.json +1 -1
  366. package/dist/lib/schemas-data/3.1/core/pagination-response.json +1 -1
  367. package/dist/lib/schemas-data/3.1/core/performance-feedback.json +12 -12
  368. package/dist/lib/schemas-data/3.1/core/performance-standard.json +4 -4
  369. package/dist/lib/schemas-data/3.1/core/placement-definition.json +10 -10
  370. package/dist/lib/schemas-data/3.1/core/placement-ref.json +1 -1
  371. package/dist/lib/schemas-data/3.1/core/placement.json +7 -7
  372. package/dist/lib/schemas-data/3.1/core/planned-delivery.json +5 -5
  373. package/dist/lib/schemas-data/3.1/core/platform-extension-ref.json +1 -1
  374. package/dist/lib/schemas-data/3.1/core/postal-area-support.json +2 -2
  375. package/dist/lib/schemas-data/3.1/core/postal-area.json +4 -4
  376. package/dist/lib/schemas-data/3.1/core/postal-country-system.json +2 -2
  377. package/dist/lib/schemas-data/3.1/core/price.json +1 -1
  378. package/dist/lib/schemas-data/3.1/core/pricing-option.json +10 -10
  379. package/dist/lib/schemas-data/3.1/core/product-allocation.json +4 -4
  380. package/dist/lib/schemas-data/3.1/core/product-allowed-action.json +5 -5
  381. package/dist/lib/schemas-data/3.1/core/product-filters.json +27 -27
  382. package/dist/lib/schemas-data/3.1/core/product-format-declaration.json +16 -16
  383. package/dist/lib/schemas-data/3.1/core/product-signal-targeting-option.json +3 -3
  384. package/dist/lib/schemas-data/3.1/core/product.json +40 -40
  385. package/dist/lib/schemas-data/3.1/core/property-id.json +1 -1
  386. package/dist/lib/schemas-data/3.1/core/property-list-ref.json +1 -1
  387. package/dist/lib/schemas-data/3.1/core/property-tag.json +1 -1
  388. package/dist/lib/schemas-data/3.1/core/property.json +6 -6
  389. package/dist/lib/schemas-data/3.1/core/proposal.json +6 -6
  390. package/dist/lib/schemas-data/3.1/core/protocol-envelope.json +5 -5
  391. package/dist/lib/schemas-data/3.1/core/provenance.json +9 -9
  392. package/dist/lib/schemas-data/3.1/core/publisher-property-selector.json +3 -3
  393. package/dist/lib/schemas-data/3.1/core/push-notification-config.json +2 -2
  394. package/dist/lib/schemas-data/3.1/core/real-estate-item.json +4 -4
  395. package/dist/lib/schemas-data/3.1/core/reference-asset.json +1 -1
  396. package/dist/lib/schemas-data/3.1/core/registry-event.json +14 -14
  397. package/dist/lib/schemas-data/3.1/core/registry-feed-response.json +2 -2
  398. package/dist/lib/schemas-data/3.1/core/reporting-capabilities.json +8 -8
  399. package/dist/lib/schemas-data/3.1/core/reporting-webhook.json +3 -3
  400. package/dist/lib/schemas-data/3.1/core/requirements/asset-requirements.json +13 -13
  401. package/dist/lib/schemas-data/3.1/core/requirements/audio-asset-requirements.json +1 -1
  402. package/dist/lib/schemas-data/3.1/core/requirements/catalog-field-binding.json +4 -4
  403. package/dist/lib/schemas-data/3.1/core/requirements/catalog-requirements.json +5 -5
  404. package/dist/lib/schemas-data/3.1/core/requirements/css-asset-requirements.json +1 -1
  405. package/dist/lib/schemas-data/3.1/core/requirements/daast-asset-requirements.json +1 -1
  406. package/dist/lib/schemas-data/3.1/core/requirements/html-asset-requirements.json +1 -1
  407. package/dist/lib/schemas-data/3.1/core/requirements/image-asset-requirements.json +2 -2
  408. package/dist/lib/schemas-data/3.1/core/requirements/javascript-asset-requirements.json +1 -1
  409. package/dist/lib/schemas-data/3.1/core/requirements/markdown-asset-requirements.json +1 -1
  410. package/dist/lib/schemas-data/3.1/core/requirements/offering-asset-constraint.json +4 -4
  411. package/dist/lib/schemas-data/3.1/core/requirements/text-asset-requirements.json +1 -1
  412. package/dist/lib/schemas-data/3.1/core/requirements/url-asset-requirements.json +1 -1
  413. package/dist/lib/schemas-data/3.1/core/requirements/vast-asset-requirements.json +1 -1
  414. package/dist/lib/schemas-data/3.1/core/requirements/video-asset-requirements.json +6 -6
  415. package/dist/lib/schemas-data/3.1/core/requirements/webhook-asset-requirements.json +1 -1
  416. package/dist/lib/schemas-data/3.1/core/response-payload-jws-envelope.json +1 -1
  417. package/dist/lib/schemas-data/3.1/core/response.json +1 -1
  418. package/dist/lib/schemas-data/3.1/core/rights-constraint.json +4 -4
  419. package/dist/lib/schemas-data/3.1/core/seller-agent-ref.json +1 -1
  420. package/dist/lib/schemas-data/3.1/core/signal-coverage-forecast.json +5 -5
  421. package/dist/lib/schemas-data/3.1/core/signal-definition-enrichment.json +4 -4
  422. package/dist/lib/schemas-data/3.1/core/signal-definition.json +5 -5
  423. package/dist/lib/schemas-data/3.1/core/signal-filters.json +3 -3
  424. package/dist/lib/schemas-data/3.1/core/signal-id.json +1 -1
  425. package/dist/lib/schemas-data/3.1/core/signal-listing.json +4 -4
  426. package/dist/lib/schemas-data/3.1/core/signal-modeling-disclosure.json +1 -1
  427. package/dist/lib/schemas-data/3.1/core/signal-pricing-option.json +2 -2
  428. package/dist/lib/schemas-data/3.1/core/signal-pricing.json +6 -6
  429. package/dist/lib/schemas-data/3.1/core/signal-ref.json +1 -1
  430. package/dist/lib/schemas-data/3.1/core/signal-selection-group-rule.json +1 -1
  431. package/dist/lib/schemas-data/3.1/core/signal-targeting-expression.json +4 -4
  432. package/dist/lib/schemas-data/3.1/core/signal-targeting-rules.json +2 -2
  433. package/dist/lib/schemas-data/3.1/core/signal-targeting.json +7 -7
  434. package/dist/lib/schemas-data/3.1/core/sla-window.json +1 -1
  435. package/dist/lib/schemas-data/3.1/core/special.json +2 -2
  436. package/dist/lib/schemas-data/3.1/core/start-timing.json +1 -1
  437. package/dist/lib/schemas-data/3.1/core/store-item.json +3 -3
  438. package/dist/lib/schemas-data/3.1/core/talent.json +2 -2
  439. package/dist/lib/schemas-data/3.1/core/targeting.json +22 -22
  440. package/dist/lib/schemas-data/3.1/core/tasks-get-request.json +5 -5
  441. package/dist/lib/schemas-data/3.1/core/tasks-get-response.json +10 -10
  442. package/dist/lib/schemas-data/3.1/core/tasks-list-request.json +13 -13
  443. package/dist/lib/schemas-data/3.1/core/tasks-list-response.json +8 -8
  444. package/dist/lib/schemas-data/3.1/core/transformer-param.json +1 -1
  445. package/dist/lib/schemas-data/3.1/core/transformer.json +5 -5
  446. package/dist/lib/schemas-data/3.1/core/truncation-sentinel.json +1 -1
  447. package/dist/lib/schemas-data/3.1/core/user-match.json +3 -3
  448. package/dist/lib/schemas-data/3.1/core/vehicle-item.json +4 -4
  449. package/dist/lib/schemas-data/3.1/core/vendor-metric-id.json +1 -1
  450. package/dist/lib/schemas-data/3.1/core/vendor-metric-optimization-supported-metric.json +3 -3
  451. package/dist/lib/schemas-data/3.1/core/vendor-metric-optimization.json +2 -2
  452. package/dist/lib/schemas-data/3.1/core/vendor-metric-value.json +3 -3
  453. package/dist/lib/schemas-data/3.1/core/vendor-pricing-option.json +3 -3
  454. package/dist/lib/schemas-data/3.1/core/version-envelope.json +1 -1
  455. package/dist/lib/schemas-data/3.1/core/webhook-activity-record.json +3 -3
  456. package/dist/lib/schemas-data/3.1/core/webhook-challenge-response.json +1 -1
  457. package/dist/lib/schemas-data/3.1/core/webhook-challenge.json +2 -2
  458. package/dist/lib/schemas-data/3.1/core/wholesale-feed-event.json +17 -17
  459. package/dist/lib/schemas-data/3.1/core/wholesale-feed-webhook.json +3 -3
  460. package/dist/lib/schemas-data/3.1/core/x-entity-types.json +1 -1
  461. package/dist/lib/schemas-data/3.1/creative/asset-types/index.json +6 -6
  462. package/dist/lib/schemas-data/3.1/creative/audit-observation.json +2 -2
  463. package/dist/lib/schemas-data/3.1/creative/creative-feature-result.json +2 -2
  464. package/dist/lib/schemas-data/3.1/creative/creative-purged-webhook.json +3 -3
  465. package/dist/lib/schemas-data/3.1/creative/creative-status-changed-webhook.json +4 -4
  466. package/dist/lib/schemas-data/3.1/creative/get-creative-delivery-request.json +6 -6
  467. package/dist/lib/schemas-data/3.1/creative/get-creative-delivery-response.json +9 -9
  468. package/dist/lib/schemas-data/3.1/creative/get-creative-features-request.json +6 -6
  469. package/dist/lib/schemas-data/3.1/creative/get-creative-features-response.json +11 -11
  470. package/dist/lib/schemas-data/3.1/creative/list-creative-formats-request.json +13 -13
  471. package/dist/lib/schemas-data/3.1/creative/list-creative-formats-response.json +9 -9
  472. package/dist/lib/schemas-data/3.1/creative/list-creatives-request.json +9 -9
  473. package/dist/lib/schemas-data/3.1/creative/list-creatives-response.json +21 -21
  474. package/dist/lib/schemas-data/3.1/creative/list-transformers-request.json +8 -8
  475. package/dist/lib/schemas-data/3.1/creative/list-transformers-response.json +8 -8
  476. package/dist/lib/schemas-data/3.1/creative/preview-creative-request.json +12 -12
  477. package/dist/lib/schemas-data/3.1/creative/preview-creative-response.json +14 -14
  478. package/dist/lib/schemas-data/3.1/creative/preview-render.json +1 -1
  479. package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-input-required.json +3 -3
  480. package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-submitted.json +4 -4
  481. package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-working.json +3 -3
  482. package/dist/lib/schemas-data/3.1/creative/sync-creatives-request.json +8 -8
  483. package/dist/lib/schemas-data/3.1/creative/sync-creatives-response.json +15 -15
  484. package/dist/lib/schemas-data/3.1/creative/validate-input-request.json +4 -4
  485. package/dist/lib/schemas-data/3.1/creative/validate-input-response.json +4 -4
  486. package/dist/lib/schemas-data/3.1/creative/validate-input-result.json +1 -1
  487. package/dist/lib/schemas-data/3.1/creative/video-brief.json +1 -1
  488. package/dist/lib/schemas-data/3.1/enums/account-scope.json +1 -1
  489. package/dist/lib/schemas-data/3.1/enums/account-status.json +1 -1
  490. package/dist/lib/schemas-data/3.1/enums/action-not-allowed-reason.json +1 -1
  491. package/dist/lib/schemas-data/3.1/enums/action-source.json +1 -1
  492. package/dist/lib/schemas-data/3.1/enums/adcp-protocol.json +1 -1
  493. package/dist/lib/schemas-data/3.1/enums/adjustment-kind.json +1 -1
  494. package/dist/lib/schemas-data/3.1/enums/advertiser-industry.json +1 -1
  495. package/dist/lib/schemas-data/3.1/enums/age-verification-method.json +1 -1
  496. package/dist/lib/schemas-data/3.1/enums/assessment-status.json +1 -1
  497. package/dist/lib/schemas-data/3.1/enums/asset-content-type.json +1 -1
  498. package/dist/lib/schemas-data/3.1/enums/attestation-claim.json +1 -1
  499. package/dist/lib/schemas-data/3.1/enums/attribution-methodology.json +1 -1
  500. package/dist/lib/schemas-data/3.1/enums/attribution-model.json +1 -1
  501. package/dist/lib/schemas-data/3.1/enums/audience-source.json +1 -1
  502. package/dist/lib/schemas-data/3.1/enums/audience-status.json +1 -1
  503. package/dist/lib/schemas-data/3.1/enums/audio-channel-layout.json +1 -1
  504. package/dist/lib/schemas-data/3.1/enums/audio-distribution-type.json +1 -1
  505. package/dist/lib/schemas-data/3.1/enums/auth-scheme.json +1 -1
  506. package/dist/lib/schemas-data/3.1/enums/available-metric.json +1 -1
  507. package/dist/lib/schemas-data/3.1/enums/billing-party.json +1 -1
  508. package/dist/lib/schemas-data/3.1/enums/binary-verdict.json +1 -1
  509. package/dist/lib/schemas-data/3.1/enums/brand-agent-type.json +1 -1
  510. package/dist/lib/schemas-data/3.1/enums/c2pa-watermark-action.json +1 -1
  511. package/dist/lib/schemas-data/3.1/enums/canceled-by.json +1 -1
  512. package/dist/lib/schemas-data/3.1/enums/catalog-action.json +1 -1
  513. package/dist/lib/schemas-data/3.1/enums/catalog-item-status.json +1 -1
  514. package/dist/lib/schemas-data/3.1/enums/catalog-type.json +1 -1
  515. package/dist/lib/schemas-data/3.1/enums/channels.json +1 -1
  516. package/dist/lib/schemas-data/3.1/enums/cloud-storage-protocol.json +1 -1
  517. package/dist/lib/schemas-data/3.1/enums/co-branding-requirement.json +1 -1
  518. package/dist/lib/schemas-data/3.1/enums/collection-cadence.json +1 -1
  519. package/dist/lib/schemas-data/3.1/enums/collection-kind.json +1 -1
  520. package/dist/lib/schemas-data/3.1/enums/collection-relationship.json +1 -1
  521. package/dist/lib/schemas-data/3.1/enums/collection-status.json +1 -1
  522. package/dist/lib/schemas-data/3.1/enums/completion-source.json +1 -1
  523. package/dist/lib/schemas-data/3.1/enums/consent-basis.json +1 -1
  524. package/dist/lib/schemas-data/3.1/enums/content-id-type.json +1 -1
  525. package/dist/lib/schemas-data/3.1/enums/content-rating-system.json +1 -1
  526. package/dist/lib/schemas-data/3.1/enums/creative-action.json +1 -1
  527. package/dist/lib/schemas-data/3.1/enums/creative-agent-capability.json +1 -1
  528. package/dist/lib/schemas-data/3.1/enums/creative-approval-status.json +1 -1
  529. package/dist/lib/schemas-data/3.1/enums/creative-event-reason-code.json +1 -1
  530. package/dist/lib/schemas-data/3.1/enums/creative-identifier-type.json +1 -1
  531. package/dist/lib/schemas-data/3.1/enums/creative-quality.json +1 -1
  532. package/dist/lib/schemas-data/3.1/enums/creative-selection-strategy.json +1 -1
  533. package/dist/lib/schemas-data/3.1/enums/creative-sort-field.json +1 -1
  534. package/dist/lib/schemas-data/3.1/enums/creative-status.json +1 -1
  535. package/dist/lib/schemas-data/3.1/enums/daast-tracking-event.json +1 -1
  536. package/dist/lib/schemas-data/3.1/enums/daast-version.json +1 -1
  537. package/dist/lib/schemas-data/3.1/enums/day-of-week.json +1 -1
  538. package/dist/lib/schemas-data/3.1/enums/delegation-authority.json +1 -1
  539. package/dist/lib/schemas-data/3.1/enums/delivery-type.json +1 -1
  540. package/dist/lib/schemas-data/3.1/enums/demographic-system.json +1 -1
  541. package/dist/lib/schemas-data/3.1/enums/derivative-type.json +1 -1
  542. package/dist/lib/schemas-data/3.1/enums/device-platform.json +1 -1
  543. package/dist/lib/schemas-data/3.1/enums/device-type.json +1 -1
  544. package/dist/lib/schemas-data/3.1/enums/digital-source-type.json +1 -1
  545. package/dist/lib/schemas-data/3.1/enums/dimension-unit.json +1 -1
  546. package/dist/lib/schemas-data/3.1/enums/disclosure-persistence.json +1 -1
  547. package/dist/lib/schemas-data/3.1/enums/disclosure-position.json +1 -1
  548. package/dist/lib/schemas-data/3.1/enums/distance-unit.json +1 -1
  549. package/dist/lib/schemas-data/3.1/enums/distribution-identifier-type.json +1 -1
  550. package/dist/lib/schemas-data/3.1/enums/embedded-provenance-method.json +1 -1
  551. package/dist/lib/schemas-data/3.1/enums/error-code.json +1 -1
  552. package/dist/lib/schemas-data/3.1/enums/error-scope.json +1 -1
  553. package/dist/lib/schemas-data/3.1/enums/escalation-severity.json +1 -1
  554. package/dist/lib/schemas-data/3.1/enums/event-type.json +1 -1
  555. package/dist/lib/schemas-data/3.1/enums/exclusivity.json +1 -1
  556. package/dist/lib/schemas-data/3.1/enums/feature-check-status.json +1 -1
  557. package/dist/lib/schemas-data/3.1/enums/feed-format.json +1 -1
  558. package/dist/lib/schemas-data/3.1/enums/feedback-source.json +1 -1
  559. package/dist/lib/schemas-data/3.1/enums/forecast-method.json +1 -1
  560. package/dist/lib/schemas-data/3.1/enums/forecast-range-unit.json +1 -1
  561. package/dist/lib/schemas-data/3.1/enums/forecastable-metric.json +1 -1
  562. package/dist/lib/schemas-data/3.1/enums/format-id-parameter.json +1 -1
  563. package/dist/lib/schemas-data/3.1/enums/frame-rate-type.json +1 -1
  564. package/dist/lib/schemas-data/3.1/enums/frequency-cap-scope.json +1 -1
  565. package/dist/lib/schemas-data/3.1/enums/genre-taxonomy.json +3 -3
  566. package/dist/lib/schemas-data/3.1/enums/geo-level.json +1 -1
  567. package/dist/lib/schemas-data/3.1/enums/gop-type.json +1 -1
  568. package/dist/lib/schemas-data/3.1/enums/governance-decision.json +1 -1
  569. package/dist/lib/schemas-data/3.1/enums/governance-domain.json +1 -1
  570. package/dist/lib/schemas-data/3.1/enums/governance-mode.json +1 -1
  571. package/dist/lib/schemas-data/3.1/enums/governance-phase.json +1 -1
  572. package/dist/lib/schemas-data/3.1/enums/history-entry-type.json +1 -1
  573. package/dist/lib/schemas-data/3.1/enums/http-method.json +1 -1
  574. package/dist/lib/schemas-data/3.1/enums/identifier-types.json +1 -1
  575. package/dist/lib/schemas-data/3.1/enums/impairment-offline-state.json +1 -1
  576. package/dist/lib/schemas-data/3.1/enums/impairment-reason-code.json +1 -1
  577. package/dist/lib/schemas-data/3.1/enums/installment-status.json +1 -1
  578. package/dist/lib/schemas-data/3.1/enums/javascript-module-type.json +1 -1
  579. package/dist/lib/schemas-data/3.1/enums/landing-page-requirement.json +1 -1
  580. package/dist/lib/schemas-data/3.1/enums/legacy-postal-system.json +1 -1
  581. package/dist/lib/schemas-data/3.1/enums/lift-dimension.json +1 -1
  582. package/dist/lib/schemas-data/3.1/enums/logo-slot.json +1 -1
  583. package/dist/lib/schemas-data/3.1/enums/makegood-remedy.json +1 -1
  584. package/dist/lib/schemas-data/3.1/enums/markdown-flavor.json +1 -1
  585. package/dist/lib/schemas-data/3.1/enums/match-id-type.json +3 -3
  586. package/dist/lib/schemas-data/3.1/enums/match-type.json +1 -1
  587. package/dist/lib/schemas-data/3.1/enums/media-buy-action-mode.json +1 -1
  588. package/dist/lib/schemas-data/3.1/enums/media-buy-health.json +1 -1
  589. package/dist/lib/schemas-data/3.1/enums/media-buy-status.json +1 -1
  590. package/dist/lib/schemas-data/3.1/enums/media-buy-valid-action.json +1 -1
  591. package/dist/lib/schemas-data/3.1/enums/metric-scope.json +1 -1
  592. package/dist/lib/schemas-data/3.1/enums/metric-type.json +1 -1
  593. package/dist/lib/schemas-data/3.1/enums/metro-system.json +1 -1
  594. package/dist/lib/schemas-data/3.1/enums/moov-atom-position.json +1 -1
  595. package/dist/lib/schemas-data/3.1/enums/notification-type.json +1 -1
  596. package/dist/lib/schemas-data/3.1/enums/offering-availability-status.json +1 -1
  597. package/dist/lib/schemas-data/3.1/enums/outcome-type.json +1 -1
  598. package/dist/lib/schemas-data/3.1/enums/pacing.json +1 -1
  599. package/dist/lib/schemas-data/3.1/enums/payment-terms.json +1 -1
  600. package/dist/lib/schemas-data/3.1/enums/performance-standard-metric.json +1 -1
  601. package/dist/lib/schemas-data/3.1/enums/policy-category.json +1 -1
  602. package/dist/lib/schemas-data/3.1/enums/policy-enforcement.json +1 -1
  603. package/dist/lib/schemas-data/3.1/enums/postal-system.json +1 -1
  604. package/dist/lib/schemas-data/3.1/enums/preview-output-format.json +1 -1
  605. package/dist/lib/schemas-data/3.1/enums/pricing-model.json +1 -1
  606. package/dist/lib/schemas-data/3.1/enums/production-quality.json +1 -1
  607. package/dist/lib/schemas-data/3.1/enums/property-type.json +1 -1
  608. package/dist/lib/schemas-data/3.1/enums/proposal-status.json +1 -1
  609. package/dist/lib/schemas-data/3.1/enums/publisher-identifier-types.json +1 -1
  610. package/dist/lib/schemas-data/3.1/enums/purchase-type.json +1 -1
  611. package/dist/lib/schemas-data/3.1/enums/reach-unit.json +1 -1
  612. package/dist/lib/schemas-data/3.1/enums/reporting-frequency.json +1 -1
  613. package/dist/lib/schemas-data/3.1/enums/response-type.json +1 -1
  614. package/dist/lib/schemas-data/3.1/enums/restricted-attribute.json +1 -1
  615. package/dist/lib/schemas-data/3.1/enums/right-type.json +1 -1
  616. package/dist/lib/schemas-data/3.1/enums/right-use.json +1 -1
  617. package/dist/lib/schemas-data/3.1/enums/rights-billing-period.json +1 -1
  618. package/dist/lib/schemas-data/3.1/enums/scan-type.json +1 -1
  619. package/dist/lib/schemas-data/3.1/enums/si-session-status.json +1 -1
  620. package/dist/lib/schemas-data/3.1/enums/signal-catalog-type.json +1 -1
  621. package/dist/lib/schemas-data/3.1/enums/signal-source.json +1 -1
  622. package/dist/lib/schemas-data/3.1/enums/signal-value-type.json +1 -1
  623. package/dist/lib/schemas-data/3.1/enums/snapshot-unavailable-reason.json +1 -1
  624. package/dist/lib/schemas-data/3.1/enums/social-placement-surface.json +1 -1
  625. package/dist/lib/schemas-data/3.1/enums/sort-direction.json +1 -1
  626. package/dist/lib/schemas-data/3.1/enums/sort-metric.json +1 -1
  627. package/dist/lib/schemas-data/3.1/enums/special-category.json +1 -1
  628. package/dist/lib/schemas-data/3.1/enums/specialism.json +1 -1
  629. package/dist/lib/schemas-data/3.1/enums/sponsored-placement-type.json +1 -1
  630. package/dist/lib/schemas-data/3.1/enums/talent-role.json +1 -1
  631. package/dist/lib/schemas-data/3.1/enums/task-status.json +1 -1
  632. package/dist/lib/schemas-data/3.1/enums/task-type.json +1 -1
  633. package/dist/lib/schemas-data/3.1/enums/transport-mode.json +1 -1
  634. package/dist/lib/schemas-data/3.1/enums/travel-time-unit.json +1 -1
  635. package/dist/lib/schemas-data/3.1/enums/uid-type.json +3 -3
  636. package/dist/lib/schemas-data/3.1/enums/universal-macro.json +1 -1
  637. package/dist/lib/schemas-data/3.1/enums/update-frequency.json +1 -1
  638. package/dist/lib/schemas-data/3.1/enums/url-asset-type.json +1 -1
  639. package/dist/lib/schemas-data/3.1/enums/validation-mode.json +1 -1
  640. package/dist/lib/schemas-data/3.1/enums/vast-tracking-event.json +1 -1
  641. package/dist/lib/schemas-data/3.1/enums/vast-version.json +1 -1
  642. package/dist/lib/schemas-data/3.1/enums/video-placement-type.json +1 -1
  643. package/dist/lib/schemas-data/3.1/enums/viewability-standard.json +1 -1
  644. package/dist/lib/schemas-data/3.1/enums/watermark-media-type.json +1 -1
  645. package/dist/lib/schemas-data/3.1/enums/wcag-level.json +1 -1
  646. package/dist/lib/schemas-data/3.1/enums/webhook-response-type.json +1 -1
  647. package/dist/lib/schemas-data/3.1/enums/webhook-security-method.json +1 -1
  648. package/dist/lib/schemas-data/3.1/error-details/account-setup-required.json +1 -1
  649. package/dist/lib/schemas-data/3.1/error-details/action-not-allowed.json +4 -4
  650. package/dist/lib/schemas-data/3.1/error-details/agent-permission-denied.json +1 -1
  651. package/dist/lib/schemas-data/3.1/error-details/audience-too-small.json +1 -1
  652. package/dist/lib/schemas-data/3.1/error-details/authorization-required.json +3 -3
  653. package/dist/lib/schemas-data/3.1/error-details/billing-not-permitted-for-agent.json +3 -3
  654. package/dist/lib/schemas-data/3.1/error-details/billing-not-supported.json +2 -2
  655. package/dist/lib/schemas-data/3.1/error-details/budget-too-low.json +1 -1
  656. package/dist/lib/schemas-data/3.1/error-details/conflict.json +1 -1
  657. package/dist/lib/schemas-data/3.1/error-details/creative-rejected.json +1 -1
  658. package/dist/lib/schemas-data/3.1/error-details/policy-violation.json +1 -1
  659. package/dist/lib/schemas-data/3.1/error-details/rate-limited.json +1 -1
  660. package/dist/lib/schemas-data/3.1/error-details/stale-response.json +1 -1
  661. package/dist/lib/schemas-data/3.1/error-details/vendor-error-codes.json +1 -1
  662. package/dist/lib/schemas-data/3.1/error-details/version-unsupported.json +2 -2
  663. package/dist/lib/schemas-data/3.1/extensions/extension-meta.json +1 -1
  664. package/dist/lib/schemas-data/3.1/extensions/index.json +2 -2
  665. package/dist/lib/schemas-data/3.1/formats/canonical/_base.json +5 -5
  666. package/dist/lib/schemas-data/3.1/formats/canonical/agent_placement.json +2 -2
  667. package/dist/lib/schemas-data/3.1/formats/canonical/audio_daast.json +2 -2
  668. package/dist/lib/schemas-data/3.1/formats/canonical/audio_hosted.json +2 -2
  669. package/dist/lib/schemas-data/3.1/formats/canonical/display_tag.json +2 -2
  670. package/dist/lib/schemas-data/3.1/formats/canonical/html5.json +2 -2
  671. package/dist/lib/schemas-data/3.1/formats/canonical/image.json +2 -2
  672. package/dist/lib/schemas-data/3.1/formats/canonical/image_carousel.json +2 -2
  673. package/dist/lib/schemas-data/3.1/formats/canonical/native_in_feed.json +2 -2
  674. package/dist/lib/schemas-data/3.1/formats/canonical/responsive_creative.json +2 -2
  675. package/dist/lib/schemas-data/3.1/formats/canonical/sponsored_placement.json +3 -3
  676. package/dist/lib/schemas-data/3.1/formats/canonical/video_hosted.json +2 -2
  677. package/dist/lib/schemas-data/3.1/formats/canonical/video_vast.json +2 -2
  678. package/dist/lib/schemas-data/3.1/governance/attribute-definition.json +1 -1
  679. package/dist/lib/schemas-data/3.1/governance/audience-constraints.json +3 -3
  680. package/dist/lib/schemas-data/3.1/governance/check-governance-request.json +8 -8
  681. package/dist/lib/schemas-data/3.1/governance/check-governance-response.json +7 -7
  682. package/dist/lib/schemas-data/3.1/governance/get-plan-audit-logs-request.json +5 -5
  683. package/dist/lib/schemas-data/3.1/governance/get-plan-audit-logs-response.json +11 -11
  684. package/dist/lib/schemas-data/3.1/governance/policy-category-definition.json +2 -2
  685. package/dist/lib/schemas-data/3.1/governance/policy-entry.json +6 -6
  686. package/dist/lib/schemas-data/3.1/governance/policy-ref.json +1 -1
  687. package/dist/lib/schemas-data/3.1/governance/report-plan-outcome-request.json +7 -7
  688. package/dist/lib/schemas-data/3.1/governance/report-plan-outcome-response.json +5 -5
  689. package/dist/lib/schemas-data/3.1/governance/sync-plans-request.json +14 -14
  690. package/dist/lib/schemas-data/3.1/governance/sync-plans-response.json +6 -6
  691. package/dist/lib/schemas-data/3.1/index.json +443 -443
  692. package/dist/lib/schemas-data/3.1/manifest.json +7 -3
  693. package/dist/lib/schemas-data/3.1/manifest.schema.json +1 -1
  694. package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-input-required.json +4 -4
  695. package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-submitted.json +4 -4
  696. package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-working.json +3 -3
  697. package/dist/lib/schemas-data/3.1/media-buy/build-creative-request.json +16 -16
  698. package/dist/lib/schemas-data/3.1/media-buy/build-creative-response.json +35 -35
  699. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-input-required.json +4 -4
  700. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-submitted.json +4 -4
  701. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-working.json +3 -3
  702. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-request.json +13 -13
  703. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-response.json +19 -19
  704. package/dist/lib/schemas-data/3.1/media-buy/get-media-buy-delivery-request.json +23 -23
  705. package/dist/lib/schemas-data/3.1/media-buy/get-media-buy-delivery-response.json +27 -27
  706. package/dist/lib/schemas-data/3.1/media-buy/get-media-buys-request.json +8 -8
  707. package/dist/lib/schemas-data/3.1/media-buy/get-media-buys-response.json +30 -30
  708. package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-input-required.json +4 -4
  709. package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-submitted.json +4 -4
  710. package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-working.json +3 -3
  711. package/dist/lib/schemas-data/3.1/media-buy/get-products-request.json +13 -13
  712. package/dist/lib/schemas-data/3.1/media-buy/get-products-response.json +10 -10
  713. package/dist/lib/schemas-data/3.1/media-buy/list-creative-formats-request.json +13 -13
  714. package/dist/lib/schemas-data/3.1/media-buy/list-creative-formats-response.json +9 -9
  715. package/dist/lib/schemas-data/3.1/media-buy/log-event-request.json +5 -5
  716. package/dist/lib/schemas-data/3.1/media-buy/log-event-response.json +8 -8
  717. package/dist/lib/schemas-data/3.1/media-buy/media-buy-delivery-webhook-result.json +9 -9
  718. package/dist/lib/schemas-data/3.1/media-buy/package-request.json +23 -23
  719. package/dist/lib/schemas-data/3.1/media-buy/package-update.json +13 -13
  720. package/dist/lib/schemas-data/3.1/media-buy/provide-performance-feedback-request.json +7 -7
  721. package/dist/lib/schemas-data/3.1/media-buy/provide-performance-feedback-response.json +8 -8
  722. package/dist/lib/schemas-data/3.1/media-buy/sync-audiences-request.json +8 -8
  723. package/dist/lib/schemas-data/3.1/media-buy/sync-audiences-response.json +14 -14
  724. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  725. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  726. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-working.json +3 -3
  727. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-request.json +8 -8
  728. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-response.json +14 -14
  729. package/dist/lib/schemas-data/3.1/media-buy/sync-event-sources-request.json +8 -8
  730. package/dist/lib/schemas-data/3.1/media-buy/sync-event-sources-response.json +14 -14
  731. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-input-required.json +3 -3
  732. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-submitted.json +4 -4
  733. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-working.json +3 -3
  734. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-request.json +11 -11
  735. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-response.json +17 -17
  736. package/dist/lib/schemas-data/3.1/pricing-options/cpa-option.json +4 -4
  737. package/dist/lib/schemas-data/3.1/pricing-options/cpc-option.json +4 -4
  738. package/dist/lib/schemas-data/3.1/pricing-options/cpcv-option.json +4 -4
  739. package/dist/lib/schemas-data/3.1/pricing-options/cpm-option.json +4 -4
  740. package/dist/lib/schemas-data/3.1/pricing-options/cpp-option.json +5 -5
  741. package/dist/lib/schemas-data/3.1/pricing-options/cpv-option.json +4 -4
  742. package/dist/lib/schemas-data/3.1/pricing-options/flat-rate-option.json +4 -4
  743. package/dist/lib/schemas-data/3.1/pricing-options/price-breakdown.json +2 -2
  744. package/dist/lib/schemas-data/3.1/pricing-options/price-guidance.json +1 -1
  745. package/dist/lib/schemas-data/3.1/pricing-options/time-option.json +4 -4
  746. package/dist/lib/schemas-data/3.1/pricing-options/vcpm-option.json +4 -4
  747. package/dist/lib/schemas-data/3.1/property/authorization-result.json +1 -1
  748. package/dist/lib/schemas-data/3.1/property/base-property-source.json +4 -4
  749. package/dist/lib/schemas-data/3.1/property/create-property-list-request.json +8 -8
  750. package/dist/lib/schemas-data/3.1/property/create-property-list-response.json +6 -6
  751. package/dist/lib/schemas-data/3.1/property/delete-property-list-request.json +5 -5
  752. package/dist/lib/schemas-data/3.1/property/delete-property-list-response.json +5 -5
  753. package/dist/lib/schemas-data/3.1/property/delivery-record.json +3 -3
  754. package/dist/lib/schemas-data/3.1/property/get-property-list-request.json +5 -5
  755. package/dist/lib/schemas-data/3.1/property/get-property-list-response.json +9 -9
  756. package/dist/lib/schemas-data/3.1/property/list-property-lists-request.json +6 -6
  757. package/dist/lib/schemas-data/3.1/property/list-property-lists-response.json +7 -7
  758. package/dist/lib/schemas-data/3.1/property/property-error.json +2 -2
  759. package/dist/lib/schemas-data/3.1/property/property-feature-definition.json +2 -2
  760. package/dist/lib/schemas-data/3.1/property/property-feature-result.json +4 -4
  761. package/dist/lib/schemas-data/3.1/property/property-feature-value.json +2 -2
  762. package/dist/lib/schemas-data/3.1/property/property-feature.json +1 -1
  763. package/dist/lib/schemas-data/3.1/property/property-list-changed-webhook.json +2 -2
  764. package/dist/lib/schemas-data/3.1/property/property-list-filters.json +5 -5
  765. package/dist/lib/schemas-data/3.1/property/property-list.json +6 -6
  766. package/dist/lib/schemas-data/3.1/property/update-property-list-request.json +8 -8
  767. package/dist/lib/schemas-data/3.1/property/update-property-list-response.json +6 -6
  768. package/dist/lib/schemas-data/3.1/property/validate-property-delivery-request.json +6 -6
  769. package/dist/lib/schemas-data/3.1/property/validate-property-delivery-response.json +6 -6
  770. package/dist/lib/schemas-data/3.1/property/validation-result.json +5 -5
  771. package/dist/lib/schemas-data/3.1/protocol/get-adcp-capabilities-request.json +4 -4
  772. package/dist/lib/schemas-data/3.1/protocol/get-adcp-capabilities-response.json +34 -34
  773. package/dist/lib/schemas-data/3.1/protocol/get-task-status-request.json +5 -5
  774. package/dist/lib/schemas-data/3.1/protocol/get-task-status-response.json +10 -10
  775. package/dist/lib/schemas-data/3.1/protocol/list-tasks-request.json +13 -13
  776. package/dist/lib/schemas-data/3.1/protocol/list-tasks-response.json +8 -8
  777. package/dist/lib/schemas-data/3.1/registries/v1-canonical-mapping.json +2 -2
  778. package/dist/lib/schemas-data/3.1/signals/activate-signal-request.json +6 -6
  779. package/dist/lib/schemas-data/3.1/signals/activate-signal-response.json +9 -9
  780. package/dist/lib/schemas-data/3.1/signals/get-signals-async-response-submitted.json +4 -4
  781. package/dist/lib/schemas-data/3.1/signals/get-signals-async-response-working.json +3 -3
  782. package/dist/lib/schemas-data/3.1/signals/get-signals-request.json +11 -11
  783. package/dist/lib/schemas-data/3.1/signals/get-signals-response.json +17 -17
  784. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-capabilities.json +1 -1
  785. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-context-use.json +1 -1
  786. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-get-offering-request.json +4 -4
  787. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-get-offering-response.json +9 -9
  788. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-identity.json +1 -1
  789. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-initiate-session-request.json +7 -7
  790. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-initiate-session-response.json +10 -10
  791. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-send-message-request.json +5 -5
  792. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-send-message-response.json +10 -10
  793. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-sponsored-context-receipt.json +4 -4
  794. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-sponsored-context.json +4 -4
  795. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-terminate-session-request.json +4 -4
  796. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-terminate-session-response.json +7 -7
  797. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-ui-element.json +1 -1
  798. package/dist/lib/schemas-data/3.1/trusted-match/available-package.json +4 -4
  799. package/dist/lib/schemas-data/3.1/trusted-match/context-match-request.json +5 -5
  800. package/dist/lib/schemas-data/3.1/trusted-match/context-match-response.json +4 -4
  801. package/dist/lib/schemas-data/3.1/trusted-match/error.json +1 -1
  802. package/dist/lib/schemas-data/3.1/trusted-match/identity-match-request.json +4 -4
  803. package/dist/lib/schemas-data/3.1/trusted-match/identity-match-response.json +4 -4
  804. package/dist/lib/schemas-data/3.1/trusted-match/offer-price.json +1 -1
  805. package/dist/lib/schemas-data/3.1/trusted-match/offer.json +5 -5
  806. package/dist/lib/schemas-data/3.1/trusted-match/provider-identity-match-response.json +4 -4
  807. package/dist/lib/schemas-data/3.1/trusted-match/provider-registration.json +2 -2
  808. package/dist/lib/schemas-data/3.1/trusted-match/publisher-tmpx-config.json +1 -1
  809. package/dist/lib/schemas-data/3.1/trusted-match/tmpx-chunk.json +1 -1
  810. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  811. package/dist/lib/server/decisioning/capabilities.d.mts +5 -5
  812. package/dist/lib/server/decisioning/capabilities.d.ts +5 -5
  813. package/dist/lib/server/decisioning/capabilities.js.map +1 -1
  814. package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
  815. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.js.map +1 -1
  816. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
  817. package/dist/lib/server/wire-spec-fields.generated.d.mts +29 -29
  818. package/dist/lib/server/wire-spec-fields.generated.d.ts +29 -29
  819. package/dist/lib/server/wire-spec-fields.generated.js +29 -29
  820. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -1
  821. package/dist/lib/server/wire-spec-fields.generated.mjs +29 -29
  822. package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
  823. package/dist/lib/testing/client.d.ts.map +1 -1
  824. package/dist/lib/testing/client.js +6 -2
  825. package/dist/lib/testing/client.js.map +1 -1
  826. package/dist/lib/testing/client.mjs +6 -2
  827. package/dist/lib/testing/client.mjs.map +1 -1
  828. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  829. package/dist/lib/testing/storyboard/runner.js +18 -4
  830. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  831. package/dist/lib/testing/storyboard/runner.mjs +18 -4
  832. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  833. package/dist/lib/testing/storyboard/types.d.mts +83 -29
  834. package/dist/lib/testing/storyboard/types.d.ts +83 -29
  835. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  836. package/dist/lib/testing/storyboard/types.js.map +1 -1
  837. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  838. package/dist/lib/testing/storyboard/validations.d.mts +3 -1
  839. package/dist/lib/testing/storyboard/validations.d.ts +3 -1
  840. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
  841. package/dist/lib/testing/storyboard/validations.js +86 -23
  842. package/dist/lib/testing/storyboard/validations.js.map +1 -1
  843. package/dist/lib/testing/storyboard/validations.mjs +86 -24
  844. package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
  845. package/dist/lib/testing/types.d.mts +11 -0
  846. package/dist/lib/testing/types.d.ts +11 -0
  847. package/dist/lib/testing/types.d.ts.map +1 -1
  848. package/dist/lib/testing/types.js.map +1 -1
  849. package/dist/lib/types/comply-test-controller.d.ts +1 -1
  850. package/dist/lib/types/core.generated.d.mts +2 -2
  851. package/dist/lib/types/core.generated.d.ts +2 -2
  852. package/dist/lib/types/core.generated.js.map +1 -1
  853. package/dist/lib/types/get-adcp-capabilities.d.ts +2 -2
  854. package/dist/lib/types/get-products.d.ts +2 -2
  855. package/dist/lib/types/get-task-status.d.ts +1 -1
  856. package/dist/lib/types/log-event.d.ts +1 -1
  857. package/dist/lib/types/manifest.generated.d.mts +3 -3
  858. package/dist/lib/types/manifest.generated.d.ts +3 -3
  859. package/dist/lib/types/manifest.generated.js.map +1 -1
  860. package/dist/lib/types/manifest.generated.mjs.map +1 -1
  861. package/dist/lib/types/per-tool-index.json +1 -1
  862. package/dist/lib/types/sync-audiences.d.ts +1 -1
  863. package/dist/lib/types/tools.generated.d.mts +2 -2
  864. package/dist/lib/types/tools.generated.d.ts +2 -2
  865. package/dist/lib/types/tools.generated.js.map +1 -1
  866. package/dist/lib/validation/schema-loader.d.ts.map +1 -1
  867. package/dist/lib/validation/schema-loader.js +9 -0
  868. package/dist/lib/validation/schema-loader.js.map +1 -1
  869. package/dist/lib/validation/schema-loader.mjs +8 -0
  870. package/dist/lib/validation/schema-loader.mjs.map +1 -1
  871. package/dist/lib/version.d.mts +7 -7
  872. package/dist/lib/version.d.ts +7 -7
  873. package/dist/lib/version.d.ts.map +1 -1
  874. package/dist/lib/version.js +11 -6
  875. package/dist/lib/version.js.map +1 -1
  876. package/dist/lib/version.mjs +11 -6
  877. package/dist/lib/version.mjs.map +1 -1
  878. package/docs/llms.txt +5 -5
  879. package/package.json +2 -2
  880. package/compliance/cache/3.1.15/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  881. package/compliance/cache/3.1.15/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  882. package/compliance/cache/3.1.15.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  883. package/compliance/cache/3.1.15.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  884. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/brand/index.yaml +0 -0
  885. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  886. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  887. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/index.yaml +0 -0
  888. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
  889. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
  890. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  891. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
  892. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/scenarios/native_in_feed.yaml +0 -0
  893. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/governance/index.yaml +0 -0
  894. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  895. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/available_actions.yaml +0 -0
  896. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  897. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  898. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  899. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  900. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  901. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
  902. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  903. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  904. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  905. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  906. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  907. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  908. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  909. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  910. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  911. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  912. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
  913. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  914. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  915. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  916. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  917. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  918. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  919. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  920. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
  921. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  922. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  923. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  924. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  925. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  926. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  927. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  928. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  929. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  930. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  931. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/state-machine.yaml +0 -0
  932. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/signals/index.yaml +0 -0
  933. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  934. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/sponsored-intelligence/index.yaml +0 -0
  935. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  936. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/brand/index.yaml +0 -0
  937. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  938. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  939. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/index.yaml +0 -0
  940. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
  941. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
  942. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  943. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
  944. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
  945. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/governance/index.yaml +0 -0
  946. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  947. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
  948. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  949. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  950. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  951. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  952. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  953. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
  954. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  955. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  956. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  957. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  958. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  959. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  960. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  961. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  962. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  963. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  964. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
  965. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  966. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  967. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  968. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  969. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  970. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  971. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  972. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
  973. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  974. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  975. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  976. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  977. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  978. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  979. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  980. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  981. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  982. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  983. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/state-machine.yaml +0 -0
  984. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/signals/index.yaml +0 -0
  985. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  986. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/sponsored-intelligence/index.yaml +0 -0
  987. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  988. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/audience-sync/index.yaml +0 -0
  989. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/brand-rights/index.yaml +0 -0
  990. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  991. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/collection-lists/index.yaml +0 -0
  992. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/content-standards/index.yaml +0 -0
  993. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/creative-ad-server/index.yaml +0 -0
  994. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/creative-generative/generative-seller.yaml +0 -0
  995. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/creative-generative/index.yaml +0 -0
  996. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/creative-template/index.yaml +0 -0
  997. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/creative-transformers/index.yaml +0 -0
  998. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/governance-aware-seller/index.yaml +0 -0
  999. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1000. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/governance-delivery-monitor/index.yaml +0 -0
  1001. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1002. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/governance-spend-authority/index.yaml +0 -0
  1003. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/property-lists/index.yaml +0 -0
  1004. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1005. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/sales-non-guaranteed/index.yaml +0 -0
  1006. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/sales-social/index.yaml +0 -0
  1007. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/signal-marketplace/index.yaml +0 -0
  1008. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1009. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/signal-owned/index.yaml +0 -0
  1010. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1011. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/acme-outdoor-live.yaml +0 -0
  1012. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/billing-gate-runner.yaml +0 -0
  1013. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/bistro-oranje.yaml +0 -0
  1014. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/distributed-brand-runner.yaml +0 -0
  1015. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/nova-motors.yaml +0 -0
  1016. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/osei-natural.yaml +0 -0
  1017. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/parallel-dispatch-runner.yaml +0 -0
  1018. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/rate-limit-trip-runner.yaml +0 -0
  1019. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/signed-requests-runner.yaml +0 -0
  1020. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/single-side-trust-runner.yaml +0 -0
  1021. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/substitution-observer-runner.yaml +0 -0
  1022. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/summit-foods.yaml +0 -0
  1023. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/webhook-receiver-runner.yaml +0 -0
  1024. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/catalog-macro-substitution.json +0 -0
  1025. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1026. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1027. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1028. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1029. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1030. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1031. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1032. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1033. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1034. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1035. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1036. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/README.md +0 -0
  1037. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/canonicalization.json +0 -0
  1038. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/keys.json +0 -0
  1039. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1040. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1041. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1042. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1043. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1044. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1045. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1046. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1047. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1048. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1049. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1050. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1051. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1052. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1053. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1054. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1055. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1056. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1057. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  1058. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  1059. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  1060. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  1061. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  1062. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  1063. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1064. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  1065. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1066. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  1067. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  1068. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  1069. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  1070. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  1071. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  1072. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  1073. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  1074. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  1075. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1076. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  1077. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  1078. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1079. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-receiver-envelope.json +0 -0
  1080. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/README.md +0 -0
  1081. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/keys.json +0 -0
  1082. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  1083. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  1084. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  1085. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  1086. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  1087. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  1088. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  1089. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  1090. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  1091. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  1092. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  1093. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  1094. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  1095. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  1096. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  1097. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  1098. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  1099. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  1100. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  1101. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  1102. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  1103. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  1104. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  1105. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  1106. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  1107. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  1108. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  1109. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  1110. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  1111. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/billing-gate-dispatch.yaml +0 -0
  1112. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/canonical-format-validate-input.yaml +0 -0
  1113. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/capability-discovery.yaml +0 -0
  1114. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/collection-lists-pagination-integrity.yaml +0 -0
  1115. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/comply-controller-mode-gate.yaml +0 -0
  1116. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/content-standards-pagination-integrity.yaml +0 -0
  1117. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/deterministic-testing.yaml +0 -0
  1118. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/error-compliance-signals.yaml +0 -0
  1119. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/error-compliance.yaml +0 -0
  1120. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/fictional-entities.yaml +0 -0
  1121. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/get-media-buys-pagination-integrity.yaml +0 -0
  1122. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/get-products-pagination-integrity.yaml +0 -0
  1123. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/get-signals-pagination-integrity.yaml +0 -0
  1124. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/idempotency.yaml +0 -0
  1125. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/notification-config-event-scope.yaml +0 -0
  1126. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/notification-config-lifecycle.yaml +0 -0
  1127. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/notification-config-rejections.yaml +0 -0
  1128. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/pagination-integrity-list-accounts.yaml +0 -0
  1129. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/pagination-integrity.yaml +0 -0
  1130. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/property-lists-pagination-integrity.yaml +0 -0
  1131. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/read-tool-idempotency.yaml +0 -0
  1132. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/runner-output-contract.yaml +0 -0
  1133. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/schema-validation-signals.yaml +0 -0
  1134. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/schema-validation.yaml +0 -0
  1135. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/security.yaml +0 -0
  1136. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/signed-requests.yaml +0 -0
  1137. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/stale-response-advisory.yaml +0 -0
  1138. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/storyboard-schema.yaml +0 -0
  1139. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/v3-envelope-integrity.yaml +0 -0
  1140. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/version-negotiation.yaml +0 -0
  1141. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/webhook-emission.yaml +0 -0
  1142. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/webhook-receiver-envelope.yaml +0 -0
  1143. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  1144. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  1145. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/wholesale-feed-products.yaml +0 -0
  1146. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  1147. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/wholesale-feed-signals.yaml +0 -0
  1148. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/brand/index.yaml +0 -0
  1149. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1150. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1151. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/index.yaml +0 -0
  1152. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
  1153. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
  1154. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1155. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
  1156. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/scenarios/native_in_feed.yaml +0 -0
  1157. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/governance/index.yaml +0 -0
  1158. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1159. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/available_actions.yaml +0 -0
  1160. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1161. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  1162. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1163. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1164. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1165. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
  1166. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1167. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  1168. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1169. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1170. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  1171. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  1172. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  1173. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  1174. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1175. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  1176. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
  1177. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1178. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1179. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1180. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1181. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1182. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1183. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1184. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1185. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1186. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1187. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1188. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1189. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1190. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1191. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1192. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1193. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1194. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1195. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/state-machine.yaml +0 -0
  1196. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/signals/index.yaml +0 -0
  1197. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  1198. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/sponsored-intelligence/index.yaml +0 -0
  1199. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1200. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/brand/index.yaml +0 -0
  1201. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1202. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1203. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/index.yaml +0 -0
  1204. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
  1205. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
  1206. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1207. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
  1208. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
  1209. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/governance/index.yaml +0 -0
  1210. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1211. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
  1212. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1213. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  1214. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1215. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1216. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1217. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
  1218. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1219. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  1220. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1221. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1222. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  1223. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  1224. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  1225. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  1226. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1227. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  1228. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
  1229. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1230. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1231. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1232. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1233. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1234. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1235. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1236. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1237. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1238. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1239. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1240. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1241. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1242. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1243. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1244. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1245. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1246. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1247. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/state-machine.yaml +0 -0
  1248. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/signals/index.yaml +0 -0
  1249. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  1250. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/sponsored-intelligence/index.yaml +0 -0
  1251. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1252. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/audience-sync/index.yaml +0 -0
  1253. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/brand-rights/index.yaml +0 -0
  1254. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  1255. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/collection-lists/index.yaml +0 -0
  1256. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/content-standards/index.yaml +0 -0
  1257. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/creative-ad-server/index.yaml +0 -0
  1258. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/creative-generative/generative-seller.yaml +0 -0
  1259. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/creative-generative/index.yaml +0 -0
  1260. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/creative-template/index.yaml +0 -0
  1261. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/creative-transformers/index.yaml +0 -0
  1262. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/governance-aware-seller/index.yaml +0 -0
  1263. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1264. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/governance-delivery-monitor/index.yaml +0 -0
  1265. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1266. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/governance-spend-authority/index.yaml +0 -0
  1267. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/property-lists/index.yaml +0 -0
  1268. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1269. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/sales-non-guaranteed/index.yaml +0 -0
  1270. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/sales-social/index.yaml +0 -0
  1271. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/signal-marketplace/index.yaml +0 -0
  1272. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1273. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/signal-owned/index.yaml +0 -0
  1274. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1275. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/acme-outdoor-live.yaml +0 -0
  1276. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/billing-gate-runner.yaml +0 -0
  1277. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/bistro-oranje.yaml +0 -0
  1278. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/distributed-brand-runner.yaml +0 -0
  1279. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/nova-motors.yaml +0 -0
  1280. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/osei-natural.yaml +0 -0
  1281. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/parallel-dispatch-runner.yaml +0 -0
  1282. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/rate-limit-trip-runner.yaml +0 -0
  1283. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/signed-requests-runner.yaml +0 -0
  1284. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/single-side-trust-runner.yaml +0 -0
  1285. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/substitution-observer-runner.yaml +0 -0
  1286. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/summit-foods.yaml +0 -0
  1287. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/webhook-receiver-runner.yaml +0 -0
  1288. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/catalog-macro-substitution.json +0 -0
  1289. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1290. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1291. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1292. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1293. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1294. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1295. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1296. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1297. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1298. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1299. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1300. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/README.md +0 -0
  1301. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/canonicalization.json +0 -0
  1302. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/keys.json +0 -0
  1303. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1304. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1305. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1306. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1307. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1308. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1309. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1310. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1311. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1312. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1313. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1314. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1315. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1316. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1317. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1318. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1319. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1320. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1321. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  1322. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  1323. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  1324. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  1325. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  1326. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  1327. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1328. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  1329. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1330. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  1331. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  1332. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  1333. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  1334. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  1335. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  1336. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  1337. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  1338. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  1339. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1340. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  1341. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  1342. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1343. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-receiver-envelope.json +0 -0
  1344. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/README.md +0 -0
  1345. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/keys.json +0 -0
  1346. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  1347. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  1348. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  1349. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  1350. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  1351. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  1352. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  1353. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  1354. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  1355. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  1356. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  1357. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  1358. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  1359. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  1360. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  1361. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  1362. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  1363. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  1364. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  1365. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  1366. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  1367. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  1368. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  1369. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  1370. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  1371. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  1372. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  1373. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  1374. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  1375. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/billing-gate-dispatch.yaml +0 -0
  1376. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/canonical-format-validate-input.yaml +0 -0
  1377. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/capability-discovery.yaml +0 -0
  1378. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/collection-lists-pagination-integrity.yaml +0 -0
  1379. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/comply-controller-mode-gate.yaml +0 -0
  1380. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/content-standards-pagination-integrity.yaml +0 -0
  1381. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/deterministic-testing.yaml +0 -0
  1382. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/error-compliance-signals.yaml +0 -0
  1383. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/error-compliance.yaml +0 -0
  1384. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/fictional-entities.yaml +0 -0
  1385. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/get-media-buys-pagination-integrity.yaml +0 -0
  1386. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/get-products-pagination-integrity.yaml +0 -0
  1387. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/get-signals-pagination-integrity.yaml +0 -0
  1388. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/idempotency.yaml +0 -0
  1389. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/notification-config-event-scope.yaml +0 -0
  1390. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/notification-config-lifecycle.yaml +0 -0
  1391. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/notification-config-rejections.yaml +0 -0
  1392. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/pagination-integrity-list-accounts.yaml +0 -0
  1393. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/pagination-integrity.yaml +0 -0
  1394. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/property-lists-pagination-integrity.yaml +0 -0
  1395. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/read-tool-idempotency.yaml +0 -0
  1396. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/runner-output-contract.yaml +0 -0
  1397. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/schema-validation-signals.yaml +0 -0
  1398. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/schema-validation.yaml +0 -0
  1399. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/security.yaml +0 -0
  1400. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/signed-requests.yaml +0 -0
  1401. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/stale-response-advisory.yaml +0 -0
  1402. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/storyboard-schema.yaml +0 -0
  1403. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/v3-envelope-integrity.yaml +0 -0
  1404. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/version-negotiation.yaml +0 -0
  1405. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/webhook-emission.yaml +0 -0
  1406. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/webhook-receiver-envelope.yaml +0 -0
  1407. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  1408. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  1409. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/wholesale-feed-products.yaml +0 -0
  1410. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  1411. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/wholesale-feed-signals.yaml +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/testing/storyboard/validations.ts"],"sourcesContent":["/**\n * Per-step validation engine for storyboard testing.\n *\n * Emits validation results conforming to the runner-output contract:\n * failed validations carry RFC 6901 `json_pointer`, machine-readable\n * `expected`/`actual`, and for `response_schema` checks the `schema_id`\n * plus resolvable `schema_url`. See\n * `static/compliance/source/universal/runner-output-contract.yaml`.\n */\n\nimport { prepareResponseForSchemaValidation, TOOL_RESPONSE_SCHEMAS } from '../../utils/response-schemas';\nimport { injectLegacyEnvelopeStatus } from '../../utils/envelope-status-compat';\nimport { TRANSPORT_SUFFIX_REGEX } from '../../utils/a2a-discovery';\nimport { validateResponse, type ValidationIssue } from '../../validation/schema-validator';\nimport { hasSchemaBundle } from '../../validation/schema-loader';\nimport { ADCP_VERSION, LIBRARY_VERSION } from '../../version';\nimport { isPre31AdcpVersion } from '../../utils/adcp-version-config';\nimport { gte as semverGte, valid as validSemver } from 'semver';\nimport type { TaskResult } from '../types';\nimport type {\n A2ATaskEnvelope,\n HttpProbeResult,\n RunnerRequestRecord,\n RunnerResponseRecord,\n SchemaValidationError,\n StoryboardContext,\n StoryboardValidation,\n StrictValidationVerdict,\n UpstreamTrafficPayloadMatch,\n ValidationResult,\n} from './types';\nimport type { RecordedCall, UpstreamTrafficSuccess } from '../test-controller';\nimport { isJsonContentType } from '../test-controller';\nimport { globToRegExp } from '../../utils/glob';\nimport {\n resolvePath,\n resolvePathAll,\n resolvePortableIdentifierPathAll,\n toJsonPointer,\n validatePortableIdentifierPath,\n type PortableIdentifierPathIssue,\n} from './path';\nimport { detectShapeDriftHints } from './shape-drift-hints';\nimport { PROBE_TASK_ALLOWLIST } from './test-kit';\nimport { validateCanonicalFormatSatisfaction } from './canonical-format-satisfaction';\nimport { extractTaskAdcpError } from './rate-limit-trip';\nimport type { OAuthMetadataGraphGrade } from './oauth-metadata-graph';\nimport { normalizeOAuthResourceForComparison, redactOAuthUrlForOutput } from './oauth-metadata-graph';\n\n/**\n * Broader validation context that carries the run-level state a single\n * validation might need: the task result (for MCP tools), the HTTP probe\n * result (for raw tasks), the agent URL (for cross-cutting checks like\n * `resource_equals_agent_url`), and the accumulated contribution flags.\n */\nexport interface ValidationContext {\n taskName: string;\n /** AdCP schema bundle to use for strict AJV validation. */\n adcpVersion?: string;\n /** Server-declared AdCP version to use for response-shape compatibility decisions. */\n responseAdcpVersion?: string;\n taskResult?: TaskResult;\n httpResult?: HttpProbeResult;\n agentUrl: string;\n contributions: Set<string>;\n /**\n * Storyboard-declared response schema reference, e.g.\n * `\"protocol/get-adcp-capabilities-response.json\"`. When present the\n * runner emits schema_id / schema_url conforming to the contract.\n */\n responseSchemaRef?: string;\n /** Exact request the runner sent — echoed on failed validations. */\n request?: RunnerRequestRecord;\n /** Exact response observed — echoed on failed validations. */\n response?: RunnerResponseRecord;\n /**\n * Accumulated storyboard context from prior steps. Exposed to cross-step\n * checks (`refs_resolve`) that need to reference values extracted earlier\n * in the run. Single-step checks ignore it.\n */\n storyboardContext?: StoryboardContext;\n /**\n * Captured A2A wire shape — populated by the runner when the protocol\n * is `a2a` and the SDK fetch was wrapped with `withRawResponseCapture`.\n * `a2a_submitted_artifact` and other wire-shape checks read this to\n * assert on the JSON-RPC envelope; non-A2A runs leave it undefined and\n * those checks self-skip with `not_applicable`.\n */\n a2aEnvelope?: A2ATaskEnvelope;\n /**\n * Most recent A2A envelope captured by a PRIOR step in the same run.\n * Cross-step checks (`a2a_context_continuity`) read this to compare\n * the current step's `Task.contextId` against the prior step's\n * `Task.contextId` — A2A 0.3.0 mandates the server echo the\n * client-supplied `contextId` on follow-up sends. Absent on the\n * first A2A step in a run, on non-A2A runs, and when no prior step\n * captured an envelope (e.g. all priors were probe steps).\n */\n priorA2aEnvelope?: A2ATaskEnvelope;\n /**\n * Step id of the prior step whose A2A envelope `priorA2aEnvelope`\n * came from. Used by cross-step diagnostics to point operators at\n * the exact prior step the continuity assertion is comparing\n * against.\n */\n priorA2aStepId?: string;\n /**\n * Pre-fetched data for `upstream_traffic` validations. Populated by the\n * runner before validations fire so the dispatcher stays synchronous.\n * Keyed by `since_timestamp` so the runner can de-dupe identical\n * windows across multiple validations on the same step. Absent when\n * the step has no `upstream_traffic` validations. The `advertised`\n * field is the controller's `list_scenarios` capability flag — when\n * false, every `upstream_traffic` validation grades not_applicable.\n * Per runner-output-contract.yaml v2.0.0, the missing-controller path\n * is opt-in by adopter, not a conformance failure.\n */\n upstreamTraffic?: UpstreamTrafficValidationContext;\n /**\n * Storyboard step (raw YAML) — legacy fallback for direct validation\n * callers. The runner's resolved `request.payload` is preferred for\n * `upstream_traffic.identifier_paths` so context/generated tokens compare\n * against values actually sent on the wire.\n */\n storyboardStep?: { sample_request?: Record<string, unknown> };\n /**\n * Resolved set of dispatch outcomes for a `parallel_dispatch` step.\n * Populated only when the runner fanned out N concurrent requests through\n * the `parallel_dispatch_runner` contract. `cross_response_field_equal`\n * and `cross_response_count_distinct` read this to grade against the\n * cross-response set; single-dispatch steps leave it undefined and those\n * two checks grade `not_applicable`.\n */\n crossResponses?: CrossResponseSet;\n /** Async-prefetched result consumed by the oauth_metadata_graph check. */\n oauthMetadataGraph?: OAuthMetadataGraphGrade;\n}\n\n/**\n * Aggregated cross-response data for `cross_response_*` validations on a\n * `parallel_dispatch` step. Carries per-dispatch outcomes plus a derived\n * `resolved` list of `TaskResult`s for paths that succeeded (after any\n * in-flight retry resolution). The cross-response checks operate against\n * `resolved`; per-response checks operate against the individual entries\n * via the dispatcher's aggregation pass.\n */\nexport interface CrossResponseSet {\n /** Every dispatch's terminal outcome, in fan-out order. */\n dispatches: CrossResponseDispatch[];\n /** Resolved task results for dispatches that terminated successfully. */\n resolved: TaskResult[];\n}\n\n/**\n * One dispatch's terminal record after any in-flight retry loop.\n */\nexport interface CrossResponseDispatch {\n /** Per-dispatch correlation_id the runner attached. Excluded from the canonical hash. */\n correlation_id: string;\n /** Terminal task result, when the dispatch resolved within the barrier window. */\n taskResult?: TaskResult;\n /** Terminal error string, when the dispatch failed at the wire layer. */\n error?: string;\n /** True when the barrier window expired before the dispatch terminated. */\n timed_out?: boolean;\n /** Per-dispatch wall-clock duration in milliseconds. */\n duration_ms: number;\n}\n\n/**\n * Pre-fetched controller traffic data the runner stashes on the validation\n * context so the synchronous dispatcher can grade `upstream_traffic`\n * checks without making controller calls itself.\n */\nexport interface UpstreamTrafficValidationContext {\n /** Whether the controller advertises `query_upstream_traffic` in `list_scenarios`. */\n advertised: boolean;\n /**\n * Pre-fetched controller responses keyed by ISO `since_timestamp`. Each\n * entry carries the request the runner issued, the response observed,\n * and the parsed payload (or an error string when the call failed).\n */\n queries: Map<string, UpstreamTrafficQueryResult>;\n /**\n * The ISO timestamp the runner used as the default `since_timestamp`\n * for THIS step (the step's own request start). Validations that don't\n * declare `since: prior_step_id` use this key into `queries`.\n */\n thisStepSince: string;\n /**\n * Resolved ISO timestamps for `since: prior_step_id` references. The\n * runner pre-resolves these so the validation can index `queries` by\n * the same timestamp. Absent when the validation has no `since:`\n * declaration or the named prior step did not record a timestamp.\n */\n priorStepSinceMap?: Map<string, string>;\n /**\n * `since:` step IDs declared by storyboard validations that did not\n * resolve to any recorded prior step. Surfaced as a typed failure on\n * the validation result rather than silently widened to the current\n * step's window — a misspelled reference would otherwise pass vacuously\n * (the contract treats unresolved references as authoring bugs).\n */\n unresolvedSinceRefs?: Set<string>;\n /**\n * SHA-256 digests the runner sent as `identifier_value_digests`, keyed by\n * plaintext identifier values resolved from the step request. Used to pair\n * digest-mode `identifier_match_proofs` back to storyboard vectors.\n */\n identifierDigestByValue?: Map<string, string>;\n /**\n * Set when the runner clipped identifier digest requests to its bounded\n * buffer. Overflow vectors cannot be proven in digest mode and are reported\n * as not_applicable rather than missing.\n */\n identifierDigestLimitExceeded?: { limit: number; clipped: number };\n}\n\nexport interface UpstreamTrafficQueryResult {\n request: RunnerRequestRecord;\n response: RunnerResponseRecord;\n /** Successful payload from the controller, or an error placeholder when the call failed. */\n payload: UpstreamTrafficSuccess | { error: string; error_kind?: string };\n}\n\n/**\n * Run all validations for a storyboard step.\n */\nexport function runValidations(validations: StoryboardValidation[], context: ValidationContext): ValidationResult[] {\n return validations.map(v => decorateValidationResult(runValidation(v, context), context, v));\n}\n\n/** Capability semver emitted in run summaries and used for advisory expiry. */\nexport const RUNNER_CAPABILITY_VERSION = LIBRARY_VERSION;\n\n/** True when a failed validation contributes to the owning step's grade. */\nexport function validationFailsStep(result: ValidationResult): boolean {\n return !result.passed && result.severity !== 'advisory';\n}\n\n/**\n * Attach request / response records to a failed validation so implementors\n * see the exact bytes the runner sent and observed. Passed validations stay\n * minimal — carrying the full payload on every passing check bloats the\n * JSON surface without diagnostic value.\n */\nexport function decorateValidationResult(\n result: ValidationResult,\n context: ValidationContext,\n validation: StoryboardValidation\n): ValidationResult {\n const declaredSeverity = validation.severity ?? 'required';\n const expiry = validation.expires_after_version;\n const shouldEvaluatePromotion = !result.not_applicable && declaredSeverity === 'advisory' && expiry !== undefined;\n if (shouldEvaluatePromotion && validSemver(expiry) === null) {\n throw new Error(`expires_after_version must be valid semver; received ${JSON.stringify(expiry)}`);\n }\n const promotionApplied =\n shouldEvaluatePromotion &&\n validSemver(RUNNER_CAPABILITY_VERSION) !== null &&\n semverGte(RUNNER_CAPABILITY_VERSION, expiry);\n const augmented: ValidationResult = {\n ...result,\n ...(validation.id !== undefined && { id: validation.id }),\n severity: promotionApplied ? 'required' : declaredSeverity,\n ...(shouldEvaluatePromotion && { severity_promoted_from_advisory: promotionApplied }),\n };\n if (augmented.passed) return augmented;\n if (context.request && augmented.request === undefined) augmented.request = context.request;\n if (context.response && augmented.response === undefined) augmented.response = context.response;\n return augmented;\n}\n\nfunction runValidation(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n switch (validation.check) {\n case 'response_schema':\n return requireTaskResult(ctx, validation, tr => validateResponseSchema(validation, ctx, tr));\n case 'field_present':\n // field_present runs against either MCP task result data OR an HTTP probe body —\n // the storyboard's probe_protected_resource validates fields in the RFC 9728 JSON.\n return validateFieldPresent(validation, resolveTarget(ctx));\n case 'field_absent':\n return validateFieldAbsent(validation, resolveTarget(ctx));\n case 'envelope_field_present':\n // Envelope-scoped variants — runtime semantics identical to the\n // un-prefixed checks (TaskResult exposes envelope fields like\n // `status`, `task_id` and version-envelope fields like `adcp_version`\n // at the surface level). The distinct check types exist primarily so\n // static drift detection can walk the envelope schemas instead of the\n // per-tool response. See adcp#3429 and adcp#5195.\n return validateFieldPresent(validation, resolveTarget(ctx));\n case 'envelope_field_absent':\n return validateFieldAbsent(validation, resolveTarget(ctx));\n case 'envelope_field_value':\n return validateFieldValue(validation, resolveTarget(ctx));\n case 'envelope_field_value_or_absent':\n return validateFieldValueOrAbsent(validation, resolveTarget(ctx));\n case 'envelope_field_pattern':\n return validateFieldPattern(validation, resolveTarget(ctx));\n case 'field_value':\n return validateFieldValue(validation, resolveTarget(ctx));\n case 'field_value_or_absent':\n return validateFieldValueOrAbsent(validation, resolveTarget(ctx));\n case 'field_pattern':\n return validateFieldPattern(validation, resolveTarget(ctx));\n case 'field_contains':\n return validateFieldContains(validation, resolveTarget(ctx));\n case 'status_code':\n return requireTaskResult(ctx, validation, tr => validateStatusCode(validation, tr));\n case 'error_code':\n return requireTaskResult(ctx, validation, tr => validateErrorCode(validation, tr));\n case 'http_status':\n return requireHttpResult(ctx, validation, hr => validateHttpStatus(validation, hr));\n case 'http_status_in':\n return requireHttpResult(ctx, validation, hr => validateHttpStatusIn(validation, hr));\n case 'on_401_require_header':\n return requireHttpResult(ctx, validation, hr => validateOn401RequireHeader(validation, hr));\n case 'resource_equals_agent_url':\n return requireHttpResult(ctx, validation, hr => validateResourceEqualsAgentUrl(validation, hr, ctx.agentUrl));\n case 'oauth_metadata_graph':\n return validateOAuthMetadataGraph(validation, ctx.oauthMetadataGraph);\n case 'any_of':\n return validateAnyOf(validation, ctx.contributions);\n case 'a2a_submitted_artifact':\n return validateA2ASubmittedArtifact(validation, ctx);\n case 'a2a_context_continuity':\n return validateA2AContextContinuity(validation, ctx);\n case 'refs_resolve':\n return validateRefsResolve(validation, ctx);\n case 'field_less_than':\n return validateNumericComparison(validation, ctx, NUMERIC_OPS.less_than);\n case 'field_greater_than':\n return validateNumericComparison(validation, ctx, NUMERIC_OPS.greater_than);\n case 'field_at_most':\n return validateNumericComparison(validation, ctx, NUMERIC_OPS.at_most);\n case 'field_at_least':\n return validateNumericComparison(validation, ctx, NUMERIC_OPS.at_least);\n case 'field_equals_context':\n return validateFieldEqualsContext(validation, ctx);\n case 'field_in_context_array':\n return validateFieldInContextArray(validation, ctx);\n case 'all_fields_in_context_array':\n return validateAllFieldsInContextArray(validation, ctx);\n case 'upstream_traffic':\n return validateUpstreamTraffic(validation, ctx);\n case 'replay_not_cached_rate_limit':\n return validateReplayNotCachedRateLimit(validation, ctx);\n case 'cross_response_field_equal':\n return validateCrossResponseFieldEqual(validation, ctx);\n case 'cross_response_count_distinct':\n return validateCrossResponseCountDistinct(validation, ctx);\n case 'canonical_format_satisfaction':\n if (ctx.taskName !== 'create_media_buy') {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: 'canonical_format_satisfaction applies only to create_media_buy storyboard steps',\n json_pointer: null,\n expected: 'create_media_buy',\n actual: ctx.taskName,\n };\n }\n return requireTaskResult(ctx, validation, tr =>\n validateCanonicalFormatSatisfaction(validation, ctx.request, ctx.storyboardContext, tr)\n );\n case 'array_length':\n return validateArrayLength(validation, resolveTarget(ctx));\n default:\n // Forward compatibility is resolved before advisory expiry promotion:\n // an older runner cannot grade a check it does not implement, so the\n // result is not_applicable rather than evidence about the agent. This\n // is the runtime forward-compat default defined by\n // runner-output-contract.yaml (adcontextprotocol/adcp#3816); publish-time\n // lint separately rejects unknown check kinds in authored storyboards.\n return {\n check: validation.check,\n passed: true,\n description: validation.description,\n not_applicable: true,\n note: `runner does not implement authored check type '${validation.check}'`,\n };\n }\n}\n\nfunction requireTaskResult(\n ctx: ValidationContext,\n validation: StoryboardValidation,\n fn: (tr: TaskResult) => ValidationResult\n): ValidationResult {\n if (!ctx.taskResult) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: `Validation \"${validation.check}\" requires an MCP task result but this step was an HTTP probe.`,\n json_pointer: null,\n };\n }\n return fn(ctx.taskResult);\n}\n\nfunction requireHttpResult(\n ctx: ValidationContext,\n validation: StoryboardValidation,\n fn: (hr: HttpProbeResult) => ValidationResult\n): ValidationResult {\n if (!ctx.httpResult) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: `Validation \"${validation.check}\" requires an HTTP probe result but this step was an MCP task.`,\n json_pointer: null,\n };\n }\n return fn(ctx.httpResult);\n}\n\n/**\n * Resolve the object path-style validations should walk. Prefers the MCP\n * task result's `data` and falls back to the HTTP probe body, so the same\n * `field_present` / `field_value` validations work for both MCP tool steps\n * and raw RFC 9728 / RFC 8414 metadata probes.\n */\nfunction resolveTarget(ctx: ValidationContext): TaskResult {\n if (ctx.taskResult) return ctx.taskResult;\n if (ctx.httpResult) return { success: !ctx.httpResult.error, data: ctx.httpResult.body };\n return { success: false, data: undefined };\n}\n\n// ────────────────────────────────────────────────────────────\n// Schema URL resolution\n// ────────────────────────────────────────────────────────────\n\nconst SCHEMA_URL_BASE = 'https://adcontextprotocol.org';\n\n/**\n * Build a `{ schema_id, schema_url }` pair from a storyboard-declared\n * `response_schema_ref`. The id follows the `/schemas/<version>/<path>.json`\n * convention used by `$id` in cached JSON schemas; the url dereferences\n * against the public docs origin so implementors can fetch it.\n */\nfunction resolveSchemaIdentity(schemaRef: string | undefined): { schema_id: string | null; schema_url: string | null } {\n if (!schemaRef) return { schema_id: null, schema_url: null };\n const trimmed = schemaRef.replace(/^\\/+/, '');\n const schemaId = `/schemas/${ADCP_VERSION}/${trimmed}`;\n const schemaUrl = `${SCHEMA_URL_BASE}${schemaId}`;\n return { schema_id: schemaId, schema_url: schemaUrl };\n}\n\n/**\n * Convert a Zod error into the AJV-shaped `SchemaValidationError[]` the\n * contract calls for. Each issue names the failing instance path, the\n * schema keyword that rejected it (best-effort from Zod's `code`), and\n * the original message.\n */\n/**\n * Escape a single Zod path segment as an RFC 6901 reference token: `~` → `~0`\n * (done first), then `/` → `~1`. Numeric segments pass through as-is.\n */\nfunction escapeJsonPointerSegment(seg: PropertyKey): string {\n return String(seg).replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n\nfunction zodIssuePathToJsonPointer(path: ReadonlyArray<PropertyKey>): string {\n return '/' + path.map(escapeJsonPointerSegment).join('/');\n}\n\nfunction zodIssuesToSchemaErrors(\n issues: ReadonlyArray<{ path: ReadonlyArray<PropertyKey>; code: string; message: string }>\n): SchemaValidationError[] {\n return issues.map(issue => {\n const keyword = mapZodIssueToSchemaKeyword(issue);\n const instancePointer = issue.path.map(escapeJsonPointerSegment).join('/');\n return {\n instance_path: '/' + instancePointer,\n // Zod does not expose the schema-side pointer. Approximate AJV's\n // `schema_path` (a JSON pointer into the schema) as\n // `#/properties/<path>/<keyword>` so implementors can locate the\n // rejecting keyword inside their schema.\n schema_path: `#/properties/${instancePointer}/${keyword}`,\n keyword,\n message: issue.message,\n };\n });\n}\n\n/**\n * Map a Zod issue to the JSON Schema keyword that failed. Critically,\n * `invalid_type` with `received: 'undefined'` is a missing required field\n * (keyword `required`), not a type mismatch (keyword `type`). The two cases\n * call for different remediation — \"set the field\" vs. \"fix the value /\n * change the type\" — so the evaluator must distinguish them.\n */\nfunction mapZodIssueToSchemaKeyword(issue: { code: string; message: string }): string {\n if (issue.code === 'invalid_type' && /received `?undefined`?/i.test(issue.message)) {\n return 'required';\n }\n switch (issue.code) {\n case 'invalid_type':\n return 'type';\n case 'invalid_value':\n return 'enum';\n case 'too_small':\n return 'minimum';\n case 'too_big':\n return 'maximum';\n case 'invalid_format':\n return 'format';\n case 'unrecognized_keys':\n return 'additionalProperties';\n case 'invalid_union':\n return 'oneOf';\n case 'not_multiple_of':\n return 'multipleOf';\n default:\n return issue.code;\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// response_schema: validate against Zod\n// ────────────────────────────────────────────────────────────\n\nfunction validateResponseSchema(\n validation: StoryboardValidation,\n ctx: ValidationContext,\n taskResult: TaskResult\n): ValidationResult {\n const taskName = ctx.taskName;\n const { schema_id, schema_url } = resolveSchemaIdentity(ctx.responseSchemaRef);\n const schema = TOOL_RESPONSE_SCHEMAS[taskName];\n if (!schema) {\n return {\n check: 'response_schema',\n passed: false,\n description: validation.description,\n error: `No schema registered for task \"${taskName}\"`,\n json_pointer: null,\n expected: schema_id ?? `response schema for ${taskName}`,\n // The runner failed before observing the agent — distinguish that from\n // \"agent returned null\" so implementors don't chase a phantom agent bug.\n actual: { reason: 'no_schema_registered', task: taskName },\n schema_id,\n schema_url,\n };\n }\n\n // Keep the raw payload separately from the object-form one below so the\n // shape-drift detector can recognize bare-array responses (a common drift\n // pattern for list tools). Strip _message when it's a top-level property —\n // bare arrays don't carry that field.\n const rawData = taskResult.data ?? {};\n const dataWithoutMessage = Array.isArray(rawData)\n ? rawData\n : (() => {\n const { _message, ...rest } = rawData as Record<string, unknown>;\n return rest;\n })();\n // 3.0.x back-compat: synthesize envelope `status` for legacy peers\n // before validating against the 3.1 envelope schema. See\n // `utils/envelope-status-compat.ts`.\n const dataForValidation = Array.isArray(dataWithoutMessage)\n ? dataWithoutMessage\n : injectLegacyEnvelopeStatus(dataWithoutMessage as Record<string, unknown>, { toolName: taskName });\n const responseAdcpVersion = ctx.responseAdcpVersion ?? ctx.adcpVersion;\n const parseResult = schema.safeParse(\n prepareResponseForSchemaValidation(taskName, dataForValidation, responseAdcpVersion)\n );\n\n // Strict (AJV) verdict runs alongside the lenient Zod check so the run\n // report surfaces strictness deltas (issue #820 follow-up). The AJV path\n // enforces `format` keywords and `additionalProperties: false` that Zod's\n // `passthrough()` omits — a response can pass Zod and fail AJV. The step's\n // overall pass/fail stays Zod-driven to preserve backwards compatibility.\n const strict = computeStrictVerdict(taskName, dataWithoutMessage, ctx.adcpVersion, ctx.responseAdcpVersion);\n\n // Shape-drift no longer rides on `ValidationResult.warning` — issue #935\n // moved that diagnostic to `StoryboardStepResult.hints[]` as a structured\n // `ShapeDriftHint`. The runner emits the structured hint via\n // `detectShapeDriftHints` directly; this layer focuses on the strict /\n // variant-fallback signal that doesn't yet have a hint kind.\n\n if (parseResult.success) {\n const base: ValidationResult = {\n check: 'response_schema',\n passed: true,\n description: validation.description,\n schema_id,\n schema_url,\n };\n // Surface strict-only / variant-fallback signal via `warning` so step-\n // level output (and LLM-driven self-correction that scans `error`/\n // `warning` fields) sees something without flipping `passed`.\n const warning = strict ? buildStrictWarning(strict) : undefined;\n if (!strict && !warning) return base;\n if (!strict) return { ...base, warning };\n return warning ? { ...base, strict, warning } : { ...base, strict };\n }\n\n const schemaErrors = zodIssuesToSchemaErrors(parseResult.error.issues);\n const firstIssue = parseResult.error.issues[0];\n const jsonPointer = firstIssue ? zodIssuePathToJsonPointer(firstIssue.path) : null;\n const issues = parseResult.error.issues\n .slice(0, 5)\n .map(i => `${i.path.join('.')}: ${i.message}`)\n .join('; ');\n\n const failed: ValidationResult = {\n check: 'response_schema',\n passed: false,\n description: validation.description,\n error: issues,\n json_pointer: jsonPointer,\n expected: schema_id ?? `response schema for ${taskName}`,\n actual: schemaErrors,\n schema_id,\n schema_url,\n };\n return strict ? { ...failed, strict } : failed;\n}\n\n/**\n * Run the strict AJV validator for `taskName` against the response payload.\n * Returns undefined when no AJV schema is available (the client can't\n * observe a strictness delta for tools whose JSON-schema doesn't ship with\n * the SDK — notably the brand-rights and governance schemas that live\n * outside the `bundled/` tree the loader walks today).\n */\nfunction computeStrictVerdict(\n taskName: string,\n payload: unknown,\n adcpVersion?: string,\n responseAdcpVersion?: string\n): StrictValidationVerdict | undefined {\n const validationVersion =\n responseAdcpVersion && hasSchemaBundle(responseAdcpVersion) ? responseAdcpVersion : adcpVersion;\n if (responseAdcpVersion && isPre31AdcpVersion(responseAdcpVersion) && !hasSchemaBundle(responseAdcpVersion)) {\n return undefined;\n }\n const payloadForValidation = prepareResponseForSchemaValidation(taskName, payload, responseAdcpVersion);\n const outcome = validateResponse(taskName, payloadForValidation, validationVersion);\n // `variant: 'skipped'` means no AJV validator compiled for this task (no\n // strictness signal to emit); treat the same as \"no AJV schema available\".\n if (outcome.variant === 'skipped') return undefined;\n const fallbackFields: Pick<StrictValidationVerdict, 'variant_fallback_applied' | 'requested_variant'> =\n outcome.variant_fallback_applied\n ? { variant_fallback_applied: true, requested_variant: outcome.requested_variant }\n : {};\n if (outcome.valid) {\n return { valid: true, variant: outcome.variant, ...fallbackFields };\n }\n return {\n valid: false,\n variant: outcome.variant,\n issues: outcome.issues.slice(0, 10).map(ajvIssueToSchemaError),\n ...fallbackFields,\n };\n}\n\nfunction ajvIssueToSchemaError(issue: ValidationIssue): SchemaValidationError {\n return {\n instance_path: issue.pointer,\n schema_path: issue.schemaPath,\n keyword: issue.keyword,\n message: issue.message,\n };\n}\n\n/**\n * Render the strict verdict into a non-fatal warning for step-level\n * output. Two cases produce signal (both preserve `passed`):\n * - Strict-only failure: Zod accepted, AJV rejected. Top AJV issue.\n * - Variant fallback: agent advertised an async variant without a\n * compiled schema; validation fell back to sync. Conformance gap\n * worth flagging even when AJV ultimately accepted.\n * When both apply, both are joined. Returns undefined when neither\n * applies (strict accepted and no fallback).\n */\nfunction buildStrictWarning(strict: StrictValidationVerdict): string | undefined {\n const parts: string[] = [];\n if (strict.variant_fallback_applied && strict.requested_variant) {\n parts.push(\n `agent advertised status=\"${strict.requested_variant}\" but the tool has no schema for that variant — validated against sync fallback`\n );\n }\n if (!strict.valid && strict.issues && strict.issues.length > 0) {\n // Group `required` keyword issues under their parent path so sellers see\n // \"missing properties at /x: a, b, c\" in one pass instead of one missing\n // field per storyboard run. This is the single biggest onramp cliff for\n // sellers filling out response schemas with N required fields —\n // previously they iterated N times, learning one required field per run.\n const requiredIssues = strict.issues.filter(i => i.keyword === 'required');\n const otherIssues = strict.issues.filter(i => i.keyword !== 'required');\n if (requiredIssues.length > 0) {\n const grouped = new Map<string, string[]>();\n for (const issue of requiredIssues) {\n const at = issue.instance_path || '/';\n // AJV's `required`-issue message format: `must have required property '<name>'`.\n const match = issue.message.match(/required property ['\"]([^'\"]+)['\"]/);\n const field = match?.[1] ?? issue.message;\n const list = grouped.get(at) ?? [];\n list.push(field);\n grouped.set(at, list);\n }\n for (const [at, fields] of grouped) {\n parts.push(`strict JSON-schema missing required at ${at}: ${fields.join(', ')}`);\n }\n }\n const MAX_OTHER = 5;\n const shown = otherIssues.slice(0, MAX_OTHER);\n const remaining = otherIssues.length - shown.length;\n for (const issue of shown) {\n const pointer = issue.instance_path || '/';\n parts.push(`strict JSON-schema rejected ${pointer}: ${issue.message}`);\n }\n if (remaining > 0) {\n parts.push(`(+${remaining} more AJV issue${remaining === 1 ? '' : 's'})`);\n }\n }\n return parts.length > 0 ? parts.join('; ') : undefined;\n}\n\n/**\n * Recognize common payload-shape mistakes and return the human-readable\n * fix-recipe — `string` form retained for direct unit-test callers and\n * for any external consumer that imported the shim before issue #935\n * moved the canonical detector to `shape-drift-hints.ts`. Both forms\n * reuse the same detection logic; this shim returns `hints[0]?.message`.\n *\n * Covers four shape-inversion patterns observed in real integrations:\n * - `build_creative` returning platform-native fields at the top level\n * (scope3 agentic-adapters#100 — `tag_url`, `creative_id`, `media_type`)\n * - `sync_creatives` returning a single creative's inner shape bubbled\n * up without the `creatives` array wrapper, OR the wrong wrapper key\n * (`{ results: [...] }` instead of `{ creatives: [...] }`)\n * - `preview_creative` returning raw render fields (`preview_url`,\n * `preview_html`) at the top level without the `previews[].renders[]`\n * nesting and `response_type` discriminator\n * - List tools (`list_creatives`, `list_creative_formats`, `list_accounts`,\n * `get_products`, `get_media_buys`, `get_signals`, `list_property_lists`,\n * `list_collection_lists`, `list_content_standards`) returning a bare\n * array at the top level instead of the `{ <key>: [...] }` envelope\n *\n * Run-path callers should consume the structured hint via the runner's\n * `step.hints[]` surface (issue #935) — the structured fields drive\n * per-case fix plans without re-parsing the message.\n *\n * @param taskName — tool name (snake_case) the storyboard dispatched under\n * @param payload — raw response payload. `unknown` rather than\n * `Record<string, unknown>` so bare-array payloads are recognizable at\n * the top level.\n */\nexport function detectShapeDriftHint(taskName: string, payload: unknown): string | undefined {\n return detectShapeDriftHints(taskName, payload)[0]?.message;\n}\n\nexport { LIST_WRAPPER_TOOLS } from './shape-drift-hints';\n\n// ────────────────────────────────────────────────────────────\n// field_present: check a path exists\n// ────────────────────────────────────────────────────────────\n\nfunction validateFieldPresent(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n // `check` is either `field_present` or `envelope_field_present` (adcp#3429);\n // both share runtime semantics, but the result echoes the storyboard's\n // choice verbatim so reporters can distinguish.\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n const wildcardError = rejectWildcardScalarPath(validation, checkName);\n if (wildcardError) return wildcardError;\n\n const value = resolvePath(taskResult.data, validation.path);\n const present = value !== undefined && value !== null;\n const pointer = toJsonPointer(validation.path);\n\n if (present) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Field not found at path: ${validation.path}`,\n json_pointer: pointer,\n expected: validation.path,\n actual: value ?? null,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// field_absent / envelope_field_absent: check a path does NOT exist\n//\n// Pass when the field is absent (undefined or null). Fail when the field\n// is present with any value. The `envelope_field_absent` variant carries\n// the same runtime semantics but signals to the drift detector that the\n// path lives on the v3 envelope schema rather than the per-tool response.\n// Added per adcp#3429 alongside the `envelope_field_present` family.\n// ────────────────────────────────────────────────────────────\n\nfunction validateFieldAbsent(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n const wildcardError = rejectWildcardScalarPath(validation, checkName);\n if (wildcardError) return wildcardError;\n\n const value = resolvePath(taskResult.data, validation.path);\n const absent = value === undefined || value === null;\n const pointer = toJsonPointer(validation.path);\n\n if (absent) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Field found at path: ${validation.path} (expected absent)`,\n json_pointer: pointer,\n expected: null,\n actual: value,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// field_value: check a path equals expected value\n// ────────────────────────────────────────────────────────────\n\nfunction valuesMatch(actual: unknown, expected: unknown): boolean {\n if (typeof actual === 'object' && actual !== null) {\n return deepEqualJsonValue(actual, expected);\n }\n return actual === expected;\n}\n\n/**\n * JSON deep equality for `field_value`-family checks: object member order is\n * NOT significant (RFC 8259 section 4), array element order IS, scalars are\n * strict. Mirrors the sibling implementations in `webhook-receiver.ts` and\n * `canonical-format-satisfaction.ts`. Previously this was a\n * `JSON.stringify(a) === JSON.stringify(b)` comparison, which false-negatived\n * content-equal objects whose members serialize in a different order (e.g. a\n * format_id `{id, agent_url}` echoed by the agent as `{agent_url, id}`) —\n * adcp-client#2327.\n */\nfunction deepEqualJsonValue(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (typeof a !== 'object') return false;\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b)) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqualJsonValue(a[i], b[i])) return false;\n }\n return true;\n }\n const keysA = Object.keys(a as Record<string, unknown>);\n const keysB = Object.keys(b as Record<string, unknown>);\n if (keysA.length !== keysB.length) return false;\n for (const k of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, k)) return false;\n if (!deepEqualJsonValue((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k])) return false;\n }\n return true;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Matching used by `field_contains`.\n *\n * Scalar expectations keep exact equality, while object/array expectations are\n * treated as deep subsets. This lets a storyboard assert the keyed parts of an\n * unordered response entry such as:\n *\n * path: products[0].allowed_actions[]\n * value: { action: \"extend_flight\", modes: [\"requires_approval\"] }\n *\n * without requiring the seller to omit additional optional fields or keep a\n * fixed array order.\n */\nfunction containsValueMatches(actual: unknown, expected: unknown): boolean {\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) return false;\n if (expected.length === 0) return actual.length === 0;\n const used = new Set<number>();\n return expected.every(expectedItem => {\n const matchIndex = actual.findIndex(\n (actualItem, index) => !used.has(index) && containsValueMatches(actualItem, expectedItem)\n );\n if (matchIndex === -1) return false;\n used.add(matchIndex);\n return true;\n });\n }\n\n if (isRecord(expected)) {\n if (!isRecord(actual)) return false;\n return Object.entries(expected).every(\n ([key, expectedValue]) =>\n Object.prototype.hasOwnProperty.call(actual, key) && containsValueMatches(actual[key], expectedValue)\n );\n }\n\n return valuesMatch(actual, expected);\n}\n\nfunction pathUsesWildcardSyntax(path: string): boolean {\n return /\\[(?:\\*|)\\]/.test(path);\n}\n\nfunction rejectWildcardScalarPath(validation: StoryboardValidation, checkName: string): ValidationResult | undefined {\n if (!validation.path || !pathUsesWildcardSyntax(validation.path)) return undefined;\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `${checkName} does not support wildcard path syntax (${validation.path}); use field_contains for array wildcard membership checks`,\n json_pointer: toJsonPointer(validation.path),\n expected: 'path without [] or [*] wildcard syntax',\n actual: validation.path,\n };\n}\n\nfunction validateFieldValue(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n // `check` is either `field_value` or `envelope_field_value` (adcp#3429);\n // result echoes the storyboard's choice so reporters can distinguish.\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n const wildcardError = rejectWildcardScalarPath(validation, checkName);\n if (wildcardError) return wildcardError;\n\n const actual = resolvePath(taskResult.data, validation.path);\n const pointer = toJsonPointer(validation.path);\n\n // allowed_values: pass if actual matches any value in the list\n if (validation.allowed_values?.length) {\n const passed = validation.allowed_values.some(v => valuesMatch(actual, v));\n if (passed) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected one of ${JSON.stringify(validation.allowed_values)}, got ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected: validation.allowed_values,\n actual: actual ?? null,\n };\n }\n\n // Exact match against value\n const passed = valuesMatch(actual, validation.value);\n\n if (passed) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected ${JSON.stringify(validation.value)}, got ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected: validation.value,\n actual: actual ?? null,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// field_value_or_absent: envelope-tolerant variant of field_value\n//\n// Pass when the field is absent OR present-and-matching. Fail only when the\n// field is present with a disallowed value. Lets a storyboard keep positive\n// coverage on a spec-optional field without penalizing agents that omit it.\n// Spec: adcontextprotocol/adcp #3013 envelope `replayed` semantics.\n// ────────────────────────────────────────────────────────────\n\nfunction validateFieldValueOrAbsent(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n // `check` is either `field_value_or_absent` or `envelope_field_value_or_absent`\n // (adcp#3429); result echoes the storyboard's choice verbatim.\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n const wildcardError = rejectWildcardScalarPath(validation, checkName);\n if (wildcardError) return wildcardError;\n\n const rawActual = resolvePath(taskResult.data, validation.path);\n const pointer = toJsonPointer(validation.path);\n const actual =\n validation.check === 'field_value_or_absent' &&\n validation.path === 'status' &&\n rawActual !== undefined &&\n isTaskEnvelopeStatus(rawActual) &&\n resolvePath(taskResult.data, 'media_buy_status') !== undefined\n ? undefined\n : rawActual;\n\n // Absent → pass. The check only fires when the field is present.\n if (actual === undefined) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n\n // Present → fall through to the same value / allowed_values semantics as field_value.\n if (validation.allowed_values?.length) {\n const passed = validation.allowed_values.some(v => valuesMatch(actual, v));\n if (passed) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected absent or one of ${JSON.stringify(validation.allowed_values)}, got ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected: validation.allowed_values,\n actual,\n };\n }\n\n const passed = valuesMatch(actual, validation.value);\n if (passed) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected absent or ${JSON.stringify(validation.value)}, got ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected: validation.value,\n actual,\n };\n}\n\nconst TASK_ENVELOPE_STATUSES = new Set([\n 'submitted',\n 'working',\n 'input-required',\n 'completed',\n 'canceled',\n 'failed',\n 'rejected',\n 'auth-required',\n 'unknown',\n]);\n\nfunction isTaskEnvelopeStatus(value: unknown): boolean {\n return typeof value === 'string' && TASK_ENVELOPE_STATUSES.has(value);\n}\n\n// ────────────────────────────────────────────────────────────\n// field_pattern / envelope_field_pattern: check a string matches\n// a storyboard-authored JavaScript regular expression source.\n// ────────────────────────────────────────────────────────────\n\nfunction validateFieldPattern(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n const wildcardError = rejectWildcardScalarPath(validation, checkName);\n if (wildcardError) return wildcardError;\n\n const pointer = toJsonPointer(validation.path);\n const expected = { pattern: validation.pattern };\n\n if (typeof validation.pattern !== 'string' || validation.pattern.length === 0) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `${checkName} requires a non-empty \\`pattern\\` string`,\n json_pointer: pointer,\n expected: { pattern: 'non-empty JavaScript regular expression source' },\n actual: validation.pattern ?? null,\n };\n }\n\n let re: RegExp;\n try {\n re = new RegExp(validation.pattern);\n } catch (err) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Invalid ${checkName} pattern ${JSON.stringify(validation.pattern)}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n json_pointer: pointer,\n expected,\n actual: validation.pattern ?? null,\n };\n }\n\n const actual = resolvePath(taskResult.data, validation.path);\n if (typeof actual !== 'string') {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error:\n actual === undefined || actual === null\n ? `Field not found at path: ${validation.path}`\n : `Expected string at path: ${validation.path}, got ${Array.isArray(actual) ? 'array' : typeof actual}`,\n json_pointer: pointer,\n expected,\n actual: actual ?? null,\n };\n }\n\n if (re.test(actual)) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected string at path ${validation.path} to match pattern ${JSON.stringify(validation.pattern)}, got ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected,\n actual,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// field_contains: wildcard-aware membership check\n//\n// Resolves `path` via `resolvePathAll` (which understands `[*]` and `[]`\n// segments) and passes when ANY resolved value matches `value` or any of\n// `allowed_values`. Object/array expectations are deep subset matches, so\n// keyed entries like `allowed_actions[]` can be asserted without pinning a\n// positional index or requiring exact object shape.\n// ────────────────────────────────────────────────────────────\n\nfunction validateFieldContains(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n if (validation.value === undefined && !validation.allowed_values?.length) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `${checkName} requires either \\`value\\` or \\`allowed_values\\``,\n json_pointer: toJsonPointer(validation.path),\n expected: '`value` or `allowed_values` must be set',\n actual: null,\n };\n }\n\n const resolved = resolvePathAll(taskResult.data, validation.path);\n const pointer = toJsonPointer(validation.path);\n\n const candidates = validation.allowed_values?.length ? validation.allowed_values : [validation.value];\n const matched = resolved.some(actual => candidates.some(c => containsValueMatches(actual, c)));\n\n if (matched) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n\n const expected = validation.allowed_values?.length ? validation.allowed_values : validation.value;\n const errMsg = validation.allowed_values?.length\n ? `Expected one of ${JSON.stringify(validation.allowed_values)} to appear in path; got ${JSON.stringify(resolved)}`\n : `Expected ${JSON.stringify(validation.value)} to appear in path; got ${JSON.stringify(resolved)}`;\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: errMsg,\n json_pointer: pointer,\n expected,\n actual: resolved,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// array_length: assert cardinality of the array at `path`\n//\n// Configurations:\n// - `value: N` → exact match (array.length === N)\n// - `min` / `max` → inclusive bounds (either or both)\n// - both → misconfigured, fails the check\n//\n// Cardinality is unsound to express via `field_present arr[N-1]` +\n// `field_value_or_absent arr[N] value: null` because the second clause\n// passes when a seller emits a literal `null` pad at `arr[N]`. This check\n// reads `array.length` directly and rejects non-array resolutions instead.\n// Spec: adcp#4685; SDK adcp-client#1830.\n// ────────────────────────────────────────────────────────────\n\nfunction validateArrayLength(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n const checkName = 'array_length' as const;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: 'No path specified for array_length validation',\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n const pointer = toJsonPointer(validation.path);\n\n const hasExact = typeof validation.value === 'number';\n const hasMin = typeof validation.min === 'number';\n const hasMax = typeof validation.max === 'number';\n\n if (!hasExact && !hasMin && !hasMax) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: 'array_length requires `value` (exact count) or `min`/`max` (bounds)',\n json_pointer: pointer,\n expected: '`value: N` or `min`/`max`',\n actual: null,\n };\n }\n\n if (hasExact && (hasMin || hasMax)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: 'array_length accepts either `value` OR `min`/`max`, not both',\n json_pointer: pointer,\n expected: '`value` or `min`/`max`, not both',\n actual: { value: validation.value, min: validation.min, max: validation.max },\n };\n }\n\n // Reject NaN, fractional, and negative bounds at the config gate. `array.length`\n // is always a non-negative integer, so any other comparand makes the check\n // impossible to satisfy — fail loudly at authoring time rather than silently\n // every run.\n const isValidCount = (n: unknown): n is number => typeof n === 'number' && Number.isInteger(n) && n >= 0;\n const badOperand = (label: string, n: number) =>\n `array_length \\`${label}\\` must be a non-negative integer; got ${Number.isNaN(n) ? 'NaN' : String(n)}`;\n if (hasExact && !isValidCount(validation.value)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: badOperand('value', validation.value as unknown as number),\n json_pointer: pointer,\n expected: 'non-negative integer',\n actual: (validation.value as unknown) ?? null,\n };\n }\n if (hasMin && !isValidCount(validation.min)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: badOperand('min', validation.min as unknown as number),\n json_pointer: pointer,\n expected: 'non-negative integer',\n actual: (validation.min as unknown) ?? null,\n };\n }\n if (hasMax && !isValidCount(validation.max)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: badOperand('max', validation.max as unknown as number),\n json_pointer: pointer,\n expected: 'non-negative integer',\n actual: (validation.max as unknown) ?? null,\n };\n }\n if (hasMin && hasMax && (validation.min as number) > (validation.max as number)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `array_length range is impossible: min ${validation.min} > max ${validation.max}`,\n json_pointer: pointer,\n expected: '`min <= max`',\n actual: { min: validation.min, max: validation.max },\n };\n }\n\n const resolved = resolvePath(taskResult.data, validation.path);\n if (!Array.isArray(resolved)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `array_length requires an array at path; got ${resolved === undefined ? 'undefined' : typeof resolved === 'object' && resolved !== null ? 'object' : typeof resolved}`,\n json_pointer: pointer,\n expected: 'array',\n actual: resolved ?? null,\n };\n }\n\n const length = resolved.length;\n\n if (hasExact) {\n const target = validation.value as number;\n if (length === target) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected array length ${target}, got ${length}`,\n json_pointer: pointer,\n expected: target,\n actual: length,\n };\n }\n\n const min = hasMin ? (validation.min as number) : undefined;\n const max = hasMax ? (validation.max as number) : undefined;\n\n if (min !== undefined && length < min) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected array length >= ${min}, got ${length}`,\n json_pointer: pointer,\n expected: { min, max },\n actual: length,\n };\n }\n if (max !== undefined && length > max) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected array length <= ${max}, got ${length}`,\n json_pointer: pointer,\n expected: { min, max },\n actual: length,\n };\n }\n\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// status_code: check TaskResult status\n// ────────────────────────────────────────────────────────────\n\nfunction validateStatusCode(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n const passed = taskResult.success;\n\n if (passed) {\n return {\n check: 'status_code',\n passed: true,\n description: validation.description,\n };\n }\n return {\n check: 'status_code',\n passed: false,\n description: validation.description,\n error: `Task failed: ${taskResult.error || 'unknown error'}`,\n json_pointer: null,\n expected: 'success',\n actual: taskResult.error ?? 'failure',\n };\n}\n\n// Strip the \"CODE: message\" prefix some transports produce, leaving just the\n// code. Returns undefined when the input doesn't look like a coded error.\nfunction extractCodeFromErrorString(raw: string | undefined): string | undefined {\n if (!raw) return undefined;\n const match = /^([A-Z][A-Z0-9_]{2,}):\\s/.exec(raw);\n return match ? match[1] : raw;\n}\n\n// ────────────────────────────────────────────────────────────\n// error_code: check error code in error response\n// ────────────────────────────────────────────────────────────\n\nfunction validateErrorCode(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n // Extract error code from various locations agents might put it.\n // Prefer the spec-canonical `errors[0].code` envelope (core/error.json), then\n // fall back to legacy/structured locations so we get a bare code instead of\n // the \"CODE: message\" string materialized on taskResult.error.\n //\n // Guarded by `success === false` because AdCP async envelopes (`submitted`,\n // `input-required`) explicitly permit an advisory `errors[]` on non-failed\n // tasks for non-blocking warnings — reading it unconditionally would\n // false-positive `error_code` validations on successful responses.\n const data = taskResult.data as Record<string, unknown> | undefined;\n const errors = data?.errors;\n const firstError = !taskResult.success && Array.isArray(errors) ? errors[0] : undefined;\n const firstErrorCode =\n firstError && typeof firstError === 'object' && typeof (firstError as Record<string, unknown>).code === 'string'\n ? ((firstError as Record<string, unknown>).code as string)\n : undefined;\n const taskAdcpError = taskResult.adcp_error as Record<string, unknown> | undefined;\n const dataAdcpError = data?.adcp_error as Record<string, unknown> | undefined;\n const adcpError = taskAdcpError ?? dataAdcpError;\n const errorCode =\n firstErrorCode ??\n adcpError?.code ??\n data?.error_code ??\n data?.code ??\n (data?.error as Record<string, unknown> | undefined)?.code ??\n extractCodeFromErrorString(taskResult.error);\n\n const pointer =\n firstErrorCode !== undefined\n ? '/errors/0/code'\n : taskAdcpError?.code !== undefined\n ? '/adcp_error/code'\n : adcpError?.code !== undefined\n ? '/adcp_error/code'\n : data?.error_code !== undefined\n ? '/error_code'\n : null;\n\n if (validation.allowed_values?.length) {\n const actualCode = errorCode !== undefined && errorCode !== null ? String(errorCode) : undefined;\n const passed = actualCode !== undefined && validation.allowed_values.some(v => String(v) === actualCode);\n if (passed) {\n return { check: 'error_code', passed: true, description: validation.description, json_pointer: pointer };\n }\n return {\n check: 'error_code',\n passed: false,\n description: validation.description,\n error: `Expected one of ${JSON.stringify(validation.allowed_values)}, got ${JSON.stringify(errorCode)}`,\n json_pointer: pointer,\n expected: validation.allowed_values,\n actual: errorCode ?? null,\n };\n }\n\n if (!validation.value) {\n // Just check that an error code exists\n const hasCode = errorCode !== undefined && errorCode !== null;\n if (hasCode) {\n return { check: 'error_code', passed: true, description: validation.description, json_pointer: pointer };\n }\n return {\n check: 'error_code',\n passed: false,\n description: validation.description,\n error: 'No error code found in response',\n json_pointer: pointer,\n expected: 'any error code',\n actual: null,\n };\n }\n\n const passed = String(errorCode) === String(validation.value);\n if (passed) {\n return { check: 'error_code', passed: true, description: validation.description, json_pointer: pointer };\n }\n return {\n check: 'error_code',\n passed: false,\n description: validation.description,\n error: `Expected error code \"${validation.value}\", got \"${errorCode}\"`,\n json_pointer: pointer,\n expected: validation.value,\n actual: errorCode ?? null,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// http_status / http_status_in\n// ────────────────────────────────────────────────────────────\n\nfunction validateHttpStatus(validation: StoryboardValidation, hr: HttpProbeResult): ValidationResult {\n const expected = validation.value as number | undefined;\n const passed = typeof expected === 'number' && hr.status === expected;\n if (passed) {\n return { check: 'http_status', passed: true, description: validation.description };\n }\n return {\n check: 'http_status',\n passed: false,\n description: validation.description,\n error: `Expected HTTP ${expected}, got ${hr.status}${hr.error ? ` (${hr.error})` : ''}`,\n json_pointer: null,\n expected: expected ?? null,\n actual: hr.status,\n };\n}\n\nfunction validateHttpStatusIn(validation: StoryboardValidation, hr: HttpProbeResult): ValidationResult {\n const allowed = Array.isArray(validation.allowed_values) ? validation.allowed_values : [];\n const passed = allowed.some(v => v === hr.status);\n if (passed) {\n return { check: 'http_status_in', passed: true, description: validation.description };\n }\n // Disambiguate two failure modes that produce the same HTTP-status mismatch:\n // (a) the kit's `probe_task` requires non-empty params, so the agent 400s on\n // schema before auth ever runs (operator's fault), or (b) the agent really\n // does evaluate schema before auth (agent's fault — itself a conformance\n // gap). Both are real; the text names both so compliance reports don't\n // unilaterally blame the operator for an agent that games the probe by\n // returning a schema-shaped body.\n const expectedAuthReject = allowed.includes(401) || allowed.includes(403);\n const schemaRejected = (hr.status === 400 || hr.status === 422) && looksLikeSchemaValidationBody(hr.body);\n if (expectedAuthReject && schemaRejected) {\n return {\n check: 'http_status_in',\n passed: false,\n description: validation.description,\n error:\n `Agent returned HTTP ${hr.status} with a schema-validation body before any auth response. ` +\n `Two possible causes: (1) \\`test_kit.auth.probe_task\\` points at a task that requires ` +\n `non-empty parameters, so schema validation rejected the probe before auth ran (fix: set ` +\n `\\`probe_task\\` to one of ${PROBE_TASK_ALLOWLIST.join(', ')}); or (2) the agent evaluates ` +\n `schema before auth, which is itself a conformance gap (protected endpoints must return ` +\n `401/403 on invalid credentials regardless of body shape).`,\n json_pointer: null,\n expected: allowed,\n actual: hr.status,\n };\n }\n return {\n check: 'http_status_in',\n passed: false,\n description: validation.description,\n error: `Expected HTTP status in ${JSON.stringify(allowed)}, got ${hr.status}${hr.error ? ` (${hr.error})` : ''}`,\n json_pointer: null,\n expected: allowed,\n actual: hr.status,\n };\n}\n\nconst SCHEMA_KEYWORD_RE = /invalid[_ ]?params|validation|schema|required|must be/i;\nconst SCHEMA_CODE_RE = /VALIDATION|INVALID|SCHEMA|BAD_REQUEST/i;\n\n/**\n * Detect bodies that look like JSON-RPC / MCP schema-validation rejections.\n *\n * Conservative: only returns true when the body has a recognizable error\n * envelope AND either a JSON-RPC invalid-params code (-32602) or a\n * message/field-level hint pointing at schema/validation. Returning true\n * on a real auth response would hide genuine agent bugs, so we over-reject.\n *\n * Handles both parsed JSON object bodies and plain-text bodies — the HTTP\n * probe returns a decoded string when content-type isn't JSON, and agents\n * that 400 with `text/plain` short messages like \"missing required field\"\n * deserve the same kit-config diagnostic. String detection is deliberately\n * tight: a recognizable schema-keyword substring in a short body (≤ 1 KiB).\n */\nfunction looksLikeSchemaValidationBody(body: unknown): boolean {\n if (typeof body === 'string') {\n return body.length > 0 && body.length <= 1024 && SCHEMA_KEYWORD_RE.test(body);\n }\n if (!body || typeof body !== 'object' || Array.isArray(body)) return false;\n const obj = body as Record<string, unknown>;\n // JSON-RPC error envelope\n const rpcError = obj.error as Record<string, unknown> | undefined;\n if (rpcError && typeof rpcError === 'object') {\n const code = rpcError.code;\n if (typeof code === 'number' && (code === -32602 || code === -32600)) return true;\n const msg = rpcError.message;\n if (typeof msg === 'string' && SCHEMA_KEYWORD_RE.test(msg)) return true;\n }\n // AdCP / REST-style validation envelope\n if (Array.isArray(obj.errors) && obj.errors.length > 0) return true;\n if (Array.isArray(obj.validation_errors) && obj.validation_errors.length > 0) return true;\n const topCode = obj.error_code ?? obj.code;\n if (typeof topCode === 'string' && SCHEMA_CODE_RE.test(topCode)) return true;\n return false;\n}\n\n// ────────────────────────────────────────────────────────────\n// on_401_require_header\n// ────────────────────────────────────────────────────────────\n\nfunction validateOn401RequireHeader(validation: StoryboardValidation, hr: HttpProbeResult): ValidationResult {\n const header = typeof validation.value === 'string' ? validation.value.toLowerCase() : undefined;\n if (!header) {\n return {\n check: 'on_401_require_header',\n passed: false,\n description: validation.description,\n error: '`value` is required (the header name to require on 401 responses).',\n json_pointer: null,\n expected: 'header name',\n actual: null,\n };\n }\n // Silent pass when the response isn't a 401 — the conditional is part of\n // the spec (RFC 6750 §3 only applies to 401s).\n if (hr.status !== 401) {\n return { check: 'on_401_require_header', passed: true, description: validation.description };\n }\n const value = hr.headers[header];\n const passed = typeof value === 'string' && value.length > 0;\n if (passed) {\n return { check: 'on_401_require_header', passed: true, description: validation.description };\n }\n return {\n check: 'on_401_require_header',\n passed: false,\n description: validation.description,\n error: `401 response missing required header \"${header}\".`,\n json_pointer: null,\n expected: `response header \"${header}\" present`,\n actual: value ?? null,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// resource_equals_agent_url\n// ────────────────────────────────────────────────────────────\n\n/**\n * Normalize a URL for RFC 9728 resource identity checks:\n * lowercases scheme/host, strips userinfo, query, and fragment, and\n * collapses trailing slashes while preserving the path. RFC 9728\n * `resource` identifies the agent at its full endpoint, so paths are\n * significant here — use `canonicalizeAgentUrlForScope` for `refs_resolve`\n * scope comparisons where paths must be dropped.\n */\n/**\n * Canonical form of an agent URL for `refs_resolve` scope comparisons.\n *\n * AdCP's `agent_url` identifies the agent — which may live under a subpath\n * like `https://publisher.com/.well-known/adcp/sales` (see core/format-id.json).\n * Path is therefore significant and MUST be preserved; collapsing to origin\n * would false-positive sibling agents on shared hosts.\n *\n * What must be stripped is the transport suffix the runner appends to reach\n * the protocol endpoint (`/mcp`, `/a2a`, `/sse`) and the well-known agent-card\n * path, so the runner's target URL canonicalizes to the same value the agent\n * advertises in its refs. Mirrors `SingleAgentClient.computeBaseUrl` but as a\n * pure string operation suitable for validation without an agent instance.\n *\n * Also: lowercase scheme/host, drop default ports, strip userinfo, query,\n * fragment — normal RFC 3986 §6.2 canonicalization. Closes adcp-client#710.\n */\nconst AGENT_CARD_SUFFIX_RE = /\\/\\.well-known\\/agent(?:-card)?\\.json$/i;\nfunction canonicalizeAgentUrlForScope(url: string): string {\n try {\n const u = new URL(url);\n u.hash = '';\n u.search = '';\n u.username = '';\n u.password = '';\n let path = u.pathname;\n path = path.replace(AGENT_CARD_SUFFIX_RE, '');\n path = path.replace(TRANSPORT_SUFFIX_REGEX, '');\n // A bare `/` and the empty string denote the same origin-relative root;\n // collapse them so `https://host` and `https://host/` canonicalize equally.\n if (path === '/' || path === '') path = '';\n else if (path.endsWith('/')) path = path.slice(0, -1);\n const defaultPort = u.protocol === 'https:' ? '443' : u.protocol === 'http:' ? '80' : '';\n const host = u.hostname.toLowerCase();\n const port = u.port && u.port !== defaultPort ? `:${u.port}` : '';\n return `${u.protocol.toLowerCase()}//${host}${port}${path}`;\n } catch {\n return url;\n }\n}\n\nfunction validateResourceEqualsAgentUrl(\n validation: StoryboardValidation,\n hr: HttpProbeResult,\n agentUrl: string\n): ValidationResult {\n const body = (hr.body ?? {}) as { resource?: unknown };\n const resource = typeof body.resource === 'string' ? body.resource : undefined;\n if (!resource) {\n return {\n check: 'resource_equals_agent_url',\n passed: false,\n description: validation.description,\n error: 'Response body missing string `resource` field.',\n json_pointer: '/resource',\n expected: redactOAuthUrlForOutput(normalizeOAuthResourceForComparison(agentUrl)),\n actual: null,\n };\n }\n const expected = normalizeOAuthResourceForComparison(agentUrl);\n const actual = normalizeOAuthResourceForComparison(resource);\n const displayExpected = redactOAuthUrlForOutput(expected);\n const displayActual = redactOAuthUrlForOutput(actual);\n const passed = actual === expected;\n // Don't echo the advertised value verbatim in the human-readable message —\n // compliance reports may be shared publicly and the raw diff helps attackers\n // probe victim agents. Machine-readable expected/actual are fine: implementors\n // consuming the JSON already hold both URLs.\n let redactedError: string | undefined;\n if (!passed) {\n let actualHost = 'unknown';\n try {\n actualHost = new URL(resource).host;\n } catch {\n /* ignore */\n }\n const expectedHost = new URL(expected).host;\n const hostDiffers = actualHost !== expectedHost;\n redactedError =\n `RFC 9728 \\`resource\\` does not equal the URL clients call (${displayExpected}). ` +\n (hostDiffers\n ? `Advertised host differs from the agent host — the most common cause is copying your authorization server origin into \\`resource\\`. `\n : `Advertised path differs from the agent path. `) +\n `Fix: set \\`resource\\` equal to the full agent URL in your protected-resource metadata document.`;\n }\n if (passed) {\n return {\n check: 'resource_equals_agent_url',\n passed: true,\n description: validation.description,\n json_pointer: '/resource',\n };\n }\n return {\n check: 'resource_equals_agent_url',\n passed: false,\n description: validation.description,\n error: redactedError,\n json_pointer: '/resource',\n expected: displayExpected,\n actual: displayActual,\n };\n}\n\nfunction validateOAuthMetadataGraph(\n validation: StoryboardValidation,\n grade: OAuthMetadataGraphGrade | undefined\n): ValidationResult {\n const expected = {\n profile: 'adcp/oauth-metadata-graph/v1',\n require_authorization_servers: true,\n follow_all_authorization_servers: true,\n probe_advertised_endpoints: true,\n };\n if (!grade) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: 'oauth_metadata_graph was not prefetched by the storyboard runner',\n json_pointer: null,\n expected,\n actual: null,\n };\n }\n if (grade.success) {\n return {\n check: validation.check,\n passed: true,\n description: validation.description,\n json_pointer: null,\n expected,\n observations: grade.observations,\n };\n }\n const primary = grade.findings[0];\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: `${grade.error_code}: ${grade.error}`,\n json_pointer: primary?.field ? findingFieldToJsonPointer(primary.field) : null,\n expected,\n actual: {\n code: grade.error_code,\n ...(primary?.url && { url: primary.url }),\n ...(primary?.field && { field: primary.field }),\n ...(primary?.message && { detail: primary.message }),\n },\n observations: grade.observations,\n };\n}\n\nfunction findingFieldToJsonPointer(field: string): string {\n const segments = field.replace(/\\[(\\d+)\\]/g, '.$1').split('.');\n return `/${segments.map(segment => segment.replace(/~/g, '~0').replace(/\\//g, '~1')).join('/')}`;\n}\n\n// ────────────────────────────────────────────────────────────\n// any_of (contribution accumulator)\n// ────────────────────────────────────────────────────────────\n\nfunction validateAnyOf(validation: StoryboardValidation, contributions: Set<string>): ValidationResult {\n const flags = Array.isArray(validation.allowed_values) ? validation.allowed_values.map(String) : [];\n const passed = flags.some(f => contributions.has(f));\n if (passed) {\n return { check: 'any_of', passed: true, description: validation.description };\n }\n return {\n check: 'any_of',\n passed: false,\n description: validation.description,\n error: `None of the required contributions were recorded: ${JSON.stringify(flags)}`,\n json_pointer: null,\n expected: flags,\n actual: Array.from(contributions),\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// a2a_submitted_artifact (A2A wire-shape regression guard)\n// ────────────────────────────────────────────────────────────\n\n/**\n * Assert the A2A `Task` envelope produced by the seller for an AdCP\n * `submitted` arm matches the cross-transport contract established in\n * adcp-client#899:\n *\n * 1. `Task.state === 'completed'` — A2A Task.state tracks the HTTP\n * transport call, not the AdCP work. The HTTP request returned\n * successfully with a queued AdCP task; emitting `'submitted'`\n * here would be a non-conformant terminal transition per A2A\n * 0.3.0 (`submitted` is the INITIAL state, never terminal).\n *\n * 2. `artifact.metadata.adcp_task_id` is a non-empty string — the\n * AdCP-level async handle rides on the artifact's metadata field,\n * not buried in `data.adcp_task_id`. Buyers resume the AdCP task\n * by reading metadata; conflating it into the AdCP payload\n * pollutes the typed response shape.\n *\n * 3. `artifact.parts[0].data.status === 'submitted'` — the AdCP\n * payload preserves its native `status` discriminator so buyers\n * can read the ad-tech state without parsing transport metadata.\n *\n * The check is A2A-specific: when no `a2aEnvelope` was captured (MCP\n * runs, or A2A runs where the SDK fetch was bypassed), the result\n * passes with `not_applicable: true` so the validation doesn't fail\n * the step on transports that don't carry the envelope.\n *\n * Failure messages name the offending field so an agent that\n * regressed to the pre-#899 shape (`Task.state: 'submitted'` with\n * `final: true`, `adcp_task_id` in `data` instead of `metadata`) gets\n * a specific diagnostic, not a generic \"wire-shape rejected\".\n */\nfunction validateA2ASubmittedArtifact(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const envelope = ctx.a2aEnvelope;\n if (!envelope) {\n // Non-A2A transport (MCP), or A2A path where the SDK fetch wasn't\n // wrapped. Skip without failing — the storyboard step still grades\n // on its other validations (e.g. MCP `field_value status === submitted`).\n return {\n check: 'a2a_submitted_artifact',\n passed: true,\n description: validation.description,\n observations: [\n 'a2a_envelope_not_captured: no JSON-RPC envelope recorded (non-A2A transport, or A2A dispatch threw before envelope was parsed)',\n ],\n };\n }\n\n const failures: Array<{ pointer: string; expected: unknown; actual: unknown; detail: string }> = [];\n\n // JSON-RPC error envelopes never satisfy the submitted-artifact\n // contract. We fail the check (skipping would silently hide a\n // server-side regression where submitted arms 500 instead of\n // returning Tasks), but emit a distinct error_code so dashboards\n // can separate transport rejections from submitted-arm shape drift.\n if (envelope.envelope.error !== undefined) {\n return {\n check: 'a2a_submitted_artifact',\n passed: false,\n description: validation.description,\n error: 'Expected a JSON-RPC success envelope carrying an A2A Task; observed an error envelope.',\n json_pointer: '/error',\n expected: { result: { kind: 'task', status: { state: 'completed' } } },\n actual: { error_code: 'a2a_jsonrpc_error_envelope', error: envelope.envelope.error },\n };\n }\n\n const result = envelope.result;\n if (result == null || typeof result !== 'object' || Array.isArray(result)) {\n return {\n check: 'a2a_submitted_artifact',\n passed: false,\n description: validation.description,\n error: 'JSON-RPC `result` is not an object — A2A `message/send` must return a Task.',\n json_pointer: '/result',\n expected: 'object (A2A Task)',\n actual: result,\n };\n }\n const task = result as Record<string, unknown>;\n\n if (task.kind !== 'task') {\n failures.push({\n pointer: '/result/kind',\n expected: 'task',\n actual: task.kind,\n detail: `Expected result.kind === 'task'; got ${JSON.stringify(task.kind)}.`,\n });\n }\n\n // Task.id non-empty — buyers can't address `tasks/get` or\n // `tasks/cancel` without it, so an empty / missing id is a\n // wire-shape regression even if the transport call succeeded.\n if (typeof task.id !== 'string' || task.id.length === 0) {\n failures.push({\n pointer: '/result/id',\n expected: 'non-empty string',\n actual: task.id,\n detail:\n 'A2A `Task.id` must be a non-empty string — buyers address follow-up `tasks/get` / `tasks/cancel` calls by this id.',\n });\n }\n\n // Task.contextId non-empty — A2A 0.3.0 binds follow-ups (subsequent\n // sends, status streams) to the context; an empty contextId\n // breaks correlation across calls.\n if (typeof task.contextId !== 'string' || task.contextId.length === 0) {\n failures.push({\n pointer: '/result/contextId',\n expected: 'non-empty string',\n actual: task.contextId,\n detail:\n 'A2A `Task.contextId` must be a non-empty string — A2A 0.3.0 requires it on every Task to correlate follow-up sends and status streams.',\n });\n }\n\n // Invariant 1 — A2A `Task.state` for a submitted AdCP arm is\n // `'completed'` (the HTTP call completed). Pre-#899 emitted\n // `'submitted'` with `final: true`, which is the regression we want\n // to catch.\n const status = task.status;\n const state =\n status != null && typeof status === 'object' && !Array.isArray(status)\n ? (status as Record<string, unknown>).state\n : undefined;\n if (state !== 'completed') {\n failures.push({\n pointer: '/result/status/state',\n expected: 'completed',\n actual: state,\n detail:\n `Expected Task.state === 'completed' (HTTP-call lifecycle); got ${JSON.stringify(state)}. ` +\n \"A2A 0.3.0 forbids 'submitted' as a terminal state — for AdCP submitted arms the transport call has completed; the AdCP task lives on artifact metadata.\",\n });\n }\n\n // Invariants 2 + 3 — artifact.metadata.adcp_task_id placement and\n // artifact.parts[0].data.status preservation. Walk the artifact\n // chain, collecting failures rather than short-circuiting so the\n // error block names every divergence at once.\n const artifacts = task.artifacts;\n if (!Array.isArray(artifacts) || artifacts.length === 0) {\n failures.push({\n pointer: '/result/artifacts',\n expected: 'non-empty array',\n actual: artifacts,\n detail: 'A2A submitted arm must produce at least one artifact carrying the AdCP response.',\n });\n } else {\n const artifact = artifacts[0] as Record<string, unknown> | null;\n if (artifact == null || typeof artifact !== 'object' || Array.isArray(artifact)) {\n failures.push({\n pointer: '/result/artifacts/0',\n expected: 'object',\n actual: artifact,\n detail: 'First artifact must be an object.',\n });\n } else {\n // artifact.artifactId non-empty — needed for chunked-artifact\n // resumption and for buyers that key local state by artifact\n // id (e.g. caching the AdCP payload while the task continues).\n if (typeof artifact.artifactId !== 'string' || artifact.artifactId.length === 0) {\n failures.push({\n pointer: '/result/artifacts/0/artifactId',\n expected: 'non-empty string',\n actual: artifact.artifactId,\n detail:\n 'A2A `Artifact.artifactId` must be a non-empty string — chunked-artifact resumption and buyer-side caching key off this id.',\n });\n }\n\n // Invariant 2 — adcp_task_id on artifact.metadata.\n const metadata = artifact.metadata;\n const metadataTaskId =\n metadata != null && typeof metadata === 'object' && !Array.isArray(metadata)\n ? (metadata as Record<string, unknown>).adcp_task_id\n : undefined;\n if (typeof metadataTaskId !== 'string' || metadataTaskId.length === 0) {\n failures.push({\n pointer: '/result/artifacts/0/metadata/adcp_task_id',\n expected: 'non-empty string',\n actual: metadataTaskId,\n detail:\n 'Expected `adcp_task_id` on `artifact.metadata` (per A2A 0.3.0 metadata-extension convention). Pre-#899 placed this in `artifact.parts[0].data.adcp_task_id` — that path is non-conformant; transport metadata pollutes the typed AdCP payload shape.',\n });\n }\n\n // Invariant 3 — artifact.parts[0].data.status === 'submitted'.\n const parts = artifact.parts;\n if (!Array.isArray(parts) || parts.length === 0) {\n failures.push({\n pointer: '/result/artifacts/0/parts',\n expected: 'non-empty array with a DataPart',\n actual: parts,\n detail: 'A2A submitted arm must include a DataPart carrying the AdCP response.',\n });\n } else {\n const firstPart = parts[0] as Record<string, unknown> | null;\n if (firstPart == null || typeof firstPart !== 'object' || Array.isArray(firstPart)) {\n failures.push({\n pointer: '/result/artifacts/0/parts/0',\n expected: 'object',\n actual: firstPart,\n detail: 'First artifact part must be an object.',\n });\n } else {\n if (firstPart.kind !== 'data') {\n failures.push({\n pointer: '/result/artifacts/0/parts/0/kind',\n expected: 'data',\n actual: firstPart.kind,\n detail: `Expected the first artifact part to be a DataPart (kind === 'data'); got ${JSON.stringify(firstPart.kind)}.`,\n });\n }\n const data = firstPart.data;\n const dataStatus =\n data != null && typeof data === 'object' && !Array.isArray(data)\n ? (data as Record<string, unknown>).status\n : undefined;\n if (dataStatus !== 'submitted') {\n failures.push({\n pointer: '/result/artifacts/0/parts/0/data/status',\n expected: 'submitted',\n actual: dataStatus,\n detail:\n `Expected the AdCP payload's status to round-trip as 'submitted'; got ${JSON.stringify(dataStatus)}. ` +\n 'The DataPart must carry the AdCP tool response verbatim — buyers read the ad-tech state from `data.status`, not from `Task.state`.',\n });\n }\n // Dual-write detection: catches the pre-#899 regression\n // where the agent leaked the transport handle into the\n // payload. A future AdCP tool whose response schema\n // legitimately includes `adcp_task_id` is allowed to\n // surface it inside `data` AS LONG AS it equals the\n // metadata value — a divergent or solo-payload write is\n // still the regression class issue #904 catches.\n const dataAdcpTaskId =\n data != null && typeof data === 'object' && !Array.isArray(data)\n ? (data as Record<string, unknown>).adcp_task_id\n : undefined;\n if (dataAdcpTaskId !== undefined) {\n const equalsMetadata =\n typeof metadataTaskId === 'string' &&\n typeof dataAdcpTaskId === 'string' &&\n dataAdcpTaskId === metadataTaskId;\n if (!equalsMetadata) {\n failures.push({\n pointer: '/result/artifacts/0/parts/0/data/adcp_task_id',\n expected: 'absent OR equal to artifact.metadata.adcp_task_id',\n actual: dataAdcpTaskId,\n detail:\n typeof metadataTaskId === 'string'\n ? `Pre-#899 dual-write detected: \\`data.adcp_task_id\\` (${JSON.stringify(dataAdcpTaskId)}) diverges from \\`artifact.metadata.adcp_task_id\\` (${JSON.stringify(metadataTaskId)}).`\n : 'Pre-#899 shape detected: `adcp_task_id` appeared inside `artifact.parts[0].data` without a matching `artifact.metadata.adcp_task_id`. Transport metadata belongs on `artifact.metadata`.',\n });\n }\n }\n }\n }\n }\n }\n\n if (failures.length === 0) {\n return {\n check: 'a2a_submitted_artifact',\n passed: true,\n description: validation.description,\n };\n }\n\n // Surface every failure at once. The first one anchors json_pointer /\n // expected / actual for tools that read those scalar fields; the full\n // list lands in `actual.failures` so all regressions are visible in\n // a single grading run. Multi-failure runs prepend the first detail\n // to the error string so consumers reading only `error` still get a\n // pointer to the most-actionable diagnostic.\n const first = failures[0]!;\n return {\n check: 'a2a_submitted_artifact',\n passed: false,\n description: validation.description,\n error:\n failures.length === 1\n ? first.detail\n : `${failures.length} A2A wire-shape invariants failed; first: ${first.detail}`,\n json_pointer: first.pointer,\n expected: first.expected,\n actual: { failures },\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// refs_resolve (cross-step integrity check)\n// ────────────────────────────────────────────────────────────\n\n// ────────────────────────────────────────────────────────────\n// a2a_context_continuity (cross-step A2A session-binding guard)\n// ────────────────────────────────────────────────────────────\n\n/**\n * Assert that the A2A `Task.contextId` on this step's response\n * matches the prior step's response. A2A 0.3.0 §7.1 binds follow-up\n * sends to a server-side conversation via `Message.contextId`; the\n * server MUST echo it on the response Task. The `@a2a-js/sdk`'s\n * `DefaultRequestHandler` does this automatically — `createA2AAdapter`\n * passes through `requestContext.contextId`, so a passing seller built\n * on the SDK won't trip a single-call check. The regression class is\n * sellers that bypass the SDK's request handler and stamp their own\n * `contextId` on the response, breaking buyer-side correlation across\n * a multi-turn flow (proposal refinement, IO signing, async approval).\n *\n * The check compares the current step's\n * `ctx.a2aEnvelope.result.contextId` against the prior step's\n * `ctx.priorA2aEnvelope.result.contextId`. Skip semantics:\n *\n * - Non-A2A run (`a2aEnvelope` undefined) → skip\n * - First A2A step in a run (`priorA2aEnvelope` undefined) → skip\n * - Either envelope had no extractable `contextId` → skip\n * - JSON-RPC error envelope (`envelope.error` present) → skip\n *\n * Skips emit a single observation noting which condition triggered so\n * triage can distinguish \"validator self-skipped\" from \"validator\n * passed because contexts matched\".\n */\nfunction validateA2AContextContinuity(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const current = ctx.a2aEnvelope;\n const prior = ctx.priorA2aEnvelope;\n const passResult = (observation: string): ValidationResult => ({\n check: 'a2a_context_continuity',\n passed: true,\n description: validation.description,\n observations: [observation],\n });\n\n if (!current)\n return passResult('a2a_envelope_not_captured: skipped on non-A2A transport (or capture-bypassing dispatch path)');\n if (!prior) return passResult('first_a2a_step: no prior A2A envelope to compare against; skipped');\n if (current.envelope.error !== undefined || prior.envelope.error !== undefined) {\n return passResult('jsonrpc_error_envelope: skipped — continuity is undefined for transport-rejected calls');\n }\n\n const currentContextId = extractContextIdFromEnvelope(current);\n const priorContextId = extractContextIdFromEnvelope(prior);\n\n if (priorContextId == null)\n return passResult('prior_contextId_absent: prior step did not surface a Task.contextId; skipped');\n if (currentContextId == null) {\n return {\n check: 'a2a_context_continuity',\n passed: false,\n description: validation.description,\n error:\n `Current step's response Task is missing \\`contextId\\` (prior step had ${JSON.stringify(priorContextId)}). ` +\n 'A2A 0.3.0 requires the server to echo the client-supplied contextId on every follow-up send; an empty/missing ' +\n 'contextId on a non-first send breaks buyer-side session correlation.',\n json_pointer: '/result/contextId',\n expected: priorContextId,\n actual: currentContextId,\n };\n }\n if (currentContextId !== priorContextId) {\n const priorStepNote = ctx.priorA2aStepId ? ` (prior step: ${ctx.priorA2aStepId})` : '';\n return {\n check: 'a2a_context_continuity',\n passed: false,\n description: validation.description,\n error:\n `A2A \\`Task.contextId\\` diverged across steps${priorStepNote}: expected ${JSON.stringify(priorContextId)}, got ${JSON.stringify(currentContextId)}. ` +\n \"Per A2A 0.3.0 §7.1 the server MUST echo the client-supplied contextId on follow-up sends. A divergent value indicates the seller bypassed the SDK's request handler and stamped its own contextId — buyer-side session correlation is broken.\",\n json_pointer: '/result/contextId',\n expected: priorContextId,\n actual: currentContextId,\n };\n }\n return { check: 'a2a_context_continuity', passed: true, description: validation.description };\n}\n\nfunction extractContextIdFromEnvelope(envelope: A2ATaskEnvelope): string | undefined {\n const result = envelope.result;\n if (result == null || typeof result !== 'object' || Array.isArray(result)) return undefined;\n const ctxId = (result as Record<string, unknown>).contextId;\n return typeof ctxId === 'string' && ctxId.length > 0 ? ctxId : undefined;\n}\n\n/**\n * Assert every ref in a source set resolves to a member of a target set.\n *\n * Used by `media_buy_seller` to check that every `format_id` returned on\n * `get_products` products actually resolves to a format in the subsequent\n * `list_creative_formats` response — catches invalid references before\n * `sync_creatives` fails at runtime.\n *\n * `scope` lets the check distinguish refs the agent under test owns\n * (`agent_url` matches) from third-party refs (pointing at a different\n * creative agent). Third-party refs can't be verified without calling\n * that agent's `list_creative_formats`, so `on_out_of_scope` controls\n * whether they pass (`warn` with observations, `ignore` silently) or\n * fail.\n */\nfunction validateRefsResolve(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const source = validation.source;\n const target = validation.target;\n const matchKeys = validation.match_keys;\n\n if (!source || !target || !matchKeys?.length) {\n return {\n check: 'refs_resolve',\n passed: false,\n description: validation.description,\n error: '`source`, `target`, and `match_keys` are all required for refs_resolve.',\n json_pointer: null,\n expected: '{ source, target, match_keys }',\n actual: {\n source: source ?? null,\n target: target ?? null,\n match_keys: matchKeys ?? null,\n },\n };\n }\n\n const sourceRoot = resolveRefsRoot(source.from, ctx);\n const targetRoot = resolveRefsRoot(target.from, ctx);\n const sourceRaw = resolvePathAll(sourceRoot, source.path);\n const targetRaw = resolvePathAll(targetRoot, target.path);\n const sourceRefs = sourceRaw.filter(isRefObject);\n const targetRefs = targetRaw.filter(isRefObject);\n\n const metaObservations: Array<Record<string, unknown>> = [];\n if (sourceRaw.length > 0 && sourceRefs.length === 0) {\n metaObservations.push({ kind: 'non_object_values_filtered', side: 'source', count: sourceRaw.length });\n }\n if (targetRaw.length > 0 && targetRefs.length === 0) {\n metaObservations.push({ kind: 'non_object_values_filtered', side: 'target', count: targetRaw.length });\n }\n\n // adcp-client#712: when the current-step target response carries\n // pagination metadata with more pages available, the target set is\n // incomplete and missing refs may legitimately live on later pages.\n // Surface a meta-observation AND demote unresolved refs to\n // observations so partial-page reads don't false-fail the check.\n // The stricter fix (spec Option A: \"compliance mode returns everything\n // referenced by products\") needs an AdCP spec change — until that\n // lands, the runner must not penalize conformant paginating sellers.\n const targetPaginated = target.from === 'current_step' && hasMorePages(targetRoot);\n if (targetPaginated) {\n metaObservations.push({ kind: 'target_paginated', side: 'target' });\n }\n\n const scope = validation.scope;\n const outOfScopeMode = validation.on_out_of_scope ?? 'warn';\n const scopeEquals = scope ? resolveScopeEquals(scope.equals, scope.key, ctx.agentUrl) : undefined;\n\n const inScope: Array<Record<string, unknown>> = [];\n const outOfScope: Array<Record<string, unknown>> = [];\n\n for (const ref of sourceRefs) {\n if (!scope) {\n inScope.push(ref);\n continue;\n }\n const refValue = ref[scope.key];\n const normalized = normalizeIfUrlKey(refValue, scope.key);\n if (scopeEquals !== undefined && normalized === scopeEquals) {\n inScope.push(ref);\n } else {\n outOfScope.push(ref);\n }\n }\n\n // adcp-client#711: catch the silent-no-op case where a scope filter\n // excludes 100% of source refs. Independent of whether the partition\n // is \"correct\" — if every ref falls out of scope, the check enforces\n // nothing and the grader deserves to see that structural smell.\n // Suppressed under `on_out_of_scope: 'ignore'` because that mode\n // explicitly opts out of scope-related warnings.\n if (scope && outOfScopeMode !== 'ignore' && sourceRefs.length > 0 && inScope.length === 0) {\n metaObservations.push({\n kind: 'scope_excluded_all_refs',\n count: sourceRefs.length,\n scope_key: scope.key,\n });\n }\n\n const unresolved = dedupRefs(\n inScope.filter(s => !targetRefs.some(t => refsMatch(s, t, matchKeys))),\n matchKeys\n );\n\n // When the target was paginated and refs are unresolved, demote those\n // refs from `missing` to `unresolved_with_pagination` observations so a\n // conformant paginating seller passes. The meta-observation still fires.\n const missing = targetPaginated ? [] : unresolved;\n const paginatedUnresolved = targetPaginated ? unresolved : [];\n\n // `fail` mode promotes out-of-scope refs into the missing set so compliance\n // reports name them the same way they name truly broken refs.\n const failOutOfScope = outOfScopeMode === 'fail' ? dedupRefs(outOfScope, matchKeys) : [];\n const allMissing = [...missing, ...failOutOfScope];\n\n const warnObservations =\n outOfScopeMode === 'warn' && outOfScope.length > 0\n ? dedupRefs(outOfScope, matchKeys).map(ref => ({\n kind: 'out_of_scope_ref',\n ref: projectRefForReport(ref, matchKeys),\n }))\n : [];\n const paginatedObservations = paginatedUnresolved.map(ref => ({\n kind: 'unresolved_with_pagination',\n ref: projectRefForReport(ref, matchKeys),\n }));\n\n // adcp-client#718: when target_paginated AND at least one ref is\n // unresolved-with-pagination, emit a neutral structural meta-observation\n // naming the co-occurrence. A seller that unconditionally returns\n // pagination.has_more: true masks unresolved refs via the pagination\n // demotion (#712/#717) and passes refs_resolve cleanly; graders keying\n // on `passed` alone wouldn't see the problem. This gives dashboards an\n // independent signal without changing pass/fail semantics. Becomes\n // redundant when adcp#2601's \"compliance mode returns everything\n // referenced\" rule lands.\n if (targetPaginated && paginatedUnresolved.length > 0) {\n metaObservations.push({\n kind: 'unresolved_hidden_by_pagination',\n unresolved_count: paginatedUnresolved.length,\n });\n }\n\n // Meta-observations precede per-ref observations so the array cap never\n // drops the grader-signal primitives (scope_excluded_all_refs,\n // target_paginated, unresolved_hidden_by_pagination) in favor of\n // redundant out-of-scope entries.\n const observations = capObservations([...metaObservations, ...paginatedObservations, ...warnObservations]);\n\n if (allMissing.length === 0) {\n return {\n check: 'refs_resolve',\n passed: true,\n description: validation.description,\n ...(observations && { observations }),\n };\n }\n\n const preview = allMissing\n .slice(0, 3)\n .map(r => JSON.stringify(projectRefForReport(r, matchKeys)))\n .join(', ');\n const errorMsg =\n allMissing.length > 3\n ? `${allMissing.length} ref(s) did not resolve; first 3: ${preview}`\n : `${allMissing.length} ref(s) did not resolve: ${preview}`;\n\n return {\n check: 'refs_resolve',\n passed: false,\n description: validation.description,\n path: source.path,\n error: errorMsg,\n json_pointer: null,\n expected: `every source ref resolves to a target ref matched on [${matchKeys.join(', ')}]`,\n actual: {\n missing: allMissing.map(r => projectRefForReport(r, matchKeys)),\n ...(failOutOfScope.length > 0 && {\n out_of_scope_failed: failOutOfScope.map(r => projectRefForReport(r, matchKeys)),\n }),\n },\n ...(observations && { observations }),\n };\n}\n\n/**\n * Detect whether the response at `root` advertises additional pages.\n * Accepts the AdCP-standard `pagination.has_more` flag; conservative\n * otherwise (false on non-objects, missing fields, or unparseable shapes).\n */\nfunction hasMorePages(root: unknown): boolean {\n if (!root || typeof root !== 'object' || Array.isArray(root)) return false;\n const pagination = (root as Record<string, unknown>).pagination;\n if (!pagination || typeof pagination !== 'object' || Array.isArray(pagination)) return false;\n return (pagination as Record<string, unknown>).has_more === true;\n}\n\nfunction resolveRefsRoot(from: 'current_step' | 'context', ctx: ValidationContext): unknown {\n if (from === 'context') return ctx.storyboardContext ?? {};\n if (ctx.taskResult) return ctx.taskResult.data;\n if (ctx.httpResult) return ctx.httpResult.body;\n return undefined;\n}\n\nfunction resolveScopeEquals(equals: string, key: string, agentUrl: string): string {\n const raw = equals === '$agent_url' ? agentUrl : equals;\n return key.toLowerCase().endsWith('url') ? canonicalizeAgentUrlForScope(raw) : raw;\n}\n\nfunction normalizeIfUrlKey(value: unknown, key: string): unknown {\n return typeof value === 'string' && key.toLowerCase().endsWith('url') ? canonicalizeAgentUrlForScope(value) : value;\n}\n\nfunction isRefObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction refsMatch(a: Record<string, unknown>, b: Record<string, unknown>, keys: string[]): boolean {\n for (const key of keys) {\n // Own-property only: a storyboard author supplying `match_keys: ['constructor']`\n // must not match every object via prototype chain.\n if (!Object.prototype.hasOwnProperty.call(a, key) || !Object.prototype.hasOwnProperty.call(b, key)) {\n return false;\n }\n const av = a[key];\n const bv = b[key];\n // Missing match-key on either side is NOT a match — agents that omit a\n // key shouldn't fuzzy-match other agents that also happen to omit it.\n if (av === undefined || bv === undefined) return false;\n // URL-ish fields get trailing-slash / case normalization so declared\n // and probed URLs compare equal even when one side includes a trailing\n // \"/\". `format_id` fields are exact-compare.\n const normA = normalizeIfUrlKey(av, key);\n const normB = normalizeIfUrlKey(bv, key);\n if (normA !== normB) return false;\n }\n return true;\n}\n\nfunction projectRef(ref: Record<string, unknown>, keys: string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(ref, key)) out[key] = ref[key];\n }\n return out;\n}\n\n// Observation hygiene caps (adcp-client#714). Compliance reports may be\n// published or forwarded to third parties, so every ref field emitted in\n// observations / actual.missing is length-bounded and URL fields have\n// credentials scrubbed before they leave the runner.\nconst REF_FIELD_MAX_LEN = 512;\nconst MAX_OBSERVATIONS = 50;\n\n/**\n * Projection of a ref intended for grader-visible output (observations,\n * `actual.missing`). Strips userinfo from URL fields, caps string length,\n * and passes non-string values through untouched. Kept distinct from the\n * internal `projectRef` because dedup relies on stable JSON projection —\n * truncating strings would false-collapse refs that differ only in their\n * truncated suffix.\n */\nfunction projectRefForReport(ref: Record<string, unknown>, keys: string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of keys) {\n if (!Object.prototype.hasOwnProperty.call(ref, key)) continue;\n const v = ref[key];\n if (typeof v === 'string') {\n out[key] = sanitizeFieldString(v, key.toLowerCase().endsWith('url'));\n } else {\n out[key] = v;\n }\n }\n return out;\n}\n\n// Regex fallback that scrubs `scheme://user:pass@host` credential shapes\n// in free-text fields — covers cases where `new URL()` can't parse the value\n// (partial URL, extra prose, trailing whitespace) but a user:pass@ substring\n// still leaks credentials to grader reports.\nconst CREDENTIAL_SHAPE_RE = /([a-zA-Z][a-zA-Z0-9+.-]*:\\/\\/)[^/\\s@]+@/g;\n\nfunction sanitizeFieldString(value: string, isUrlField: boolean): string {\n // Truncate first so a multi-MB hostile string doesn't force URL parsing\n // over the whole payload. Truncation uses code points so surrogate pairs\n // aren't cleaved into invalid UTF-16 strings.\n let out = value;\n if (out.length > REF_FIELD_MAX_LEN) {\n out =\n Array.from(out)\n .slice(0, REF_FIELD_MAX_LEN - 1)\n .join('') + '…';\n }\n if (isUrlField) {\n try {\n const u = new URL(out);\n // Reject dangerous schemes in URL-keyed fields: downstream compliance\n // UIs that render `agent_url` as a clickable link otherwise inherit\n // `javascript:` / `data:` / `file:` as a stored-XSS vector.\n if (u.protocol !== 'https:' && u.protocol !== 'http:') {\n return `<non-http scheme: ${u.protocol.replace(/[^a-z+.-]/gi, '')}>`;\n }\n if (u.username || u.password) {\n u.username = '';\n u.password = '';\n out = u.toString();\n }\n } catch {\n // Not a parseable URL — fall through to the regex scrub below.\n }\n }\n // Belt-and-suspenders: strip any remaining `scheme://user:pass@` shapes,\n // whether or not the field is URL-keyed. A hostile agent may plant\n // credential-shaped substrings inside an `id` or a non-URL ref field.\n out = out.replace(CREDENTIAL_SHAPE_RE, '$1');\n return out;\n}\n\nfunction capObservations(observations: Array<Record<string, unknown>>): Array<Record<string, unknown>> | undefined {\n if (observations.length === 0) return undefined;\n if (observations.length <= MAX_OBSERVATIONS) return observations;\n const kept = observations.slice(0, MAX_OBSERVATIONS - 1);\n kept.push({ kind: 'observations_truncated', dropped: observations.length - kept.length });\n return kept;\n}\n\n/**\n * Deduplicate refs by their projected match-key tuple so a single broken\n * reference in a 50-product response doesn't show up 50× in `actual.missing`.\n */\nfunction dedupRefs(refs: Array<Record<string, unknown>>, keys: string[]): Array<Record<string, unknown>> {\n const seen = new Map<string, Record<string, unknown>>();\n for (const ref of refs) {\n const k = JSON.stringify(projectRef(ref, keys));\n if (!seen.has(k)) seen.set(k, ref);\n }\n return Array.from(seen.values());\n}\n\n// ────────────────────────────────────────────────────────────\n// Numeric comparison + cross-step value checks\n//\n// field_less_than (strict <), field_at_most (≤), field_at_least (≥),\n// and field_equals_context (deep-equals) all read their comparand\n// from `ctx.storyboardContext` — the accumulator populated by\n// `context_outputs` rules across step boundaries — and fall back\n// to the literal `value` field when no `context_key` is set. The\n// precedent for context resolution is refs_resolve's\n// `resolveRefsRoot('context', ctx)` path. The three numeric checks\n// share `validateNumericComparison`; field_equals_context has its\n// own path because its operands aren't required to be numeric.\n// Added for adcp#2642 (less_than, equals_context) and\n// adcp-client#1839 (at_most, at_least).\n// ────────────────────────────────────────────────────────────\n\n/**\n * Resolve the comparand for a cross-step check from the storyboard context.\n *\n * Returns `{ found: true, value }` when the context key is set and present,\n * `{ found: false, observation }` when context_key is set but absent (the\n * prior step may have been skipped on a branch-set path — not an error),\n * and `{ found: true, value: validation.value }` when no context_key is\n * given (fall back to literal comparand).\n */\nfunction resolveContextComparand(\n validation: StoryboardValidation,\n ctx: ValidationContext\n): { found: true; value: unknown } | { found: false; observation: string } {\n if (!validation.context_key) {\n return { found: true, value: validation.value };\n }\n if (!ctx.storyboardContext) {\n return {\n found: false,\n observation: `context_key_absent: storyboardContext not available for key \"${validation.context_key}\"`,\n };\n }\n const ctxValue = ctx.storyboardContext[validation.context_key];\n if (!(validation.context_key in ctx.storyboardContext) || ctxValue === undefined) {\n return {\n found: false,\n observation: `context_key_absent: key \"${validation.context_key}\" not found in storyboard context (prior step may have been skipped)`,\n };\n }\n return { found: true, value: ctxValue };\n}\n\ninterface NumericOp {\n /** Check name surfaced in result.check and error prose. */\n check: 'field_less_than' | 'field_greater_than' | 'field_at_most' | 'field_at_least';\n /** Human-readable operator (`<`, `>`, `<=`, `>=`) used in error messages. */\n symbol: string;\n /** Comparator returning true when `actual` satisfies the assertion vs `comparand`. */\n compare: (actual: number, comparand: number) => boolean;\n}\n\nconst NUMERIC_OPS = {\n less_than: { check: 'field_less_than', symbol: '<', compare: (a, c) => a < c },\n greater_than: { check: 'field_greater_than', symbol: '>', compare: (a, c) => a > c },\n at_most: { check: 'field_at_most', symbol: '<=', compare: (a, c) => a <= c },\n at_least: { check: 'field_at_least', symbol: '>=', compare: (a, c) => a >= c },\n} as const satisfies Record<string, NumericOp>;\n\nfunction validateNumericComparison(\n validation: StoryboardValidation,\n ctx: ValidationContext,\n op: NumericOp\n): ValidationResult {\n if (!validation.path) {\n return {\n check: op.check,\n passed: false,\n description: validation.description,\n error: `No path specified for ${op.check} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n const comparandResult = resolveContextComparand(validation, ctx);\n if (!comparandResult.found) {\n return {\n check: op.check,\n passed: true,\n description: validation.description,\n observations: [comparandResult.observation],\n };\n }\n\n const actual = resolvePath(resolveTarget(ctx).data, validation.path);\n const comparand = comparandResult.value;\n const pointer = toJsonPointer(validation.path);\n\n if (actual === undefined || actual === null) {\n return {\n check: op.check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Field not found at path: ${validation.path}`,\n json_pointer: pointer,\n expected: `numeric value ${op.symbol} ${JSON.stringify(comparand)}`,\n actual: null,\n };\n }\n if (typeof actual !== 'number' || !Number.isFinite(actual)) {\n return {\n check: op.check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `${op.check} requires a finite number at path \"${validation.path}\"; got ${typeof actual} ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected: `finite number ${op.symbol} ${JSON.stringify(comparand)}`,\n actual: actual ?? null,\n };\n }\n if (typeof comparand !== 'number' || !Number.isFinite(comparand)) {\n return {\n check: op.check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `${op.check} comparand must be a finite number; got ${typeof comparand} ${JSON.stringify(comparand)}`,\n json_pointer: pointer,\n expected: `finite number (comparand)`,\n actual: actual,\n };\n }\n\n if (op.compare(actual, comparand)) {\n return {\n check: op.check,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: op.check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected ${JSON.stringify(actual)} ${op.symbol} ${JSON.stringify(comparand)}`,\n json_pointer: pointer,\n expected: `${op.symbol} ${JSON.stringify(comparand)}`,\n actual,\n };\n}\n\nfunction validateFieldEqualsContext(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n if (!validation.path) {\n return {\n check: 'field_equals_context',\n passed: false,\n description: validation.description,\n error: 'No path specified for field_equals_context validation',\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n if (!validation.context_key) {\n return {\n check: 'field_equals_context',\n passed: false,\n description: validation.description,\n error: 'field_equals_context requires context_key to be set',\n json_pointer: null,\n expected: 'context_key must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n const comparandResult = resolveContextComparand(validation, ctx);\n if (!comparandResult.found) {\n return {\n check: 'field_equals_context',\n passed: true,\n description: validation.description,\n observations: [comparandResult.observation],\n };\n }\n\n const actual = resolvePath(resolveTarget(ctx).data, validation.path);\n const expected = comparandResult.value;\n const pointer = toJsonPointer(validation.path);\n\n const passed = valuesMatch(actual, expected);\n if (passed) {\n return {\n check: 'field_equals_context',\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: 'field_equals_context',\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected ${JSON.stringify(expected)} (from context[\"${validation.context_key}\"]); got ${JSON.stringify(actual ?? null)}`,\n json_pointer: pointer,\n expected,\n actual: actual ?? null,\n };\n}\n\nfunction validateFieldInContextArray(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n if (!validation.path) {\n return {\n check: 'field_in_context_array',\n passed: false,\n description: validation.description,\n error: 'No path specified for field_in_context_array validation',\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n if (!validation.context_key) {\n return {\n check: 'field_in_context_array',\n passed: false,\n description: validation.description,\n error: 'field_in_context_array requires context_key to be set',\n json_pointer: null,\n expected: 'context_key must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n const comparandResult = resolveContextComparand(validation, ctx);\n if (!comparandResult.found) {\n return {\n check: 'field_in_context_array',\n passed: true,\n description: validation.description,\n observations: [comparandResult.observation],\n };\n }\n\n const allowed = comparandResult.value;\n const actual = resolvePath(resolveTarget(ctx).data, validation.path);\n const pointer = toJsonPointer(validation.path);\n if (!Array.isArray(allowed)) {\n return {\n check: 'field_in_context_array',\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected context[\"${validation.context_key}\"] to be an array; got ${JSON.stringify(allowed)}`,\n json_pointer: pointer,\n expected: 'context value must be an array',\n actual: allowed,\n };\n }\n\n if (allowed.some(candidate => valuesMatch(actual, candidate))) {\n return {\n check: 'field_in_context_array',\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: 'field_in_context_array',\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected ${JSON.stringify(actual ?? null)} to be a member of context[\"${validation.context_key}\"] (${JSON.stringify(allowed)})`,\n json_pointer: pointer,\n expected: allowed,\n actual: actual ?? null,\n };\n}\n\nfunction validateAllFieldsInContextArray(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const check = 'all_fields_in_context_array';\n if (!validation.path) {\n return {\n check,\n passed: false,\n description: validation.description,\n error: `No path specified for ${check} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n if (!validation.context_key) {\n return {\n check,\n passed: false,\n description: validation.description,\n error: `${check} requires context_key to be set`,\n json_pointer: null,\n expected: 'context_key must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n const comparandResult = resolveContextComparand(validation, ctx);\n if (!comparandResult.found) {\n return {\n check,\n passed: true,\n description: validation.description,\n observations: [comparandResult.observation],\n };\n }\n\n const allowed = comparandResult.value;\n const actual = resolvePathAll(resolveTarget(ctx).data, validation.path);\n const pointer = toJsonPointer(validation.path);\n if (!Array.isArray(allowed)) {\n return {\n check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected context[\"${validation.context_key}\"] to be an array; got ${JSON.stringify(allowed)}`,\n json_pointer: pointer,\n expected: 'context value must be an array',\n actual: allowed,\n };\n }\n\n const passed = actual.every(value => allowed.some(candidate => deepEqualJsonValue(value, candidate)));\n if (passed) {\n return {\n check,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected every value at ${validation.path} to be a member of context[\"${validation.context_key}\"]`,\n json_pointer: pointer,\n expected: allowed,\n actual,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// upstream_traffic — anti-façade side-effect assertion\n// ────────────────────────────────────────────────────────────\n\n/**\n * Authored check that asserts side-effects against the adopter's\n * `comply_test_controller`'s `query_upstream_traffic` scenario.\n *\n * Adopters who do not advertise `query_upstream_traffic` in\n * `list_scenarios` opt out — every `upstream_traffic` validation grades\n * `not_applicable`. Adopters who advertise it but return zero recorded\n * calls in the assertion window grade `failed` (the façade signal).\n *\n * The runner pre-fetches the controller's response per\n * `since_timestamp` window and stashes it on `ctx.upstreamTraffic` so\n * this synchronous dispatcher can grade without itself making controller\n * calls. Per runner-output-contract.yaml v2.0.0, `request` / `response`\n * on the validation_result point to the CONTROLLER call, not the\n * storyboard step's AdCP request.\n */\nfunction validateUpstreamTraffic(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const expected = buildUpstreamTrafficExpected(validation);\n const invalidIdentifierPaths = collectInvalidIdentifierPaths(validation.identifier_paths);\n if (invalidIdentifierPaths.length > 0) {\n return {\n check: 'upstream_traffic',\n passed: false,\n description: validation.description,\n error:\n 'storyboard authoring error: invalid upstream_traffic.identifier_paths: ' +\n invalidIdentifierPaths.map(issue => `${issue.path} (${issue.reason})`).join('; '),\n json_pointer: null,\n expected,\n actual: {\n matched_count: 0,\n total_calls: 0,\n missing_payload_paths: [],\n missing_identifier_values: [],\n invalid_identifier_paths: invalidIdentifierPaths,\n },\n schema_id: null,\n schema_url: null,\n };\n }\n\n const upstream = ctx.upstreamTraffic;\n // Adopter opted out (or controller wasn't detected): grade not_applicable.\n // missing_test_controller controller-side, not failed — opt-in by adopter\n // capability per the spec.\n if (!upstream || !upstream.advertised) {\n return {\n check: 'upstream_traffic',\n passed: true,\n not_applicable: true,\n description: validation.description,\n note: 'adopter did not advertise query_upstream_traffic in list_scenarios — graded as not_applicable',\n json_pointer: null,\n expected,\n actual: null,\n schema_id: null,\n schema_url: null,\n };\n }\n\n // A `since: prior_step_id` reference that didn't resolve to any recorded\n // prior step is a storyboard authoring bug — fail loudly rather than\n // silently widen to this step's window (which would let misspelled refs\n // pass vacuously).\n if (validation.since && upstream.unresolvedSinceRefs?.has(validation.since)) {\n return {\n check: 'upstream_traffic',\n passed: false,\n description: validation.description,\n error: `since: \"${validation.since}\" did not resolve to any prior step's recorded request timestamp.`,\n json_pointer: null,\n expected,\n actual: null,\n schema_id: null,\n schema_url: null,\n };\n }\n\n const sinceKey = upstream.priorStepSinceMap?.get(validation.since ?? '') ?? upstream.thisStepSince;\n const query = upstream.queries.get(sinceKey);\n if (!query) {\n return {\n check: 'upstream_traffic',\n passed: false,\n description: validation.description,\n error: `Runner did not pre-fetch query_upstream_traffic for since_timestamp=${sinceKey}.`,\n json_pointer: null,\n expected,\n actual: null,\n schema_id: null,\n schema_url: null,\n };\n }\n\n // Controller call itself errored (transport or controller-side fault).\n // Surface the error rather than treating an empty result as \"no traffic\".\n // Truncate the agent-controlled error string to match the runner's\n // `MAX_ERROR_LENGTH` posture on every other validation_result.error.\n if (!('success' in query.payload) || query.payload.success !== true) {\n const errMsg = 'error' in query.payload ? query.payload.error : 'controller returned a non-success response';\n if ('error_kind' in query.payload && query.payload.error_kind === 'jcs_non_finite') {\n return {\n check: 'upstream_traffic',\n passed: true,\n not_applicable: true,\n description: validation.description,\n note: 'digest attestation could not canonicalize a non-finite JSON number - graded not_applicable',\n json_pointer: null,\n expected,\n actual: { matched_count: 0, total_calls: 0, missing_payload_paths: [], missing_identifier_values: [] },\n schema_id: null,\n schema_url: null,\n request: query.request,\n response: query.response,\n };\n }\n return {\n check: 'upstream_traffic',\n passed: false,\n description: validation.description,\n error: truncateValidationError(`query_upstream_traffic failed: ${errMsg}`),\n json_pointer: null,\n expected,\n actual: { matched_count: 0, total_calls: 0, missing_payload_paths: [], missing_identifier_values: [] },\n schema_id: null,\n schema_url: null,\n request: query.request,\n response: query.response,\n };\n }\n\n const all = query.payload.recorded_calls ?? [];\n const totalCalls = all.length;\n const matched = filterByEndpointPattern(all, validation.endpoint_pattern);\n const matchedCount = matched.length;\n const minCount = validation.min_count ?? 1;\n\n // payload_must_contain results bucket two ways: paths that no matched\n // call satisfied despite inspectable raw JSON evidence (failure), and\n // paths with no portable payload evidence to inspect (`not_applicable`).\n // Any actionable raw JSON miss keeps the validation failed; otherwise any\n // not_applicable path downgrades the validation from pass to not_applicable.\n const missingPayloadPaths: string[] = [];\n const notApplicablePaths: string[] = [];\n if (validation.payload_must_contain && validation.payload_must_contain.length > 0) {\n for (const spec of validation.payload_must_contain) {\n const result = anyMatchedCallSatisfies(matched, spec);\n if (result.satisfied) continue;\n if (result.not_applicable) {\n notApplicablePaths.push(spec.path);\n } else {\n missingPayloadPaths.push(spec.path);\n }\n }\n }\n\n // identifier_paths: extract every value at each declared path against the\n // storyboard's sample_request (author-controlled vectors), then assert each\n // resolved value appears at any depth in some matched call's payload. Spec\n // is explicit: ALL resolved values must be present — single-placeholder\n // fabrication is the threat. Replaces the earlier `buyer_identifier_echo`\n // boolean shorthand per spec PR adcp#3816.\n const missingIdentifierValues: unknown[] = [];\n const notApplicableIdentifierValues: unknown[] = [];\n if (validation.identifier_paths && validation.identifier_paths.length > 0) {\n const requestPayload = ctx.request?.payload;\n const sample =\n requestPayload && typeof requestPayload === 'object' && !Array.isArray(requestPayload)\n ? (requestPayload as Record<string, unknown>)\n : ctx.storyboardStep?.sample_request;\n for (const path of validation.identifier_paths) {\n const vectors = sample !== undefined ? resolvePortableIdentifierPathAll(sample, path) : [];\n for (const vector of vectors) {\n if (vector === undefined || vector === null) continue;\n const digest = typeof vector === 'string' ? upstream.identifierDigestByValue?.get(vector) : undefined;\n const result = anyMatchedCallEchoesValue(matched, vector, digest);\n if (result.satisfied) continue;\n if (result.not_applicable) {\n notApplicableIdentifierValues.push(vector);\n } else {\n missingIdentifierValues.push(vector);\n }\n }\n }\n }\n\n const hasRawIntrospectionAssertions =\n (validation.payload_must_contain?.length ?? 0) > 0 || (validation.identifier_paths?.length ?? 0) > 0;\n const rawRequiredDigestDowngrade =\n validation.attestation_mode_required === 'raw' &&\n hasRawIntrospectionAssertions &&\n matched.length > 0 &&\n matched.every(call => call.attestation_mode === 'digest');\n\n if (rawRequiredDigestDowngrade) {\n missingPayloadPaths.length = 0;\n missingIdentifierValues.length = 0;\n }\n\n const countOk = minCount === 0 ? matchedCount === 0 : matchedCount >= minCount;\n const payloadOk = missingPayloadPaths.length === 0;\n const echoOk = missingIdentifierValues.length === 0;\n const passed = countOk && (rawRequiredDigestDowngrade || (payloadOk && echoOk));\n\n // Per spec: a payload_must_contain assertion whose only available evidence\n // is not portable to inspect grades not_applicable. When any required path\n // lands in that bucket (and count + echo passed with no actionable payload\n // misses), the whole validation grades not_applicable rather than passed.\n const anyPayloadNotApplicable =\n (validation.payload_must_contain?.length ?? 0) > 0 &&\n notApplicablePaths.length > 0 &&\n missingPayloadPaths.length === 0;\n const hasMeaningfulPayloadPass =\n (validation.payload_must_contain?.length ?? 0) > 0 && payloadOk && !anyPayloadNotApplicable;\n const allIdentifiersNotApplicable =\n (validation.identifier_paths?.length ?? 0) > 0 &&\n missingIdentifierValues.length === 0 &&\n notApplicableIdentifierValues.length > 0;\n const not_applicable =\n passed &&\n countOk &&\n (rawRequiredDigestDowngrade ||\n anyPayloadNotApplicable ||\n (allIdentifiersNotApplicable && !hasMeaningfulPayloadPass));\n\n const actual = {\n matched_count: matchedCount,\n total_calls: totalCalls,\n missing_payload_paths: missingPayloadPaths,\n missing_identifier_values: missingIdentifierValues,\n not_applicable_payload_paths: notApplicablePaths,\n not_applicable_identifier_values: notApplicableIdentifierValues,\n ...(upstream.identifierDigestLimitExceeded && {\n identifier_digest_limit_exceeded: upstream.identifierDigestLimitExceeded,\n }),\n };\n\n // RFC 6901 pointer: when one specific call's payload failed\n // payload_must_contain, point at that call's payload; null when the\n // failure is a count mismatch or no specific call is implicated.\n let jsonPointer: string | null = null;\n if (!payloadOk && matched.length > 0) {\n const actionableMiss = matched.find(\n call => call.attestation_mode === 'raw' && isJsonContentType(call.content_type)\n );\n const idx = all.indexOf(actionableMiss ?? matched[0]!);\n if (idx >= 0) jsonPointer = `/recorded_calls/${idx}/payload`;\n }\n\n if (passed) {\n return {\n check: 'upstream_traffic',\n passed: true,\n ...(not_applicable && { not_applicable: true }),\n ...(not_applicable && {\n note: rawRequiredDigestDowngrade\n ? `attestation_mode_required: raw but controller returned digest attestations — graded not_applicable`\n : allIdentifiersNotApplicable\n ? upstream.identifierDigestLimitExceeded\n ? `identifier_paths exceeded the runner digest buffer; recorder buffer capped at ${upstream.identifierDigestLimitExceeded.limit} unique digests with ${upstream.identifierDigestLimitExceeded.clipped} overflow value(s) clipped — graded not_applicable`\n : `identifier_paths only matched digest attestations without portable proofs — graded not_applicable`\n : `payload_must_contain paths could not be fully inspected in raw JSON attestations — graded not_applicable`,\n }),\n description: validation.description,\n json_pointer: null,\n expected,\n actual,\n schema_id: null,\n schema_url: null,\n };\n }\n\n const errParts: string[] = [];\n if (!countOk) {\n errParts.push(\n minCount === 0\n ? `expected zero matching call(s); observed ${matchedCount}`\n : `expected at least ${minCount} matching call(s); observed ${matchedCount}`\n );\n }\n if (!payloadOk) errParts.push(`missing payload paths: ${missingPayloadPaths.join(', ')}`);\n if (!echoOk)\n errParts.push(`identifier values not echoed: ${missingIdentifierValues.map(v => JSON.stringify(v)).join(', ')}`);\n\n return {\n check: 'upstream_traffic',\n passed: false,\n description: validation.description,\n error: errParts.join('; '),\n json_pointer: jsonPointer,\n expected,\n actual,\n schema_id: null,\n schema_url: null,\n request: query.request,\n response: query.response,\n };\n}\n\nfunction collectInvalidIdentifierPaths(paths: string[] | undefined): PortableIdentifierPathIssue[] {\n const invalid: PortableIdentifierPathIssue[] = [];\n for (const path of paths ?? []) {\n const reason = validatePortableIdentifierPath(path);\n if (reason) invalid.push({ path, reason });\n }\n return invalid;\n}\n\n/**\n * Cap on agent / controller-controlled error strings inlined into a\n * `validation_result.error` field. Mirrors the runner's `MAX_ERROR_LENGTH`\n * posture so a hostile or buggy controller can't bloat the compliance\n * report (or LLM context window) by returning a megabyte error message.\n */\nconst VALIDATION_ERROR_MAX_LENGTH = 2000;\n\nfunction truncateValidationError(s: string): string {\n return s.length > VALIDATION_ERROR_MAX_LENGTH ? s.slice(0, VALIDATION_ERROR_MAX_LENGTH) + '...[truncated]' : s;\n}\n\nfunction buildUpstreamTrafficExpected(validation: StoryboardValidation): Record<string, unknown> {\n const expected: Record<string, unknown> = {};\n if (validation.min_count !== undefined) expected.min_count = validation.min_count;\n else expected.min_count = 1;\n if (validation.endpoint_pattern !== undefined) expected.endpoint_pattern = validation.endpoint_pattern;\n if (validation.payload_must_contain !== undefined) expected.payload_must_contain = validation.payload_must_contain;\n if (validation.attestation_mode_required !== undefined) {\n expected.attestation_mode_required = validation.attestation_mode_required;\n }\n if (validation.preferred_attestation_mode !== undefined) {\n expected.preferred_attestation_mode = validation.preferred_attestation_mode;\n }\n if (validation.identifier_paths !== undefined) expected.identifier_paths = validation.identifier_paths;\n return expected;\n}\n\n/**\n * Filter `recorded_calls` by an `endpoint_pattern` glob. The pattern is\n * matched against `recorded_calls[].endpoint` (`<METHOD> <URL>`). `*`\n * expands to any-character-run; other regex metacharacters are escaped\n * literally. Returns the input unchanged when no pattern is set.\n */\nfunction filterByEndpointPattern(calls: RecordedCall[], pattern: string | undefined): RecordedCall[] {\n if (!pattern) return calls;\n const re = globToRegExp(pattern);\n return calls.filter(c => re.test(c.endpoint));\n}\n\n/**\n * Returns whether at least one matched call's payload satisfies the\n * `payload_must_contain` predicate, plus a flag indicating the assertion\n * graded `not_applicable` (no matched call had a JSON payload to inspect).\n *\n * Per spec PRs adcp#3816 (initial JSONPath restriction) and adcp#3987\n * (closes the substring-fallback ambiguity #3845):\n *\n * - JSONPath path-based matching is valid ONLY when `content_type` is\n * `application/json` or `*\\/*+json` (RFC 6839 §3.1 structured-syntax\n * suffix).\n * - Non-JSON calls + ANY match mode (`present` / `equals` /\n * `contains_any`): grade `not_applicable`. Earlier sketches downgraded\n * `match: present` to a terminal-key substring search of the raw\n * payload — that heuristic created false positives (a payload\n * mentioning the key name in any context — URL fragment, comment,\n * unrelated metadata field — would pass), exactly the kind of\n * loophole the anti-façade contract exists to close. Storyboards\n * needing a non-JSON value-carried signal use `identifier_paths`\n * instead — substring-searches storyboard-supplied VALUES (not\n * path-derived strings), encoding-agnostic, no false-positive\n * surface.\n *\n * Path syntax is dotted-with-`[*]` only; RFC 9535 descendant operator\n * (`$..foo`) is explicitly NOT supported per the storyboard-schema patch.\n */\nfunction anyMatchedCallSatisfies(\n calls: RecordedCall[],\n spec: UpstreamTrafficPayloadMatch\n): { satisfied: boolean; not_applicable: boolean } {\n let sawApplicableCall = false;\n for (const call of calls) {\n if (call.attestation_mode !== 'raw') {\n continue;\n }\n const isJson = isJsonContentType(call.content_type);\n // All match modes require a structured-JSON payload — non-JSON calls\n // don't contribute regardless of mode (adcp#3987).\n if (!isJson) {\n continue;\n }\n sawApplicableCall = true;\n const candidates = resolveJsonPathLite(call.payload, spec.path);\n if (candidates.length === 0) continue;\n if (spec.match === 'present') {\n return { satisfied: true, not_applicable: false };\n } else if (spec.match === 'equals') {\n if (candidates.some(v => deepEqual(v, spec.value))) return { satisfied: true, not_applicable: false };\n } else if (spec.match === 'contains_any') {\n const allowed = spec.allowed_values ?? [];\n if (candidates.some(v => allowed.some(a => deepEqual(v, a)))) return { satisfied: true, not_applicable: false };\n }\n }\n return { satisfied: false, not_applicable: !sawApplicableCall };\n}\n\n/**\n * JSONPath-lite resolver — dotted-with-`[*]` form only, per spec PR\n * adcp#3816's pin to `parsePathWithWildcards` semantics. RFC 9535\n * descendant operator (`$..foo`) is explicitly NOT supported. A leading\n * `$.` / `$` prefix is tolerated and stripped; the canonical form authors\n * are encouraged to write is the bare positional path.\n */\nfunction resolveJsonPathLite(root: unknown, path: string): unknown[] {\n if (!path) return [];\n let p = path.trim();\n if (p.startsWith('$.')) p = p.slice(2);\n else if (p.startsWith('$')) p = p.slice(1);\n if (p.startsWith('.')) p = p.slice(1);\n return walkLitePath(root, p);\n}\n\n/**\n * Cap on the number of terminal values JSONPath-lite emission can produce\n * across all wildcard fan-out, defending the runner against a hostile\n * `recorded_calls[].payload` shaped to maximize fan-out. Mirrors the\n * existing `RESOLVE_PATH_ALL_MAX` cap in path.ts.\n */\nconst JSONPATH_LITE_MAX_RESULTS = 10_000;\n\nfunction walkLitePath(root: unknown, path: string): unknown[] {\n if (path === '') return root === undefined ? [] : [root];\n // Split on `.` but keep `[*]` and `[N]` attached to their keys.\n const tokens = path.split(/(?=\\.)|(?<=\\])/g).filter(Boolean);\n let frontier: unknown[] = [root];\n for (const rawToken of tokens) {\n const token = rawToken.startsWith('.') ? rawToken.slice(1) : rawToken;\n const next: unknown[] = [];\n for (const cur of frontier) {\n if (next.length >= JSONPATH_LITE_MAX_RESULTS) break;\n if (cur === undefined || cur === null) continue;\n if (token === '[*]') {\n if (Array.isArray(cur)) next.push(...cur);\n } else if (/^\\[\\d+\\]$/.test(token)) {\n const idx = parseInt(token.slice(1, -1), 10);\n if (Array.isArray(cur)) next.push(cur[idx]);\n } else if (token.includes('[*]')) {\n const [key, ...rest] = token.split('[*]');\n const keyVal = key && typeof cur === 'object' && cur !== null ? (cur as Record<string, unknown>)[key] : cur;\n if (Array.isArray(keyVal)) {\n const tail = rest.join('[*]');\n if (tail === '') next.push(...keyVal);\n else next.push(...keyVal.flatMap(v => walkLitePath(v, tail)));\n }\n } else if (typeof cur === 'object' && cur !== null) {\n next.push((cur as Record<string, unknown>)[token]);\n }\n }\n frontier = next.slice(0, JSONPATH_LITE_MAX_RESULTS).filter(v => v !== undefined);\n }\n return frontier;\n}\n\n/**\n * Depth cap for any-depth value containment check. Defends the runner\n * against a hostile `recorded_calls[].payload` shaped as a 100k-deep\n * nested object that would blow the recursion stack.\n */\nconst CONTAINS_VALUE_MAX_DEPTH = 256;\n\nfunction anyMatchedCallEchoesValue(\n calls: RecordedCall[],\n value: unknown,\n valueDigest?: string\n): { satisfied: boolean; not_applicable: boolean } {\n let sawApplicableCall = false;\n for (const call of calls) {\n if (call.attestation_mode === 'digest') {\n if (!isJsonContentType(call.content_type)) continue;\n if (!valueDigest) continue;\n sawApplicableCall = true;\n if (call.identifier_match_proofs?.some(proof => proof.identifier_value_sha256 === valueDigest && proof.found)) {\n return { satisfied: true, not_applicable: false };\n }\n continue;\n }\n\n sawApplicableCall = true;\n // Non-JSON payloads land as raw strings — substring-match the\n // stringified vector. Defensible best-effort downgrade per the spec's\n // non-JSON fallback note.\n if (typeof call.payload === 'string') {\n if (typeof value === 'string' && call.payload.includes(value)) {\n return { satisfied: true, not_applicable: false };\n }\n continue;\n }\n if (containsValueAnyDepth(call.payload, value, 0)) return { satisfied: true, not_applicable: false };\n }\n return { satisfied: false, not_applicable: !sawApplicableCall };\n}\n\nfunction containsValueAnyDepth(root: unknown, target: unknown, depth: number): boolean {\n if (depth > CONTAINS_VALUE_MAX_DEPTH) return false;\n if (deepEqual(root, target)) return true;\n if (Array.isArray(root)) {\n for (const item of root) if (containsValueAnyDepth(item, target, depth + 1)) return true;\n return false;\n }\n if (root !== null && typeof root === 'object') {\n for (const v of Object.values(root as Record<string, unknown>)) {\n if (containsValueAnyDepth(v, target, depth + 1)) return true;\n }\n }\n return false;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null || typeof a !== typeof b) return false;\n if (typeof a !== 'object') return false;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== (b as unknown[]).length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], (b as unknown[])[i])) return false;\n }\n return true;\n }\n if (Array.isArray(b)) return false;\n const ao = a as Record<string, unknown>;\n const bo = b as Record<string, unknown>;\n const ak = Object.keys(ao);\n const bk = Object.keys(bo);\n if (ak.length !== bk.length) return false;\n for (const k of ak) {\n if (!Object.prototype.hasOwnProperty.call(bo, k)) return false;\n if (!deepEqual(ao[k], bo[k])) return false;\n }\n return true;\n}\n\n/**\n * Cross-response: every resolved dispatch carries the same value at `path`.\n * Spec: test-kits/parallel-dispatch-runner.yaml (rule 9 / first-insert-wins).\n *\n * Grading rules:\n * - `ctx.crossResponses` absent → not_applicable (single-dispatch step).\n * - Fewer than 2 dispatches resolved → fail (the assertion requires a\n * cross-response comparison; one survivor doesn't prove the seller\n * deterministically resolved the race).\n * - All resolved values equal → pass.\n * - Any disagreement → fail; the result lists the distinct values observed\n * so reviewers can spot the duplicate-resource case at a glance.\n */\nfunction validateCrossResponseFieldEqual(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const cr = ctx.crossResponses;\n const path = validation.path ?? '';\n if (!cr) {\n return {\n check: validation.check,\n passed: true,\n not_applicable: true,\n description: validation.description,\n note: 'step has no parallel_dispatch fan-out; cross-response checks grade not_applicable on single-dispatch steps',\n json_pointer: toJsonPointer(path),\n };\n }\n if (cr.resolved.length < 2) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n expected: 'at least 2 resolved dispatches with equal values at the path',\n actual: `${cr.resolved.length} dispatch(es) resolved out of ${cr.dispatches.length}`,\n schema_id: null,\n schema_url: null,\n };\n }\n const values = cr.resolved.map(tr => resolvePath(tr.data as Record<string, unknown> | undefined, path));\n const first = values[0];\n const allEqual = values.every(v => deepEqual(v, first));\n if (allEqual) {\n return {\n check: validation.check,\n passed: true,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n actual: first,\n };\n }\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n expected: 'all resolved dispatches return the same value at the path',\n actual: values,\n schema_id: null,\n schema_url: null,\n };\n}\n\nfunction validateReplayNotCachedRateLimit(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const payload = resolveTarget(ctx).data as Record<string, unknown> | undefined;\n const tripResponse = payload?.trip_response;\n const replayResponse = payload?.replay_response;\n const targetTask = typeof payload?.target_task === 'string' ? payload.target_task : undefined;\n if (!tripResponse || typeof tripResponse !== 'object' || !replayResponse || typeof replayResponse !== 'object') {\n const missing = [\n !tripResponse || typeof tripResponse !== 'object' ? 'trip_response' : undefined,\n !replayResponse || typeof replayResponse !== 'object' ? 'replay_response' : undefined,\n ].filter((field): field is string => typeof field === 'string');\n return {\n check: validation.check,\n passed: true,\n not_applicable: true,\n description: validation.description,\n note: `step did not produce rate_limit_trip_runner ${missing.join(' and ')}; replay_not_cached_rate_limit grades not_applicable`,\n json_pointer: null,\n };\n }\n\n const tripCode = extractSnapshotErrorCode(tripResponse as Record<string, unknown>, targetTask);\n const replayCode = extractSnapshotErrorCode(replayResponse as Record<string, unknown>, targetTask);\n if (tripCode !== 'RATE_LIMITED') {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: '/trip_response/error/code',\n expected: 'RATE_LIMITED trip_response error code',\n actual: tripCode ?? null,\n schema_id: null,\n schema_url: null,\n };\n }\n if (replayCode === 'RATE_LIMITED') {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: 'rate_limit_response_cached_as_replay',\n json_pointer: '/replay_response/error/code',\n expected: 'replay_response must not return RATE_LIMITED from the idempotency cache',\n actual: replayCode,\n schema_id: null,\n schema_url: null,\n };\n }\n return {\n check: validation.check,\n passed: true,\n description: validation.description,\n json_pointer: '/replay_response/error/code',\n actual: replayCode ?? null,\n };\n}\n\nfunction extractSnapshotErrorCode(snapshot: Record<string, unknown>, taskName?: string): string | undefined {\n const structuredError = snapshot.error;\n if (structuredError && typeof structuredError === 'object') {\n const code = (structuredError as Record<string, unknown>).code;\n if (typeof code === 'string') return code;\n }\n const adcpError = snapshot.adcp_error;\n if (adcpError && typeof adcpError === 'object') {\n const code = (adcpError as Record<string, unknown>).code;\n if (typeof code === 'string') return code;\n }\n const data = snapshot.data;\n if (data && typeof data === 'object') {\n const extracted = extractTaskAdcpError({ success: snapshot.success === true, data }, taskName);\n if (extracted) return extracted.code;\n }\n return undefined;\n}\n\n/**\n * Cross-response: the cardinality of distinct values at `path` across all\n * resolved dispatches is in `allowed_values`. Spec:\n * test-kits/parallel-dispatch-runner.yaml.\n *\n * Grading rules:\n * - `ctx.crossResponses` absent → not_applicable.\n * - No dispatch resolved → fail.\n * - `allowed_values` missing or non-array → fail (authoring error).\n * - Distinct count ∈ allowed_values → pass.\n * - Otherwise → fail.\n */\nfunction validateCrossResponseCountDistinct(\n validation: StoryboardValidation,\n ctx: ValidationContext\n): ValidationResult {\n const cr = ctx.crossResponses;\n const path = validation.path ?? '';\n if (!cr) {\n return {\n check: validation.check,\n passed: true,\n not_applicable: true,\n description: validation.description,\n note: 'step has no parallel_dispatch fan-out; cross-response checks grade not_applicable on single-dispatch steps',\n json_pointer: toJsonPointer(path),\n };\n }\n if (!Array.isArray(validation.allowed_values) || validation.allowed_values.length === 0) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n expected: 'allowed_values: [<integer>, ...] declaring acceptable distinct counts',\n actual: validation.allowed_values,\n schema_id: null,\n schema_url: null,\n };\n }\n if (cr.resolved.length === 0) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n expected: 'at least one resolved dispatch',\n actual: `0 / ${cr.dispatches.length} dispatches resolved`,\n schema_id: null,\n schema_url: null,\n };\n }\n const distinct = new Set<string>();\n for (const tr of cr.resolved) {\n const v = resolvePath(tr.data as Record<string, unknown> | undefined, path);\n if (v === undefined || v === null) continue;\n distinct.add(JSON.stringify(v));\n }\n const distinctCount = distinct.size;\n const allowed = validation.allowed_values as number[];\n if (allowed.includes(distinctCount)) {\n return {\n check: validation.check,\n passed: true,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n actual: distinctCount,\n };\n }\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n expected: `distinct count ∈ ${JSON.stringify(allowed)}`,\n actual: distinctCount,\n schema_id: null,\n schema_url: null,\n };\n}\n\n// resolvePath re-exported from ./path for backwards compat\nexport { resolvePath } from './path';\n"],"mappings":"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","names":["passed","resolvePath"]}
1
+ {"version":3,"sources":["../../../../src/lib/testing/storyboard/validations.ts"],"sourcesContent":["/**\n * Per-step validation engine for storyboard testing.\n *\n * Emits validation results conforming to the runner-output contract:\n * failed validations carry RFC 6901 `json_pointer`, machine-readable\n * `expected`/`actual`, and for `response_schema` checks the `schema_id`\n * plus resolvable `schema_url`. See\n * `static/compliance/source/universal/runner-output-contract.yaml`.\n */\n\nimport { prepareResponseForSchemaValidation, TOOL_RESPONSE_SCHEMAS } from '../../utils/response-schemas';\nimport { injectLegacyEnvelopeStatus } from '../../utils/envelope-status-compat';\nimport { TRANSPORT_SUFFIX_REGEX } from '../../utils/a2a-discovery';\nimport { validateResponse, type ValidationIssue } from '../../validation/schema-validator';\nimport { hasSchemaBundle, isExternalSchemaRootActive } from '../../validation/schema-loader';\nimport { ADCP_VERSION, LIBRARY_VERSION } from '../../version';\nimport { isPre31AdcpVersion } from '../../utils/adcp-version-config';\nimport { gte as semverGte, valid as validSemver } from 'semver';\nimport type { TaskResult } from '../types';\nimport type {\n A2ATaskEnvelope,\n HttpProbeResult,\n RunnerRequestRecord,\n RunnerResponseRecord,\n SchemaValidationError,\n StoryboardContext,\n StoryboardValidation,\n StrictValidationVerdict,\n UpstreamTrafficPayloadMatch,\n ValidationResult,\n} from './types';\nimport type { RecordedCall, UpstreamTrafficSuccess } from '../test-controller';\nimport { isJsonContentType } from '../test-controller';\nimport { globToRegExp } from '../../utils/glob';\nimport {\n resolvePath,\n resolvePathAll,\n resolvePortableIdentifierPathAll,\n toJsonPointer,\n validatePortableIdentifierPath,\n type PortableIdentifierPathIssue,\n} from './path';\nimport { detectShapeDriftHints } from './shape-drift-hints';\nimport { PROBE_TASK_ALLOWLIST } from './test-kit';\nimport { validateCanonicalFormatSatisfaction } from './canonical-format-satisfaction';\nimport { extractTaskAdcpError } from './rate-limit-trip';\nimport type { OAuthMetadataGraphGrade } from './oauth-metadata-graph';\nimport { normalizeOAuthResourceForComparison, redactOAuthUrlForOutput } from './oauth-metadata-graph';\n\n/**\n * Broader validation context that carries the run-level state a single\n * validation might need: the task result (for MCP tools), the HTTP probe\n * result (for raw tasks), the agent URL (for cross-cutting checks like\n * `resource_equals_agent_url`), and the accumulated contribution flags.\n */\nexport interface ValidationContext {\n taskName: string;\n /** AdCP schema bundle to use for strict AJV validation. */\n adcpVersion?: string;\n /** Server-declared AdCP version to use for response-shape compatibility decisions. */\n responseAdcpVersion?: string;\n /** Make a strict AJV response-schema rejection fail the validation. */\n strictResponseSchemaValidation?: boolean;\n taskResult?: TaskResult;\n httpResult?: HttpProbeResult;\n agentUrl: string;\n contributions: Set<string>;\n /**\n * Storyboard-declared response schema reference, e.g.\n * `\"protocol/get-adcp-capabilities-response.json\"`. When present the\n * runner emits schema_id / schema_url conforming to the contract.\n */\n responseSchemaRef?: string;\n /** Exact request the runner sent — echoed on failed validations. */\n request?: RunnerRequestRecord;\n /** Exact response observed — echoed on failed validations. */\n response?: RunnerResponseRecord;\n /**\n * Accumulated storyboard context from prior steps. Exposed to cross-step\n * checks (`refs_resolve`) that need to reference values extracted earlier\n * in the run. Single-step checks ignore it.\n */\n storyboardContext?: StoryboardContext;\n /**\n * Captured A2A wire shape — populated by the runner when the protocol\n * is `a2a` and the SDK fetch was wrapped with `withRawResponseCapture`.\n * `a2a_submitted_artifact` and other wire-shape checks read this to\n * assert on the JSON-RPC envelope; non-A2A runs leave it undefined and\n * those checks self-skip with `not_applicable`.\n */\n a2aEnvelope?: A2ATaskEnvelope;\n /**\n * Most recent A2A envelope captured by a PRIOR step in the same run.\n * Cross-step checks (`a2a_context_continuity`) read this to compare\n * the current step's `Task.contextId` against the prior step's\n * `Task.contextId` — A2A 0.3.0 mandates the server echo the\n * client-supplied `contextId` on follow-up sends. Absent on the\n * first A2A step in a run, on non-A2A runs, and when no prior step\n * captured an envelope (e.g. all priors were probe steps).\n */\n priorA2aEnvelope?: A2ATaskEnvelope;\n /**\n * Step id of the prior step whose A2A envelope `priorA2aEnvelope`\n * came from. Used by cross-step diagnostics to point operators at\n * the exact prior step the continuity assertion is comparing\n * against.\n */\n priorA2aStepId?: string;\n /**\n * Pre-fetched data for `upstream_traffic` validations. Populated by the\n * runner before validations fire so the dispatcher stays synchronous.\n * Keyed by `since_timestamp` so the runner can de-dupe identical\n * windows across multiple validations on the same step. Absent when\n * the step has no `upstream_traffic` validations. The `advertised`\n * field is the controller's `list_scenarios` capability flag — when\n * false, every `upstream_traffic` validation grades not_applicable.\n * Per runner-output-contract.yaml v2.0.0, the missing-controller path\n * is opt-in by adopter, not a conformance failure.\n */\n upstreamTraffic?: UpstreamTrafficValidationContext;\n /**\n * Storyboard step (raw YAML) — legacy fallback for direct validation\n * callers. The runner's resolved `request.payload` is preferred for\n * `upstream_traffic.identifier_paths` so context/generated tokens compare\n * against values actually sent on the wire.\n */\n storyboardStep?: { sample_request?: Record<string, unknown> };\n /**\n * Resolved set of dispatch outcomes for a `parallel_dispatch` step.\n * Populated only when the runner fanned out N concurrent requests through\n * the `parallel_dispatch_runner` contract. `cross_response_field_equal`\n * and `cross_response_count_distinct` read this to grade against the\n * cross-response set; single-dispatch steps leave it undefined and those\n * two checks grade `not_applicable`.\n */\n crossResponses?: CrossResponseSet;\n /** Async-prefetched result consumed by the oauth_metadata_graph check. */\n oauthMetadataGraph?: OAuthMetadataGraphGrade;\n}\n\n/**\n * Aggregated cross-response data for `cross_response_*` validations on a\n * `parallel_dispatch` step. Carries per-dispatch outcomes plus a derived\n * `resolved` list of `TaskResult`s for paths that succeeded (after any\n * in-flight retry resolution). The cross-response checks operate against\n * `resolved`; per-response checks operate against the individual entries\n * via the dispatcher's aggregation pass.\n */\nexport interface CrossResponseSet {\n /** Every dispatch's terminal outcome, in fan-out order. */\n dispatches: CrossResponseDispatch[];\n /** Resolved task results for dispatches that terminated successfully. */\n resolved: TaskResult[];\n}\n\n/**\n * One dispatch's terminal record after any in-flight retry loop.\n */\nexport interface CrossResponseDispatch {\n /** Per-dispatch correlation_id the runner attached. Excluded from the canonical hash. */\n correlation_id: string;\n /** Terminal task result, when the dispatch resolved within the barrier window. */\n taskResult?: TaskResult;\n /** Terminal error string, when the dispatch failed at the wire layer. */\n error?: string;\n /** True when the barrier window expired before the dispatch terminated. */\n timed_out?: boolean;\n /** Per-dispatch wall-clock duration in milliseconds. */\n duration_ms: number;\n}\n\n/**\n * Pre-fetched controller traffic data the runner stashes on the validation\n * context so the synchronous dispatcher can grade `upstream_traffic`\n * checks without making controller calls itself.\n */\nexport interface UpstreamTrafficValidationContext {\n /** Whether the controller advertises `query_upstream_traffic` in `list_scenarios`. */\n advertised: boolean;\n /**\n * Pre-fetched controller responses keyed by ISO `since_timestamp`. Each\n * entry carries the request the runner issued, the response observed,\n * and the parsed payload (or an error string when the call failed).\n */\n queries: Map<string, UpstreamTrafficQueryResult>;\n /**\n * The ISO timestamp the runner used as the default `since_timestamp`\n * for THIS step (the step's own request start). Validations that don't\n * declare `since: prior_step_id` use this key into `queries`.\n */\n thisStepSince: string;\n /**\n * Resolved ISO timestamps for `since: prior_step_id` references. The\n * runner pre-resolves these so the validation can index `queries` by\n * the same timestamp. Absent when the validation has no `since:`\n * declaration or the named prior step did not record a timestamp.\n */\n priorStepSinceMap?: Map<string, string>;\n /**\n * `since:` step IDs declared by storyboard validations that did not\n * resolve to any recorded prior step. Surfaced as a typed failure on\n * the validation result rather than silently widened to the current\n * step's window — a misspelled reference would otherwise pass vacuously\n * (the contract treats unresolved references as authoring bugs).\n */\n unresolvedSinceRefs?: Set<string>;\n /**\n * SHA-256 digests the runner sent as `identifier_value_digests`, keyed by\n * plaintext identifier values resolved from the step request. Used to pair\n * digest-mode `identifier_match_proofs` back to storyboard vectors.\n */\n identifierDigestByValue?: Map<string, string>;\n /**\n * Set when the runner clipped identifier digest requests to its bounded\n * buffer. Overflow vectors cannot be proven in digest mode and are reported\n * as not_applicable rather than missing.\n */\n identifierDigestLimitExceeded?: { limit: number; clipped: number };\n}\n\nexport interface UpstreamTrafficQueryResult {\n request: RunnerRequestRecord;\n response: RunnerResponseRecord;\n /** Successful payload from the controller, or an error placeholder when the call failed. */\n payload: UpstreamTrafficSuccess | { error: string; error_kind?: string };\n}\n\n/**\n * Run all validations for a storyboard step.\n */\nexport function runValidations(validations: StoryboardValidation[], context: ValidationContext): ValidationResult[] {\n return validations.map(v => decorateValidationResult(runValidation(v, context), context, v));\n}\n\n/** Capability semver emitted in run summaries and used for advisory expiry. */\nexport const RUNNER_CAPABILITY_VERSION = LIBRARY_VERSION;\n\n/** True when a failed validation contributes to the owning step's grade. */\nexport function validationFailsStep(result: ValidationResult): boolean {\n return !result.passed && result.severity !== 'advisory';\n}\n\n/**\n * Attach request / response records to a failed validation so implementors\n * see the exact bytes the runner sent and observed. Passed validations stay\n * minimal — carrying the full payload on every passing check bloats the\n * JSON surface without diagnostic value.\n */\nexport function decorateValidationResult(\n result: ValidationResult,\n context: ValidationContext,\n validation: StoryboardValidation\n): ValidationResult {\n const declaredSeverity = validation.severity ?? 'required';\n const expiry = validation.expires_after_version;\n const shouldEvaluatePromotion = !result.not_applicable && declaredSeverity === 'advisory' && expiry !== undefined;\n if (shouldEvaluatePromotion && validSemver(expiry) === null) {\n throw new Error(`expires_after_version must be valid semver; received ${JSON.stringify(expiry)}`);\n }\n const promotionApplied =\n shouldEvaluatePromotion &&\n validSemver(RUNNER_CAPABILITY_VERSION) !== null &&\n semverGte(RUNNER_CAPABILITY_VERSION, expiry);\n const augmented: ValidationResult = {\n ...result,\n ...(validation.id !== undefined && { id: validation.id }),\n severity: promotionApplied ? 'required' : declaredSeverity,\n ...(shouldEvaluatePromotion && { severity_promoted_from_advisory: promotionApplied }),\n };\n if (augmented.passed) return augmented;\n if (context.request && augmented.request === undefined) augmented.request = context.request;\n if (context.response && augmented.response === undefined) augmented.response = context.response;\n return augmented;\n}\n\nfunction runValidation(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n switch (validation.check) {\n case 'response_schema':\n return requireTaskResult(ctx, validation, tr => validateResponseSchema(validation, ctx, tr));\n case 'field_present':\n // field_present runs against either MCP task result data OR an HTTP probe body —\n // the storyboard's probe_protected_resource validates fields in the RFC 9728 JSON.\n return validateFieldPresent(validation, resolveTarget(ctx));\n case 'field_absent':\n return validateFieldAbsent(validation, resolveTarget(ctx));\n case 'envelope_field_present':\n // Envelope-scoped variants — runtime semantics identical to the\n // un-prefixed checks (TaskResult exposes envelope fields like\n // `status`, `task_id` and version-envelope fields like `adcp_version`\n // at the surface level). The distinct check types exist primarily so\n // static drift detection can walk the envelope schemas instead of the\n // per-tool response. See adcp#3429 and adcp#5195.\n return validateFieldPresent(validation, resolveTarget(ctx));\n case 'envelope_field_absent':\n return validateFieldAbsent(validation, resolveTarget(ctx));\n case 'envelope_field_value':\n return validateFieldValue(validation, resolveTarget(ctx));\n case 'envelope_field_value_or_absent':\n return validateFieldValueOrAbsent(validation, resolveTarget(ctx));\n case 'envelope_field_pattern':\n return validateFieldPattern(validation, resolveTarget(ctx));\n case 'field_value':\n return validateFieldValue(validation, resolveTarget(ctx));\n case 'field_value_or_absent':\n return validateFieldValueOrAbsent(validation, resolveTarget(ctx));\n case 'field_pattern':\n return validateFieldPattern(validation, resolveTarget(ctx));\n case 'field_contains':\n return validateFieldContains(validation, resolveTarget(ctx));\n case 'status_code':\n return requireTaskResult(ctx, validation, tr => validateStatusCode(validation, tr));\n case 'error_code':\n return requireTaskResult(ctx, validation, tr => validateErrorCode(validation, tr));\n case 'http_status':\n return requireHttpResult(ctx, validation, hr => validateHttpStatus(validation, hr));\n case 'http_status_in':\n return requireHttpResult(ctx, validation, hr => validateHttpStatusIn(validation, hr));\n case 'on_401_require_header':\n return requireHttpResult(ctx, validation, hr => validateOn401RequireHeader(validation, hr));\n case 'resource_equals_agent_url':\n return requireHttpResult(ctx, validation, hr => validateResourceEqualsAgentUrl(validation, hr, ctx.agentUrl));\n case 'oauth_metadata_graph':\n return validateOAuthMetadataGraph(validation, ctx.oauthMetadataGraph);\n case 'any_of':\n return validateAnyOf(validation, ctx.contributions);\n case 'a2a_submitted_artifact':\n return validateA2ASubmittedArtifact(validation, ctx);\n case 'a2a_context_continuity':\n return validateA2AContextContinuity(validation, ctx);\n case 'refs_resolve':\n return validateRefsResolve(validation, ctx);\n case 'field_less_than':\n return validateNumericComparison(validation, ctx, NUMERIC_OPS.less_than);\n case 'field_greater_than':\n return validateNumericComparison(validation, ctx, NUMERIC_OPS.greater_than);\n case 'field_at_most':\n return validateNumericComparison(validation, ctx, NUMERIC_OPS.at_most);\n case 'field_at_least':\n return validateNumericComparison(validation, ctx, NUMERIC_OPS.at_least);\n case 'field_equals_context':\n return validateFieldEqualsContext(validation, ctx);\n case 'field_in_context_array':\n return validateFieldInContextArray(validation, ctx);\n case 'all_fields_in_context_array':\n return validateAllFieldsInContextArray(validation, ctx);\n case 'upstream_traffic':\n return validateUpstreamTraffic(validation, ctx);\n case 'replay_not_cached_rate_limit':\n return validateReplayNotCachedRateLimit(validation, ctx);\n case 'cross_response_field_equal':\n return validateCrossResponseFieldEqual(validation, ctx);\n case 'cross_response_count_distinct':\n return validateCrossResponseCountDistinct(validation, ctx);\n case 'canonical_format_satisfaction':\n if (ctx.taskName !== 'create_media_buy') {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: 'canonical_format_satisfaction applies only to create_media_buy storyboard steps',\n json_pointer: null,\n expected: 'create_media_buy',\n actual: ctx.taskName,\n };\n }\n return requireTaskResult(ctx, validation, tr =>\n validateCanonicalFormatSatisfaction(validation, ctx.request, ctx.storyboardContext, tr)\n );\n case 'array_length':\n return validateArrayLength(validation, resolveTarget(ctx));\n default:\n // Forward compatibility is resolved before advisory expiry promotion:\n // an older runner cannot grade a check it does not implement, so the\n // result is not_applicable rather than evidence about the agent. This\n // is the runtime forward-compat default defined by\n // runner-output-contract.yaml (adcontextprotocol/adcp#3816); publish-time\n // lint separately rejects unknown check kinds in authored storyboards.\n return {\n check: validation.check,\n passed: true,\n description: validation.description,\n not_applicable: true,\n note: `runner does not implement authored check type '${validation.check}'`,\n };\n }\n}\n\nfunction requireTaskResult(\n ctx: ValidationContext,\n validation: StoryboardValidation,\n fn: (tr: TaskResult) => ValidationResult\n): ValidationResult {\n if (!ctx.taskResult) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: `Validation \"${validation.check}\" requires an MCP task result but this step was an HTTP probe.`,\n json_pointer: null,\n };\n }\n return fn(ctx.taskResult);\n}\n\nfunction requireHttpResult(\n ctx: ValidationContext,\n validation: StoryboardValidation,\n fn: (hr: HttpProbeResult) => ValidationResult\n): ValidationResult {\n if (!ctx.httpResult) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: `Validation \"${validation.check}\" requires an HTTP probe result but this step was an MCP task.`,\n json_pointer: null,\n };\n }\n return fn(ctx.httpResult);\n}\n\n/**\n * Resolve the object path-style validations should walk. Prefers the MCP\n * task result's `data` and falls back to the HTTP probe body, so the same\n * `field_present` / `field_value` validations work for both MCP tool steps\n * and raw RFC 9728 / RFC 8414 metadata probes.\n */\nfunction resolveTarget(ctx: ValidationContext): TaskResult {\n if (ctx.taskResult) return ctx.taskResult;\n if (ctx.httpResult) return { success: !ctx.httpResult.error, data: ctx.httpResult.body };\n return { success: false, data: undefined };\n}\n\n// ────────────────────────────────────────────────────────────\n// Schema URL resolution\n// ────────────────────────────────────────────────────────────\n\nconst SCHEMA_URL_BASE = 'https://adcontextprotocol.org';\n\n/**\n * Build a `{ schema_id, schema_url }` pair from a storyboard-declared\n * `response_schema_ref`. The id follows the `/schemas/<version>/<path>.json`\n * convention used by `$id` in cached JSON schemas; the url dereferences\n * against the public docs origin so implementors can fetch it.\n */\nfunction resolveSchemaIdentity(\n schemaRef: string | undefined,\n adcpVersion: string = ADCP_VERSION\n): { schema_id: string | null; schema_url: string | null } {\n if (!schemaRef) return { schema_id: null, schema_url: null };\n const trimmed = schemaRef.replace(/^\\/+/, '');\n const schemaId = `/schemas/${adcpVersion}/${trimmed}`;\n const schemaUrl = `${SCHEMA_URL_BASE}${schemaId}`;\n return { schema_id: schemaId, schema_url: schemaUrl };\n}\n\n/**\n * Convert a Zod error into the AJV-shaped `SchemaValidationError[]` the\n * contract calls for. Each issue names the failing instance path, the\n * schema keyword that rejected it (best-effort from Zod's `code`), and\n * the original message.\n */\n/**\n * Escape a single Zod path segment as an RFC 6901 reference token: `~` → `~0`\n * (done first), then `/` → `~1`. Numeric segments pass through as-is.\n */\nfunction escapeJsonPointerSegment(seg: PropertyKey): string {\n return String(seg).replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n\nfunction zodIssuePathToJsonPointer(path: ReadonlyArray<PropertyKey>): string {\n return '/' + path.map(escapeJsonPointerSegment).join('/');\n}\n\nfunction zodIssuesToSchemaErrors(\n issues: ReadonlyArray<{ path: ReadonlyArray<PropertyKey>; code: string; message: string }>\n): SchemaValidationError[] {\n return issues.map(issue => {\n const keyword = mapZodIssueToSchemaKeyword(issue);\n const instancePointer = issue.path.map(escapeJsonPointerSegment).join('/');\n return {\n instance_path: '/' + instancePointer,\n // Zod does not expose the schema-side pointer. Approximate AJV's\n // `schema_path` (a JSON pointer into the schema) as\n // `#/properties/<path>/<keyword>` so implementors can locate the\n // rejecting keyword inside their schema.\n schema_path: `#/properties/${instancePointer}/${keyword}`,\n keyword,\n message: issue.message,\n };\n });\n}\n\n/**\n * Map a Zod issue to the JSON Schema keyword that failed. Critically,\n * `invalid_type` with `received: 'undefined'` is a missing required field\n * (keyword `required`), not a type mismatch (keyword `type`). The two cases\n * call for different remediation — \"set the field\" vs. \"fix the value /\n * change the type\" — so the evaluator must distinguish them.\n */\nfunction mapZodIssueToSchemaKeyword(issue: { code: string; message: string }): string {\n if (issue.code === 'invalid_type' && /received `?undefined`?/i.test(issue.message)) {\n return 'required';\n }\n switch (issue.code) {\n case 'invalid_type':\n return 'type';\n case 'invalid_value':\n return 'enum';\n case 'too_small':\n return 'minimum';\n case 'too_big':\n return 'maximum';\n case 'invalid_format':\n return 'format';\n case 'unrecognized_keys':\n return 'additionalProperties';\n case 'invalid_union':\n return 'oneOf';\n case 'not_multiple_of':\n return 'multipleOf';\n default:\n return issue.code;\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// response_schema: validate against the active schema authority\n// ────────────────────────────────────────────────────────────\n\nfunction validateResponseSchema(\n validation: StoryboardValidation,\n ctx: ValidationContext,\n taskResult: TaskResult\n): ValidationResult {\n const taskName = ctx.taskName;\n const schemaIdentityVersion = ctx.adcpVersion ?? ctx.responseAdcpVersion ?? ADCP_VERSION;\n const { schema_id, schema_url } = resolveSchemaIdentity(ctx.responseSchemaRef, schemaIdentityVersion);\n\n // Keep the raw payload separately from the object-form one below so the\n // shape-drift detector can recognize bare-array responses (a common drift\n // pattern for list tools). Strip _message when it's a top-level property —\n // bare arrays don't carry that field.\n const rawData: unknown = taskResult.data ?? {};\n const dataWithoutMessage = Array.isArray(rawData)\n ? rawData\n : (() => {\n const { _message, ...rest } = rawData as Record<string, unknown>;\n return rest;\n })();\n const schema = TOOL_RESPONSE_SCHEMAS[taskName];\n // Evaluate the packaged validator for diagnostics even when an external\n // bundle is authoritative. Its result must never gate that run, but it lets\n // strict-summary consumers distinguish an actual strict/lenient delta from\n // a response that both schema sources reject.\n const dataForValidation = Array.isArray(dataWithoutMessage)\n ? dataWithoutMessage\n : injectLegacyEnvelopeStatus(dataWithoutMessage as Record<string, unknown>, { toolName: taskName });\n const responseAdcpVersion = ctx.responseAdcpVersion ?? ctx.adcpVersion;\n const parseResult = schema?.safeParse(\n prepareResponseForSchemaValidation(taskName, dataForValidation, responseAdcpVersion)\n );\n const computedStrict = computeStrictVerdict(taskName, dataWithoutMessage, ctx.adcpVersion, ctx.responseAdcpVersion);\n const strict = computedStrict ? { ...computedStrict, lenient_valid: parseResult?.success ?? null } : undefined;\n const externalSchemaIsAuthoritative = isExternalResponseSchemaAuthoritative(ctx);\n\n // An explicit schemaRoot represents current source that may be newer than\n // this SDK package's generated Zod snapshot. In that mode the external JSON\n // Schema bundle is the source of truth for both known tools and tools added\n // by the external build.\n if (externalSchemaIsAuthoritative) {\n if (!strict) {\n return noResponseSchemaResult(validation, taskName, schema_id, schema_url);\n }\n if (strict.valid) {\n const base: ValidationResult = {\n check: 'response_schema',\n passed: true,\n description: validation.description,\n schema_id,\n schema_url,\n strict,\n };\n const warning = buildStrictWarning(strict);\n return warning ? { ...base, warning } : base;\n }\n\n const issues = strict.issues ?? [];\n const firstIssue = issues[0];\n return {\n check: 'response_schema',\n passed: false,\n description: validation.description,\n error:\n issues.length > 0\n ? issues\n .slice(0, 5)\n .map(issue => `${issue.instance_path || '/'}: ${issue.message}`)\n .join('; ')\n : `External JSON Schema rejected the ${taskName} response`,\n json_pointer: firstIssue?.instance_path || null,\n expected: schema_id ?? `response schema for ${taskName}`,\n actual: issues,\n schema_id,\n schema_url,\n strict,\n };\n }\n\n if (!schema) {\n return noResponseSchemaResult(validation, taskName, schema_id, schema_url, strict);\n }\n // `schema` is present, so optional chaining above necessarily produced a\n // packaged verdict.\n if (!parseResult) return noResponseSchemaResult(validation, taskName, schema_id, schema_url, strict);\n\n // Strict (AJV) verdict runs alongside the lenient Zod check. Storyboard runs\n // grade that verdict by default; direct validation callers and explicit\n // migration runs can leave it informational. Explicit external bundles take\n // the authoritative branch above instead.\n\n // Shape-drift no longer rides on `ValidationResult.warning` — issue #935\n // moved that diagnostic to `StoryboardStepResult.hints[]` as a structured\n // `ShapeDriftHint`. The runner emits the structured hint via\n // `detectShapeDriftHints` directly; this layer focuses on the strict /\n // variant-fallback signal that doesn't yet have a hint kind.\n\n if (parseResult.success) {\n const base: ValidationResult = {\n check: 'response_schema',\n passed: true,\n description: validation.description,\n schema_id,\n schema_url,\n };\n if (strict && !strict.valid && ctx.strictResponseSchemaValidation === true) {\n const issues = strict.issues ?? [];\n const firstIssue = issues[0];\n return {\n ...base,\n passed: false,\n error:\n issues.length > 0\n ? issues\n .slice(0, 5)\n .map(issue => `${issue.instance_path || '/'}: ${issue.message}`)\n .join('; ')\n : `Strict JSON Schema rejected the ${taskName} response`,\n json_pointer: firstIssue?.instance_path || null,\n expected: schema_id ?? `response schema for ${taskName}`,\n actual: issues,\n strict,\n };\n }\n // Surface strict-only / variant-fallback signal via `warning` so step-\n // level output (and LLM-driven self-correction that scans `error`/\n // `warning` fields) sees something without flipping `passed`.\n const warning = strict ? buildStrictWarning(strict) : undefined;\n if (!strict && !warning) return base;\n if (!strict) return { ...base, warning };\n return warning ? { ...base, strict, warning } : { ...base, strict };\n }\n\n const schemaErrors = zodIssuesToSchemaErrors(parseResult.error.issues);\n const firstIssue = parseResult.error.issues[0];\n const jsonPointer = firstIssue ? zodIssuePathToJsonPointer(firstIssue.path) : null;\n const issues = parseResult.error.issues\n .slice(0, 5)\n .map(i => `${i.path.join('.')}: ${i.message}`)\n .join('; ');\n\n const failed: ValidationResult = {\n check: 'response_schema',\n passed: false,\n description: validation.description,\n error: issues,\n json_pointer: jsonPointer,\n expected: schema_id ?? `response schema for ${taskName}`,\n actual: schemaErrors,\n schema_id,\n schema_url,\n };\n return strict ? { ...failed, strict } : failed;\n}\n\n/** @internal Shared with the storyboard runner's Zod-rejection recovery path. */\nexport function isExternalResponseSchemaAuthoritative(\n ctx: Pick<ValidationContext, 'adcpVersion' | 'responseAdcpVersion'>\n): boolean {\n const validationVersion = responseSchemaValidationVersion(ctx.adcpVersion, ctx.responseAdcpVersion);\n return validationVersion !== undefined && isExternalSchemaRootActive(validationVersion);\n}\n\nfunction responseSchemaValidationVersion(\n adcpVersion: string | undefined,\n responseAdcpVersion: string | undefined\n): string | undefined {\n // An explicit external root belongs to the caller-selected protocol source\n // and must win over a packaged stable wire alias advertised by the server.\n // The server version still feeds compatibility preparation separately.\n if (adcpVersion && isExternalSchemaRootActive(adcpVersion)) return adcpVersion;\n return responseAdcpVersion && hasSchemaBundle(responseAdcpVersion) ? responseAdcpVersion : adcpVersion;\n}\n\nfunction noResponseSchemaResult(\n validation: StoryboardValidation,\n taskName: string,\n schema_id: string | null,\n schema_url: string | null,\n strict?: StrictValidationVerdict\n): ValidationResult {\n const result: ValidationResult = {\n check: 'response_schema',\n passed: false,\n description: validation.description,\n error: `No schema registered for task \"${taskName}\"`,\n json_pointer: null,\n expected: schema_id ?? `response schema for ${taskName}`,\n // The runner failed before observing the agent — distinguish that from\n // \"agent returned null\" so implementors don't chase a phantom agent bug.\n actual: { reason: 'no_schema_registered', task: taskName },\n schema_id,\n schema_url,\n };\n return strict ? { ...result, strict } : result;\n}\n\n/**\n * Run the strict AJV validator for `taskName` against the response payload.\n * Returns undefined when no AJV schema is available (the client can't\n * observe a strictness delta for tools whose JSON-schema doesn't ship with\n * the SDK — notably the brand-rights and governance schemas that live\n * outside the `bundled/` tree the loader walks today).\n */\nfunction computeStrictVerdict(\n taskName: string,\n payload: unknown,\n adcpVersion?: string,\n responseAdcpVersion?: string\n): StrictValidationVerdict | undefined {\n const externalVersionSelected = adcpVersion !== undefined && isExternalSchemaRootActive(adcpVersion);\n const validationVersion = responseSchemaValidationVersion(adcpVersion, responseAdcpVersion);\n if (\n !externalVersionSelected &&\n responseAdcpVersion &&\n isPre31AdcpVersion(responseAdcpVersion) &&\n !hasSchemaBundle(responseAdcpVersion)\n ) {\n return undefined;\n }\n const payloadForValidation = prepareResponseForSchemaValidation(taskName, payload, responseAdcpVersion);\n const outcome = validateResponse(taskName, payloadForValidation, validationVersion);\n // `variant: 'skipped'` means no AJV validator compiled for this task (no\n // strictness signal to emit); treat the same as \"no AJV schema available\".\n if (outcome.variant === 'skipped') return undefined;\n const fallbackFields: Pick<StrictValidationVerdict, 'variant_fallback_applied' | 'requested_variant'> =\n outcome.variant_fallback_applied\n ? { variant_fallback_applied: true, requested_variant: outcome.requested_variant }\n : {};\n if (outcome.valid) {\n return { valid: true, variant: outcome.variant, ...fallbackFields };\n }\n return {\n valid: false,\n variant: outcome.variant,\n issues: outcome.issues.slice(0, 10).map(ajvIssueToSchemaError),\n ...fallbackFields,\n };\n}\n\nfunction ajvIssueToSchemaError(issue: ValidationIssue): SchemaValidationError {\n return {\n instance_path: issue.pointer,\n schema_path: issue.schemaPath,\n keyword: issue.keyword,\n message: issue.message,\n };\n}\n\n/**\n * Render the strict verdict into a non-fatal warning for step-level\n * output. Two cases produce signal (both preserve `passed`):\n * - Strict-only failure: Zod accepted, AJV rejected. Top AJV issue.\n * - Variant fallback: agent advertised an async variant without a\n * compiled schema; validation fell back to sync. Conformance gap\n * worth flagging even when AJV ultimately accepted.\n * When both apply, both are joined. Returns undefined when neither\n * applies (strict accepted and no fallback).\n */\nfunction buildStrictWarning(strict: StrictValidationVerdict): string | undefined {\n const parts: string[] = [];\n if (strict.variant_fallback_applied && strict.requested_variant) {\n parts.push(\n `agent advertised status=\"${strict.requested_variant}\" but the tool has no schema for that variant — validated against sync fallback`\n );\n }\n if (!strict.valid && strict.issues && strict.issues.length > 0) {\n // Group `required` keyword issues under their parent path so sellers see\n // \"missing properties at /x: a, b, c\" in one pass instead of one missing\n // field per storyboard run. This is the single biggest onramp cliff for\n // sellers filling out response schemas with N required fields —\n // previously they iterated N times, learning one required field per run.\n const requiredIssues = strict.issues.filter(i => i.keyword === 'required');\n const otherIssues = strict.issues.filter(i => i.keyword !== 'required');\n if (requiredIssues.length > 0) {\n const grouped = new Map<string, string[]>();\n for (const issue of requiredIssues) {\n const at = issue.instance_path || '/';\n // AJV's `required`-issue message format: `must have required property '<name>'`.\n const match = issue.message.match(/required property ['\"]([^'\"]+)['\"]/);\n const field = match?.[1] ?? issue.message;\n const list = grouped.get(at) ?? [];\n list.push(field);\n grouped.set(at, list);\n }\n for (const [at, fields] of grouped) {\n parts.push(`strict JSON-schema missing required at ${at}: ${fields.join(', ')}`);\n }\n }\n const MAX_OTHER = 5;\n const shown = otherIssues.slice(0, MAX_OTHER);\n const remaining = otherIssues.length - shown.length;\n for (const issue of shown) {\n const pointer = issue.instance_path || '/';\n parts.push(`strict JSON-schema rejected ${pointer}: ${issue.message}`);\n }\n if (remaining > 0) {\n parts.push(`(+${remaining} more AJV issue${remaining === 1 ? '' : 's'})`);\n }\n }\n return parts.length > 0 ? parts.join('; ') : undefined;\n}\n\n/**\n * Recognize common payload-shape mistakes and return the human-readable\n * fix-recipe — `string` form retained for direct unit-test callers and\n * for any external consumer that imported the shim before issue #935\n * moved the canonical detector to `shape-drift-hints.ts`. Both forms\n * reuse the same detection logic; this shim returns `hints[0]?.message`.\n *\n * Covers four shape-inversion patterns observed in real integrations:\n * - `build_creative` returning platform-native fields at the top level\n * (scope3 agentic-adapters#100 — `tag_url`, `creative_id`, `media_type`)\n * - `sync_creatives` returning a single creative's inner shape bubbled\n * up without the `creatives` array wrapper, OR the wrong wrapper key\n * (`{ results: [...] }` instead of `{ creatives: [...] }`)\n * - `preview_creative` returning raw render fields (`preview_url`,\n * `preview_html`) at the top level without the `previews[].renders[]`\n * nesting and `response_type` discriminator\n * - List tools (`list_creatives`, `list_creative_formats`, `list_accounts`,\n * `get_products`, `get_media_buys`, `get_signals`, `list_property_lists`,\n * `list_collection_lists`, `list_content_standards`) returning a bare\n * array at the top level instead of the `{ <key>: [...] }` envelope\n *\n * Run-path callers should consume the structured hint via the runner's\n * `step.hints[]` surface (issue #935) — the structured fields drive\n * per-case fix plans without re-parsing the message.\n *\n * @param taskName — tool name (snake_case) the storyboard dispatched under\n * @param payload — raw response payload. `unknown` rather than\n * `Record<string, unknown>` so bare-array payloads are recognizable at\n * the top level.\n */\nexport function detectShapeDriftHint(taskName: string, payload: unknown): string | undefined {\n return detectShapeDriftHints(taskName, payload)[0]?.message;\n}\n\nexport { LIST_WRAPPER_TOOLS } from './shape-drift-hints';\n\n// ────────────────────────────────────────────────────────────\n// field_present: check a path exists\n// ────────────────────────────────────────────────────────────\n\nfunction validateFieldPresent(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n // `check` is either `field_present` or `envelope_field_present` (adcp#3429);\n // both share runtime semantics, but the result echoes the storyboard's\n // choice verbatim so reporters can distinguish.\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n const wildcardError = rejectWildcardScalarPath(validation, checkName);\n if (wildcardError) return wildcardError;\n\n const value = resolvePath(taskResult.data, validation.path);\n const present = value !== undefined && value !== null;\n const pointer = toJsonPointer(validation.path);\n\n if (present) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Field not found at path: ${validation.path}`,\n json_pointer: pointer,\n expected: validation.path,\n actual: value ?? null,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// field_absent / envelope_field_absent: check a path does NOT exist\n//\n// Pass when the field is absent (undefined or null). Fail when the field\n// is present with any value. The `envelope_field_absent` variant carries\n// the same runtime semantics but signals to the drift detector that the\n// path lives on the v3 envelope schema rather than the per-tool response.\n// Added per adcp#3429 alongside the `envelope_field_present` family.\n// ────────────────────────────────────────────────────────────\n\nfunction validateFieldAbsent(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n const wildcardError = rejectWildcardScalarPath(validation, checkName);\n if (wildcardError) return wildcardError;\n\n const value = resolvePath(taskResult.data, validation.path);\n const absent = value === undefined || value === null;\n const pointer = toJsonPointer(validation.path);\n\n if (absent) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Field found at path: ${validation.path} (expected absent)`,\n json_pointer: pointer,\n expected: null,\n actual: value,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// field_value: check a path equals expected value\n// ────────────────────────────────────────────────────────────\n\nfunction valuesMatch(actual: unknown, expected: unknown): boolean {\n if (typeof actual === 'object' && actual !== null) {\n return deepEqualJsonValue(actual, expected);\n }\n return actual === expected;\n}\n\n/**\n * JSON deep equality for `field_value`-family checks: object member order is\n * NOT significant (RFC 8259 section 4), array element order IS, scalars are\n * strict. Mirrors the sibling implementations in `webhook-receiver.ts` and\n * `canonical-format-satisfaction.ts`. Previously this was a\n * `JSON.stringify(a) === JSON.stringify(b)` comparison, which false-negatived\n * content-equal objects whose members serialize in a different order (e.g. a\n * format_id `{id, agent_url}` echoed by the agent as `{agent_url, id}`) —\n * adcp-client#2327.\n */\nfunction deepEqualJsonValue(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (typeof a !== 'object') return false;\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b)) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqualJsonValue(a[i], b[i])) return false;\n }\n return true;\n }\n const keysA = Object.keys(a as Record<string, unknown>);\n const keysB = Object.keys(b as Record<string, unknown>);\n if (keysA.length !== keysB.length) return false;\n for (const k of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, k)) return false;\n if (!deepEqualJsonValue((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k])) return false;\n }\n return true;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Matching used by `field_contains`.\n *\n * Scalar expectations keep exact equality, while object/array expectations are\n * treated as deep subsets. This lets a storyboard assert the keyed parts of an\n * unordered response entry such as:\n *\n * path: products[0].allowed_actions[]\n * value: { action: \"extend_flight\", modes: [\"requires_approval\"] }\n *\n * without requiring the seller to omit additional optional fields or keep a\n * fixed array order.\n */\nfunction containsValueMatches(actual: unknown, expected: unknown): boolean {\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) return false;\n if (expected.length === 0) return actual.length === 0;\n const used = new Set<number>();\n return expected.every(expectedItem => {\n const matchIndex = actual.findIndex(\n (actualItem, index) => !used.has(index) && containsValueMatches(actualItem, expectedItem)\n );\n if (matchIndex === -1) return false;\n used.add(matchIndex);\n return true;\n });\n }\n\n if (isRecord(expected)) {\n if (!isRecord(actual)) return false;\n return Object.entries(expected).every(\n ([key, expectedValue]) =>\n Object.prototype.hasOwnProperty.call(actual, key) && containsValueMatches(actual[key], expectedValue)\n );\n }\n\n return valuesMatch(actual, expected);\n}\n\nfunction pathUsesWildcardSyntax(path: string): boolean {\n return /\\[(?:\\*|)\\]/.test(path);\n}\n\nfunction rejectWildcardScalarPath(validation: StoryboardValidation, checkName: string): ValidationResult | undefined {\n if (!validation.path || !pathUsesWildcardSyntax(validation.path)) return undefined;\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `${checkName} does not support wildcard path syntax (${validation.path}); use field_contains for array wildcard membership checks`,\n json_pointer: toJsonPointer(validation.path),\n expected: 'path without [] or [*] wildcard syntax',\n actual: validation.path,\n };\n}\n\nfunction validateFieldValue(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n // `check` is either `field_value` or `envelope_field_value` (adcp#3429);\n // result echoes the storyboard's choice so reporters can distinguish.\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n const wildcardError = rejectWildcardScalarPath(validation, checkName);\n if (wildcardError) return wildcardError;\n\n const actual = resolvePath(taskResult.data, validation.path);\n const pointer = toJsonPointer(validation.path);\n\n // allowed_values: pass if actual matches any value in the list\n if (validation.allowed_values?.length) {\n const passed = validation.allowed_values.some(v => valuesMatch(actual, v));\n if (passed) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected one of ${JSON.stringify(validation.allowed_values)}, got ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected: validation.allowed_values,\n actual: actual ?? null,\n };\n }\n\n // Exact match against value\n const passed = valuesMatch(actual, validation.value);\n\n if (passed) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected ${JSON.stringify(validation.value)}, got ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected: validation.value,\n actual: actual ?? null,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// field_value_or_absent: envelope-tolerant variant of field_value\n//\n// Pass when the field is absent OR present-and-matching. Fail only when the\n// field is present with a disallowed value. Lets a storyboard keep positive\n// coverage on a spec-optional field without penalizing agents that omit it.\n// Spec: adcontextprotocol/adcp #3013 envelope `replayed` semantics.\n// ────────────────────────────────────────────────────────────\n\nfunction validateFieldValueOrAbsent(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n // `check` is either `field_value_or_absent` or `envelope_field_value_or_absent`\n // (adcp#3429); result echoes the storyboard's choice verbatim.\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n const wildcardError = rejectWildcardScalarPath(validation, checkName);\n if (wildcardError) return wildcardError;\n\n const rawActual = resolvePath(taskResult.data, validation.path);\n const pointer = toJsonPointer(validation.path);\n const actual =\n validation.check === 'field_value_or_absent' &&\n validation.path === 'status' &&\n rawActual !== undefined &&\n isTaskEnvelopeStatus(rawActual) &&\n resolvePath(taskResult.data, 'media_buy_status') !== undefined\n ? undefined\n : rawActual;\n\n // Absent → pass. The check only fires when the field is present.\n if (actual === undefined) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n\n // Present → fall through to the same value / allowed_values semantics as field_value.\n if (validation.allowed_values?.length) {\n const passed = validation.allowed_values.some(v => valuesMatch(actual, v));\n if (passed) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected absent or one of ${JSON.stringify(validation.allowed_values)}, got ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected: validation.allowed_values,\n actual,\n };\n }\n\n const passed = valuesMatch(actual, validation.value);\n if (passed) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected absent or ${JSON.stringify(validation.value)}, got ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected: validation.value,\n actual,\n };\n}\n\nconst TASK_ENVELOPE_STATUSES = new Set([\n 'submitted',\n 'working',\n 'input-required',\n 'completed',\n 'canceled',\n 'failed',\n 'rejected',\n 'auth-required',\n 'unknown',\n]);\n\nfunction isTaskEnvelopeStatus(value: unknown): boolean {\n return typeof value === 'string' && TASK_ENVELOPE_STATUSES.has(value);\n}\n\n// ────────────────────────────────────────────────────────────\n// field_pattern / envelope_field_pattern: check a string matches\n// a storyboard-authored JavaScript regular expression source.\n// ────────────────────────────────────────────────────────────\n\nfunction validateFieldPattern(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n const wildcardError = rejectWildcardScalarPath(validation, checkName);\n if (wildcardError) return wildcardError;\n\n const pointer = toJsonPointer(validation.path);\n const expected = { pattern: validation.pattern };\n\n if (typeof validation.pattern !== 'string' || validation.pattern.length === 0) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `${checkName} requires a non-empty \\`pattern\\` string`,\n json_pointer: pointer,\n expected: { pattern: 'non-empty JavaScript regular expression source' },\n actual: validation.pattern ?? null,\n };\n }\n\n let re: RegExp;\n try {\n re = new RegExp(validation.pattern);\n } catch (err) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Invalid ${checkName} pattern ${JSON.stringify(validation.pattern)}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n json_pointer: pointer,\n expected,\n actual: validation.pattern ?? null,\n };\n }\n\n const actual = resolvePath(taskResult.data, validation.path);\n if (typeof actual !== 'string') {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error:\n actual === undefined || actual === null\n ? `Field not found at path: ${validation.path}`\n : `Expected string at path: ${validation.path}, got ${Array.isArray(actual) ? 'array' : typeof actual}`,\n json_pointer: pointer,\n expected,\n actual: actual ?? null,\n };\n }\n\n if (re.test(actual)) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected string at path ${validation.path} to match pattern ${JSON.stringify(validation.pattern)}, got ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected,\n actual,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// field_contains: wildcard-aware membership check\n//\n// Resolves `path` via `resolvePathAll` (which understands `[*]` and `[]`\n// segments) and passes when ANY resolved value matches `value` or any of\n// `allowed_values`. Object/array expectations are deep subset matches, so\n// keyed entries like `allowed_actions[]` can be asserted without pinning a\n// positional index or requiring exact object shape.\n// ────────────────────────────────────────────────────────────\n\nfunction validateFieldContains(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n const checkName = validation.check;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `No path specified for ${checkName} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n if (validation.value === undefined && !validation.allowed_values?.length) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `${checkName} requires either \\`value\\` or \\`allowed_values\\``,\n json_pointer: toJsonPointer(validation.path),\n expected: '`value` or `allowed_values` must be set',\n actual: null,\n };\n }\n\n const resolved = resolvePathAll(taskResult.data, validation.path);\n const pointer = toJsonPointer(validation.path);\n\n const candidates = validation.allowed_values?.length ? validation.allowed_values : [validation.value];\n const matched = resolved.some(actual => candidates.some(c => containsValueMatches(actual, c)));\n\n if (matched) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n\n const expected = validation.allowed_values?.length ? validation.allowed_values : validation.value;\n const errMsg = validation.allowed_values?.length\n ? `Expected one of ${JSON.stringify(validation.allowed_values)} to appear in path; got ${JSON.stringify(resolved)}`\n : `Expected ${JSON.stringify(validation.value)} to appear in path; got ${JSON.stringify(resolved)}`;\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: errMsg,\n json_pointer: pointer,\n expected,\n actual: resolved,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// array_length: assert cardinality of the array at `path`\n//\n// Configurations:\n// - `value: N` → exact match (array.length === N)\n// - `min` / `max` → inclusive bounds (either or both)\n// - both → misconfigured, fails the check\n//\n// Cardinality is unsound to express via `field_present arr[N-1]` +\n// `field_value_or_absent arr[N] value: null` because the second clause\n// passes when a seller emits a literal `null` pad at `arr[N]`. This check\n// reads `array.length` directly and rejects non-array resolutions instead.\n// Spec: adcp#4685; SDK adcp-client#1830.\n// ────────────────────────────────────────────────────────────\n\nfunction validateArrayLength(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n const checkName = 'array_length' as const;\n if (!validation.path) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: 'No path specified for array_length validation',\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n const pointer = toJsonPointer(validation.path);\n\n const hasExact = typeof validation.value === 'number';\n const hasMin = typeof validation.min === 'number';\n const hasMax = typeof validation.max === 'number';\n\n if (!hasExact && !hasMin && !hasMax) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: 'array_length requires `value` (exact count) or `min`/`max` (bounds)',\n json_pointer: pointer,\n expected: '`value: N` or `min`/`max`',\n actual: null,\n };\n }\n\n if (hasExact && (hasMin || hasMax)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: 'array_length accepts either `value` OR `min`/`max`, not both',\n json_pointer: pointer,\n expected: '`value` or `min`/`max`, not both',\n actual: { value: validation.value, min: validation.min, max: validation.max },\n };\n }\n\n // Reject NaN, fractional, and negative bounds at the config gate. `array.length`\n // is always a non-negative integer, so any other comparand makes the check\n // impossible to satisfy — fail loudly at authoring time rather than silently\n // every run.\n const isValidCount = (n: unknown): n is number => typeof n === 'number' && Number.isInteger(n) && n >= 0;\n const badOperand = (label: string, n: number) =>\n `array_length \\`${label}\\` must be a non-negative integer; got ${Number.isNaN(n) ? 'NaN' : String(n)}`;\n if (hasExact && !isValidCount(validation.value)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: badOperand('value', validation.value as unknown as number),\n json_pointer: pointer,\n expected: 'non-negative integer',\n actual: (validation.value as unknown) ?? null,\n };\n }\n if (hasMin && !isValidCount(validation.min)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: badOperand('min', validation.min as unknown as number),\n json_pointer: pointer,\n expected: 'non-negative integer',\n actual: (validation.min as unknown) ?? null,\n };\n }\n if (hasMax && !isValidCount(validation.max)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: badOperand('max', validation.max as unknown as number),\n json_pointer: pointer,\n expected: 'non-negative integer',\n actual: (validation.max as unknown) ?? null,\n };\n }\n if (hasMin && hasMax && (validation.min as number) > (validation.max as number)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `array_length range is impossible: min ${validation.min} > max ${validation.max}`,\n json_pointer: pointer,\n expected: '`min <= max`',\n actual: { min: validation.min, max: validation.max },\n };\n }\n\n const resolved = resolvePath(taskResult.data, validation.path);\n if (!Array.isArray(resolved)) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `array_length requires an array at path; got ${resolved === undefined ? 'undefined' : typeof resolved === 'object' && resolved !== null ? 'object' : typeof resolved}`,\n json_pointer: pointer,\n expected: 'array',\n actual: resolved ?? null,\n };\n }\n\n const length = resolved.length;\n\n if (hasExact) {\n const target = validation.value as number;\n if (length === target) {\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected array length ${target}, got ${length}`,\n json_pointer: pointer,\n expected: target,\n actual: length,\n };\n }\n\n const min = hasMin ? (validation.min as number) : undefined;\n const max = hasMax ? (validation.max as number) : undefined;\n\n if (min !== undefined && length < min) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected array length >= ${min}, got ${length}`,\n json_pointer: pointer,\n expected: { min, max },\n actual: length,\n };\n }\n if (max !== undefined && length > max) {\n return {\n check: checkName,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected array length <= ${max}, got ${length}`,\n json_pointer: pointer,\n expected: { min, max },\n actual: length,\n };\n }\n\n return {\n check: checkName,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// status_code: check TaskResult status\n// ────────────────────────────────────────────────────────────\n\nfunction validateStatusCode(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n const passed = taskResult.success;\n\n if (passed) {\n return {\n check: 'status_code',\n passed: true,\n description: validation.description,\n };\n }\n return {\n check: 'status_code',\n passed: false,\n description: validation.description,\n error: `Task failed: ${taskResult.error || 'unknown error'}`,\n json_pointer: null,\n expected: 'success',\n actual: taskResult.error ?? 'failure',\n };\n}\n\n// Strip the \"CODE: message\" prefix some transports produce, leaving just the\n// code. Returns undefined when the input doesn't look like a coded error.\nfunction extractCodeFromErrorString(raw: string | undefined): string | undefined {\n if (!raw) return undefined;\n const match = /^([A-Z][A-Z0-9_]{2,}):\\s/.exec(raw);\n return match ? match[1] : raw;\n}\n\n// ────────────────────────────────────────────────────────────\n// error_code: check error code in error response\n// ────────────────────────────────────────────────────────────\n\nfunction validateErrorCode(validation: StoryboardValidation, taskResult: TaskResult): ValidationResult {\n // Extract error code from various locations agents might put it.\n // Prefer the spec-canonical `errors[0].code` envelope (core/error.json), then\n // fall back to legacy/structured locations so we get a bare code instead of\n // the \"CODE: message\" string materialized on taskResult.error.\n //\n // Guarded by `success === false` because AdCP async envelopes (`submitted`,\n // `input-required`) explicitly permit an advisory `errors[]` on non-failed\n // tasks for non-blocking warnings — reading it unconditionally would\n // false-positive `error_code` validations on successful responses.\n const data = taskResult.data as Record<string, unknown> | undefined;\n const errors = data?.errors;\n const firstError = !taskResult.success && Array.isArray(errors) ? errors[0] : undefined;\n const firstErrorCode =\n firstError && typeof firstError === 'object' && typeof (firstError as Record<string, unknown>).code === 'string'\n ? ((firstError as Record<string, unknown>).code as string)\n : undefined;\n const taskAdcpError = taskResult.adcp_error as Record<string, unknown> | undefined;\n const dataAdcpError = data?.adcp_error as Record<string, unknown> | undefined;\n const adcpError = taskAdcpError ?? dataAdcpError;\n const errorCode =\n firstErrorCode ??\n adcpError?.code ??\n data?.error_code ??\n data?.code ??\n (data?.error as Record<string, unknown> | undefined)?.code ??\n extractCodeFromErrorString(taskResult.error);\n\n const pointer =\n firstErrorCode !== undefined\n ? '/errors/0/code'\n : taskAdcpError?.code !== undefined\n ? '/adcp_error/code'\n : adcpError?.code !== undefined\n ? '/adcp_error/code'\n : data?.error_code !== undefined\n ? '/error_code'\n : null;\n\n if (validation.allowed_values?.length) {\n const actualCode = errorCode !== undefined && errorCode !== null ? String(errorCode) : undefined;\n const passed = actualCode !== undefined && validation.allowed_values.some(v => String(v) === actualCode);\n if (passed) {\n return { check: 'error_code', passed: true, description: validation.description, json_pointer: pointer };\n }\n return {\n check: 'error_code',\n passed: false,\n description: validation.description,\n error: `Expected one of ${JSON.stringify(validation.allowed_values)}, got ${JSON.stringify(errorCode)}`,\n json_pointer: pointer,\n expected: validation.allowed_values,\n actual: errorCode ?? null,\n };\n }\n\n if (!validation.value) {\n // Just check that an error code exists\n const hasCode = errorCode !== undefined && errorCode !== null;\n if (hasCode) {\n return { check: 'error_code', passed: true, description: validation.description, json_pointer: pointer };\n }\n return {\n check: 'error_code',\n passed: false,\n description: validation.description,\n error: 'No error code found in response',\n json_pointer: pointer,\n expected: 'any error code',\n actual: null,\n };\n }\n\n const passed = String(errorCode) === String(validation.value);\n if (passed) {\n return { check: 'error_code', passed: true, description: validation.description, json_pointer: pointer };\n }\n return {\n check: 'error_code',\n passed: false,\n description: validation.description,\n error: `Expected error code \"${validation.value}\", got \"${errorCode}\"`,\n json_pointer: pointer,\n expected: validation.value,\n actual: errorCode ?? null,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// http_status / http_status_in\n// ────────────────────────────────────────────────────────────\n\nfunction validateHttpStatus(validation: StoryboardValidation, hr: HttpProbeResult): ValidationResult {\n const expected = validation.value as number | undefined;\n const passed = typeof expected === 'number' && hr.status === expected;\n if (passed) {\n return { check: 'http_status', passed: true, description: validation.description };\n }\n return {\n check: 'http_status',\n passed: false,\n description: validation.description,\n error: `Expected HTTP ${expected}, got ${hr.status}${hr.error ? ` (${hr.error})` : ''}`,\n json_pointer: null,\n expected: expected ?? null,\n actual: hr.status,\n };\n}\n\nfunction validateHttpStatusIn(validation: StoryboardValidation, hr: HttpProbeResult): ValidationResult {\n const allowed = Array.isArray(validation.allowed_values) ? validation.allowed_values : [];\n const passed = allowed.some(v => v === hr.status);\n if (passed) {\n return { check: 'http_status_in', passed: true, description: validation.description };\n }\n // Disambiguate two failure modes that produce the same HTTP-status mismatch:\n // (a) the kit's `probe_task` requires non-empty params, so the agent 400s on\n // schema before auth ever runs (operator's fault), or (b) the agent really\n // does evaluate schema before auth (agent's fault — itself a conformance\n // gap). Both are real; the text names both so compliance reports don't\n // unilaterally blame the operator for an agent that games the probe by\n // returning a schema-shaped body.\n const expectedAuthReject = allowed.includes(401) || allowed.includes(403);\n const schemaRejected = (hr.status === 400 || hr.status === 422) && looksLikeSchemaValidationBody(hr.body);\n if (expectedAuthReject && schemaRejected) {\n return {\n check: 'http_status_in',\n passed: false,\n description: validation.description,\n error:\n `Agent returned HTTP ${hr.status} with a schema-validation body before any auth response. ` +\n `Two possible causes: (1) \\`test_kit.auth.probe_task\\` points at a task that requires ` +\n `non-empty parameters, so schema validation rejected the probe before auth ran (fix: set ` +\n `\\`probe_task\\` to one of ${PROBE_TASK_ALLOWLIST.join(', ')}); or (2) the agent evaluates ` +\n `schema before auth, which is itself a conformance gap (protected endpoints must return ` +\n `401/403 on invalid credentials regardless of body shape).`,\n json_pointer: null,\n expected: allowed,\n actual: hr.status,\n };\n }\n return {\n check: 'http_status_in',\n passed: false,\n description: validation.description,\n error: `Expected HTTP status in ${JSON.stringify(allowed)}, got ${hr.status}${hr.error ? ` (${hr.error})` : ''}`,\n json_pointer: null,\n expected: allowed,\n actual: hr.status,\n };\n}\n\nconst SCHEMA_KEYWORD_RE = /invalid[_ ]?params|validation|schema|required|must be/i;\nconst SCHEMA_CODE_RE = /VALIDATION|INVALID|SCHEMA|BAD_REQUEST/i;\n\n/**\n * Detect bodies that look like JSON-RPC / MCP schema-validation rejections.\n *\n * Conservative: only returns true when the body has a recognizable error\n * envelope AND either a JSON-RPC invalid-params code (-32602) or a\n * message/field-level hint pointing at schema/validation. Returning true\n * on a real auth response would hide genuine agent bugs, so we over-reject.\n *\n * Handles both parsed JSON object bodies and plain-text bodies — the HTTP\n * probe returns a decoded string when content-type isn't JSON, and agents\n * that 400 with `text/plain` short messages like \"missing required field\"\n * deserve the same kit-config diagnostic. String detection is deliberately\n * tight: a recognizable schema-keyword substring in a short body (≤ 1 KiB).\n */\nfunction looksLikeSchemaValidationBody(body: unknown): boolean {\n if (typeof body === 'string') {\n return body.length > 0 && body.length <= 1024 && SCHEMA_KEYWORD_RE.test(body);\n }\n if (!body || typeof body !== 'object' || Array.isArray(body)) return false;\n const obj = body as Record<string, unknown>;\n // JSON-RPC error envelope\n const rpcError = obj.error as Record<string, unknown> | undefined;\n if (rpcError && typeof rpcError === 'object') {\n const code = rpcError.code;\n if (typeof code === 'number' && (code === -32602 || code === -32600)) return true;\n const msg = rpcError.message;\n if (typeof msg === 'string' && SCHEMA_KEYWORD_RE.test(msg)) return true;\n }\n // AdCP / REST-style validation envelope\n if (Array.isArray(obj.errors) && obj.errors.length > 0) return true;\n if (Array.isArray(obj.validation_errors) && obj.validation_errors.length > 0) return true;\n const topCode = obj.error_code ?? obj.code;\n if (typeof topCode === 'string' && SCHEMA_CODE_RE.test(topCode)) return true;\n return false;\n}\n\n// ────────────────────────────────────────────────────────────\n// on_401_require_header\n// ────────────────────────────────────────────────────────────\n\nfunction validateOn401RequireHeader(validation: StoryboardValidation, hr: HttpProbeResult): ValidationResult {\n const header = typeof validation.value === 'string' ? validation.value.toLowerCase() : undefined;\n if (!header) {\n return {\n check: 'on_401_require_header',\n passed: false,\n description: validation.description,\n error: '`value` is required (the header name to require on 401 responses).',\n json_pointer: null,\n expected: 'header name',\n actual: null,\n };\n }\n // Silent pass when the response isn't a 401 — the conditional is part of\n // the spec (RFC 6750 §3 only applies to 401s).\n if (hr.status !== 401) {\n return { check: 'on_401_require_header', passed: true, description: validation.description };\n }\n const value = hr.headers[header];\n const passed = typeof value === 'string' && value.length > 0;\n if (passed) {\n return { check: 'on_401_require_header', passed: true, description: validation.description };\n }\n return {\n check: 'on_401_require_header',\n passed: false,\n description: validation.description,\n error: `401 response missing required header \"${header}\".`,\n json_pointer: null,\n expected: `response header \"${header}\" present`,\n actual: value ?? null,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// resource_equals_agent_url\n// ────────────────────────────────────────────────────────────\n\n/**\n * Normalize a URL for RFC 9728 resource identity checks:\n * lowercases scheme/host, strips userinfo, query, and fragment, and\n * collapses trailing slashes while preserving the path. RFC 9728\n * `resource` identifies the agent at its full endpoint, so paths are\n * significant here — use `canonicalizeAgentUrlForScope` for `refs_resolve`\n * scope comparisons where paths must be dropped.\n */\n/**\n * Canonical form of an agent URL for `refs_resolve` scope comparisons.\n *\n * AdCP's `agent_url` identifies the agent — which may live under a subpath\n * like `https://publisher.com/.well-known/adcp/sales` (see core/format-id.json).\n * Path is therefore significant and MUST be preserved; collapsing to origin\n * would false-positive sibling agents on shared hosts.\n *\n * What must be stripped is the transport suffix the runner appends to reach\n * the protocol endpoint (`/mcp`, `/a2a`, `/sse`) and the well-known agent-card\n * path, so the runner's target URL canonicalizes to the same value the agent\n * advertises in its refs. Mirrors `SingleAgentClient.computeBaseUrl` but as a\n * pure string operation suitable for validation without an agent instance.\n *\n * Also: lowercase scheme/host, drop default ports, strip userinfo, query,\n * fragment — normal RFC 3986 §6.2 canonicalization. Closes adcp-client#710.\n */\nconst AGENT_CARD_SUFFIX_RE = /\\/\\.well-known\\/agent(?:-card)?\\.json$/i;\nfunction canonicalizeAgentUrlForScope(url: string): string {\n try {\n const u = new URL(url);\n u.hash = '';\n u.search = '';\n u.username = '';\n u.password = '';\n let path = u.pathname;\n path = path.replace(AGENT_CARD_SUFFIX_RE, '');\n path = path.replace(TRANSPORT_SUFFIX_REGEX, '');\n // A bare `/` and the empty string denote the same origin-relative root;\n // collapse them so `https://host` and `https://host/` canonicalize equally.\n if (path === '/' || path === '') path = '';\n else if (path.endsWith('/')) path = path.slice(0, -1);\n const defaultPort = u.protocol === 'https:' ? '443' : u.protocol === 'http:' ? '80' : '';\n const host = u.hostname.toLowerCase();\n const port = u.port && u.port !== defaultPort ? `:${u.port}` : '';\n return `${u.protocol.toLowerCase()}//${host}${port}${path}`;\n } catch {\n return url;\n }\n}\n\nfunction validateResourceEqualsAgentUrl(\n validation: StoryboardValidation,\n hr: HttpProbeResult,\n agentUrl: string\n): ValidationResult {\n const body = (hr.body ?? {}) as { resource?: unknown };\n const resource = typeof body.resource === 'string' ? body.resource : undefined;\n if (!resource) {\n return {\n check: 'resource_equals_agent_url',\n passed: false,\n description: validation.description,\n error: 'Response body missing string `resource` field.',\n json_pointer: '/resource',\n expected: redactOAuthUrlForOutput(normalizeOAuthResourceForComparison(agentUrl)),\n actual: null,\n };\n }\n const expected = normalizeOAuthResourceForComparison(agentUrl);\n const actual = normalizeOAuthResourceForComparison(resource);\n const displayExpected = redactOAuthUrlForOutput(expected);\n const displayActual = redactOAuthUrlForOutput(actual);\n const passed = actual === expected;\n // Don't echo the advertised value verbatim in the human-readable message —\n // compliance reports may be shared publicly and the raw diff helps attackers\n // probe victim agents. Machine-readable expected/actual are fine: implementors\n // consuming the JSON already hold both URLs.\n let redactedError: string | undefined;\n if (!passed) {\n let actualHost = 'unknown';\n try {\n actualHost = new URL(resource).host;\n } catch {\n /* ignore */\n }\n const expectedHost = new URL(expected).host;\n const hostDiffers = actualHost !== expectedHost;\n redactedError =\n `RFC 9728 \\`resource\\` does not equal the URL clients call (${displayExpected}). ` +\n (hostDiffers\n ? `Advertised host differs from the agent host — the most common cause is copying your authorization server origin into \\`resource\\`. `\n : `Advertised path differs from the agent path. `) +\n `Fix: set \\`resource\\` equal to the full agent URL in your protected-resource metadata document.`;\n }\n if (passed) {\n return {\n check: 'resource_equals_agent_url',\n passed: true,\n description: validation.description,\n json_pointer: '/resource',\n };\n }\n return {\n check: 'resource_equals_agent_url',\n passed: false,\n description: validation.description,\n error: redactedError,\n json_pointer: '/resource',\n expected: displayExpected,\n actual: displayActual,\n };\n}\n\nfunction validateOAuthMetadataGraph(\n validation: StoryboardValidation,\n grade: OAuthMetadataGraphGrade | undefined\n): ValidationResult {\n const expected = {\n profile: 'adcp/oauth-metadata-graph/v1',\n require_authorization_servers: true,\n follow_all_authorization_servers: true,\n probe_advertised_endpoints: true,\n };\n if (!grade) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: 'oauth_metadata_graph was not prefetched by the storyboard runner',\n json_pointer: null,\n expected,\n actual: null,\n };\n }\n if (grade.success) {\n return {\n check: validation.check,\n passed: true,\n description: validation.description,\n json_pointer: null,\n expected,\n observations: grade.observations,\n };\n }\n const primary = grade.findings[0];\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: `${grade.error_code}: ${grade.error}`,\n json_pointer: primary?.field ? findingFieldToJsonPointer(primary.field) : null,\n expected,\n actual: {\n code: grade.error_code,\n ...(primary?.url && { url: primary.url }),\n ...(primary?.field && { field: primary.field }),\n ...(primary?.message && { detail: primary.message }),\n },\n observations: grade.observations,\n };\n}\n\nfunction findingFieldToJsonPointer(field: string): string {\n const segments = field.replace(/\\[(\\d+)\\]/g, '.$1').split('.');\n return `/${segments.map(segment => segment.replace(/~/g, '~0').replace(/\\//g, '~1')).join('/')}`;\n}\n\n// ────────────────────────────────────────────────────────────\n// any_of (contribution accumulator)\n// ────────────────────────────────────────────────────────────\n\nfunction validateAnyOf(validation: StoryboardValidation, contributions: Set<string>): ValidationResult {\n const flags = Array.isArray(validation.allowed_values) ? validation.allowed_values.map(String) : [];\n const passed = flags.some(f => contributions.has(f));\n if (passed) {\n return { check: 'any_of', passed: true, description: validation.description };\n }\n return {\n check: 'any_of',\n passed: false,\n description: validation.description,\n error: `None of the required contributions were recorded: ${JSON.stringify(flags)}`,\n json_pointer: null,\n expected: flags,\n actual: Array.from(contributions),\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// a2a_submitted_artifact (A2A wire-shape regression guard)\n// ────────────────────────────────────────────────────────────\n\n/**\n * Assert the A2A `Task` envelope produced by the seller for an AdCP\n * `submitted` arm matches the cross-transport contract established in\n * adcp-client#899:\n *\n * 1. `Task.state === 'completed'` — A2A Task.state tracks the HTTP\n * transport call, not the AdCP work. The HTTP request returned\n * successfully with a queued AdCP task; emitting `'submitted'`\n * here would be a non-conformant terminal transition per A2A\n * 0.3.0 (`submitted` is the INITIAL state, never terminal).\n *\n * 2. `artifact.metadata.adcp_task_id` is a non-empty string — the\n * AdCP-level async handle rides on the artifact's metadata field,\n * not buried in `data.adcp_task_id`. Buyers resume the AdCP task\n * by reading metadata; conflating it into the AdCP payload\n * pollutes the typed response shape.\n *\n * 3. `artifact.parts[0].data.status === 'submitted'` — the AdCP\n * payload preserves its native `status` discriminator so buyers\n * can read the ad-tech state without parsing transport metadata.\n *\n * The check is A2A-specific: when no `a2aEnvelope` was captured (MCP\n * runs, or A2A runs where the SDK fetch was bypassed), the result\n * passes with `not_applicable: true` so the validation doesn't fail\n * the step on transports that don't carry the envelope.\n *\n * Failure messages name the offending field so an agent that\n * regressed to the pre-#899 shape (`Task.state: 'submitted'` with\n * `final: true`, `adcp_task_id` in `data` instead of `metadata`) gets\n * a specific diagnostic, not a generic \"wire-shape rejected\".\n */\nfunction validateA2ASubmittedArtifact(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const envelope = ctx.a2aEnvelope;\n if (!envelope) {\n // Non-A2A transport (MCP), or A2A path where the SDK fetch wasn't\n // wrapped. Skip without failing — the storyboard step still grades\n // on its other validations (e.g. MCP `field_value status === submitted`).\n return {\n check: 'a2a_submitted_artifact',\n passed: true,\n description: validation.description,\n observations: [\n 'a2a_envelope_not_captured: no JSON-RPC envelope recorded (non-A2A transport, or A2A dispatch threw before envelope was parsed)',\n ],\n };\n }\n\n const failures: Array<{ pointer: string; expected: unknown; actual: unknown; detail: string }> = [];\n\n // JSON-RPC error envelopes never satisfy the submitted-artifact\n // contract. We fail the check (skipping would silently hide a\n // server-side regression where submitted arms 500 instead of\n // returning Tasks), but emit a distinct error_code so dashboards\n // can separate transport rejections from submitted-arm shape drift.\n if (envelope.envelope.error !== undefined) {\n return {\n check: 'a2a_submitted_artifact',\n passed: false,\n description: validation.description,\n error: 'Expected a JSON-RPC success envelope carrying an A2A Task; observed an error envelope.',\n json_pointer: '/error',\n expected: { result: { kind: 'task', status: { state: 'completed' } } },\n actual: { error_code: 'a2a_jsonrpc_error_envelope', error: envelope.envelope.error },\n };\n }\n\n const result = envelope.result;\n if (result == null || typeof result !== 'object' || Array.isArray(result)) {\n return {\n check: 'a2a_submitted_artifact',\n passed: false,\n description: validation.description,\n error: 'JSON-RPC `result` is not an object — A2A `message/send` must return a Task.',\n json_pointer: '/result',\n expected: 'object (A2A Task)',\n actual: result,\n };\n }\n const task = result as Record<string, unknown>;\n\n if (task.kind !== 'task') {\n failures.push({\n pointer: '/result/kind',\n expected: 'task',\n actual: task.kind,\n detail: `Expected result.kind === 'task'; got ${JSON.stringify(task.kind)}.`,\n });\n }\n\n // Task.id non-empty — buyers can't address `tasks/get` or\n // `tasks/cancel` without it, so an empty / missing id is a\n // wire-shape regression even if the transport call succeeded.\n if (typeof task.id !== 'string' || task.id.length === 0) {\n failures.push({\n pointer: '/result/id',\n expected: 'non-empty string',\n actual: task.id,\n detail:\n 'A2A `Task.id` must be a non-empty string — buyers address follow-up `tasks/get` / `tasks/cancel` calls by this id.',\n });\n }\n\n // Task.contextId non-empty — A2A 0.3.0 binds follow-ups (subsequent\n // sends, status streams) to the context; an empty contextId\n // breaks correlation across calls.\n if (typeof task.contextId !== 'string' || task.contextId.length === 0) {\n failures.push({\n pointer: '/result/contextId',\n expected: 'non-empty string',\n actual: task.contextId,\n detail:\n 'A2A `Task.contextId` must be a non-empty string — A2A 0.3.0 requires it on every Task to correlate follow-up sends and status streams.',\n });\n }\n\n // Invariant 1 — A2A `Task.state` for a submitted AdCP arm is\n // `'completed'` (the HTTP call completed). Pre-#899 emitted\n // `'submitted'` with `final: true`, which is the regression we want\n // to catch.\n const status = task.status;\n const state =\n status != null && typeof status === 'object' && !Array.isArray(status)\n ? (status as Record<string, unknown>).state\n : undefined;\n if (state !== 'completed') {\n failures.push({\n pointer: '/result/status/state',\n expected: 'completed',\n actual: state,\n detail:\n `Expected Task.state === 'completed' (HTTP-call lifecycle); got ${JSON.stringify(state)}. ` +\n \"A2A 0.3.0 forbids 'submitted' as a terminal state — for AdCP submitted arms the transport call has completed; the AdCP task lives on artifact metadata.\",\n });\n }\n\n // Invariants 2 + 3 — artifact.metadata.adcp_task_id placement and\n // artifact.parts[0].data.status preservation. Walk the artifact\n // chain, collecting failures rather than short-circuiting so the\n // error block names every divergence at once.\n const artifacts = task.artifacts;\n if (!Array.isArray(artifacts) || artifacts.length === 0) {\n failures.push({\n pointer: '/result/artifacts',\n expected: 'non-empty array',\n actual: artifacts,\n detail: 'A2A submitted arm must produce at least one artifact carrying the AdCP response.',\n });\n } else {\n const artifact = artifacts[0] as Record<string, unknown> | null;\n if (artifact == null || typeof artifact !== 'object' || Array.isArray(artifact)) {\n failures.push({\n pointer: '/result/artifacts/0',\n expected: 'object',\n actual: artifact,\n detail: 'First artifact must be an object.',\n });\n } else {\n // artifact.artifactId non-empty — needed for chunked-artifact\n // resumption and for buyers that key local state by artifact\n // id (e.g. caching the AdCP payload while the task continues).\n if (typeof artifact.artifactId !== 'string' || artifact.artifactId.length === 0) {\n failures.push({\n pointer: '/result/artifacts/0/artifactId',\n expected: 'non-empty string',\n actual: artifact.artifactId,\n detail:\n 'A2A `Artifact.artifactId` must be a non-empty string — chunked-artifact resumption and buyer-side caching key off this id.',\n });\n }\n\n // Invariant 2 — adcp_task_id on artifact.metadata.\n const metadata = artifact.metadata;\n const metadataTaskId =\n metadata != null && typeof metadata === 'object' && !Array.isArray(metadata)\n ? (metadata as Record<string, unknown>).adcp_task_id\n : undefined;\n if (typeof metadataTaskId !== 'string' || metadataTaskId.length === 0) {\n failures.push({\n pointer: '/result/artifacts/0/metadata/adcp_task_id',\n expected: 'non-empty string',\n actual: metadataTaskId,\n detail:\n 'Expected `adcp_task_id` on `artifact.metadata` (per A2A 0.3.0 metadata-extension convention). Pre-#899 placed this in `artifact.parts[0].data.adcp_task_id` — that path is non-conformant; transport metadata pollutes the typed AdCP payload shape.',\n });\n }\n\n // Invariant 3 — artifact.parts[0].data.status === 'submitted'.\n const parts = artifact.parts;\n if (!Array.isArray(parts) || parts.length === 0) {\n failures.push({\n pointer: '/result/artifacts/0/parts',\n expected: 'non-empty array with a DataPart',\n actual: parts,\n detail: 'A2A submitted arm must include a DataPart carrying the AdCP response.',\n });\n } else {\n const firstPart = parts[0] as Record<string, unknown> | null;\n if (firstPart == null || typeof firstPart !== 'object' || Array.isArray(firstPart)) {\n failures.push({\n pointer: '/result/artifacts/0/parts/0',\n expected: 'object',\n actual: firstPart,\n detail: 'First artifact part must be an object.',\n });\n } else {\n if (firstPart.kind !== 'data') {\n failures.push({\n pointer: '/result/artifacts/0/parts/0/kind',\n expected: 'data',\n actual: firstPart.kind,\n detail: `Expected the first artifact part to be a DataPart (kind === 'data'); got ${JSON.stringify(firstPart.kind)}.`,\n });\n }\n const data = firstPart.data;\n const dataStatus =\n data != null && typeof data === 'object' && !Array.isArray(data)\n ? (data as Record<string, unknown>).status\n : undefined;\n if (dataStatus !== 'submitted') {\n failures.push({\n pointer: '/result/artifacts/0/parts/0/data/status',\n expected: 'submitted',\n actual: dataStatus,\n detail:\n `Expected the AdCP payload's status to round-trip as 'submitted'; got ${JSON.stringify(dataStatus)}. ` +\n 'The DataPart must carry the AdCP tool response verbatim — buyers read the ad-tech state from `data.status`, not from `Task.state`.',\n });\n }\n // Dual-write detection: catches the pre-#899 regression\n // where the agent leaked the transport handle into the\n // payload. A future AdCP tool whose response schema\n // legitimately includes `adcp_task_id` is allowed to\n // surface it inside `data` AS LONG AS it equals the\n // metadata value — a divergent or solo-payload write is\n // still the regression class issue #904 catches.\n const dataAdcpTaskId =\n data != null && typeof data === 'object' && !Array.isArray(data)\n ? (data as Record<string, unknown>).adcp_task_id\n : undefined;\n if (dataAdcpTaskId !== undefined) {\n const equalsMetadata =\n typeof metadataTaskId === 'string' &&\n typeof dataAdcpTaskId === 'string' &&\n dataAdcpTaskId === metadataTaskId;\n if (!equalsMetadata) {\n failures.push({\n pointer: '/result/artifacts/0/parts/0/data/adcp_task_id',\n expected: 'absent OR equal to artifact.metadata.adcp_task_id',\n actual: dataAdcpTaskId,\n detail:\n typeof metadataTaskId === 'string'\n ? `Pre-#899 dual-write detected: \\`data.adcp_task_id\\` (${JSON.stringify(dataAdcpTaskId)}) diverges from \\`artifact.metadata.adcp_task_id\\` (${JSON.stringify(metadataTaskId)}).`\n : 'Pre-#899 shape detected: `adcp_task_id` appeared inside `artifact.parts[0].data` without a matching `artifact.metadata.adcp_task_id`. Transport metadata belongs on `artifact.metadata`.',\n });\n }\n }\n }\n }\n }\n }\n\n if (failures.length === 0) {\n return {\n check: 'a2a_submitted_artifact',\n passed: true,\n description: validation.description,\n };\n }\n\n // Surface every failure at once. The first one anchors json_pointer /\n // expected / actual for tools that read those scalar fields; the full\n // list lands in `actual.failures` so all regressions are visible in\n // a single grading run. Multi-failure runs prepend the first detail\n // to the error string so consumers reading only `error` still get a\n // pointer to the most-actionable diagnostic.\n const first = failures[0]!;\n return {\n check: 'a2a_submitted_artifact',\n passed: false,\n description: validation.description,\n error:\n failures.length === 1\n ? first.detail\n : `${failures.length} A2A wire-shape invariants failed; first: ${first.detail}`,\n json_pointer: first.pointer,\n expected: first.expected,\n actual: { failures },\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// refs_resolve (cross-step integrity check)\n// ────────────────────────────────────────────────────────────\n\n// ────────────────────────────────────────────────────────────\n// a2a_context_continuity (cross-step A2A session-binding guard)\n// ────────────────────────────────────────────────────────────\n\n/**\n * Assert that the A2A `Task.contextId` on this step's response\n * matches the prior step's response. A2A 0.3.0 §7.1 binds follow-up\n * sends to a server-side conversation via `Message.contextId`; the\n * server MUST echo it on the response Task. The `@a2a-js/sdk`'s\n * `DefaultRequestHandler` does this automatically — `createA2AAdapter`\n * passes through `requestContext.contextId`, so a passing seller built\n * on the SDK won't trip a single-call check. The regression class is\n * sellers that bypass the SDK's request handler and stamp their own\n * `contextId` on the response, breaking buyer-side correlation across\n * a multi-turn flow (proposal refinement, IO signing, async approval).\n *\n * The check compares the current step's\n * `ctx.a2aEnvelope.result.contextId` against the prior step's\n * `ctx.priorA2aEnvelope.result.contextId`. Skip semantics:\n *\n * - Non-A2A run (`a2aEnvelope` undefined) → skip\n * - First A2A step in a run (`priorA2aEnvelope` undefined) → skip\n * - Either envelope had no extractable `contextId` → skip\n * - JSON-RPC error envelope (`envelope.error` present) → skip\n *\n * Skips emit a single observation noting which condition triggered so\n * triage can distinguish \"validator self-skipped\" from \"validator\n * passed because contexts matched\".\n */\nfunction validateA2AContextContinuity(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const current = ctx.a2aEnvelope;\n const prior = ctx.priorA2aEnvelope;\n const passResult = (observation: string): ValidationResult => ({\n check: 'a2a_context_continuity',\n passed: true,\n description: validation.description,\n observations: [observation],\n });\n\n if (!current)\n return passResult('a2a_envelope_not_captured: skipped on non-A2A transport (or capture-bypassing dispatch path)');\n if (!prior) return passResult('first_a2a_step: no prior A2A envelope to compare against; skipped');\n if (current.envelope.error !== undefined || prior.envelope.error !== undefined) {\n return passResult('jsonrpc_error_envelope: skipped — continuity is undefined for transport-rejected calls');\n }\n\n const currentContextId = extractContextIdFromEnvelope(current);\n const priorContextId = extractContextIdFromEnvelope(prior);\n\n if (priorContextId == null)\n return passResult('prior_contextId_absent: prior step did not surface a Task.contextId; skipped');\n if (currentContextId == null) {\n return {\n check: 'a2a_context_continuity',\n passed: false,\n description: validation.description,\n error:\n `Current step's response Task is missing \\`contextId\\` (prior step had ${JSON.stringify(priorContextId)}). ` +\n 'A2A 0.3.0 requires the server to echo the client-supplied contextId on every follow-up send; an empty/missing ' +\n 'contextId on a non-first send breaks buyer-side session correlation.',\n json_pointer: '/result/contextId',\n expected: priorContextId,\n actual: currentContextId,\n };\n }\n if (currentContextId !== priorContextId) {\n const priorStepNote = ctx.priorA2aStepId ? ` (prior step: ${ctx.priorA2aStepId})` : '';\n return {\n check: 'a2a_context_continuity',\n passed: false,\n description: validation.description,\n error:\n `A2A \\`Task.contextId\\` diverged across steps${priorStepNote}: expected ${JSON.stringify(priorContextId)}, got ${JSON.stringify(currentContextId)}. ` +\n \"Per A2A 0.3.0 §7.1 the server MUST echo the client-supplied contextId on follow-up sends. A divergent value indicates the seller bypassed the SDK's request handler and stamped its own contextId — buyer-side session correlation is broken.\",\n json_pointer: '/result/contextId',\n expected: priorContextId,\n actual: currentContextId,\n };\n }\n return { check: 'a2a_context_continuity', passed: true, description: validation.description };\n}\n\nfunction extractContextIdFromEnvelope(envelope: A2ATaskEnvelope): string | undefined {\n const result = envelope.result;\n if (result == null || typeof result !== 'object' || Array.isArray(result)) return undefined;\n const ctxId = (result as Record<string, unknown>).contextId;\n return typeof ctxId === 'string' && ctxId.length > 0 ? ctxId : undefined;\n}\n\n/**\n * Assert every ref in a source set resolves to a member of a target set.\n *\n * Used by `media_buy_seller` to check that every `format_id` returned on\n * `get_products` products actually resolves to a format in the subsequent\n * `list_creative_formats` response — catches invalid references before\n * `sync_creatives` fails at runtime.\n *\n * `scope` lets the check distinguish refs the agent under test owns\n * (`agent_url` matches) from third-party refs (pointing at a different\n * creative agent). Third-party refs can't be verified without calling\n * that agent's `list_creative_formats`, so `on_out_of_scope` controls\n * whether they pass (`warn` with observations, `ignore` silently) or\n * fail.\n */\nfunction validateRefsResolve(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const source = validation.source;\n const target = validation.target;\n const matchKeys = validation.match_keys;\n\n if (!source || !target || !matchKeys?.length) {\n return {\n check: 'refs_resolve',\n passed: false,\n description: validation.description,\n error: '`source`, `target`, and `match_keys` are all required for refs_resolve.',\n json_pointer: null,\n expected: '{ source, target, match_keys }',\n actual: {\n source: source ?? null,\n target: target ?? null,\n match_keys: matchKeys ?? null,\n },\n };\n }\n\n const sourceRoot = resolveRefsRoot(source.from, ctx);\n const targetRoot = resolveRefsRoot(target.from, ctx);\n const sourceRaw = resolvePathAll(sourceRoot, source.path);\n const targetRaw = resolvePathAll(targetRoot, target.path);\n const sourceRefs = sourceRaw.filter(isRefObject);\n const targetRefs = targetRaw.filter(isRefObject);\n\n const metaObservations: Array<Record<string, unknown>> = [];\n if (sourceRaw.length > 0 && sourceRefs.length === 0) {\n metaObservations.push({ kind: 'non_object_values_filtered', side: 'source', count: sourceRaw.length });\n }\n if (targetRaw.length > 0 && targetRefs.length === 0) {\n metaObservations.push({ kind: 'non_object_values_filtered', side: 'target', count: targetRaw.length });\n }\n\n // adcp-client#712: when the current-step target response carries\n // pagination metadata with more pages available, the target set is\n // incomplete and missing refs may legitimately live on later pages.\n // Surface a meta-observation AND demote unresolved refs to\n // observations so partial-page reads don't false-fail the check.\n // The stricter fix (spec Option A: \"compliance mode returns everything\n // referenced by products\") needs an AdCP spec change — until that\n // lands, the runner must not penalize conformant paginating sellers.\n const targetPaginated = target.from === 'current_step' && hasMorePages(targetRoot);\n if (targetPaginated) {\n metaObservations.push({ kind: 'target_paginated', side: 'target' });\n }\n\n const scope = validation.scope;\n const outOfScopeMode = validation.on_out_of_scope ?? 'warn';\n const scopeEquals = scope ? resolveScopeEquals(scope.equals, scope.key, ctx.agentUrl) : undefined;\n\n const inScope: Array<Record<string, unknown>> = [];\n const outOfScope: Array<Record<string, unknown>> = [];\n\n for (const ref of sourceRefs) {\n if (!scope) {\n inScope.push(ref);\n continue;\n }\n const refValue = ref[scope.key];\n const normalized = normalizeIfUrlKey(refValue, scope.key);\n if (scopeEquals !== undefined && normalized === scopeEquals) {\n inScope.push(ref);\n } else {\n outOfScope.push(ref);\n }\n }\n\n // adcp-client#711: catch the silent-no-op case where a scope filter\n // excludes 100% of source refs. Independent of whether the partition\n // is \"correct\" — if every ref falls out of scope, the check enforces\n // nothing and the grader deserves to see that structural smell.\n // Suppressed under `on_out_of_scope: 'ignore'` because that mode\n // explicitly opts out of scope-related warnings.\n if (scope && outOfScopeMode !== 'ignore' && sourceRefs.length > 0 && inScope.length === 0) {\n metaObservations.push({\n kind: 'scope_excluded_all_refs',\n count: sourceRefs.length,\n scope_key: scope.key,\n });\n }\n\n const unresolved = dedupRefs(\n inScope.filter(s => !targetRefs.some(t => refsMatch(s, t, matchKeys))),\n matchKeys\n );\n\n // When the target was paginated and refs are unresolved, demote those\n // refs from `missing` to `unresolved_with_pagination` observations so a\n // conformant paginating seller passes. The meta-observation still fires.\n const missing = targetPaginated ? [] : unresolved;\n const paginatedUnresolved = targetPaginated ? unresolved : [];\n\n // `fail` mode promotes out-of-scope refs into the missing set so compliance\n // reports name them the same way they name truly broken refs.\n const failOutOfScope = outOfScopeMode === 'fail' ? dedupRefs(outOfScope, matchKeys) : [];\n const allMissing = [...missing, ...failOutOfScope];\n\n const warnObservations =\n outOfScopeMode === 'warn' && outOfScope.length > 0\n ? dedupRefs(outOfScope, matchKeys).map(ref => ({\n kind: 'out_of_scope_ref',\n ref: projectRefForReport(ref, matchKeys),\n }))\n : [];\n const paginatedObservations = paginatedUnresolved.map(ref => ({\n kind: 'unresolved_with_pagination',\n ref: projectRefForReport(ref, matchKeys),\n }));\n\n // adcp-client#718: when target_paginated AND at least one ref is\n // unresolved-with-pagination, emit a neutral structural meta-observation\n // naming the co-occurrence. A seller that unconditionally returns\n // pagination.has_more: true masks unresolved refs via the pagination\n // demotion (#712/#717) and passes refs_resolve cleanly; graders keying\n // on `passed` alone wouldn't see the problem. This gives dashboards an\n // independent signal without changing pass/fail semantics. Becomes\n // redundant when adcp#2601's \"compliance mode returns everything\n // referenced\" rule lands.\n if (targetPaginated && paginatedUnresolved.length > 0) {\n metaObservations.push({\n kind: 'unresolved_hidden_by_pagination',\n unresolved_count: paginatedUnresolved.length,\n });\n }\n\n // Meta-observations precede per-ref observations so the array cap never\n // drops the grader-signal primitives (scope_excluded_all_refs,\n // target_paginated, unresolved_hidden_by_pagination) in favor of\n // redundant out-of-scope entries.\n const observations = capObservations([...metaObservations, ...paginatedObservations, ...warnObservations]);\n\n if (allMissing.length === 0) {\n return {\n check: 'refs_resolve',\n passed: true,\n description: validation.description,\n ...(observations && { observations }),\n };\n }\n\n const preview = allMissing\n .slice(0, 3)\n .map(r => JSON.stringify(projectRefForReport(r, matchKeys)))\n .join(', ');\n const errorMsg =\n allMissing.length > 3\n ? `${allMissing.length} ref(s) did not resolve; first 3: ${preview}`\n : `${allMissing.length} ref(s) did not resolve: ${preview}`;\n\n return {\n check: 'refs_resolve',\n passed: false,\n description: validation.description,\n path: source.path,\n error: errorMsg,\n json_pointer: null,\n expected: `every source ref resolves to a target ref matched on [${matchKeys.join(', ')}]`,\n actual: {\n missing: allMissing.map(r => projectRefForReport(r, matchKeys)),\n ...(failOutOfScope.length > 0 && {\n out_of_scope_failed: failOutOfScope.map(r => projectRefForReport(r, matchKeys)),\n }),\n },\n ...(observations && { observations }),\n };\n}\n\n/**\n * Detect whether the response at `root` advertises additional pages.\n * Accepts the AdCP-standard `pagination.has_more` flag; conservative\n * otherwise (false on non-objects, missing fields, or unparseable shapes).\n */\nfunction hasMorePages(root: unknown): boolean {\n if (!root || typeof root !== 'object' || Array.isArray(root)) return false;\n const pagination = (root as Record<string, unknown>).pagination;\n if (!pagination || typeof pagination !== 'object' || Array.isArray(pagination)) return false;\n return (pagination as Record<string, unknown>).has_more === true;\n}\n\nfunction resolveRefsRoot(from: 'current_step' | 'context', ctx: ValidationContext): unknown {\n if (from === 'context') return ctx.storyboardContext ?? {};\n if (ctx.taskResult) return ctx.taskResult.data;\n if (ctx.httpResult) return ctx.httpResult.body;\n return undefined;\n}\n\nfunction resolveScopeEquals(equals: string, key: string, agentUrl: string): string {\n const raw = equals === '$agent_url' ? agentUrl : equals;\n return key.toLowerCase().endsWith('url') ? canonicalizeAgentUrlForScope(raw) : raw;\n}\n\nfunction normalizeIfUrlKey(value: unknown, key: string): unknown {\n return typeof value === 'string' && key.toLowerCase().endsWith('url') ? canonicalizeAgentUrlForScope(value) : value;\n}\n\nfunction isRefObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction refsMatch(a: Record<string, unknown>, b: Record<string, unknown>, keys: string[]): boolean {\n for (const key of keys) {\n // Own-property only: a storyboard author supplying `match_keys: ['constructor']`\n // must not match every object via prototype chain.\n if (!Object.prototype.hasOwnProperty.call(a, key) || !Object.prototype.hasOwnProperty.call(b, key)) {\n return false;\n }\n const av = a[key];\n const bv = b[key];\n // Missing match-key on either side is NOT a match — agents that omit a\n // key shouldn't fuzzy-match other agents that also happen to omit it.\n if (av === undefined || bv === undefined) return false;\n // URL-ish fields get trailing-slash / case normalization so declared\n // and probed URLs compare equal even when one side includes a trailing\n // \"/\". `format_id` fields are exact-compare.\n const normA = normalizeIfUrlKey(av, key);\n const normB = normalizeIfUrlKey(bv, key);\n if (normA !== normB) return false;\n }\n return true;\n}\n\nfunction projectRef(ref: Record<string, unknown>, keys: string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(ref, key)) out[key] = ref[key];\n }\n return out;\n}\n\n// Observation hygiene caps (adcp-client#714). Compliance reports may be\n// published or forwarded to third parties, so every ref field emitted in\n// observations / actual.missing is length-bounded and URL fields have\n// credentials scrubbed before they leave the runner.\nconst REF_FIELD_MAX_LEN = 512;\nconst MAX_OBSERVATIONS = 50;\n\n/**\n * Projection of a ref intended for grader-visible output (observations,\n * `actual.missing`). Strips userinfo from URL fields, caps string length,\n * and passes non-string values through untouched. Kept distinct from the\n * internal `projectRef` because dedup relies on stable JSON projection —\n * truncating strings would false-collapse refs that differ only in their\n * truncated suffix.\n */\nfunction projectRefForReport(ref: Record<string, unknown>, keys: string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of keys) {\n if (!Object.prototype.hasOwnProperty.call(ref, key)) continue;\n const v = ref[key];\n if (typeof v === 'string') {\n out[key] = sanitizeFieldString(v, key.toLowerCase().endsWith('url'));\n } else {\n out[key] = v;\n }\n }\n return out;\n}\n\n// Regex fallback that scrubs `scheme://user:pass@host` credential shapes\n// in free-text fields — covers cases where `new URL()` can't parse the value\n// (partial URL, extra prose, trailing whitespace) but a user:pass@ substring\n// still leaks credentials to grader reports.\nconst CREDENTIAL_SHAPE_RE = /([a-zA-Z][a-zA-Z0-9+.-]*:\\/\\/)[^/\\s@]+@/g;\n\nfunction sanitizeFieldString(value: string, isUrlField: boolean): string {\n // Truncate first so a multi-MB hostile string doesn't force URL parsing\n // over the whole payload. Truncation uses code points so surrogate pairs\n // aren't cleaved into invalid UTF-16 strings.\n let out = value;\n if (out.length > REF_FIELD_MAX_LEN) {\n out =\n Array.from(out)\n .slice(0, REF_FIELD_MAX_LEN - 1)\n .join('') + '…';\n }\n if (isUrlField) {\n try {\n const u = new URL(out);\n // Reject dangerous schemes in URL-keyed fields: downstream compliance\n // UIs that render `agent_url` as a clickable link otherwise inherit\n // `javascript:` / `data:` / `file:` as a stored-XSS vector.\n if (u.protocol !== 'https:' && u.protocol !== 'http:') {\n return `<non-http scheme: ${u.protocol.replace(/[^a-z+.-]/gi, '')}>`;\n }\n if (u.username || u.password) {\n u.username = '';\n u.password = '';\n out = u.toString();\n }\n } catch {\n // Not a parseable URL — fall through to the regex scrub below.\n }\n }\n // Belt-and-suspenders: strip any remaining `scheme://user:pass@` shapes,\n // whether or not the field is URL-keyed. A hostile agent may plant\n // credential-shaped substrings inside an `id` or a non-URL ref field.\n out = out.replace(CREDENTIAL_SHAPE_RE, '$1');\n return out;\n}\n\nfunction capObservations(observations: Array<Record<string, unknown>>): Array<Record<string, unknown>> | undefined {\n if (observations.length === 0) return undefined;\n if (observations.length <= MAX_OBSERVATIONS) return observations;\n const kept = observations.slice(0, MAX_OBSERVATIONS - 1);\n kept.push({ kind: 'observations_truncated', dropped: observations.length - kept.length });\n return kept;\n}\n\n/**\n * Deduplicate refs by their projected match-key tuple so a single broken\n * reference in a 50-product response doesn't show up 50× in `actual.missing`.\n */\nfunction dedupRefs(refs: Array<Record<string, unknown>>, keys: string[]): Array<Record<string, unknown>> {\n const seen = new Map<string, Record<string, unknown>>();\n for (const ref of refs) {\n const k = JSON.stringify(projectRef(ref, keys));\n if (!seen.has(k)) seen.set(k, ref);\n }\n return Array.from(seen.values());\n}\n\n// ────────────────────────────────────────────────────────────\n// Numeric comparison + cross-step value checks\n//\n// field_less_than (strict <), field_at_most (≤), field_at_least (≥),\n// and field_equals_context (deep-equals) all read their comparand\n// from `ctx.storyboardContext` — the accumulator populated by\n// `context_outputs` rules across step boundaries — and fall back\n// to the literal `value` field when no `context_key` is set. The\n// precedent for context resolution is refs_resolve's\n// `resolveRefsRoot('context', ctx)` path. The three numeric checks\n// share `validateNumericComparison`; field_equals_context has its\n// own path because its operands aren't required to be numeric.\n// Added for adcp#2642 (less_than, equals_context) and\n// adcp-client#1839 (at_most, at_least).\n// ────────────────────────────────────────────────────────────\n\n/**\n * Resolve the comparand for a cross-step check from the storyboard context.\n *\n * Returns `{ found: true, value }` when the context key is set and present,\n * `{ found: false, observation }` when context_key is set but absent (the\n * prior step may have been skipped on a branch-set path — not an error),\n * and `{ found: true, value: validation.value }` when no context_key is\n * given (fall back to literal comparand).\n */\nfunction resolveContextComparand(\n validation: StoryboardValidation,\n ctx: ValidationContext\n): { found: true; value: unknown } | { found: false; observation: string } {\n if (!validation.context_key) {\n return { found: true, value: validation.value };\n }\n if (!ctx.storyboardContext) {\n return {\n found: false,\n observation: `context_key_absent: storyboardContext not available for key \"${validation.context_key}\"`,\n };\n }\n const ctxValue = ctx.storyboardContext[validation.context_key];\n if (!(validation.context_key in ctx.storyboardContext) || ctxValue === undefined) {\n return {\n found: false,\n observation: `context_key_absent: key \"${validation.context_key}\" not found in storyboard context (prior step may have been skipped)`,\n };\n }\n return { found: true, value: ctxValue };\n}\n\ninterface NumericOp {\n /** Check name surfaced in result.check and error prose. */\n check: 'field_less_than' | 'field_greater_than' | 'field_at_most' | 'field_at_least';\n /** Human-readable operator (`<`, `>`, `<=`, `>=`) used in error messages. */\n symbol: string;\n /** Comparator returning true when `actual` satisfies the assertion vs `comparand`. */\n compare: (actual: number, comparand: number) => boolean;\n}\n\nconst NUMERIC_OPS = {\n less_than: { check: 'field_less_than', symbol: '<', compare: (a, c) => a < c },\n greater_than: { check: 'field_greater_than', symbol: '>', compare: (a, c) => a > c },\n at_most: { check: 'field_at_most', symbol: '<=', compare: (a, c) => a <= c },\n at_least: { check: 'field_at_least', symbol: '>=', compare: (a, c) => a >= c },\n} as const satisfies Record<string, NumericOp>;\n\nfunction validateNumericComparison(\n validation: StoryboardValidation,\n ctx: ValidationContext,\n op: NumericOp\n): ValidationResult {\n if (!validation.path) {\n return {\n check: op.check,\n passed: false,\n description: validation.description,\n error: `No path specified for ${op.check} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n const comparandResult = resolveContextComparand(validation, ctx);\n if (!comparandResult.found) {\n return {\n check: op.check,\n passed: true,\n description: validation.description,\n observations: [comparandResult.observation],\n };\n }\n\n const actual = resolvePath(resolveTarget(ctx).data, validation.path);\n const comparand = comparandResult.value;\n const pointer = toJsonPointer(validation.path);\n\n if (actual === undefined || actual === null) {\n return {\n check: op.check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Field not found at path: ${validation.path}`,\n json_pointer: pointer,\n expected: `numeric value ${op.symbol} ${JSON.stringify(comparand)}`,\n actual: null,\n };\n }\n if (typeof actual !== 'number' || !Number.isFinite(actual)) {\n return {\n check: op.check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `${op.check} requires a finite number at path \"${validation.path}\"; got ${typeof actual} ${JSON.stringify(actual)}`,\n json_pointer: pointer,\n expected: `finite number ${op.symbol} ${JSON.stringify(comparand)}`,\n actual: actual ?? null,\n };\n }\n if (typeof comparand !== 'number' || !Number.isFinite(comparand)) {\n return {\n check: op.check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `${op.check} comparand must be a finite number; got ${typeof comparand} ${JSON.stringify(comparand)}`,\n json_pointer: pointer,\n expected: `finite number (comparand)`,\n actual: actual,\n };\n }\n\n if (op.compare(actual, comparand)) {\n return {\n check: op.check,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: op.check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected ${JSON.stringify(actual)} ${op.symbol} ${JSON.stringify(comparand)}`,\n json_pointer: pointer,\n expected: `${op.symbol} ${JSON.stringify(comparand)}`,\n actual,\n };\n}\n\nfunction validateFieldEqualsContext(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n if (!validation.path) {\n return {\n check: 'field_equals_context',\n passed: false,\n description: validation.description,\n error: 'No path specified for field_equals_context validation',\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n if (!validation.context_key) {\n return {\n check: 'field_equals_context',\n passed: false,\n description: validation.description,\n error: 'field_equals_context requires context_key to be set',\n json_pointer: null,\n expected: 'context_key must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n const comparandResult = resolveContextComparand(validation, ctx);\n if (!comparandResult.found) {\n return {\n check: 'field_equals_context',\n passed: true,\n description: validation.description,\n observations: [comparandResult.observation],\n };\n }\n\n const actual = resolvePath(resolveTarget(ctx).data, validation.path);\n const expected = comparandResult.value;\n const pointer = toJsonPointer(validation.path);\n\n const passed = valuesMatch(actual, expected);\n if (passed) {\n return {\n check: 'field_equals_context',\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: 'field_equals_context',\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected ${JSON.stringify(expected)} (from context[\"${validation.context_key}\"]); got ${JSON.stringify(actual ?? null)}`,\n json_pointer: pointer,\n expected,\n actual: actual ?? null,\n };\n}\n\nfunction validateFieldInContextArray(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n if (!validation.path) {\n return {\n check: 'field_in_context_array',\n passed: false,\n description: validation.description,\n error: 'No path specified for field_in_context_array validation',\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n if (!validation.context_key) {\n return {\n check: 'field_in_context_array',\n passed: false,\n description: validation.description,\n error: 'field_in_context_array requires context_key to be set',\n json_pointer: null,\n expected: 'context_key must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n const comparandResult = resolveContextComparand(validation, ctx);\n if (!comparandResult.found) {\n return {\n check: 'field_in_context_array',\n passed: true,\n description: validation.description,\n observations: [comparandResult.observation],\n };\n }\n\n const allowed = comparandResult.value;\n const actual = resolvePath(resolveTarget(ctx).data, validation.path);\n const pointer = toJsonPointer(validation.path);\n if (!Array.isArray(allowed)) {\n return {\n check: 'field_in_context_array',\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected context[\"${validation.context_key}\"] to be an array; got ${JSON.stringify(allowed)}`,\n json_pointer: pointer,\n expected: 'context value must be an array',\n actual: allowed,\n };\n }\n\n if (allowed.some(candidate => valuesMatch(actual, candidate))) {\n return {\n check: 'field_in_context_array',\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check: 'field_in_context_array',\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected ${JSON.stringify(actual ?? null)} to be a member of context[\"${validation.context_key}\"] (${JSON.stringify(allowed)})`,\n json_pointer: pointer,\n expected: allowed,\n actual: actual ?? null,\n };\n}\n\nfunction validateAllFieldsInContextArray(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const check = 'all_fields_in_context_array';\n if (!validation.path) {\n return {\n check,\n passed: false,\n description: validation.description,\n error: `No path specified for ${check} validation`,\n json_pointer: null,\n expected: 'path must be set in storyboard validation entry',\n actual: null,\n };\n }\n if (!validation.context_key) {\n return {\n check,\n passed: false,\n description: validation.description,\n error: `${check} requires context_key to be set`,\n json_pointer: null,\n expected: 'context_key must be set in storyboard validation entry',\n actual: null,\n };\n }\n\n const comparandResult = resolveContextComparand(validation, ctx);\n if (!comparandResult.found) {\n return {\n check,\n passed: true,\n description: validation.description,\n observations: [comparandResult.observation],\n };\n }\n\n const allowed = comparandResult.value;\n const actual = resolvePathAll(resolveTarget(ctx).data, validation.path);\n const pointer = toJsonPointer(validation.path);\n if (!Array.isArray(allowed)) {\n return {\n check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected context[\"${validation.context_key}\"] to be an array; got ${JSON.stringify(allowed)}`,\n json_pointer: pointer,\n expected: 'context value must be an array',\n actual: allowed,\n };\n }\n\n const passed = actual.every(value => allowed.some(candidate => deepEqualJsonValue(value, candidate)));\n if (passed) {\n return {\n check,\n passed: true,\n description: validation.description,\n path: validation.path,\n json_pointer: pointer,\n };\n }\n return {\n check,\n passed: false,\n description: validation.description,\n path: validation.path,\n error: `Expected every value at ${validation.path} to be a member of context[\"${validation.context_key}\"]`,\n json_pointer: pointer,\n expected: allowed,\n actual,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// upstream_traffic — anti-façade side-effect assertion\n// ────────────────────────────────────────────────────────────\n\n/**\n * Authored check that asserts side-effects against the adopter's\n * `comply_test_controller`'s `query_upstream_traffic` scenario.\n *\n * Adopters who do not advertise `query_upstream_traffic` in\n * `list_scenarios` opt out — every `upstream_traffic` validation grades\n * `not_applicable`. Adopters who advertise it but return zero recorded\n * calls in the assertion window grade `failed` (the façade signal).\n *\n * The runner pre-fetches the controller's response per\n * `since_timestamp` window and stashes it on `ctx.upstreamTraffic` so\n * this synchronous dispatcher can grade without itself making controller\n * calls. Per runner-output-contract.yaml v2.0.0, `request` / `response`\n * on the validation_result point to the CONTROLLER call, not the\n * storyboard step's AdCP request.\n */\nfunction validateUpstreamTraffic(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const expected = buildUpstreamTrafficExpected(validation);\n const invalidIdentifierPaths = collectInvalidIdentifierPaths(validation.identifier_paths);\n if (invalidIdentifierPaths.length > 0) {\n return {\n check: 'upstream_traffic',\n passed: false,\n description: validation.description,\n error:\n 'storyboard authoring error: invalid upstream_traffic.identifier_paths: ' +\n invalidIdentifierPaths.map(issue => `${issue.path} (${issue.reason})`).join('; '),\n json_pointer: null,\n expected,\n actual: {\n matched_count: 0,\n total_calls: 0,\n missing_payload_paths: [],\n missing_identifier_values: [],\n invalid_identifier_paths: invalidIdentifierPaths,\n },\n schema_id: null,\n schema_url: null,\n };\n }\n\n const upstream = ctx.upstreamTraffic;\n // Adopter opted out (or controller wasn't detected): grade not_applicable.\n // missing_test_controller controller-side, not failed — opt-in by adopter\n // capability per the spec.\n if (!upstream || !upstream.advertised) {\n return {\n check: 'upstream_traffic',\n passed: true,\n not_applicable: true,\n description: validation.description,\n note: 'adopter did not advertise query_upstream_traffic in list_scenarios — graded as not_applicable',\n json_pointer: null,\n expected,\n actual: null,\n schema_id: null,\n schema_url: null,\n };\n }\n\n // A `since: prior_step_id` reference that didn't resolve to any recorded\n // prior step is a storyboard authoring bug — fail loudly rather than\n // silently widen to this step's window (which would let misspelled refs\n // pass vacuously).\n if (validation.since && upstream.unresolvedSinceRefs?.has(validation.since)) {\n return {\n check: 'upstream_traffic',\n passed: false,\n description: validation.description,\n error: `since: \"${validation.since}\" did not resolve to any prior step's recorded request timestamp.`,\n json_pointer: null,\n expected,\n actual: null,\n schema_id: null,\n schema_url: null,\n };\n }\n\n const sinceKey = upstream.priorStepSinceMap?.get(validation.since ?? '') ?? upstream.thisStepSince;\n const query = upstream.queries.get(sinceKey);\n if (!query) {\n return {\n check: 'upstream_traffic',\n passed: false,\n description: validation.description,\n error: `Runner did not pre-fetch query_upstream_traffic for since_timestamp=${sinceKey}.`,\n json_pointer: null,\n expected,\n actual: null,\n schema_id: null,\n schema_url: null,\n };\n }\n\n // Controller call itself errored (transport or controller-side fault).\n // Surface the error rather than treating an empty result as \"no traffic\".\n // Truncate the agent-controlled error string to match the runner's\n // `MAX_ERROR_LENGTH` posture on every other validation_result.error.\n if (!('success' in query.payload) || query.payload.success !== true) {\n const errMsg = 'error' in query.payload ? query.payload.error : 'controller returned a non-success response';\n if ('error_kind' in query.payload && query.payload.error_kind === 'jcs_non_finite') {\n return {\n check: 'upstream_traffic',\n passed: true,\n not_applicable: true,\n description: validation.description,\n note: 'digest attestation could not canonicalize a non-finite JSON number - graded not_applicable',\n json_pointer: null,\n expected,\n actual: { matched_count: 0, total_calls: 0, missing_payload_paths: [], missing_identifier_values: [] },\n schema_id: null,\n schema_url: null,\n request: query.request,\n response: query.response,\n };\n }\n return {\n check: 'upstream_traffic',\n passed: false,\n description: validation.description,\n error: truncateValidationError(`query_upstream_traffic failed: ${errMsg}`),\n json_pointer: null,\n expected,\n actual: { matched_count: 0, total_calls: 0, missing_payload_paths: [], missing_identifier_values: [] },\n schema_id: null,\n schema_url: null,\n request: query.request,\n response: query.response,\n };\n }\n\n const all = query.payload.recorded_calls ?? [];\n const totalCalls = all.length;\n const matched = filterByEndpointPattern(all, validation.endpoint_pattern);\n const matchedCount = matched.length;\n const minCount = validation.min_count ?? 1;\n\n // payload_must_contain results bucket two ways: paths that no matched\n // call satisfied despite inspectable raw JSON evidence (failure), and\n // paths with no portable payload evidence to inspect (`not_applicable`).\n // Any actionable raw JSON miss keeps the validation failed; otherwise any\n // not_applicable path downgrades the validation from pass to not_applicable.\n const missingPayloadPaths: string[] = [];\n const notApplicablePaths: string[] = [];\n if (validation.payload_must_contain && validation.payload_must_contain.length > 0) {\n for (const spec of validation.payload_must_contain) {\n const result = anyMatchedCallSatisfies(matched, spec);\n if (result.satisfied) continue;\n if (result.not_applicable) {\n notApplicablePaths.push(spec.path);\n } else {\n missingPayloadPaths.push(spec.path);\n }\n }\n }\n\n // identifier_paths: extract every value at each declared path against the\n // storyboard's sample_request (author-controlled vectors), then assert each\n // resolved value appears at any depth in some matched call's payload. Spec\n // is explicit: ALL resolved values must be present — single-placeholder\n // fabrication is the threat. Replaces the earlier `buyer_identifier_echo`\n // boolean shorthand per spec PR adcp#3816.\n const missingIdentifierValues: unknown[] = [];\n const notApplicableIdentifierValues: unknown[] = [];\n if (validation.identifier_paths && validation.identifier_paths.length > 0) {\n const requestPayload = ctx.request?.payload;\n const sample =\n requestPayload && typeof requestPayload === 'object' && !Array.isArray(requestPayload)\n ? (requestPayload as Record<string, unknown>)\n : ctx.storyboardStep?.sample_request;\n for (const path of validation.identifier_paths) {\n const vectors = sample !== undefined ? resolvePortableIdentifierPathAll(sample, path) : [];\n for (const vector of vectors) {\n if (vector === undefined || vector === null) continue;\n const digest = typeof vector === 'string' ? upstream.identifierDigestByValue?.get(vector) : undefined;\n const result = anyMatchedCallEchoesValue(matched, vector, digest);\n if (result.satisfied) continue;\n if (result.not_applicable) {\n notApplicableIdentifierValues.push(vector);\n } else {\n missingIdentifierValues.push(vector);\n }\n }\n }\n }\n\n const hasRawIntrospectionAssertions =\n (validation.payload_must_contain?.length ?? 0) > 0 || (validation.identifier_paths?.length ?? 0) > 0;\n const rawRequiredDigestDowngrade =\n validation.attestation_mode_required === 'raw' &&\n hasRawIntrospectionAssertions &&\n matched.length > 0 &&\n matched.every(call => call.attestation_mode === 'digest');\n\n if (rawRequiredDigestDowngrade) {\n missingPayloadPaths.length = 0;\n missingIdentifierValues.length = 0;\n }\n\n const countOk = minCount === 0 ? matchedCount === 0 : matchedCount >= minCount;\n const payloadOk = missingPayloadPaths.length === 0;\n const echoOk = missingIdentifierValues.length === 0;\n const passed = countOk && (rawRequiredDigestDowngrade || (payloadOk && echoOk));\n\n // Per spec: a payload_must_contain assertion whose only available evidence\n // is not portable to inspect grades not_applicable. When any required path\n // lands in that bucket (and count + echo passed with no actionable payload\n // misses), the whole validation grades not_applicable rather than passed.\n const anyPayloadNotApplicable =\n (validation.payload_must_contain?.length ?? 0) > 0 &&\n notApplicablePaths.length > 0 &&\n missingPayloadPaths.length === 0;\n const hasMeaningfulPayloadPass =\n (validation.payload_must_contain?.length ?? 0) > 0 && payloadOk && !anyPayloadNotApplicable;\n const allIdentifiersNotApplicable =\n (validation.identifier_paths?.length ?? 0) > 0 &&\n missingIdentifierValues.length === 0 &&\n notApplicableIdentifierValues.length > 0;\n const not_applicable =\n passed &&\n countOk &&\n (rawRequiredDigestDowngrade ||\n anyPayloadNotApplicable ||\n (allIdentifiersNotApplicable && !hasMeaningfulPayloadPass));\n\n const actual = {\n matched_count: matchedCount,\n total_calls: totalCalls,\n missing_payload_paths: missingPayloadPaths,\n missing_identifier_values: missingIdentifierValues,\n not_applicable_payload_paths: notApplicablePaths,\n not_applicable_identifier_values: notApplicableIdentifierValues,\n ...(upstream.identifierDigestLimitExceeded && {\n identifier_digest_limit_exceeded: upstream.identifierDigestLimitExceeded,\n }),\n };\n\n // RFC 6901 pointer: when one specific call's payload failed\n // payload_must_contain, point at that call's payload; null when the\n // failure is a count mismatch or no specific call is implicated.\n let jsonPointer: string | null = null;\n if (!payloadOk && matched.length > 0) {\n const actionableMiss = matched.find(\n call => call.attestation_mode === 'raw' && isJsonContentType(call.content_type)\n );\n const idx = all.indexOf(actionableMiss ?? matched[0]!);\n if (idx >= 0) jsonPointer = `/recorded_calls/${idx}/payload`;\n }\n\n if (passed) {\n return {\n check: 'upstream_traffic',\n passed: true,\n ...(not_applicable && { not_applicable: true }),\n ...(not_applicable && {\n note: rawRequiredDigestDowngrade\n ? `attestation_mode_required: raw but controller returned digest attestations — graded not_applicable`\n : allIdentifiersNotApplicable\n ? upstream.identifierDigestLimitExceeded\n ? `identifier_paths exceeded the runner digest buffer; recorder buffer capped at ${upstream.identifierDigestLimitExceeded.limit} unique digests with ${upstream.identifierDigestLimitExceeded.clipped} overflow value(s) clipped — graded not_applicable`\n : `identifier_paths only matched digest attestations without portable proofs — graded not_applicable`\n : `payload_must_contain paths could not be fully inspected in raw JSON attestations — graded not_applicable`,\n }),\n description: validation.description,\n json_pointer: null,\n expected,\n actual,\n schema_id: null,\n schema_url: null,\n };\n }\n\n const errParts: string[] = [];\n if (!countOk) {\n errParts.push(\n minCount === 0\n ? `expected zero matching call(s); observed ${matchedCount}`\n : `expected at least ${minCount} matching call(s); observed ${matchedCount}`\n );\n }\n if (!payloadOk) errParts.push(`missing payload paths: ${missingPayloadPaths.join(', ')}`);\n if (!echoOk)\n errParts.push(`identifier values not echoed: ${missingIdentifierValues.map(v => JSON.stringify(v)).join(', ')}`);\n\n return {\n check: 'upstream_traffic',\n passed: false,\n description: validation.description,\n error: errParts.join('; '),\n json_pointer: jsonPointer,\n expected,\n actual,\n schema_id: null,\n schema_url: null,\n request: query.request,\n response: query.response,\n };\n}\n\nfunction collectInvalidIdentifierPaths(paths: string[] | undefined): PortableIdentifierPathIssue[] {\n const invalid: PortableIdentifierPathIssue[] = [];\n for (const path of paths ?? []) {\n const reason = validatePortableIdentifierPath(path);\n if (reason) invalid.push({ path, reason });\n }\n return invalid;\n}\n\n/**\n * Cap on agent / controller-controlled error strings inlined into a\n * `validation_result.error` field. Mirrors the runner's `MAX_ERROR_LENGTH`\n * posture so a hostile or buggy controller can't bloat the compliance\n * report (or LLM context window) by returning a megabyte error message.\n */\nconst VALIDATION_ERROR_MAX_LENGTH = 2000;\n\nfunction truncateValidationError(s: string): string {\n return s.length > VALIDATION_ERROR_MAX_LENGTH ? s.slice(0, VALIDATION_ERROR_MAX_LENGTH) + '...[truncated]' : s;\n}\n\nfunction buildUpstreamTrafficExpected(validation: StoryboardValidation): Record<string, unknown> {\n const expected: Record<string, unknown> = {};\n if (validation.min_count !== undefined) expected.min_count = validation.min_count;\n else expected.min_count = 1;\n if (validation.endpoint_pattern !== undefined) expected.endpoint_pattern = validation.endpoint_pattern;\n if (validation.payload_must_contain !== undefined) expected.payload_must_contain = validation.payload_must_contain;\n if (validation.attestation_mode_required !== undefined) {\n expected.attestation_mode_required = validation.attestation_mode_required;\n }\n if (validation.preferred_attestation_mode !== undefined) {\n expected.preferred_attestation_mode = validation.preferred_attestation_mode;\n }\n if (validation.identifier_paths !== undefined) expected.identifier_paths = validation.identifier_paths;\n return expected;\n}\n\n/**\n * Filter `recorded_calls` by an `endpoint_pattern` glob. The pattern is\n * matched against `recorded_calls[].endpoint` (`<METHOD> <URL>`). `*`\n * expands to any-character-run; other regex metacharacters are escaped\n * literally. Returns the input unchanged when no pattern is set.\n */\nfunction filterByEndpointPattern(calls: RecordedCall[], pattern: string | undefined): RecordedCall[] {\n if (!pattern) return calls;\n const re = globToRegExp(pattern);\n return calls.filter(c => re.test(c.endpoint));\n}\n\n/**\n * Returns whether at least one matched call's payload satisfies the\n * `payload_must_contain` predicate, plus a flag indicating the assertion\n * graded `not_applicable` (no matched call had a JSON payload to inspect).\n *\n * Per spec PRs adcp#3816 (initial JSONPath restriction) and adcp#3987\n * (closes the substring-fallback ambiguity #3845):\n *\n * - JSONPath path-based matching is valid ONLY when `content_type` is\n * `application/json` or `*\\/*+json` (RFC 6839 §3.1 structured-syntax\n * suffix).\n * - Non-JSON calls + ANY match mode (`present` / `equals` /\n * `contains_any`): grade `not_applicable`. Earlier sketches downgraded\n * `match: present` to a terminal-key substring search of the raw\n * payload — that heuristic created false positives (a payload\n * mentioning the key name in any context — URL fragment, comment,\n * unrelated metadata field — would pass), exactly the kind of\n * loophole the anti-façade contract exists to close. Storyboards\n * needing a non-JSON value-carried signal use `identifier_paths`\n * instead — substring-searches storyboard-supplied VALUES (not\n * path-derived strings), encoding-agnostic, no false-positive\n * surface.\n *\n * Path syntax is dotted-with-`[*]` only; RFC 9535 descendant operator\n * (`$..foo`) is explicitly NOT supported per the storyboard-schema patch.\n */\nfunction anyMatchedCallSatisfies(\n calls: RecordedCall[],\n spec: UpstreamTrafficPayloadMatch\n): { satisfied: boolean; not_applicable: boolean } {\n let sawApplicableCall = false;\n for (const call of calls) {\n if (call.attestation_mode !== 'raw') {\n continue;\n }\n const isJson = isJsonContentType(call.content_type);\n // All match modes require a structured-JSON payload — non-JSON calls\n // don't contribute regardless of mode (adcp#3987).\n if (!isJson) {\n continue;\n }\n sawApplicableCall = true;\n const candidates = resolveJsonPathLite(call.payload, spec.path);\n if (candidates.length === 0) continue;\n if (spec.match === 'present') {\n return { satisfied: true, not_applicable: false };\n } else if (spec.match === 'equals') {\n if (candidates.some(v => deepEqual(v, spec.value))) return { satisfied: true, not_applicable: false };\n } else if (spec.match === 'contains_any') {\n const allowed = spec.allowed_values ?? [];\n if (candidates.some(v => allowed.some(a => deepEqual(v, a)))) return { satisfied: true, not_applicable: false };\n }\n }\n return { satisfied: false, not_applicable: !sawApplicableCall };\n}\n\n/**\n * JSONPath-lite resolver — dotted-with-`[*]` form only, per spec PR\n * adcp#3816's pin to `parsePathWithWildcards` semantics. RFC 9535\n * descendant operator (`$..foo`) is explicitly NOT supported. A leading\n * `$.` / `$` prefix is tolerated and stripped; the canonical form authors\n * are encouraged to write is the bare positional path.\n */\nfunction resolveJsonPathLite(root: unknown, path: string): unknown[] {\n if (!path) return [];\n let p = path.trim();\n if (p.startsWith('$.')) p = p.slice(2);\n else if (p.startsWith('$')) p = p.slice(1);\n if (p.startsWith('.')) p = p.slice(1);\n return walkLitePath(root, p);\n}\n\n/**\n * Cap on the number of terminal values JSONPath-lite emission can produce\n * across all wildcard fan-out, defending the runner against a hostile\n * `recorded_calls[].payload` shaped to maximize fan-out. Mirrors the\n * existing `RESOLVE_PATH_ALL_MAX` cap in path.ts.\n */\nconst JSONPATH_LITE_MAX_RESULTS = 10_000;\n\nfunction walkLitePath(root: unknown, path: string): unknown[] {\n if (path === '') return root === undefined ? [] : [root];\n // Split on `.` but keep `[*]` and `[N]` attached to their keys.\n const tokens = path.split(/(?=\\.)|(?<=\\])/g).filter(Boolean);\n let frontier: unknown[] = [root];\n for (const rawToken of tokens) {\n const token = rawToken.startsWith('.') ? rawToken.slice(1) : rawToken;\n const next: unknown[] = [];\n for (const cur of frontier) {\n if (next.length >= JSONPATH_LITE_MAX_RESULTS) break;\n if (cur === undefined || cur === null) continue;\n if (token === '[*]') {\n if (Array.isArray(cur)) next.push(...cur);\n } else if (/^\\[\\d+\\]$/.test(token)) {\n const idx = parseInt(token.slice(1, -1), 10);\n if (Array.isArray(cur)) next.push(cur[idx]);\n } else if (token.includes('[*]')) {\n const [key, ...rest] = token.split('[*]');\n const keyVal = key && typeof cur === 'object' && cur !== null ? (cur as Record<string, unknown>)[key] : cur;\n if (Array.isArray(keyVal)) {\n const tail = rest.join('[*]');\n if (tail === '') next.push(...keyVal);\n else next.push(...keyVal.flatMap(v => walkLitePath(v, tail)));\n }\n } else if (typeof cur === 'object' && cur !== null) {\n next.push((cur as Record<string, unknown>)[token]);\n }\n }\n frontier = next.slice(0, JSONPATH_LITE_MAX_RESULTS).filter(v => v !== undefined);\n }\n return frontier;\n}\n\n/**\n * Depth cap for any-depth value containment check. Defends the runner\n * against a hostile `recorded_calls[].payload` shaped as a 100k-deep\n * nested object that would blow the recursion stack.\n */\nconst CONTAINS_VALUE_MAX_DEPTH = 256;\n\nfunction anyMatchedCallEchoesValue(\n calls: RecordedCall[],\n value: unknown,\n valueDigest?: string\n): { satisfied: boolean; not_applicable: boolean } {\n let sawApplicableCall = false;\n for (const call of calls) {\n if (call.attestation_mode === 'digest') {\n if (!isJsonContentType(call.content_type)) continue;\n if (!valueDigest) continue;\n sawApplicableCall = true;\n if (call.identifier_match_proofs?.some(proof => proof.identifier_value_sha256 === valueDigest && proof.found)) {\n return { satisfied: true, not_applicable: false };\n }\n continue;\n }\n\n sawApplicableCall = true;\n // Non-JSON payloads land as raw strings — substring-match the\n // stringified vector. Defensible best-effort downgrade per the spec's\n // non-JSON fallback note.\n if (typeof call.payload === 'string') {\n if (typeof value === 'string' && call.payload.includes(value)) {\n return { satisfied: true, not_applicable: false };\n }\n continue;\n }\n if (containsValueAnyDepth(call.payload, value, 0)) return { satisfied: true, not_applicable: false };\n }\n return { satisfied: false, not_applicable: !sawApplicableCall };\n}\n\nfunction containsValueAnyDepth(root: unknown, target: unknown, depth: number): boolean {\n if (depth > CONTAINS_VALUE_MAX_DEPTH) return false;\n if (deepEqual(root, target)) return true;\n if (Array.isArray(root)) {\n for (const item of root) if (containsValueAnyDepth(item, target, depth + 1)) return true;\n return false;\n }\n if (root !== null && typeof root === 'object') {\n for (const v of Object.values(root as Record<string, unknown>)) {\n if (containsValueAnyDepth(v, target, depth + 1)) return true;\n }\n }\n return false;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null || typeof a !== typeof b) return false;\n if (typeof a !== 'object') return false;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== (b as unknown[]).length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], (b as unknown[])[i])) return false;\n }\n return true;\n }\n if (Array.isArray(b)) return false;\n const ao = a as Record<string, unknown>;\n const bo = b as Record<string, unknown>;\n const ak = Object.keys(ao);\n const bk = Object.keys(bo);\n if (ak.length !== bk.length) return false;\n for (const k of ak) {\n if (!Object.prototype.hasOwnProperty.call(bo, k)) return false;\n if (!deepEqual(ao[k], bo[k])) return false;\n }\n return true;\n}\n\n/**\n * Cross-response: every resolved dispatch carries the same value at `path`.\n * Spec: test-kits/parallel-dispatch-runner.yaml (rule 9 / first-insert-wins).\n *\n * Grading rules:\n * - `ctx.crossResponses` absent → not_applicable (single-dispatch step).\n * - Fewer than 2 dispatches resolved → fail (the assertion requires a\n * cross-response comparison; one survivor doesn't prove the seller\n * deterministically resolved the race).\n * - All resolved values equal → pass.\n * - Any disagreement → fail; the result lists the distinct values observed\n * so reviewers can spot the duplicate-resource case at a glance.\n */\nfunction validateCrossResponseFieldEqual(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const cr = ctx.crossResponses;\n const path = validation.path ?? '';\n if (!cr) {\n return {\n check: validation.check,\n passed: true,\n not_applicable: true,\n description: validation.description,\n note: 'step has no parallel_dispatch fan-out; cross-response checks grade not_applicable on single-dispatch steps',\n json_pointer: toJsonPointer(path),\n };\n }\n if (cr.resolved.length < 2) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n expected: 'at least 2 resolved dispatches with equal values at the path',\n actual: `${cr.resolved.length} dispatch(es) resolved out of ${cr.dispatches.length}`,\n schema_id: null,\n schema_url: null,\n };\n }\n const values = cr.resolved.map(tr => resolvePath(tr.data as Record<string, unknown> | undefined, path));\n const first = values[0];\n const allEqual = values.every(v => deepEqual(v, first));\n if (allEqual) {\n return {\n check: validation.check,\n passed: true,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n actual: first,\n };\n }\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n expected: 'all resolved dispatches return the same value at the path',\n actual: values,\n schema_id: null,\n schema_url: null,\n };\n}\n\nfunction validateReplayNotCachedRateLimit(validation: StoryboardValidation, ctx: ValidationContext): ValidationResult {\n const payload = resolveTarget(ctx).data as Record<string, unknown> | undefined;\n const tripResponse = payload?.trip_response;\n const replayResponse = payload?.replay_response;\n const targetTask = typeof payload?.target_task === 'string' ? payload.target_task : undefined;\n if (!tripResponse || typeof tripResponse !== 'object' || !replayResponse || typeof replayResponse !== 'object') {\n const missing = [\n !tripResponse || typeof tripResponse !== 'object' ? 'trip_response' : undefined,\n !replayResponse || typeof replayResponse !== 'object' ? 'replay_response' : undefined,\n ].filter((field): field is string => typeof field === 'string');\n return {\n check: validation.check,\n passed: true,\n not_applicable: true,\n description: validation.description,\n note: `step did not produce rate_limit_trip_runner ${missing.join(' and ')}; replay_not_cached_rate_limit grades not_applicable`,\n json_pointer: null,\n };\n }\n\n const tripCode = extractSnapshotErrorCode(tripResponse as Record<string, unknown>, targetTask);\n const replayCode = extractSnapshotErrorCode(replayResponse as Record<string, unknown>, targetTask);\n if (tripCode !== 'RATE_LIMITED') {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: '/trip_response/error/code',\n expected: 'RATE_LIMITED trip_response error code',\n actual: tripCode ?? null,\n schema_id: null,\n schema_url: null,\n };\n }\n if (replayCode === 'RATE_LIMITED') {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n error: 'rate_limit_response_cached_as_replay',\n json_pointer: '/replay_response/error/code',\n expected: 'replay_response must not return RATE_LIMITED from the idempotency cache',\n actual: replayCode,\n schema_id: null,\n schema_url: null,\n };\n }\n return {\n check: validation.check,\n passed: true,\n description: validation.description,\n json_pointer: '/replay_response/error/code',\n actual: replayCode ?? null,\n };\n}\n\nfunction extractSnapshotErrorCode(snapshot: Record<string, unknown>, taskName?: string): string | undefined {\n const structuredError = snapshot.error;\n if (structuredError && typeof structuredError === 'object') {\n const code = (structuredError as Record<string, unknown>).code;\n if (typeof code === 'string') return code;\n }\n const adcpError = snapshot.adcp_error;\n if (adcpError && typeof adcpError === 'object') {\n const code = (adcpError as Record<string, unknown>).code;\n if (typeof code === 'string') return code;\n }\n const data = snapshot.data;\n if (data && typeof data === 'object') {\n const extracted = extractTaskAdcpError({ success: snapshot.success === true, data }, taskName);\n if (extracted) return extracted.code;\n }\n return undefined;\n}\n\n/**\n * Cross-response: the cardinality of distinct values at `path` across all\n * resolved dispatches is in `allowed_values`. Spec:\n * test-kits/parallel-dispatch-runner.yaml.\n *\n * Grading rules:\n * - `ctx.crossResponses` absent → not_applicable.\n * - No dispatch resolved → fail.\n * - `allowed_values` missing or non-array → fail (authoring error).\n * - Distinct count ∈ allowed_values → pass.\n * - Otherwise → fail.\n */\nfunction validateCrossResponseCountDistinct(\n validation: StoryboardValidation,\n ctx: ValidationContext\n): ValidationResult {\n const cr = ctx.crossResponses;\n const path = validation.path ?? '';\n if (!cr) {\n return {\n check: validation.check,\n passed: true,\n not_applicable: true,\n description: validation.description,\n note: 'step has no parallel_dispatch fan-out; cross-response checks grade not_applicable on single-dispatch steps',\n json_pointer: toJsonPointer(path),\n };\n }\n if (!Array.isArray(validation.allowed_values) || validation.allowed_values.length === 0) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n expected: 'allowed_values: [<integer>, ...] declaring acceptable distinct counts',\n actual: validation.allowed_values,\n schema_id: null,\n schema_url: null,\n };\n }\n if (cr.resolved.length === 0) {\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n expected: 'at least one resolved dispatch',\n actual: `0 / ${cr.dispatches.length} dispatches resolved`,\n schema_id: null,\n schema_url: null,\n };\n }\n const distinct = new Set<string>();\n for (const tr of cr.resolved) {\n const v = resolvePath(tr.data as Record<string, unknown> | undefined, path);\n if (v === undefined || v === null) continue;\n distinct.add(JSON.stringify(v));\n }\n const distinctCount = distinct.size;\n const allowed = validation.allowed_values as number[];\n if (allowed.includes(distinctCount)) {\n return {\n check: validation.check,\n passed: true,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n actual: distinctCount,\n };\n }\n return {\n check: validation.check,\n passed: false,\n description: validation.description,\n json_pointer: toJsonPointer(path),\n expected: `distinct count ∈ ${JSON.stringify(allowed)}`,\n actual: distinctCount,\n schema_id: null,\n schema_url: null,\n };\n}\n\n// resolvePath re-exported from ./path for backwards compat\nexport { resolvePath } from './path';\n"],"mappings":"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","names":["issues","firstIssue","passed","resolvePath"]}