@adcp/sdk 13.0.0 → 13.0.2

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 (1419) hide show
  1. package/ADCP_VERSION +1 -1
  2. package/bin/adcp.js +102 -38
  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/runtime/entity-hydration.generated.js.map +1 -1
  812. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
  813. package/dist/lib/server/wire-spec-fields.generated.d.mts +29 -29
  814. package/dist/lib/server/wire-spec-fields.generated.d.ts +29 -29
  815. package/dist/lib/server/wire-spec-fields.generated.js +29 -29
  816. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -1
  817. package/dist/lib/server/wire-spec-fields.generated.mjs +29 -29
  818. package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
  819. package/dist/lib/testing/compliance/comply.d.mts +3 -0
  820. package/dist/lib/testing/compliance/comply.d.ts +3 -0
  821. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  822. package/dist/lib/testing/compliance/comply.js +5 -2
  823. package/dist/lib/testing/compliance/comply.js.map +1 -1
  824. package/dist/lib/testing/compliance/comply.mjs +5 -2
  825. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  826. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  827. package/dist/lib/testing/storyboard/compliance.js +13 -4
  828. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  829. package/dist/lib/testing/storyboard/compliance.mjs +13 -4
  830. package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
  831. package/dist/lib/testing/storyboard/loader.d.ts.map +1 -1
  832. package/dist/lib/testing/storyboard/loader.js +5 -0
  833. package/dist/lib/testing/storyboard/loader.js.map +1 -1
  834. package/dist/lib/testing/storyboard/loader.mjs +5 -0
  835. package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
  836. package/dist/lib/testing/storyboard/provenance.d.mts +3 -0
  837. package/dist/lib/testing/storyboard/provenance.d.ts +4 -0
  838. package/dist/lib/testing/storyboard/provenance.d.ts.map +1 -0
  839. package/dist/lib/testing/storyboard/provenance.js +38 -0
  840. package/dist/lib/testing/storyboard/provenance.js.map +1 -0
  841. package/dist/lib/testing/storyboard/provenance.mjs +13 -0
  842. package/dist/lib/testing/storyboard/provenance.mjs.map +1 -0
  843. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  844. package/dist/lib/testing/storyboard/runner.js +42 -5
  845. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  846. package/dist/lib/testing/storyboard/runner.mjs +43 -6
  847. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  848. package/dist/lib/testing/storyboard/test-kit.d.mts +35 -0
  849. package/dist/lib/testing/storyboard/test-kit.d.ts +35 -0
  850. package/dist/lib/testing/storyboard/test-kit.d.ts.map +1 -1
  851. package/dist/lib/testing/storyboard/test-kit.js +101 -6
  852. package/dist/lib/testing/storyboard/test-kit.js.map +1 -1
  853. package/dist/lib/testing/storyboard/test-kit.mjs +100 -6
  854. package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
  855. package/dist/lib/testing/storyboard/types.d.mts +2 -0
  856. package/dist/lib/testing/storyboard/types.d.ts +2 -0
  857. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  858. package/dist/lib/testing/storyboard/types.js.map +1 -1
  859. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  860. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  861. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  862. package/dist/lib/types/comply-test-controller.d.ts +1 -1
  863. package/dist/lib/types/core.generated.d.mts +2 -2
  864. package/dist/lib/types/core.generated.d.ts +2 -2
  865. package/dist/lib/types/core.generated.js.map +1 -1
  866. package/dist/lib/types/get-adcp-capabilities.d.ts +2 -2
  867. package/dist/lib/types/get-products.d.ts +2 -2
  868. package/dist/lib/types/get-task-status.d.ts +1 -1
  869. package/dist/lib/types/log-event.d.ts +1 -1
  870. package/dist/lib/types/manifest.generated.d.mts +3 -3
  871. package/dist/lib/types/manifest.generated.d.ts +3 -3
  872. package/dist/lib/types/manifest.generated.js.map +1 -1
  873. package/dist/lib/types/manifest.generated.mjs.map +1 -1
  874. package/dist/lib/types/per-tool-index.json +1 -1
  875. package/dist/lib/types/sync-audiences.d.ts +1 -1
  876. package/dist/lib/types/tools.generated.d.mts +2 -2
  877. package/dist/lib/types/tools.generated.d.ts +2 -2
  878. package/dist/lib/types/tools.generated.js.map +1 -1
  879. package/dist/lib/version.d.mts +7 -7
  880. package/dist/lib/version.d.ts +7 -7
  881. package/dist/lib/version.d.ts.map +1 -1
  882. package/dist/lib/version.js +11 -6
  883. package/dist/lib/version.js.map +1 -1
  884. package/dist/lib/version.mjs +11 -6
  885. package/dist/lib/version.mjs.map +1 -1
  886. package/docs/llms.txt +5 -5
  887. package/package.json +2 -2
  888. package/compliance/cache/3.1.15/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  889. package/compliance/cache/3.1.15/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  890. package/compliance/cache/3.1.15.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  891. package/compliance/cache/3.1.15.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  892. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/brand/index.yaml +0 -0
  893. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  894. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  895. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/index.yaml +0 -0
  896. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
  897. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
  898. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  899. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
  900. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/creative/scenarios/native_in_feed.yaml +0 -0
  901. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/governance/index.yaml +0 -0
  902. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  903. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/available_actions.yaml +0 -0
  904. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  905. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  906. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  907. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  908. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  909. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
  910. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  911. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  912. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  913. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  914. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  915. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  916. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  917. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  918. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  919. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  920. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
  921. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  922. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  923. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  924. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  925. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  926. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  927. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  928. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
  929. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  930. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  931. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  932. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  933. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  934. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  935. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  936. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  937. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  938. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  939. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/media-buy/state-machine.yaml +0 -0
  940. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/signals/index.yaml +0 -0
  941. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  942. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/sponsored-intelligence/index.yaml +0 -0
  943. /package/compliance/cache/{3.1.15 → 3.1.20}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  944. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/brand/index.yaml +0 -0
  945. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  946. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  947. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/index.yaml +0 -0
  948. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
  949. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
  950. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  951. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
  952. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
  953. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/governance/index.yaml +0 -0
  954. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  955. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
  956. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  957. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  958. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  959. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  960. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  961. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
  962. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  963. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  964. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  965. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  966. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  967. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  968. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  969. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  970. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  971. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  972. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
  973. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  974. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  975. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  976. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  977. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  978. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  979. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  980. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
  981. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  982. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  983. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  984. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  985. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  986. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  987. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  988. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  989. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  990. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  991. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/media-buy/state-machine.yaml +0 -0
  992. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/signals/index.yaml +0 -0
  993. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  994. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/sponsored-intelligence/index.yaml +0 -0
  995. /package/compliance/cache/{3.1.15 → 3.1.20}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  996. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/audience-sync/index.yaml +0 -0
  997. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/brand-rights/index.yaml +0 -0
  998. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  999. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/collection-lists/index.yaml +0 -0
  1000. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/content-standards/index.yaml +0 -0
  1001. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/creative-ad-server/index.yaml +0 -0
  1002. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/creative-generative/generative-seller.yaml +0 -0
  1003. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/creative-generative/index.yaml +0 -0
  1004. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/creative-template/index.yaml +0 -0
  1005. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/creative-transformers/index.yaml +0 -0
  1006. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/governance-aware-seller/index.yaml +0 -0
  1007. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1008. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/governance-delivery-monitor/index.yaml +0 -0
  1009. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1010. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/governance-spend-authority/index.yaml +0 -0
  1011. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/property-lists/index.yaml +0 -0
  1012. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1013. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/sales-non-guaranteed/index.yaml +0 -0
  1014. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/sales-social/index.yaml +0 -0
  1015. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/signal-marketplace/index.yaml +0 -0
  1016. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1017. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/signal-owned/index.yaml +0 -0
  1018. /package/compliance/cache/{3.1.15 → 3.1.20}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1019. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/acme-outdoor-live.yaml +0 -0
  1020. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/billing-gate-runner.yaml +0 -0
  1021. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/bistro-oranje.yaml +0 -0
  1022. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/distributed-brand-runner.yaml +0 -0
  1023. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/nova-motors.yaml +0 -0
  1024. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/osei-natural.yaml +0 -0
  1025. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/parallel-dispatch-runner.yaml +0 -0
  1026. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/rate-limit-trip-runner.yaml +0 -0
  1027. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/signed-requests-runner.yaml +0 -0
  1028. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/single-side-trust-runner.yaml +0 -0
  1029. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/substitution-observer-runner.yaml +0 -0
  1030. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/summit-foods.yaml +0 -0
  1031. /package/compliance/cache/{3.1.15 → 3.1.20}/test-kits/webhook-receiver-runner.yaml +0 -0
  1032. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/catalog-macro-substitution.json +0 -0
  1033. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1034. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1035. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1036. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1037. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1038. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1039. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1040. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1041. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1042. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1043. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1044. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/README.md +0 -0
  1045. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/canonicalization.json +0 -0
  1046. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/keys.json +0 -0
  1047. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1048. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1049. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1050. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1051. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1052. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1053. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1054. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1055. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1056. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1057. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1058. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1059. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1060. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1061. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1062. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1063. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1064. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1065. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  1066. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  1067. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  1068. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  1069. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  1070. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  1071. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1072. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  1073. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1074. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  1075. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  1076. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  1077. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  1078. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  1079. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  1080. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  1081. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  1082. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  1083. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1084. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  1085. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  1086. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1087. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-receiver-envelope.json +0 -0
  1088. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/README.md +0 -0
  1089. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/keys.json +0 -0
  1090. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  1091. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  1092. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  1093. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  1094. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  1095. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  1096. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  1097. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  1098. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  1099. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  1100. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  1101. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  1102. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  1103. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  1104. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  1105. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  1106. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  1107. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  1108. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  1109. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  1110. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  1111. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  1112. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  1113. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  1114. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  1115. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  1116. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  1117. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  1118. /package/compliance/cache/{3.1.15 → 3.1.20}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  1119. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/billing-gate-dispatch.yaml +0 -0
  1120. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/canonical-format-validate-input.yaml +0 -0
  1121. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/capability-discovery.yaml +0 -0
  1122. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/collection-lists-pagination-integrity.yaml +0 -0
  1123. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/comply-controller-mode-gate.yaml +0 -0
  1124. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/content-standards-pagination-integrity.yaml +0 -0
  1125. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/deterministic-testing.yaml +0 -0
  1126. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/error-compliance-signals.yaml +0 -0
  1127. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/error-compliance.yaml +0 -0
  1128. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/fictional-entities.yaml +0 -0
  1129. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/get-media-buys-pagination-integrity.yaml +0 -0
  1130. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/get-products-pagination-integrity.yaml +0 -0
  1131. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/get-signals-pagination-integrity.yaml +0 -0
  1132. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/idempotency.yaml +0 -0
  1133. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/notification-config-event-scope.yaml +0 -0
  1134. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/notification-config-lifecycle.yaml +0 -0
  1135. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/notification-config-rejections.yaml +0 -0
  1136. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/pagination-integrity-list-accounts.yaml +0 -0
  1137. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/pagination-integrity.yaml +0 -0
  1138. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/property-lists-pagination-integrity.yaml +0 -0
  1139. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/read-tool-idempotency.yaml +0 -0
  1140. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/runner-output-contract.yaml +0 -0
  1141. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/schema-validation-signals.yaml +0 -0
  1142. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/schema-validation.yaml +0 -0
  1143. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/security.yaml +0 -0
  1144. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/signed-requests.yaml +0 -0
  1145. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/stale-response-advisory.yaml +0 -0
  1146. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/storyboard-schema.yaml +0 -0
  1147. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/v3-envelope-integrity.yaml +0 -0
  1148. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/version-negotiation.yaml +0 -0
  1149. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/webhook-emission.yaml +0 -0
  1150. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/webhook-receiver-envelope.yaml +0 -0
  1151. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  1152. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  1153. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/wholesale-feed-products.yaml +0 -0
  1154. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  1155. /package/compliance/cache/{3.1.15 → 3.1.20}/universal/wholesale-feed-signals.yaml +0 -0
  1156. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/brand/index.yaml +0 -0
  1157. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1158. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1159. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/index.yaml +0 -0
  1160. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
  1161. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
  1162. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1163. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
  1164. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/creative/scenarios/native_in_feed.yaml +0 -0
  1165. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/governance/index.yaml +0 -0
  1166. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1167. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/available_actions.yaml +0 -0
  1168. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1169. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  1170. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1171. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1172. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1173. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
  1174. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1175. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  1176. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1177. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1178. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  1179. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  1180. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  1181. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  1182. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1183. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  1184. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
  1185. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1186. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1187. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1188. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1189. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1190. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1191. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1192. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1193. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1194. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1195. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1196. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1197. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1198. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1199. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1200. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1201. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1202. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1203. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/media-buy/state-machine.yaml +0 -0
  1204. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/signals/index.yaml +0 -0
  1205. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  1206. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/sponsored-intelligence/index.yaml +0 -0
  1207. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1208. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/brand/index.yaml +0 -0
  1209. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1210. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1211. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/index.yaml +0 -0
  1212. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
  1213. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
  1214. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1215. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
  1216. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
  1217. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/governance/index.yaml +0 -0
  1218. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1219. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
  1220. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1221. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  1222. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1223. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1224. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1225. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
  1226. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1227. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  1228. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1229. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1230. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  1231. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  1232. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  1233. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  1234. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1235. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  1236. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
  1237. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1238. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1239. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1240. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1241. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1242. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1243. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1244. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1245. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1246. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1247. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1248. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1249. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1250. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1251. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1252. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1253. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1254. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1255. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/media-buy/state-machine.yaml +0 -0
  1256. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/signals/index.yaml +0 -0
  1257. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  1258. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/sponsored-intelligence/index.yaml +0 -0
  1259. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1260. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/audience-sync/index.yaml +0 -0
  1261. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/brand-rights/index.yaml +0 -0
  1262. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  1263. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/collection-lists/index.yaml +0 -0
  1264. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/content-standards/index.yaml +0 -0
  1265. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/creative-ad-server/index.yaml +0 -0
  1266. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/creative-generative/generative-seller.yaml +0 -0
  1267. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/creative-generative/index.yaml +0 -0
  1268. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/creative-template/index.yaml +0 -0
  1269. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/creative-transformers/index.yaml +0 -0
  1270. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/governance-aware-seller/index.yaml +0 -0
  1271. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1272. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/governance-delivery-monitor/index.yaml +0 -0
  1273. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1274. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/governance-spend-authority/index.yaml +0 -0
  1275. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/property-lists/index.yaml +0 -0
  1276. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1277. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/sales-non-guaranteed/index.yaml +0 -0
  1278. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/sales-social/index.yaml +0 -0
  1279. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/signal-marketplace/index.yaml +0 -0
  1280. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1281. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/signal-owned/index.yaml +0 -0
  1282. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1283. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/acme-outdoor-live.yaml +0 -0
  1284. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/billing-gate-runner.yaml +0 -0
  1285. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/bistro-oranje.yaml +0 -0
  1286. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/distributed-brand-runner.yaml +0 -0
  1287. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/nova-motors.yaml +0 -0
  1288. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/osei-natural.yaml +0 -0
  1289. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/parallel-dispatch-runner.yaml +0 -0
  1290. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/rate-limit-trip-runner.yaml +0 -0
  1291. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/signed-requests-runner.yaml +0 -0
  1292. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/single-side-trust-runner.yaml +0 -0
  1293. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/substitution-observer-runner.yaml +0 -0
  1294. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/summit-foods.yaml +0 -0
  1295. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-kits/webhook-receiver-runner.yaml +0 -0
  1296. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/catalog-macro-substitution.json +0 -0
  1297. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1298. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1299. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1300. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1301. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1302. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1303. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1304. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1305. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1306. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1307. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1308. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/README.md +0 -0
  1309. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/canonicalization.json +0 -0
  1310. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/keys.json +0 -0
  1311. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1312. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1313. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1314. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1315. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1316. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1317. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1318. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1319. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1320. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1321. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1322. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1323. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1324. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1325. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1326. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1327. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1328. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1329. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  1330. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  1331. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  1332. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  1333. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  1334. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  1335. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1336. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  1337. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1338. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  1339. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  1340. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  1341. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  1342. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  1343. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  1344. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  1345. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  1346. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  1347. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1348. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  1349. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  1350. /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
  1351. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-receiver-envelope.json +0 -0
  1352. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/README.md +0 -0
  1353. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/keys.json +0 -0
  1354. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  1355. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  1356. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  1357. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  1358. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  1359. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  1360. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  1361. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  1362. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  1363. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  1364. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  1365. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  1366. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  1367. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  1368. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  1369. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  1370. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  1371. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  1372. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  1373. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  1374. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  1375. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  1376. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  1377. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  1378. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  1379. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  1380. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  1381. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  1382. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  1383. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/billing-gate-dispatch.yaml +0 -0
  1384. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/canonical-format-validate-input.yaml +0 -0
  1385. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/capability-discovery.yaml +0 -0
  1386. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/collection-lists-pagination-integrity.yaml +0 -0
  1387. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/comply-controller-mode-gate.yaml +0 -0
  1388. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/content-standards-pagination-integrity.yaml +0 -0
  1389. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/deterministic-testing.yaml +0 -0
  1390. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/error-compliance-signals.yaml +0 -0
  1391. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/error-compliance.yaml +0 -0
  1392. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/fictional-entities.yaml +0 -0
  1393. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/get-media-buys-pagination-integrity.yaml +0 -0
  1394. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/get-products-pagination-integrity.yaml +0 -0
  1395. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/get-signals-pagination-integrity.yaml +0 -0
  1396. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/idempotency.yaml +0 -0
  1397. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/notification-config-event-scope.yaml +0 -0
  1398. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/notification-config-lifecycle.yaml +0 -0
  1399. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/notification-config-rejections.yaml +0 -0
  1400. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/pagination-integrity-list-accounts.yaml +0 -0
  1401. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/pagination-integrity.yaml +0 -0
  1402. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/property-lists-pagination-integrity.yaml +0 -0
  1403. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/read-tool-idempotency.yaml +0 -0
  1404. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/runner-output-contract.yaml +0 -0
  1405. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/schema-validation-signals.yaml +0 -0
  1406. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/schema-validation.yaml +0 -0
  1407. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/security.yaml +0 -0
  1408. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/signed-requests.yaml +0 -0
  1409. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/stale-response-advisory.yaml +0 -0
  1410. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/storyboard-schema.yaml +0 -0
  1411. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/v3-envelope-integrity.yaml +0 -0
  1412. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/version-negotiation.yaml +0 -0
  1413. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/webhook-emission.yaml +0 -0
  1414. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/webhook-receiver-envelope.yaml +0 -0
  1415. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  1416. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  1417. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/wholesale-feed-products.yaml +0 -0
  1418. /package/compliance/cache/{3.1.15.previous → 3.1.20.previous}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  1419. /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/compliance.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n/**\n * Compliance-cache loader.\n *\n * Storyboards live on disk under `compliance/cache/{version}/` after\n * `npm run sync-schemas` pulls the `/protocol/{version}.tgz` bundle.\n * This module reads that tree, resolves `get_adcp_capabilities` →\n * storyboards to run, and supports ad-hoc single-storyboard loads for\n * spec evolution.\n */\n\nimport { readFileSync, readdirSync, existsSync, statSync } from 'fs';\nimport { basename, dirname, join, resolve } from 'path';\nimport { loadStoryboardFile } from './loader';\nimport { ADCP_VERSION } from '../../version';\nimport { ADCPError } from '../../errors';\nimport { isAdcpVersionSupported } from '../../utils/adcp-version-config';\nimport { hasSchemaBundle, resolveBundleKey } from '../../validation/schema-loader';\nimport { synthesizeRequestSigningSteps } from './request-signing/synthesize';\nimport type { RunnerSelectionResult, Storyboard } from './types';\n\n/**\n * Discriminator for configuration faults `resolveStoryboardsForCapabilities`\n * surfaces. `unknown_protocol` is reserved for future use — today it emits a\n * `console.warn` rather than throwing.\n */\nexport type CapabilityResolutionCode =\n | 'specialism_parent_protocol_missing'\n | 'unknown_specialism'\n | 'unknown_protocol'\n | 'unsupported_adcp_version';\n\n/**\n * Thrown when the agent's declared capabilities cannot be mapped onto the\n * compliance cache. These are agent-configuration faults, not network or\n * cache-integrity problems — callers should branch on `code` to distinguish\n * them from runtime failures rather than regexing `message`.\n */\nexport class CapabilityResolutionError extends ADCPError {\n readonly code: CapabilityResolutionCode;\n readonly specialism?: string;\n readonly parentProtocol?: string;\n readonly protocol?: string;\n\n constructor(params: {\n code: CapabilityResolutionCode;\n message: string;\n specialism?: string;\n parentProtocol?: string;\n protocol?: string;\n }) {\n super(params.message);\n this.code = params.code;\n if (params.specialism !== undefined) this.specialism = params.specialism;\n if (params.parentProtocol !== undefined) this.parentProtocol = params.parentProtocol;\n if (params.protocol !== undefined) this.protocol = params.protocol;\n }\n}\n\n/**\n * Maps `supported_protocols` enum values (snake_case) to compliance-cache\n * path segments (kebab-case).\n *\n * Exported so the drift-alarm test can assert every spec enum value has a mapping.\n */\nexport const PROTOCOL_TO_PATH: Readonly<Record<string, string>> = Object.freeze({\n media_buy: 'media-buy',\n creative: 'creative',\n signals: 'signals',\n governance: 'governance',\n brand: 'brand',\n sponsored_intelligence: 'sponsored-intelligence',\n measurement: 'measurement',\n});\n\nexport const UNBASELINED_SUPPORTED_PROTOCOLS: ReadonlySet<string> = new Set([\n // Declared in get_adcp_capabilities.supported_protocols, but 3.1.0-beta.3\n // ships no standalone compliance/protocols/measurement baseline yet.\n 'measurement',\n]);\n\n/**\n * Specialism enum values that are deprecated aliases for universal-bundle\n * storyboards. When an agent declares one of these in\n * `get_adcp_capabilities.specialisms`, resolution MUST NOT throw\n * `unknown_specialism` — the bundle lives in `universal/<file>.yaml` and\n * runs unconditionally already. The deprecated claim is honored for\n * backward compatibility per the universal storyboard's\n * \"Backward-compatible specialism claims\" clause (currently\n * `signed-requests`; see `universal/signed-requests.yaml` and the\n * `signed_requests_specialism_deprecated` notice emitted from\n * `runner.ts:collectCapabilityNotices`).\n *\n * Map shape: deprecated specialism enum value → universal bundle base name\n * (file under `universal/<name>.yaml`, matched against `index.universal`).\n * Removed in AdCP 4.0 along with the enum value itself\n * (adcontextprotocol/adcp#3075).\n */\nexport const DEPRECATED_SPECIALISM_UNIVERSAL_ALIASES: Readonly<Record<string, string>> = Object.freeze({\n 'signed-requests': 'signed-requests',\n});\n\nexport interface ComplianceIndexProtocol {\n id: string;\n title: string | null;\n has_baseline: boolean;\n path: string;\n}\n\nexport interface ComplianceIndexSpecialism {\n id: string;\n protocol: string;\n title: string | null;\n status: string;\n path: string;\n}\n\nexport interface ComplianceIndex {\n published_version?: string;\n adcp_version: string;\n generated_at: string;\n universal: string[];\n protocols: ComplianceIndexProtocol[];\n specialisms: ComplianceIndexSpecialism[];\n}\n\nexport type BundleKind = 'universal' | 'protocol' | 'specialism';\n\nexport interface BundleRef {\n kind: BundleKind;\n /** `capability-discovery` for universal, `media-buy` for protocol, `sales-guaranteed` for specialism. */\n id: string;\n /** Path to the bundle directory (or YAML file, for universal bundles). */\n path: string;\n /** AdCP cache version this bundle came from. */\n adcp_version?: string;\n}\n\nexport interface AgentCapabilities {\n /** AdCP protocols the agent implements. Snake_case per schema. */\n supported_protocols?: string[];\n /** Optional specialisms the agent claims. */\n specialisms?: string[];\n /**\n * AdCP major versions the agent declared (from `get_adcp_capabilities.adcp.major_versions`).\n * When set, storyboards carrying `introduced_in: <major.minor>` whose major\n * isn't in this list are filtered into `not_applicable` instead of being\n * run against an agent that predates them. Unset → no version gating.\n */\n major_versions?: number[];\n /**\n * Exact/release-precision AdCP versions the seller supports, from\n * `get_adcp_capabilities.adcp.supported_versions`. When present, the\n * runner treats it as more specific than `major_versions`.\n */\n supported_versions?: string[];\n}\n\n/** Reason a storyboard was not run against an agent. */\nexport interface NotApplicableStoryboard {\n storyboard_id: string;\n storyboard_title: string;\n /** Track this storyboard would have contributed to, if known. */\n track?: string;\n reason: string;\n /** Selection reason when the storyboard was excluded before execution. */\n selection_result?: RunnerSelectionResult;\n}\n\nexport interface ResolveOptions {\n /** Explicit version override; defaults to the client's pinned ADCP_VERSION. */\n version?: string;\n /** Override the compliance cache root (tests use this to point at fixtures). */\n complianceDir?: string;\n /**\n * Explicit schema bundle root to use with the selected compliance cache.\n * The path must point at the schema-data directory for the cache version,\n * for example `.../dist/lib/schemas-data/3.0`.\n */\n schemaRoot?: string;\n /**\n * Hosted badge compatibility alias. When set, a prerelease compliance cache\n * for this stable line (for example cache `3.1.0-beta.7` with alias `3.1`)\n * may be selected for a seller that advertises the stable line in\n * `adcp.supported_versions`.\n *\n * This is deliberately scoped to a single resolver call. Normal wire-version\n * negotiation and explicit beta diagnostic targets stay strict unless the\n * caller opts in here.\n */\n hostedStableLineAlias?: string;\n}\n\nexport interface ResolvedBundle {\n ref: BundleRef;\n storyboards: Storyboard[];\n}\n\nexport interface ResolvedStoryboards {\n bundles: ResolvedBundle[];\n storyboards: Storyboard[];\n /**\n * Storyboards the agent's declared `major_versions` predates. Surfaced so\n * callers can render a `not_applicable` row — silently dropping them would\n * mean an agent that hasn't certified against a later spec version passes\n * vacuously.\n */\n not_applicable: NotApplicableStoryboard[];\n}\n\nfunction getRepoRoot(): string {\n // Walks from src/lib/testing/storyboard/ (or dist/lib/testing/storyboard/) → package root.\n return resolve(__dirname, '..', '..', '..', '..');\n}\n\n/**\n * Resolve the compliance cache directory.\n *\n * Priority:\n * 1. `options.complianceDir` (explicit override, used by tests)\n * 2. `ADCP_COMPLIANCE_DIR` env var (full path including version dir, for packaged consumers)\n * 3. `{package-root}/compliance/cache/{version}` (default, ships with the npm package)\n */\nexport function getComplianceCacheDir(options: ResolveOptions = {}): string {\n const configured = getConfiguredComplianceDir(options);\n if (configured) return configured;\n const version = options.version || readAdcpVersion();\n return join(getRepoRoot(), 'compliance', 'cache', version);\n}\n\nfunction readAdcpVersion(): string {\n // Compile-time ADCP_VERSION from src/lib/version.ts is the single source of truth\n // at runtime. scripts/sync-schemas.ts still reads the text file — sync-version.ts\n // keeps them aligned so the cache directory the lib expects matches what sync wrote.\n return ADCP_VERSION;\n}\n\nfunction complianceMissingMessage(what: string, path: string): string {\n return (\n `${what} not found at ${path}. ` +\n `The compliance cache ships with @adcp/sdk — run \\`npm i @adcp/sdk@latest\\` (or \\`npx @adcp/sdk@latest …\\`) to pick up the current cache. ` +\n `If developing locally, run \\`npm run sync-schemas\\` to populate the cache.`\n );\n}\n\n/** Load and parse `index.json` from the compliance cache. */\nexport function loadComplianceIndex(options: ResolveOptions = {}): ComplianceIndex {\n const dir = getComplianceCacheDir(options);\n const indexPath = join(dir, 'index.json');\n if (!existsSync(indexPath)) {\n throw new Error(complianceMissingMessage('Compliance cache', dir));\n }\n const index = JSON.parse(readFileSync(indexPath, 'utf-8')) as ComplianceIndex;\n return normalizeComplianceIndex(index, options, indexPath);\n}\n\nexport function getExternalSchemaRootForCompliance(options: ResolveOptions, adcpVersion: string): string | undefined {\n const configuredSchemaRoot = getConfiguredSchemaRoot(options);\n if (configuredSchemaRoot) return configuredSchemaRoot;\n // An explicit version still resolves through the package's default compliance\n // cache. Probe from that directory too so preflight capability discovery uses\n // the selected release's exact schema tree rather than whatever bundle the SDK\n // happened to compile as its default.\n const complianceDir =\n getConfiguredComplianceDir(options) ?? (options.version !== undefined ? getComplianceCacheDir(options) : undefined);\n const siblingSchemaRoot = complianceDir ? findExternalSchemaRoot(complianceDir, adcpVersion) : undefined;\n if (siblingSchemaRoot) return siblingSchemaRoot;\n if (options.version !== undefined || complianceDir !== undefined) {\n assertComplianceSchemaBundleAvailable(options, adcpVersion, complianceDir);\n }\n return undefined;\n}\n\nfunction assertComplianceSchemaBundleAvailable(\n options: ResolveOptions,\n adcpVersion: string,\n complianceDir: string | undefined\n): void {\n if (hasSchemaBundle(adcpVersion)) return;\n const selector = options.version ? `--compliance-version ${options.version}` : `compliance cache ${complianceDir}`;\n const bundleKey = resolveBundleKey(adcpVersion);\n throw new Error(\n `${selector} selected AdCP compliance version \"${adcpVersion}\", but no matching schema bundle was found. ` +\n `Refusing to validate storyboard responses with the installed default schemas. ` +\n `Pass --schema-root PATH or set ADCP_SCHEMA_ROOT to a schema-data root for \"${adcpVersion}\" ` +\n `(for example dist/lib/schemas-data/${bundleKey} or schemas/cache/${adcpVersion}), ` +\n `or install/sync an @adcp/sdk package that includes that schema bundle.`\n );\n}\n\nfunction getConfiguredComplianceDir(options: Pick<ResolveOptions, 'complianceDir'>): string | undefined {\n return options.complianceDir ?? process.env.ADCP_COMPLIANCE_DIR;\n}\n\nfunction getConfiguredSchemaRoot(options: Pick<ResolveOptions, 'schemaRoot'>): string | undefined {\n return options.schemaRoot ?? process.env.ADCP_SCHEMA_ROOT;\n}\n\nfunction normalizeComplianceIndex(index: ComplianceIndex, options: ResolveOptions, indexPath: string): ComplianceIndex {\n if (index.adcp_version === 'latest') {\n const repairedVersion = findReplacementForLatestComplianceVersion(index, options);\n if (repairedVersion) {\n return { ...index, adcp_version: repairedVersion };\n }\n }\n\n assertValidComplianceIndexVersion(index.adcp_version, indexPath);\n return index;\n}\n\nfunction findReplacementForLatestComplianceVersion(\n index: ComplianceIndex,\n options: ResolveOptions\n): string | undefined {\n if (isValidComplianceIndexVersion(index.published_version)) return index.published_version;\n\n const schemaRoot = getConfiguredSchemaRoot(options);\n const configuredVersion = schemaRoot ? readSchemaRootAdcpVersion(schemaRoot) : undefined;\n if (configuredVersion) return configuredVersion;\n\n if (!options.complianceDir) return undefined;\n return readSiblingSchemaAdcpVersion(options.complianceDir);\n}\n\nfunction readSchemaRootAdcpVersion(schemaRoot: string): string | undefined {\n const roots = [schemaRoot];\n if (basename(schemaRoot) === 'bundled') roots.push(dirname(schemaRoot));\n\n for (const root of roots) {\n const indexPath = join(root, 'index.json');\n if (!existsSync(indexPath)) continue;\n try {\n const parsed = JSON.parse(readFileSync(indexPath, 'utf-8')) as { adcp_version?: unknown };\n if (isValidComplianceIndexVersion(parsed.adcp_version)) return parsed.adcp_version;\n } catch {\n // Schema-root discovery is best-effort; the final compliance-index\n // validation below owns the actionable error when no replacement exists.\n }\n }\n for (const root of roots) {\n const version = readSchemaIdVersion(root);\n if (version) return version;\n }\n return undefined;\n}\n\nfunction readSchemaIdVersion(root: string): string | undefined {\n const versions = new Set<string>();\n const scanRoot = existsSync(join(root, 'bundled')) ? join(root, 'bundled') : root;\n for (const file of walkJsonFiles(scanRoot)) {\n try {\n const parsed = JSON.parse(readFileSync(file, 'utf-8')) as { $id?: unknown };\n if (typeof parsed.$id !== 'string') continue;\n const version = parsed.$id.match(/\\/schemas\\/([^/]+)\\//)?.[1];\n if (isValidComplianceIndexVersion(version)) versions.add(version);\n } catch {\n // Best-effort discovery; malformed schemas are handled by validation.\n }\n }\n return versions.size === 1 ? [...versions][0] : undefined;\n}\n\nfunction readSiblingSchemaAdcpVersion(complianceDir: string): string | undefined {\n for (const schemaRoot of schemaRootCandidatesForComplianceDir(complianceDir)) {\n const version = readSchemaRootAdcpVersion(schemaRoot);\n if (version) return version;\n }\n return undefined;\n}\n\nfunction isValidComplianceIndexVersion(version: unknown): version is string {\n if (typeof version !== 'string') return false;\n try {\n resolveBundleKey(version);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction assertValidComplianceIndexVersion(version: string, indexPath: string): void {\n try {\n resolveBundleKey(version);\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n throw new Error(\n `Compliance cache ${indexPath} declares invalid adcp_version ${JSON.stringify(version)}. ` +\n `adcp_version must be a real AdCP bundle version, not a selector alias such as \"latest\". ` +\n `If this is a local development bundle, pass ADCP_SCHEMA_ROOT or --schema-root pointing at the matching schema bundle. ` +\n reason\n );\n }\n}\n\nfunction findExternalSchemaRoot(complianceDir: string, adcpVersion: string): string | undefined {\n const candidates = [complianceDir, ...schemaRootCandidatesForComplianceDir(complianceDir, adcpVersion)];\n return candidates.find(hasSchemaRootShape);\n}\n\nfunction schemaRootCandidatesForComplianceDir(complianceDir: string, adcpVersion?: string): string[] {\n const candidates = new Set<string>();\n const packageRoots = packageRootCandidatesForComplianceDir(complianceDir);\n const add = (candidate: string) => candidates.add(candidate);\n\n for (const packageRoot of packageRoots) {\n addVersionedSchemaRoots(packageRoot, adcpVersion ?? ADCP_VERSION, add);\n }\n if (adcpVersion === undefined) {\n for (const packageRoot of packageRoots) {\n addSchemaContainerChildren(join(packageRoot, 'dist', 'lib', 'schemas-data'), add);\n addSchemaContainerChildren(join(packageRoot, 'dist', 'schemas'), add);\n addSchemaContainerChildren(join(packageRoot, 'schemas', 'cache'), add);\n }\n }\n\n return [...candidates];\n}\n\nfunction addVersionedSchemaRoots(packageRoot: string, adcpVersion: string, add: (candidate: string) => void): void {\n const key = resolveBundleKey(adcpVersion);\n // Prefer exact release roots before stable-minor aliases. Patch releases\n // normally share wire shape, but an explicitly selected compliance kit is\n // the authority for its own preflight validation and must not be shadowed\n // by an older `3.1` bundle left in dist.\n add(join(packageRoot, 'dist', 'lib', 'schemas-data', adcpVersion));\n add(join(packageRoot, 'dist', 'schemas', adcpVersion));\n add(join(packageRoot, 'schemas', 'cache', adcpVersion));\n add(join(packageRoot, 'dist', 'lib', 'schemas-data', key));\n add(join(packageRoot, 'dist', 'schemas', key));\n add(join(packageRoot, 'schemas', 'cache', key));\n}\n\nfunction addSchemaContainerChildren(container: string, add: (candidate: string) => void): void {\n if (!existsSync(container)) return;\n for (const entry of readdirSync(container).sort().reverse()) {\n const full = join(container, entry);\n try {\n if (statSync(full).isDirectory()) add(full);\n } catch {\n // Best-effort sibling discovery; ignore entries that disappear mid-scan.\n }\n }\n}\n\nfunction packageRootCandidatesForComplianceDir(complianceDir: string): string[] {\n const roots = new Set<string>();\n const resolved = resolve(complianceDir);\n let current = resolved;\n\n while (true) {\n if (basename(current) === 'compliance') {\n const parent = dirname(current);\n if (basename(parent) === 'dist') roots.add(dirname(parent));\n roots.add(parent);\n }\n const next = dirname(current);\n if (next === current) break;\n current = next;\n }\n\n roots.add(dirname(dirname(dirname(resolved))));\n return [...roots];\n}\n\nfunction hasSchemaRootShape(root: string): boolean {\n if (!existsSync(root)) return false;\n const scanRoot = existsSync(join(root, 'bundled')) ? join(root, 'bundled') : root;\n return walkJsonFiles(scanRoot).some(file => {\n try {\n const parsed = JSON.parse(readFileSync(file, 'utf-8')) as { $id?: unknown; $schema?: unknown };\n return typeof parsed.$id === 'string' || typeof parsed.$schema === 'string';\n } catch {\n return false;\n }\n });\n}\n\nfunction walkJsonFiles(dir: string): string[] {\n if (!existsSync(dir)) return [];\n const out: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) out.push(...walkJsonFiles(full));\n else if (entry.isFile() && entry.name.endsWith('.json')) out.push(full);\n }\n return out;\n}\n\n/**\n * Load every storyboard YAML under a directory tree (non-recursive for files at the top\n * level of a bundle, recursive for nested `scenarios/`). YAMLs that don't have a top-level\n * `id:` (schema / fixture files) are skipped.\n */\nfunction loadStoryboardsFromDir(dir: string): Storyboard[] {\n if (!existsSync(dir)) return [];\n const storyboards: Storyboard[] = [];\n const visit = (current: string) => {\n // Sort entries so ordering is deterministic across filesystems.\n const entries = readdirSync(current).sort();\n // Prefer index.yaml first so bundle-as-id lookups resolve to the main storyboard.\n entries.sort((a, b) => {\n if (a === 'index.yaml') return -1;\n if (b === 'index.yaml') return 1;\n return 0;\n });\n for (const entry of entries) {\n const full = join(current, entry);\n const stat = statSync(full);\n if (stat.isDirectory()) {\n visit(full);\n } else if (entry.endsWith('.yaml') || entry.endsWith('.yml')) {\n try {\n storyboards.push(loadStoryboardFile(full));\n } catch (err) {\n // Peek at the file — if it has an `id:` line it was meant to be a\n // storyboard and the error is a real problem; otherwise it's a schema\n // or fixture file (e.g., storyboard-schema.yaml) and silence is fine.\n try {\n const text = readFileSync(full, 'utf-8');\n if (/^id:\\s*\\S/m.test(text)) {\n console.warn(`[compliance] Failed to parse storyboard ${full}: ${(err as Error).message}`);\n }\n } catch {\n /* unreadable file — treat as non-storyboard */\n }\n }\n }\n }\n };\n visit(dir);\n return storyboards;\n}\n\n/** Load storyboards for a single bundle (universal YAML file, domain dir, or specialism dir). */\nexport function loadBundleStoryboards(ref: BundleRef): Storyboard[] {\n const raw = ref.kind === 'universal' ? safeLoadUniversal(ref.path) : loadStoryboardsFromDir(ref.path);\n return raw.map(sb => annotateStoryboardVersion(postProcessStoryboard(sb), ref.adcp_version));\n}\n\nfunction annotateStoryboardVersion(storyboard: Storyboard, adcpVersion: string | undefined): Storyboard {\n return adcpVersion === undefined ? storyboard : { ...storyboard, adcp_version: adcpVersion };\n}\n\nfunction safeLoadUniversal(path: string): Storyboard[] {\n try {\n return [loadStoryboardFile(path)];\n } catch {\n return [];\n }\n}\n\n/**\n * Post-process storyboards loaded from the cache. The signed-requests\n * specialism ships phases whose steps are generated at runtime from the\n * request-signing test vectors; synthesize them here so downstream callers\n * (the runner, CLI tooling, reporting) see a fully-populated storyboard.\n */\nfunction postProcessStoryboard(storyboard: Storyboard): Storyboard {\n if (storyboard.id === 'signed_requests') {\n try {\n return synthesizeRequestSigningSteps(storyboard);\n } catch (err) {\n // Synthesis failure = infrastructural problem (cache missing vectors,\n // schema drift, etc.). Emit a synthetic failing phase so the runner's\n // existing reporting surfaces the cause — silent empty-phase fallback\n // would render as a green pass with 0 steps, which is the worst\n // possible outcome for CI pipelines.\n return withSynthesisErrorPhase(storyboard, err);\n }\n }\n return storyboard;\n}\n\nfunction withSynthesisErrorPhase(storyboard: Storyboard, err: unknown): Storyboard {\n const message = err instanceof Error ? err.message : String(err);\n const errorPhase = {\n id: 'synthesis_error',\n title: 'Request-signing vector synthesis failed',\n narrative:\n 'The signed-requests specialism requires its phases to be synthesized at load time ' +\n 'from the compliance cache. Synthesis failed — the runner cannot grade against the ' +\n 'conformance vectors. Run `npm run sync-schemas` to refresh the cache.',\n steps: [\n {\n id: 'synthesis_error',\n title: 'Synthesize vector phases',\n task: 'synthesis_error',\n narrative: message,\n expect_error: false,\n },\n ],\n };\n return { ...storyboard, phases: [errorPhase, ...storyboard.phases] };\n}\n\n/** Enumerate every bundle present in the cache (universal + protocols + specialisms). */\nexport function listBundles(options: ResolveOptions = {}): BundleRef[] {\n const dir = getComplianceCacheDir(options);\n const index = loadComplianceIndex(options);\n const bundles: BundleRef[] = [];\n\n for (const name of index.universal) {\n bundles.push({\n kind: 'universal',\n id: name,\n path: join(dir, 'universal', `${name}.yaml`),\n adcp_version: index.adcp_version,\n });\n }\n for (const protocol of index.protocols) {\n if (!protocol.has_baseline) continue;\n bundles.push({\n kind: 'protocol',\n id: protocol.id,\n path: join(dir, 'protocols', protocol.id),\n adcp_version: index.adcp_version,\n });\n }\n for (const specialism of index.specialisms) {\n bundles.push({\n kind: 'specialism',\n id: specialism.id,\n path: join(dir, 'specialisms', specialism.id),\n adcp_version: index.adcp_version,\n });\n }\n return bundles;\n}\n\n/** List every storyboard the cache can produce, across all bundles. */\nexport function listAllComplianceStoryboards(options: ResolveOptions = {}): Storyboard[] {\n const seen = new Set<string>();\n const storyboards: Storyboard[] = [];\n for (const ref of listBundles(options)) {\n for (const sb of loadBundleStoryboards(ref)) {\n if (seen.has(sb.id)) continue;\n seen.add(sb.id);\n storyboards.push(sb);\n }\n }\n return storyboards;\n}\n\n/**\n * Find a storyboard by its internal `id` (the YAML's `id:` field).\n * Scans every bundle in the cache. Returns undefined if no match.\n */\nexport function getComplianceStoryboardById(id: string, options: ResolveOptions = {}): Storyboard | undefined {\n for (const sb of listAllComplianceStoryboards(options)) {\n if (sb.id === id) return sb;\n }\n return undefined;\n}\n\n/** Find a bundle by its directory/file id (`media-buy`, `sales-guaranteed`, `capability-discovery`). */\nexport function findBundleById(id: string, options: ResolveOptions = {}): BundleRef | undefined {\n return listBundles(options).find(b => b.id === id);\n}\n\n/**\n * Resolved view of a specialism for the `adcp specialism show` CLI: the\n * specialism's own storyboard plus every protocol scenario it pulls in via\n * `requires_scenarios`. Useful as a pre-flight \"what will CI actually run\n * against my server?\" answer.\n */\nexport interface SpecialismDetail {\n slug: string;\n protocol: string;\n status: string;\n /** Title from index.json (kept separate from storyboard.title for fallback). */\n index_title: string | null;\n /** The specialism's own index.yaml parsed as a Storyboard. */\n storyboard: Storyboard;\n /**\n * Required scenarios pulled in from protocol bundles via the index.yaml's\n * `requires_scenarios` field. Each entry is a fully-resolved Storyboard;\n * `unresolved` lists references that did not match a storyboard in the cache.\n */\n required_scenarios: Storyboard[];\n unresolved_scenarios: string[];\n /** Required tools declared by the specialism (from the index entry). */\n required_tools: string[];\n}\n\nexport function loadSpecialismDetail(slug: string, options: ResolveOptions = {}): SpecialismDetail {\n const index = loadComplianceIndex(options);\n const entry = index.specialisms.find(s => s.id === slug);\n if (!entry) {\n const known = index.specialisms.map(s => s.id).join(', ');\n throw new Error(`Unknown specialism \"${slug}\". Known specialisms: ${known}`);\n }\n\n const bundleStoryboards = loadBundleStoryboards({\n kind: 'specialism',\n id: slug,\n path: join(getComplianceCacheDir(options), 'specialisms', slug),\n adcp_version: index.adcp_version,\n });\n const storyboard = bundleStoryboards.find(sb => sb.category === entry.id.replace(/-/g, '_')) ?? bundleStoryboards[0];\n if (!storyboard) {\n throw new Error(\n `Specialism \"${slug}\" loaded no storyboards from ${join(getComplianceCacheDir(options), 'specialisms', slug)}`\n );\n }\n\n const required: Storyboard[] = [];\n const unresolved: string[] = [];\n for (const ref of storyboard.requires_scenarios ?? []) {\n // Scenario YAMLs declare `id: <category>/<scenario_id>` — the slash\n // form is the storyboard's own id and the only safe lookup. Bare-id\n // fallbacks would silently match across categories once future caches\n // ship scenarios with colliding tail segments — better to surface drift\n // through `unresolved_scenarios` than mask it with a wrong-category hit.\n const sb = getComplianceStoryboardById(ref, options);\n if (sb) required.push(sb);\n else unresolved.push(ref);\n }\n\n // index.json carries the canonical required_tools list — fall back to the\n // storyboard's own field if the index entry is missing it.\n const requiredTools =\n (entry as ComplianceIndexSpecialism & { required_tools?: string[] }).required_tools ??\n storyboard.required_tools ??\n [];\n\n return {\n slug,\n protocol: entry.protocol,\n status: entry.status,\n index_title: entry.title,\n storyboard,\n required_scenarios: required,\n unresolved_scenarios: unresolved,\n required_tools: requiredTools,\n };\n}\n\nexport function listSpecialisms(options: ResolveOptions = {}): ComplianceIndexSpecialism[] {\n return loadComplianceIndex(options).specialisms;\n}\n\n/**\n * Resolve either a bundle id or a storyboard id to a storyboard set.\n * Bundle ids expand to every storyboard in the bundle (index + scenarios).\n * Storyboard ids resolve to that single storyboard.\n *\n * Used for targeted `storyboard run <agent> <id>` invocations.\n */\nexport function resolveBundleOrStoryboard(id: string, options: ResolveOptions = {}): Storyboard[] {\n const bundle = findBundleById(id, options);\n if (bundle) return loadBundleStoryboards(bundle);\n const sb = getComplianceStoryboardById(id, options);\n return sb ? [sb] : [];\n}\n\n/**\n * Given the agent's `get_adcp_capabilities` response, resolve the set of\n * storyboards the compliance runner should execute:\n *\n * universal — every universal bundle (mandatory for every agent)\n * protocols — baseline for each declared `supported_protocols` entry\n * specialisms — every declared specialism\n *\n * Throws `CapabilityResolutionError` (fail-closed) when the declared\n * capabilities cannot be mapped onto the cache:\n *\n * - `unknown_specialism` — declared specialism has no bundle (usually stale\n * cache — run `npm run sync-schemas`).\n * - `specialism_parent_protocol_missing` — declared specialism rolls up to\n * a protocol the agent didn't include in `supported_protocols`.\n *\n * Unknown `supported_protocols` entries are logged as warnings and skipped\n * rather than thrown (fail-open), so a single bad entry doesn't block the run.\n */\nexport function resolveStoryboardsForCapabilities(\n caps: AgentCapabilities,\n options: ResolveOptions = {}\n): ResolvedStoryboards {\n const index = loadComplianceIndex(options);\n assertSupportedComplianceVersion(index.adcp_version, caps.supported_versions, options);\n const cacheDir = getComplianceCacheDir(options);\n const bundles: ResolvedBundle[] = [];\n const storyboards: Storyboard[] = [];\n const notApplicable: NotApplicableStoryboard[] = [];\n const seenStoryboards = new Set<string>();\n\n const push = (ref: BundleRef) => {\n const sbs = loadBundleStoryboards(ref);\n bundles.push({ ref, storyboards: sbs });\n for (const sb of sbs) {\n if (seenStoryboards.has(sb.id)) continue;\n seenStoryboards.add(sb.id);\n const gate = checkVersionGate(sb, caps.major_versions);\n if (gate) {\n notApplicable.push({\n storyboard_id: sb.id,\n storyboard_title: sb.title,\n track: sb.track,\n reason: gate,\n selection_result: { reason: 'version_excluded', detail: gate },\n });\n continue;\n }\n storyboards.push(sb);\n }\n };\n\n for (const name of index.universal) {\n push({\n kind: 'universal',\n id: name,\n path: join(cacheDir, 'universal', `${name}.yaml`),\n adcp_version: index.adcp_version,\n });\n }\n\n const declaredProtocols = caps.supported_protocols ?? [];\n const declaredProtocolIds = new Set<string>();\n for (const protocol of declaredProtocols) {\n // Legacy: older agents listed `compliance_testing` under supported_protocols.\n // The current schema declares it via the top-level `compliance_testing`\n // capability block instead, and it has no compliance baseline. Skip silently.\n if (protocol === 'compliance_testing' || UNBASELINED_SUPPORTED_PROTOCOLS.has(protocol)) continue;\n\n const protocolId = PROTOCOL_TO_PATH[protocol];\n if (!protocolId) {\n // Unknown protocol — likely a newer spec version or a typo. Mirror the\n // fail-closed posture on specialisms: surface it loudly, but as a warning\n // on stderr so a single bad entry doesn't block the full run.\n console.warn(\n `[resolveStoryboardsForCapabilities] Unknown supported_protocols entry \"${protocol}\". ` +\n `This is ignored; compliance cache may be stale or the agent is on a newer AdCP version.`\n );\n continue;\n }\n const entry = index.protocols.find(d => d.id === protocolId);\n if (!entry || !entry.has_baseline) continue;\n declaredProtocolIds.add(protocolId);\n push({\n kind: 'protocol',\n id: protocolId,\n path: join(cacheDir, 'protocols', protocolId),\n adcp_version: index.adcp_version,\n });\n }\n\n const declaredSpecialisms = caps.specialisms ?? [];\n for (const specialism of declaredSpecialisms) {\n const entry = index.specialisms.find(s => s.id === specialism);\n if (!entry) {\n // Deprecated alias path: some 3.0-era specialism enum values now resolve\n // to a `universal/` bundle (e.g. `signed-requests` → `universal/signed-requests.yaml`).\n // The universal storyboard is pushed unconditionally above; the deprecated\n // claim is graded there and the deprecation notice fires from runner.ts.\n // Don't throw — that would block every other storyboard.\n const universalAlias = DEPRECATED_SPECIALISM_UNIVERSAL_ALIASES[specialism];\n if (universalAlias && index.universal.includes(universalAlias)) {\n continue;\n }\n throw new CapabilityResolutionError({\n code: 'unknown_specialism',\n specialism,\n message:\n `Agent declared specialism \"${specialism}\" but no bundle exists at ` +\n `${join(cacheDir, 'specialisms', specialism)}. ` +\n `Known specialisms: ${index.specialisms.map(s => s.id).join(', ')}. ` +\n `Compliance cache version: ${index.adcp_version}. ` +\n `This usually means the cache is stale — run \\`npm run sync-schemas\\`.`,\n });\n }\n // Each specialism rolls up to one parent protocol; the spec requires the parent\n // to also be declared in supported_protocols. AAO enforces this server-side,\n // but catching it client-side stops us from running orphan scenarios.\n if (entry.protocol && !declaredProtocolIds.has(entry.protocol)) {\n throw new CapabilityResolutionError({\n code: 'specialism_parent_protocol_missing',\n specialism,\n parentProtocol: entry.protocol,\n message:\n `Agent declared specialism \"${specialism}\" (parent protocol: ${entry.protocol}) ` +\n `but did not include \"${entry.protocol}\" in supported_protocols. ` +\n `Every specialism must roll up to a declared protocol per the AdCP spec.`,\n });\n }\n push({\n kind: 'specialism',\n id: specialism,\n path: join(cacheDir, 'specialisms', specialism),\n adcp_version: index.adcp_version,\n });\n }\n\n return { bundles, storyboards, not_applicable: notApplicable };\n}\n\nexport function isComplianceVersionSupported(\n cacheVersion: string,\n supportedVersions: readonly string[],\n options: Pick<ResolveOptions, 'hostedStableLineAlias'> = {}\n): boolean {\n return (\n isAdcpVersionSupported(cacheVersion, supportedVersions) ||\n isHostedStableLineAliasSupported(cacheVersion, supportedVersions, options.hostedStableLineAlias)\n );\n}\n\nfunction assertSupportedComplianceVersion(\n cacheVersion: string,\n supportedVersions: string[] | undefined,\n options: Pick<ResolveOptions, 'hostedStableLineAlias'> = {}\n): void {\n if (!supportedVersions || supportedVersions.length === 0) return;\n if (isComplianceVersionSupported(cacheVersion, supportedVersions, options)) return;\n throw new CapabilityResolutionError({\n code: 'unsupported_adcp_version',\n message:\n `Compliance cache version ${cacheVersion} is not supported by this seller. ` +\n `Seller advertises adcp.supported_versions [${supportedVersions.join(', ')}]. ` +\n `Install or select a compatible compliance cache instead of relying on major_versions alone.`,\n });\n}\n\nfunction isHostedStableLineAliasSupported(\n cacheVersion: string,\n supportedVersions: readonly string[],\n hostedStableLineAlias: string | undefined\n): boolean {\n if (!hostedStableLineAlias || supportedVersions.length === 0) return false;\n const cacheLine = stableLineOf(cacheVersion);\n const aliasLine = stableLineOf(hostedStableLineAlias);\n if (!cacheLine || !aliasLine || cacheLine !== aliasLine) return false;\n if (!isPrereleaseVersion(cacheVersion)) return false;\n return isAdcpVersionSupported(hostedStableLineAlias, supportedVersions);\n}\n\nfunction stableLineOf(version: string): string | undefined {\n const match = /^(?:v)?(\\d+)\\.(\\d+)(?:\\.|$|-)/.exec(version);\n return match?.[1] && match?.[2] ? `${match[1]}.${match[2]}` : undefined;\n}\n\nfunction isPrereleaseVersion(version: string): boolean {\n return /^\\d+\\.\\d+(?:\\.\\d+)?-/.test(version);\n}\n\n/**\n * Compare a storyboard's `introduced_in` (e.g., \"3.1\") against an agent's\n * declared `major_versions` (e.g., `[3]`). Returns a reason string when the\n * storyboard should be gated out; undefined when it applies.\n *\n * Grammar: `introduced_in` is `<major>` or `<major>.<minor>` — only the major\n * is consulted for filtering. Minor/patch components are kept on the storyboard\n * for reporting but don't drive the gate because the spec's `major_versions`\n * array only carries majors.\n *\n * When either side is absent the gate is a no-op: agents that don't declare\n * `major_versions` (v2 synthetic profiles, discovery failures) run every\n * storyboard, and storyboards without `introduced_in` always apply.\n */\nfunction checkVersionGate(sb: Storyboard, agentMajors: number[] | undefined): string | undefined {\n if (!sb.introduced_in || !agentMajors || agentMajors.length === 0) return undefined;\n const parsed = parseIntroducedIn(sb.introduced_in);\n if (parsed === undefined) return undefined; // unparseable → don't block\n if (agentMajors.includes(parsed)) return undefined;\n const declared = agentMajors\n .slice()\n .sort((a, b) => a - b)\n .join(', ');\n return `Introduced in AdCP ${sb.introduced_in}; agent declares major_versions [${declared}].`;\n}\n\nfunction parseIntroducedIn(value: string): number | undefined {\n const match = /^\\s*(\\d+)(?:\\.\\d+)*\\s*$/.exec(value);\n if (!match?.[1]) return undefined;\n const major = Number.parseInt(match[1], 10);\n return Number.isFinite(major) ? major : undefined;\n}\n"],"mappings":"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","names":["require"]}
1
+ {"version":3,"sources":["../../../../src/lib/testing/storyboard/compliance.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n/**\n * Compliance-cache loader.\n *\n * Storyboards live on disk under `compliance/cache/{version}/` after\n * `npm run sync-schemas` pulls the `/protocol/{version}.tgz` bundle.\n * This module reads that tree, resolves `get_adcp_capabilities` →\n * storyboards to run, and supports ad-hoc single-storyboard loads for\n * spec evolution.\n */\n\nimport { readFileSync, readdirSync, existsSync, statSync } from 'fs';\nimport { basename, dirname, join, resolve } from 'path';\nimport { loadStoryboardFile } from './loader';\nimport { ADCP_VERSION } from '../../version';\nimport { ADCPError } from '../../errors';\nimport { isAdcpVersionSupported } from '../../utils/adcp-version-config';\nimport { hasSchemaBundle, resolveBundleKey } from '../../validation/schema-loader';\nimport { synthesizeRequestSigningSteps } from './request-signing/synthesize';\nimport { markStoryboardComplianceRoot } from './provenance';\nimport type { RunnerSelectionResult, Storyboard } from './types';\n\n/**\n * Discriminator for configuration faults `resolveStoryboardsForCapabilities`\n * surfaces. `unknown_protocol` is reserved for future use — today it emits a\n * `console.warn` rather than throwing.\n */\nexport type CapabilityResolutionCode =\n | 'specialism_parent_protocol_missing'\n | 'unknown_specialism'\n | 'unknown_protocol'\n | 'unsupported_adcp_version';\n\n/**\n * Thrown when the agent's declared capabilities cannot be mapped onto the\n * compliance cache. These are agent-configuration faults, not network or\n * cache-integrity problems — callers should branch on `code` to distinguish\n * them from runtime failures rather than regexing `message`.\n */\nexport class CapabilityResolutionError extends ADCPError {\n readonly code: CapabilityResolutionCode;\n readonly specialism?: string;\n readonly parentProtocol?: string;\n readonly protocol?: string;\n\n constructor(params: {\n code: CapabilityResolutionCode;\n message: string;\n specialism?: string;\n parentProtocol?: string;\n protocol?: string;\n }) {\n super(params.message);\n this.code = params.code;\n if (params.specialism !== undefined) this.specialism = params.specialism;\n if (params.parentProtocol !== undefined) this.parentProtocol = params.parentProtocol;\n if (params.protocol !== undefined) this.protocol = params.protocol;\n }\n}\n\n/**\n * Maps `supported_protocols` enum values (snake_case) to compliance-cache\n * path segments (kebab-case).\n *\n * Exported so the drift-alarm test can assert every spec enum value has a mapping.\n */\nexport const PROTOCOL_TO_PATH: Readonly<Record<string, string>> = Object.freeze({\n media_buy: 'media-buy',\n creative: 'creative',\n signals: 'signals',\n governance: 'governance',\n brand: 'brand',\n sponsored_intelligence: 'sponsored-intelligence',\n measurement: 'measurement',\n});\n\nexport const UNBASELINED_SUPPORTED_PROTOCOLS: ReadonlySet<string> = new Set([\n // Declared in get_adcp_capabilities.supported_protocols, but 3.1.0-beta.3\n // ships no standalone compliance/protocols/measurement baseline yet.\n 'measurement',\n]);\n\n/**\n * Specialism enum values that are deprecated aliases for universal-bundle\n * storyboards. When an agent declares one of these in\n * `get_adcp_capabilities.specialisms`, resolution MUST NOT throw\n * `unknown_specialism` — the bundle lives in `universal/<file>.yaml` and\n * runs unconditionally already. The deprecated claim is honored for\n * backward compatibility per the universal storyboard's\n * \"Backward-compatible specialism claims\" clause (currently\n * `signed-requests`; see `universal/signed-requests.yaml` and the\n * `signed_requests_specialism_deprecated` notice emitted from\n * `runner.ts:collectCapabilityNotices`).\n *\n * Map shape: deprecated specialism enum value → universal bundle base name\n * (file under `universal/<name>.yaml`, matched against `index.universal`).\n * Removed in AdCP 4.0 along with the enum value itself\n * (adcontextprotocol/adcp#3075).\n */\nexport const DEPRECATED_SPECIALISM_UNIVERSAL_ALIASES: Readonly<Record<string, string>> = Object.freeze({\n 'signed-requests': 'signed-requests',\n});\n\nexport interface ComplianceIndexProtocol {\n id: string;\n title: string | null;\n has_baseline: boolean;\n path: string;\n}\n\nexport interface ComplianceIndexSpecialism {\n id: string;\n protocol: string;\n title: string | null;\n status: string;\n path: string;\n}\n\nexport interface ComplianceIndex {\n published_version?: string;\n adcp_version: string;\n generated_at: string;\n universal: string[];\n protocols: ComplianceIndexProtocol[];\n specialisms: ComplianceIndexSpecialism[];\n}\n\nexport type BundleKind = 'universal' | 'protocol' | 'specialism';\n\nexport interface BundleRef {\n kind: BundleKind;\n /** `capability-discovery` for universal, `media-buy` for protocol, `sales-guaranteed` for specialism. */\n id: string;\n /** Path to the bundle directory (or YAML file, for universal bundles). */\n path: string;\n /** AdCP cache version this bundle came from. */\n adcp_version?: string;\n}\n\nexport interface AgentCapabilities {\n /** AdCP protocols the agent implements. Snake_case per schema. */\n supported_protocols?: string[];\n /** Optional specialisms the agent claims. */\n specialisms?: string[];\n /**\n * AdCP major versions the agent declared (from `get_adcp_capabilities.adcp.major_versions`).\n * When set, storyboards carrying `introduced_in: <major.minor>` whose major\n * isn't in this list are filtered into `not_applicable` instead of being\n * run against an agent that predates them. Unset → no version gating.\n */\n major_versions?: number[];\n /**\n * Exact/release-precision AdCP versions the seller supports, from\n * `get_adcp_capabilities.adcp.supported_versions`. When present, the\n * runner treats it as more specific than `major_versions`.\n */\n supported_versions?: string[];\n}\n\n/** Reason a storyboard was not run against an agent. */\nexport interface NotApplicableStoryboard {\n storyboard_id: string;\n storyboard_title: string;\n /** Track this storyboard would have contributed to, if known. */\n track?: string;\n reason: string;\n /** Selection reason when the storyboard was excluded before execution. */\n selection_result?: RunnerSelectionResult;\n}\n\nexport interface ResolveOptions {\n /** Explicit version override; defaults to the client's pinned ADCP_VERSION. */\n version?: string;\n /** Override the compliance cache root (tests use this to point at fixtures). */\n complianceDir?: string;\n /**\n * Explicit schema bundle root to use with the selected compliance cache.\n * The path must point at the schema-data directory for the cache version,\n * for example `.../dist/lib/schemas-data/3.0`.\n */\n schemaRoot?: string;\n /**\n * Hosted badge compatibility alias. When set, a prerelease compliance cache\n * for this stable line (for example cache `3.1.0-beta.7` with alias `3.1`)\n * may be selected for a seller that advertises the stable line in\n * `adcp.supported_versions`.\n *\n * This is deliberately scoped to a single resolver call. Normal wire-version\n * negotiation and explicit beta diagnostic targets stay strict unless the\n * caller opts in here.\n */\n hostedStableLineAlias?: string;\n}\n\nexport interface ResolvedBundle {\n ref: BundleRef;\n storyboards: Storyboard[];\n}\n\nexport interface ResolvedStoryboards {\n bundles: ResolvedBundle[];\n storyboards: Storyboard[];\n /**\n * Storyboards the agent's declared `major_versions` predates. Surfaced so\n * callers can render a `not_applicable` row — silently dropping them would\n * mean an agent that hasn't certified against a later spec version passes\n * vacuously.\n */\n not_applicable: NotApplicableStoryboard[];\n}\n\nfunction getRepoRoot(): string {\n // Walks from src/lib/testing/storyboard/ (or dist/lib/testing/storyboard/) → package root.\n return resolve(__dirname, '..', '..', '..', '..');\n}\n\n/**\n * Resolve the compliance cache directory.\n *\n * Priority:\n * 1. `options.complianceDir` (explicit override, used by tests)\n * 2. `ADCP_COMPLIANCE_DIR` env var (full path including version dir, for packaged consumers)\n * 3. `{package-root}/compliance/cache/{version}` (default, ships with the npm package)\n */\nexport function getComplianceCacheDir(options: ResolveOptions = {}): string {\n const configured = getConfiguredComplianceDir(options);\n if (configured) return configured;\n const version = options.version || readAdcpVersion();\n return join(getRepoRoot(), 'compliance', 'cache', version);\n}\n\nfunction readAdcpVersion(): string {\n // Compile-time ADCP_VERSION from src/lib/version.ts is the single source of truth\n // at runtime. scripts/sync-schemas.ts still reads the text file — sync-version.ts\n // keeps them aligned so the cache directory the lib expects matches what sync wrote.\n return ADCP_VERSION;\n}\n\nfunction complianceMissingMessage(what: string, path: string): string {\n return (\n `${what} not found at ${path}. ` +\n `The compliance cache ships with @adcp/sdk — run \\`npm i @adcp/sdk@latest\\` (or \\`npx @adcp/sdk@latest …\\`) to pick up the current cache. ` +\n `If developing locally, run \\`npm run sync-schemas\\` to populate the cache.`\n );\n}\n\n/** Load and parse `index.json` from the compliance cache. */\nexport function loadComplianceIndex(options: ResolveOptions = {}): ComplianceIndex {\n const dir = getComplianceCacheDir(options);\n const indexPath = join(dir, 'index.json');\n if (!existsSync(indexPath)) {\n throw new Error(complianceMissingMessage('Compliance cache', dir));\n }\n const index = JSON.parse(readFileSync(indexPath, 'utf-8')) as ComplianceIndex;\n return normalizeComplianceIndex(index, options, indexPath);\n}\n\nexport function getExternalSchemaRootForCompliance(options: ResolveOptions, adcpVersion: string): string | undefined {\n const configuredSchemaRoot = getConfiguredSchemaRoot(options);\n if (configuredSchemaRoot) return configuredSchemaRoot;\n // An explicit version still resolves through the package's default compliance\n // cache. Probe from that directory too so preflight capability discovery uses\n // the selected release's exact schema tree rather than whatever bundle the SDK\n // happened to compile as its default.\n const complianceDir =\n getConfiguredComplianceDir(options) ?? (options.version !== undefined ? getComplianceCacheDir(options) : undefined);\n const siblingSchemaRoot = complianceDir ? findExternalSchemaRoot(complianceDir, adcpVersion) : undefined;\n if (siblingSchemaRoot) return siblingSchemaRoot;\n if (options.version !== undefined || complianceDir !== undefined) {\n assertComplianceSchemaBundleAvailable(options, adcpVersion, complianceDir);\n }\n return undefined;\n}\n\nfunction assertComplianceSchemaBundleAvailable(\n options: ResolveOptions,\n adcpVersion: string,\n complianceDir: string | undefined\n): void {\n if (hasSchemaBundle(adcpVersion)) return;\n const selector = options.version ? `--compliance-version ${options.version}` : `compliance cache ${complianceDir}`;\n const bundleKey = resolveBundleKey(adcpVersion);\n throw new Error(\n `${selector} selected AdCP compliance version \"${adcpVersion}\", but no matching schema bundle was found. ` +\n `Refusing to validate storyboard responses with the installed default schemas. ` +\n `Pass --schema-root PATH or set ADCP_SCHEMA_ROOT to a schema-data root for \"${adcpVersion}\" ` +\n `(for example dist/lib/schemas-data/${bundleKey} or schemas/cache/${adcpVersion}), ` +\n `or install/sync an @adcp/sdk package that includes that schema bundle.`\n );\n}\n\nfunction getConfiguredComplianceDir(options: Pick<ResolveOptions, 'complianceDir'>): string | undefined {\n return options.complianceDir ?? process.env.ADCP_COMPLIANCE_DIR;\n}\n\nfunction getConfiguredSchemaRoot(options: Pick<ResolveOptions, 'schemaRoot'>): string | undefined {\n return options.schemaRoot ?? process.env.ADCP_SCHEMA_ROOT;\n}\n\nfunction normalizeComplianceIndex(index: ComplianceIndex, options: ResolveOptions, indexPath: string): ComplianceIndex {\n if (index.adcp_version === 'latest') {\n const repairedVersion = findReplacementForLatestComplianceVersion(index, options);\n if (repairedVersion) {\n return { ...index, adcp_version: repairedVersion };\n }\n }\n\n assertValidComplianceIndexVersion(index.adcp_version, indexPath);\n return index;\n}\n\nfunction findReplacementForLatestComplianceVersion(\n index: ComplianceIndex,\n options: ResolveOptions\n): string | undefined {\n if (isValidComplianceIndexVersion(index.published_version)) return index.published_version;\n\n const schemaRoot = getConfiguredSchemaRoot(options);\n const configuredVersion = schemaRoot ? readSchemaRootAdcpVersion(schemaRoot) : undefined;\n if (configuredVersion) return configuredVersion;\n\n if (!options.complianceDir) return undefined;\n return readSiblingSchemaAdcpVersion(options.complianceDir);\n}\n\nfunction readSchemaRootAdcpVersion(schemaRoot: string): string | undefined {\n const roots = [schemaRoot];\n if (basename(schemaRoot) === 'bundled') roots.push(dirname(schemaRoot));\n\n for (const root of roots) {\n const indexPath = join(root, 'index.json');\n if (!existsSync(indexPath)) continue;\n try {\n const parsed = JSON.parse(readFileSync(indexPath, 'utf-8')) as { adcp_version?: unknown };\n if (isValidComplianceIndexVersion(parsed.adcp_version)) return parsed.adcp_version;\n } catch {\n // Schema-root discovery is best-effort; the final compliance-index\n // validation below owns the actionable error when no replacement exists.\n }\n }\n for (const root of roots) {\n const version = readSchemaIdVersion(root);\n if (version) return version;\n }\n return undefined;\n}\n\nfunction readSchemaIdVersion(root: string): string | undefined {\n const versions = new Set<string>();\n const scanRoot = existsSync(join(root, 'bundled')) ? join(root, 'bundled') : root;\n for (const file of walkJsonFiles(scanRoot)) {\n try {\n const parsed = JSON.parse(readFileSync(file, 'utf-8')) as { $id?: unknown };\n if (typeof parsed.$id !== 'string') continue;\n const version = parsed.$id.match(/\\/schemas\\/([^/]+)\\//)?.[1];\n if (isValidComplianceIndexVersion(version)) versions.add(version);\n } catch {\n // Best-effort discovery; malformed schemas are handled by validation.\n }\n }\n return versions.size === 1 ? [...versions][0] : undefined;\n}\n\nfunction readSiblingSchemaAdcpVersion(complianceDir: string): string | undefined {\n for (const schemaRoot of schemaRootCandidatesForComplianceDir(complianceDir)) {\n const version = readSchemaRootAdcpVersion(schemaRoot);\n if (version) return version;\n }\n return undefined;\n}\n\nfunction isValidComplianceIndexVersion(version: unknown): version is string {\n if (typeof version !== 'string') return false;\n try {\n resolveBundleKey(version);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction assertValidComplianceIndexVersion(version: string, indexPath: string): void {\n try {\n resolveBundleKey(version);\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n throw new Error(\n `Compliance cache ${indexPath} declares invalid adcp_version ${JSON.stringify(version)}. ` +\n `adcp_version must be a real AdCP bundle version, not a selector alias such as \"latest\". ` +\n `If this is a local development bundle, pass ADCP_SCHEMA_ROOT or --schema-root pointing at the matching schema bundle. ` +\n reason\n );\n }\n}\n\nfunction findExternalSchemaRoot(complianceDir: string, adcpVersion: string): string | undefined {\n const candidates = [complianceDir, ...schemaRootCandidatesForComplianceDir(complianceDir, adcpVersion)];\n return candidates.find(hasSchemaRootShape);\n}\n\nfunction schemaRootCandidatesForComplianceDir(complianceDir: string, adcpVersion?: string): string[] {\n const candidates = new Set<string>();\n const packageRoots = packageRootCandidatesForComplianceDir(complianceDir);\n const add = (candidate: string) => candidates.add(candidate);\n\n for (const packageRoot of packageRoots) {\n addVersionedSchemaRoots(packageRoot, adcpVersion ?? ADCP_VERSION, add);\n }\n if (adcpVersion === undefined) {\n for (const packageRoot of packageRoots) {\n addSchemaContainerChildren(join(packageRoot, 'dist', 'lib', 'schemas-data'), add);\n addSchemaContainerChildren(join(packageRoot, 'dist', 'schemas'), add);\n addSchemaContainerChildren(join(packageRoot, 'schemas', 'cache'), add);\n }\n }\n\n return [...candidates];\n}\n\nfunction addVersionedSchemaRoots(packageRoot: string, adcpVersion: string, add: (candidate: string) => void): void {\n const key = resolveBundleKey(adcpVersion);\n // Prefer exact release roots before stable-minor aliases. Patch releases\n // normally share wire shape, but an explicitly selected compliance kit is\n // the authority for its own preflight validation and must not be shadowed\n // by an older `3.1` bundle left in dist.\n add(join(packageRoot, 'dist', 'lib', 'schemas-data', adcpVersion));\n add(join(packageRoot, 'dist', 'schemas', adcpVersion));\n add(join(packageRoot, 'schemas', 'cache', adcpVersion));\n add(join(packageRoot, 'dist', 'lib', 'schemas-data', key));\n add(join(packageRoot, 'dist', 'schemas', key));\n add(join(packageRoot, 'schemas', 'cache', key));\n}\n\nfunction addSchemaContainerChildren(container: string, add: (candidate: string) => void): void {\n if (!existsSync(container)) return;\n for (const entry of readdirSync(container).sort().reverse()) {\n const full = join(container, entry);\n try {\n if (statSync(full).isDirectory()) add(full);\n } catch {\n // Best-effort sibling discovery; ignore entries that disappear mid-scan.\n }\n }\n}\n\nfunction packageRootCandidatesForComplianceDir(complianceDir: string): string[] {\n const roots = new Set<string>();\n const resolved = resolve(complianceDir);\n let current = resolved;\n\n while (true) {\n if (basename(current) === 'compliance') {\n const parent = dirname(current);\n if (basename(parent) === 'dist') roots.add(dirname(parent));\n roots.add(parent);\n }\n const next = dirname(current);\n if (next === current) break;\n current = next;\n }\n\n roots.add(dirname(dirname(dirname(resolved))));\n return [...roots];\n}\n\nfunction hasSchemaRootShape(root: string): boolean {\n if (!existsSync(root)) return false;\n const scanRoot = existsSync(join(root, 'bundled')) ? join(root, 'bundled') : root;\n return walkJsonFiles(scanRoot).some(file => {\n try {\n const parsed = JSON.parse(readFileSync(file, 'utf-8')) as { $id?: unknown; $schema?: unknown };\n return typeof parsed.$id === 'string' || typeof parsed.$schema === 'string';\n } catch {\n return false;\n }\n });\n}\n\nfunction walkJsonFiles(dir: string): string[] {\n if (!existsSync(dir)) return [];\n const out: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) out.push(...walkJsonFiles(full));\n else if (entry.isFile() && entry.name.endsWith('.json')) out.push(full);\n }\n return out;\n}\n\n/**\n * Load every storyboard YAML under a directory tree (non-recursive for files at the top\n * level of a bundle, recursive for nested `scenarios/`). YAMLs that don't have a top-level\n * `id:` (schema / fixture files) are skipped.\n */\nfunction loadStoryboardsFromDir(dir: string): Storyboard[] {\n if (!existsSync(dir)) return [];\n const storyboards: Storyboard[] = [];\n const visit = (current: string) => {\n // Sort entries so ordering is deterministic across filesystems.\n const entries = readdirSync(current).sort();\n // Prefer index.yaml first so bundle-as-id lookups resolve to the main storyboard.\n entries.sort((a, b) => {\n if (a === 'index.yaml') return -1;\n if (b === 'index.yaml') return 1;\n return 0;\n });\n for (const entry of entries) {\n const full = join(current, entry);\n const stat = statSync(full);\n if (stat.isDirectory()) {\n visit(full);\n } else if (entry.endsWith('.yaml') || entry.endsWith('.yml')) {\n try {\n storyboards.push(loadStoryboardFile(full));\n } catch (err) {\n // Peek at the file — if it has an `id:` line it was meant to be a\n // storyboard and the error is a real problem; otherwise it's a schema\n // or fixture file (e.g., storyboard-schema.yaml) and silence is fine.\n try {\n const text = readFileSync(full, 'utf-8');\n if (/^id:\\s*\\S/m.test(text)) {\n console.warn(`[compliance] Failed to parse storyboard ${full}: ${(err as Error).message}`);\n }\n } catch {\n /* unreadable file — treat as non-storyboard */\n }\n }\n }\n }\n };\n visit(dir);\n return storyboards;\n}\n\n/** Load storyboards for a single bundle (universal YAML file, domain dir, or specialism dir). */\nexport function loadBundleStoryboards(ref: BundleRef): Storyboard[] {\n const raw = ref.kind === 'universal' ? safeLoadUniversal(ref.path) : loadStoryboardsFromDir(ref.path);\n const complianceDir = dirname(dirname(ref.path));\n return raw.map(sb => annotateStoryboardVersion(postProcessStoryboard(sb), ref.adcp_version, complianceDir));\n}\n\nfunction annotateStoryboardVersion(\n storyboard: Storyboard,\n adcpVersion: string | undefined,\n complianceDir: string\n): Storyboard {\n return markStoryboardComplianceRoot(\n {\n ...storyboard,\n ...(adcpVersion !== undefined && { adcp_version: adcpVersion }),\n compliance_dir: complianceDir,\n },\n complianceDir\n );\n}\n\nfunction safeLoadUniversal(path: string): Storyboard[] {\n try {\n return [loadStoryboardFile(path)];\n } catch {\n return [];\n }\n}\n\n/**\n * Post-process storyboards loaded from the cache. The signed-requests\n * specialism ships phases whose steps are generated at runtime from the\n * request-signing test vectors; synthesize them here so downstream callers\n * (the runner, CLI tooling, reporting) see a fully-populated storyboard.\n */\nfunction postProcessStoryboard(storyboard: Storyboard): Storyboard {\n if (storyboard.id === 'signed_requests') {\n try {\n return synthesizeRequestSigningSteps(storyboard);\n } catch (err) {\n // Synthesis failure = infrastructural problem (cache missing vectors,\n // schema drift, etc.). Emit a synthetic failing phase so the runner's\n // existing reporting surfaces the cause — silent empty-phase fallback\n // would render as a green pass with 0 steps, which is the worst\n // possible outcome for CI pipelines.\n return withSynthesisErrorPhase(storyboard, err);\n }\n }\n return storyboard;\n}\n\nfunction withSynthesisErrorPhase(storyboard: Storyboard, err: unknown): Storyboard {\n const message = err instanceof Error ? err.message : String(err);\n const errorPhase = {\n id: 'synthesis_error',\n title: 'Request-signing vector synthesis failed',\n narrative:\n 'The signed-requests specialism requires its phases to be synthesized at load time ' +\n 'from the compliance cache. Synthesis failed — the runner cannot grade against the ' +\n 'conformance vectors. Run `npm run sync-schemas` to refresh the cache.',\n steps: [\n {\n id: 'synthesis_error',\n title: 'Synthesize vector phases',\n task: 'synthesis_error',\n narrative: message,\n expect_error: false,\n },\n ],\n };\n return { ...storyboard, phases: [errorPhase, ...storyboard.phases] };\n}\n\n/** Enumerate every bundle present in the cache (universal + protocols + specialisms). */\nexport function listBundles(options: ResolveOptions = {}): BundleRef[] {\n const dir = getComplianceCacheDir(options);\n const index = loadComplianceIndex(options);\n const bundles: BundleRef[] = [];\n\n for (const name of index.universal) {\n bundles.push({\n kind: 'universal',\n id: name,\n path: join(dir, 'universal', `${name}.yaml`),\n adcp_version: index.adcp_version,\n });\n }\n for (const protocol of index.protocols) {\n if (!protocol.has_baseline) continue;\n bundles.push({\n kind: 'protocol',\n id: protocol.id,\n path: join(dir, 'protocols', protocol.id),\n adcp_version: index.adcp_version,\n });\n }\n for (const specialism of index.specialisms) {\n bundles.push({\n kind: 'specialism',\n id: specialism.id,\n path: join(dir, 'specialisms', specialism.id),\n adcp_version: index.adcp_version,\n });\n }\n return bundles;\n}\n\n/** List every storyboard the cache can produce, across all bundles. */\nexport function listAllComplianceStoryboards(options: ResolveOptions = {}): Storyboard[] {\n const seen = new Set<string>();\n const storyboards: Storyboard[] = [];\n for (const ref of listBundles(options)) {\n for (const sb of loadBundleStoryboards(ref)) {\n if (seen.has(sb.id)) continue;\n seen.add(sb.id);\n storyboards.push(sb);\n }\n }\n return storyboards;\n}\n\n/**\n * Find a storyboard by its internal `id` (the YAML's `id:` field).\n * Scans every bundle in the cache. Returns undefined if no match.\n */\nexport function getComplianceStoryboardById(id: string, options: ResolveOptions = {}): Storyboard | undefined {\n for (const sb of listAllComplianceStoryboards(options)) {\n if (sb.id === id) return sb;\n }\n return undefined;\n}\n\n/** Find a bundle by its directory/file id (`media-buy`, `sales-guaranteed`, `capability-discovery`). */\nexport function findBundleById(id: string, options: ResolveOptions = {}): BundleRef | undefined {\n return listBundles(options).find(b => b.id === id);\n}\n\n/**\n * Resolved view of a specialism for the `adcp specialism show` CLI: the\n * specialism's own storyboard plus every protocol scenario it pulls in via\n * `requires_scenarios`. Useful as a pre-flight \"what will CI actually run\n * against my server?\" answer.\n */\nexport interface SpecialismDetail {\n slug: string;\n protocol: string;\n status: string;\n /** Title from index.json (kept separate from storyboard.title for fallback). */\n index_title: string | null;\n /** The specialism's own index.yaml parsed as a Storyboard. */\n storyboard: Storyboard;\n /**\n * Required scenarios pulled in from protocol bundles via the index.yaml's\n * `requires_scenarios` field. Each entry is a fully-resolved Storyboard;\n * `unresolved` lists references that did not match a storyboard in the cache.\n */\n required_scenarios: Storyboard[];\n unresolved_scenarios: string[];\n /** Required tools declared by the specialism (from the index entry). */\n required_tools: string[];\n}\n\nexport function loadSpecialismDetail(slug: string, options: ResolveOptions = {}): SpecialismDetail {\n const index = loadComplianceIndex(options);\n const entry = index.specialisms.find(s => s.id === slug);\n if (!entry) {\n const known = index.specialisms.map(s => s.id).join(', ');\n throw new Error(`Unknown specialism \"${slug}\". Known specialisms: ${known}`);\n }\n\n const bundleStoryboards = loadBundleStoryboards({\n kind: 'specialism',\n id: slug,\n path: join(getComplianceCacheDir(options), 'specialisms', slug),\n adcp_version: index.adcp_version,\n });\n const storyboard = bundleStoryboards.find(sb => sb.category === entry.id.replace(/-/g, '_')) ?? bundleStoryboards[0];\n if (!storyboard) {\n throw new Error(\n `Specialism \"${slug}\" loaded no storyboards from ${join(getComplianceCacheDir(options), 'specialisms', slug)}`\n );\n }\n\n const required: Storyboard[] = [];\n const unresolved: string[] = [];\n for (const ref of storyboard.requires_scenarios ?? []) {\n // Scenario YAMLs declare `id: <category>/<scenario_id>` — the slash\n // form is the storyboard's own id and the only safe lookup. Bare-id\n // fallbacks would silently match across categories once future caches\n // ship scenarios with colliding tail segments — better to surface drift\n // through `unresolved_scenarios` than mask it with a wrong-category hit.\n const sb = getComplianceStoryboardById(ref, options);\n if (sb) required.push(sb);\n else unresolved.push(ref);\n }\n\n // index.json carries the canonical required_tools list — fall back to the\n // storyboard's own field if the index entry is missing it.\n const requiredTools =\n (entry as ComplianceIndexSpecialism & { required_tools?: string[] }).required_tools ??\n storyboard.required_tools ??\n [];\n\n return {\n slug,\n protocol: entry.protocol,\n status: entry.status,\n index_title: entry.title,\n storyboard,\n required_scenarios: required,\n unresolved_scenarios: unresolved,\n required_tools: requiredTools,\n };\n}\n\nexport function listSpecialisms(options: ResolveOptions = {}): ComplianceIndexSpecialism[] {\n return loadComplianceIndex(options).specialisms;\n}\n\n/**\n * Resolve either a bundle id or a storyboard id to a storyboard set.\n * Bundle ids expand to every storyboard in the bundle (index + scenarios).\n * Storyboard ids resolve to that single storyboard.\n *\n * Used for targeted `storyboard run <agent> <id>` invocations.\n */\nexport function resolveBundleOrStoryboard(id: string, options: ResolveOptions = {}): Storyboard[] {\n const bundle = findBundleById(id, options);\n if (bundle) return loadBundleStoryboards(bundle);\n const sb = getComplianceStoryboardById(id, options);\n return sb ? [sb] : [];\n}\n\n/**\n * Given the agent's `get_adcp_capabilities` response, resolve the set of\n * storyboards the compliance runner should execute:\n *\n * universal — every universal bundle (mandatory for every agent)\n * protocols — baseline for each declared `supported_protocols` entry\n * specialisms — every declared specialism\n *\n * Throws `CapabilityResolutionError` (fail-closed) when the declared\n * capabilities cannot be mapped onto the cache:\n *\n * - `unknown_specialism` — declared specialism has no bundle (usually stale\n * cache — run `npm run sync-schemas`).\n * - `specialism_parent_protocol_missing` — declared specialism rolls up to\n * a protocol the agent didn't include in `supported_protocols`.\n *\n * Unknown `supported_protocols` entries are logged as warnings and skipped\n * rather than thrown (fail-open), so a single bad entry doesn't block the run.\n */\nexport function resolveStoryboardsForCapabilities(\n caps: AgentCapabilities,\n options: ResolveOptions = {}\n): ResolvedStoryboards {\n const index = loadComplianceIndex(options);\n assertSupportedComplianceVersion(index.adcp_version, caps.supported_versions, options);\n const cacheDir = getComplianceCacheDir(options);\n const bundles: ResolvedBundle[] = [];\n const storyboards: Storyboard[] = [];\n const notApplicable: NotApplicableStoryboard[] = [];\n const seenStoryboards = new Set<string>();\n\n const push = (ref: BundleRef) => {\n const sbs = loadBundleStoryboards(ref);\n bundles.push({ ref, storyboards: sbs });\n for (const sb of sbs) {\n if (seenStoryboards.has(sb.id)) continue;\n seenStoryboards.add(sb.id);\n const gate = checkVersionGate(sb, caps.major_versions);\n if (gate) {\n notApplicable.push({\n storyboard_id: sb.id,\n storyboard_title: sb.title,\n track: sb.track,\n reason: gate,\n selection_result: { reason: 'version_excluded', detail: gate },\n });\n continue;\n }\n storyboards.push(sb);\n }\n };\n\n for (const name of index.universal) {\n push({\n kind: 'universal',\n id: name,\n path: join(cacheDir, 'universal', `${name}.yaml`),\n adcp_version: index.adcp_version,\n });\n }\n\n const declaredProtocols = caps.supported_protocols ?? [];\n const declaredProtocolIds = new Set<string>();\n for (const protocol of declaredProtocols) {\n // Legacy: older agents listed `compliance_testing` under supported_protocols.\n // The current schema declares it via the top-level `compliance_testing`\n // capability block instead, and it has no compliance baseline. Skip silently.\n if (protocol === 'compliance_testing' || UNBASELINED_SUPPORTED_PROTOCOLS.has(protocol)) continue;\n\n const protocolId = PROTOCOL_TO_PATH[protocol];\n if (!protocolId) {\n // Unknown protocol — likely a newer spec version or a typo. Mirror the\n // fail-closed posture on specialisms: surface it loudly, but as a warning\n // on stderr so a single bad entry doesn't block the full run.\n console.warn(\n `[resolveStoryboardsForCapabilities] Unknown supported_protocols entry \"${protocol}\". ` +\n `This is ignored; compliance cache may be stale or the agent is on a newer AdCP version.`\n );\n continue;\n }\n const entry = index.protocols.find(d => d.id === protocolId);\n if (!entry || !entry.has_baseline) continue;\n declaredProtocolIds.add(protocolId);\n push({\n kind: 'protocol',\n id: protocolId,\n path: join(cacheDir, 'protocols', protocolId),\n adcp_version: index.adcp_version,\n });\n }\n\n const declaredSpecialisms = caps.specialisms ?? [];\n for (const specialism of declaredSpecialisms) {\n const entry = index.specialisms.find(s => s.id === specialism);\n if (!entry) {\n // Deprecated alias path: some 3.0-era specialism enum values now resolve\n // to a `universal/` bundle (e.g. `signed-requests` → `universal/signed-requests.yaml`).\n // The universal storyboard is pushed unconditionally above; the deprecated\n // claim is graded there and the deprecation notice fires from runner.ts.\n // Don't throw — that would block every other storyboard.\n const universalAlias = DEPRECATED_SPECIALISM_UNIVERSAL_ALIASES[specialism];\n if (universalAlias && index.universal.includes(universalAlias)) {\n continue;\n }\n throw new CapabilityResolutionError({\n code: 'unknown_specialism',\n specialism,\n message:\n `Agent declared specialism \"${specialism}\" but no bundle exists at ` +\n `${join(cacheDir, 'specialisms', specialism)}. ` +\n `Known specialisms: ${index.specialisms.map(s => s.id).join(', ')}. ` +\n `Compliance cache version: ${index.adcp_version}. ` +\n `This usually means the cache is stale — run \\`npm run sync-schemas\\`.`,\n });\n }\n // Each specialism rolls up to one parent protocol; the spec requires the parent\n // to also be declared in supported_protocols. AAO enforces this server-side,\n // but catching it client-side stops us from running orphan scenarios.\n if (entry.protocol && !declaredProtocolIds.has(entry.protocol)) {\n throw new CapabilityResolutionError({\n code: 'specialism_parent_protocol_missing',\n specialism,\n parentProtocol: entry.protocol,\n message:\n `Agent declared specialism \"${specialism}\" (parent protocol: ${entry.protocol}) ` +\n `but did not include \"${entry.protocol}\" in supported_protocols. ` +\n `Every specialism must roll up to a declared protocol per the AdCP spec.`,\n });\n }\n push({\n kind: 'specialism',\n id: specialism,\n path: join(cacheDir, 'specialisms', specialism),\n adcp_version: index.adcp_version,\n });\n }\n\n return { bundles, storyboards, not_applicable: notApplicable };\n}\n\nexport function isComplianceVersionSupported(\n cacheVersion: string,\n supportedVersions: readonly string[],\n options: Pick<ResolveOptions, 'hostedStableLineAlias'> = {}\n): boolean {\n return (\n isAdcpVersionSupported(cacheVersion, supportedVersions) ||\n isHostedStableLineAliasSupported(cacheVersion, supportedVersions, options.hostedStableLineAlias)\n );\n}\n\nfunction assertSupportedComplianceVersion(\n cacheVersion: string,\n supportedVersions: string[] | undefined,\n options: Pick<ResolveOptions, 'hostedStableLineAlias'> = {}\n): void {\n if (!supportedVersions || supportedVersions.length === 0) return;\n if (isComplianceVersionSupported(cacheVersion, supportedVersions, options)) return;\n throw new CapabilityResolutionError({\n code: 'unsupported_adcp_version',\n message:\n `Compliance cache version ${cacheVersion} is not supported by this seller. ` +\n `Seller advertises adcp.supported_versions [${supportedVersions.join(', ')}]. ` +\n `Install or select a compatible compliance cache instead of relying on major_versions alone.`,\n });\n}\n\nfunction isHostedStableLineAliasSupported(\n cacheVersion: string,\n supportedVersions: readonly string[],\n hostedStableLineAlias: string | undefined\n): boolean {\n if (!hostedStableLineAlias || supportedVersions.length === 0) return false;\n const cacheLine = stableLineOf(cacheVersion);\n const aliasLine = stableLineOf(hostedStableLineAlias);\n if (!cacheLine || !aliasLine || cacheLine !== aliasLine) return false;\n if (!isPrereleaseVersion(cacheVersion)) return false;\n return isAdcpVersionSupported(hostedStableLineAlias, supportedVersions);\n}\n\nfunction stableLineOf(version: string): string | undefined {\n const match = /^(?:v)?(\\d+)\\.(\\d+)(?:\\.|$|-)/.exec(version);\n return match?.[1] && match?.[2] ? `${match[1]}.${match[2]}` : undefined;\n}\n\nfunction isPrereleaseVersion(version: string): boolean {\n return /^\\d+\\.\\d+(?:\\.\\d+)?-/.test(version);\n}\n\n/**\n * Compare a storyboard's `introduced_in` (e.g., \"3.1\") against an agent's\n * declared `major_versions` (e.g., `[3]`). Returns a reason string when the\n * storyboard should be gated out; undefined when it applies.\n *\n * Grammar: `introduced_in` is `<major>` or `<major>.<minor>` — only the major\n * is consulted for filtering. Minor/patch components are kept on the storyboard\n * for reporting but don't drive the gate because the spec's `major_versions`\n * array only carries majors.\n *\n * When either side is absent the gate is a no-op: agents that don't declare\n * `major_versions` (v2 synthetic profiles, discovery failures) run every\n * storyboard, and storyboards without `introduced_in` always apply.\n */\nfunction checkVersionGate(sb: Storyboard, agentMajors: number[] | undefined): string | undefined {\n if (!sb.introduced_in || !agentMajors || agentMajors.length === 0) return undefined;\n const parsed = parseIntroducedIn(sb.introduced_in);\n if (parsed === undefined) return undefined; // unparseable → don't block\n if (agentMajors.includes(parsed)) return undefined;\n const declared = agentMajors\n .slice()\n .sort((a, b) => a - b)\n .join(', ');\n return `Introduced in AdCP ${sb.introduced_in}; agent declares major_versions [${declared}].`;\n}\n\nfunction parseIntroducedIn(value: string): number | undefined {\n const match = /^\\s*(\\d+)(?:\\.\\d+)*\\s*$/.exec(value);\n if (!match?.[1]) return undefined;\n const major = Number.parseInt(match[1], 10);\n return Number.isFinite(major) ? major : undefined;\n}\n"],"mappings":"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","names":["require"]}
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,qBAAsB,CAAC;AAKxD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAuB/D;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAE/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAmBpE"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,qBAAsB,CAAC;AAKxD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CA4B/D;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAE/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAmBpE"}
@@ -37,6 +37,11 @@ function parseStoryboard(yamlContent) {
37
37
  if (!parsed?.id || !parsed?.phases) {
38
38
  throw new Error("Invalid storyboard YAML: missing required fields (id, phases)");
39
39
  }
40
+ if (Object.prototype.hasOwnProperty.call(parsed, "compliance_dir")) {
41
+ throw new Error(
42
+ "Invalid storyboard YAML: compliance_dir is loader-owned runtime provenance; select an external cache with runner options instead."
43
+ );
44
+ }
40
45
  for (const phase of parsed.phases) {
41
46
  if (!phase.steps) phase.steps = [];
42
47
  for (const step of phase.steps) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/testing/storyboard/loader.ts"],"sourcesContent":["/**\n * Storyboard YAML parser.\n *\n * Storyboards are pulled from the compliance cache populated by\n * `npm run sync-schemas`. See `./compliance.ts` for capability-driven\n * resolution and bundle loading.\n */\n\nimport { readFileSync } from 'fs';\nimport { parse } from 'yaml';\nimport type { Storyboard } from './types';\nimport { MUTATING_TASKS } from '../../utils/idempotency';\nimport { validateFixtureResolutionDeclarations } from './fixture-resolution';\nimport { valid as validSemver } from 'semver';\n\n/**\n * Supported `branch_set.semantics` values. Extend when AdCP adds `all_of`,\n * `at_least_n`, etc. Exported so the runner can enforce the same whitelist\n * on programmatically-constructed storyboards that bypass the YAML parser.\n */\nexport const BRANCH_SET_SEMANTICS = ['any_of'] as const;\n\nconst IDENTIFIER_PATH_SEGMENT = String.raw`[A-Za-z_][A-Za-z0-9_-]*(?:\\[\\*\\])*`;\nconst IDENTIFIER_PATH_PATTERN = new RegExp(`^${IDENTIFIER_PATH_SEGMENT}(?:\\\\.${IDENTIFIER_PATH_SEGMENT})*$`);\n\n/** Parse a YAML string into a Storyboard. Throws if required fields are missing. */\nexport function parseStoryboard(yamlContent: string): Storyboard {\n const parsed = parse(yamlContent) as Storyboard;\n if (!parsed?.id || !parsed?.phases) {\n throw new Error('Invalid storyboard YAML: missing required fields (id, phases)');\n }\n for (const phase of parsed.phases) {\n // Specialism YAMLs may declare a phase with no `steps:` — the steps are\n // synthesized at runtime from fixtures (see request-signing/synthesize.ts).\n // Treat missing steps as an empty list so the parser stays phase-agnostic.\n if (!phase.steps) phase.steps = [];\n // YAML uses `name:` for context outputs but our runtime expects `key:`.\n for (const step of phase.steps) {\n if (!step.context_outputs) continue;\n for (const output of step.context_outputs) {\n const raw = output as unknown as Record<string, unknown>;\n if (raw.name && !raw.key) {\n output.key = raw.name as string;\n }\n }\n }\n }\n validateStoryboardShape(parsed);\n return parsed;\n}\n\n/** Load and parse a single storyboard file. Useful for ad-hoc testing of in-development YAMLs. */\nexport function loadStoryboardFile(filePath: string): Storyboard {\n return parseStoryboard(readFileSync(filePath, 'utf-8'));\n}\n\n/**\n * Enforce authoring-time invariants on a Storyboard. Called by\n * `parseStoryboard`, and should also be called by any runner entry point\n * that accepts a programmatically-built `Storyboard` object so the same\n * loud-fail-on-drift guarantee holds regardless of how the storyboard was\n * constructed. Mutates only legacy shorthand fields (resolves\n * `contributes: true` to `contributes_to`) and is idempotent on\n * already-validated inputs.\n */\nexport function validateStoryboardShape(storyboard: Storyboard): void {\n validateRequires(storyboard);\n validateFixtureResolutionDeclarations(storyboard);\n validateRequiredAnyOfTools(storyboard);\n validatePhaseDependsOn(storyboard);\n for (const phase of storyboard.phases) {\n validateBranchSet(storyboard.id, phase);\n if (!phase.steps) continue;\n for (const step of phase.steps) {\n resolveContributesShorthand(storyboard.id, phase, step);\n validateFixtureForMutatingStep(storyboard.id, phase, step);\n validateOmitFlagCoherence(storyboard.id, phase, step);\n validateContextOutputs(storyboard.id, phase, step);\n validateUpstreamAttestationMode(storyboard.id, phase, step);\n validateUpstreamIdentifierPaths(storyboard.id, phase, step);\n validateAdvisoryDeclarations(storyboard.id, phase, step);\n validatePeerSubstitutesFor(storyboard.id, phase, step);\n }\n }\n}\n\nfunction validateAdvisoryDeclarations(\n storyboardId: string,\n phase: { id?: string },\n step: { id?: string; validations?: any[] }\n): void {\n for (let index = 0; index < (step.validations ?? []).length; index++) {\n const validation = step.validations![index];\n if (\n validation?.severity !== undefined &&\n validation.severity !== 'required' &&\n validation.severity !== 'advisory'\n ) {\n const prefix = `[${storyboardId}] ${phase.id ?? '?'}.${step.id ?? '?'}.validations[${index}]`;\n throw new Error(`${prefix}.severity: must be either \"required\" or \"advisory\"`);\n }\n if (validation?.severity !== 'advisory') continue;\n const prefix = `[${storyboardId}] ${phase.id ?? '?'}.${step.id ?? '?'}.validations[${index}]`;\n const hasExpiry = validation.expires_after_version !== undefined;\n const hasPermanent = validation.permanent_advisory !== undefined;\n if (hasExpiry === hasPermanent) {\n throw new Error(\n `${prefix}: severity \"advisory\" must declare exactly one of expires_after_version or permanent_advisory`\n );\n }\n if (\n hasExpiry &&\n (typeof validation.expires_after_version !== 'string' || !validSemver(validation.expires_after_version))\n ) {\n throw new Error(`${prefix}.expires_after_version: must be a valid semver string`);\n }\n if (\n hasPermanent &&\n (typeof validation.permanent_advisory !== 'object' ||\n validation.permanent_advisory === null ||\n typeof validation.permanent_advisory.reason !== 'string' ||\n validation.permanent_advisory.reason.trim().length === 0)\n ) {\n throw new Error(`${prefix}.permanent_advisory.reason: must be a non-empty string`);\n }\n }\n}\n\nfunction validateUpstreamAttestationMode(\n storyboardId: string,\n phase: { id?: string },\n step: { id?: string; validations?: any[] }\n): void {\n const validations = step.validations ?? [];\n for (let validationIndex = 0; validationIndex < validations.length; validationIndex++) {\n const validation = validations[validationIndex];\n if (validation?.check !== 'upstream_traffic') continue;\n const mode = validation.preferred_attestation_mode;\n if (mode !== undefined && mode !== 'raw' && mode !== 'digest') {\n throw new Error(\n `[${storyboardId}] ${phase.id ?? '?'}.${step.id ?? '?'}.validations[${validationIndex}].preferred_attestation_mode: must be \"raw\" or \"digest\"`\n );\n }\n }\n}\n\nfunction validateUpstreamIdentifierPaths(\n storyboardId: string,\n phase: { id?: string },\n step: { id?: string; validations?: any[] }\n): void {\n const validations = step.validations ?? [];\n for (let validationIndex = 0; validationIndex < validations.length; validationIndex++) {\n const validation = validations[validationIndex];\n if (validation?.check !== 'upstream_traffic' || validation.identifier_paths === undefined) continue;\n if (!Array.isArray(validation.identifier_paths)) {\n throw new Error(\n `[${storyboardId}] ${phase.id ?? '?'}.${\n step.id ?? '?'\n }.validations[${validationIndex}].identifier_paths: must be an array of request-payload paths`\n );\n }\n for (let pathIndex = 0; pathIndex < validation.identifier_paths.length; pathIndex++) {\n const path = validation.identifier_paths[pathIndex];\n if (typeof path !== 'string' || path.length === 0) {\n throw new Error(\n `[${storyboardId}] ${phase.id ?? '?'}.${step.id ?? '?'}.validations[${validationIndex}].identifier_paths[${pathIndex}]: must be a non-empty string`\n );\n }\n const pathErrorPrefix = `[${storyboardId}] ${phase.id ?? '?'}.${step.id ?? '?'}.validations[${validationIndex}].identifier_paths[${pathIndex}]`;\n let firstSegment: string;\n try {\n const validated = validateIdentifierPathSyntax(path);\n firstSegment = validated.firstSegment;\n } catch {\n throw new Error(\n `${pathErrorPrefix}: \"${path}\" is unsupported; identifier_paths resolve only against the request payload or sample_request using dotted paths with [*] array selectors`\n );\n }\n const root = firstSegment.toLowerCase();\n if (root === 'request' || root === 'response' || root === 'context') {\n throw new Error(\n `${pathErrorPrefix}: \"${path}\" is unsupported; identifier_paths resolve only against the request payload or sample_request`\n );\n }\n }\n }\n}\n\nfunction validateIdentifierPathSyntax(path: string): { normalized: string; firstSegment: string } {\n const trimmed = path.trim();\n const normalized = trimmed.startsWith('$.') ? trimmed.slice(2) : trimmed;\n if (!IDENTIFIER_PATH_PATTERN.test(normalized)) {\n throw new Error('unsupported identifier path syntax');\n }\n return { normalized, firstSegment: normalized.split(/[.[\\]]/, 1)[0] ?? '' };\n}\n\nfunction validateRequiredAnyOfTools(storyboard: Storyboard): void {\n if (storyboard.required_any_of_tools === undefined) return;\n if (!Array.isArray(storyboard.required_any_of_tools)) {\n throw new Error(`[${storyboard.id}] required_any_of_tools: must be an array of tool-family objects`);\n }\n if (storyboard.required_any_of_tools.length === 0) {\n throw new Error(`[${storyboard.id}] required_any_of_tools: [] is not allowed — omit the field to use no gate`);\n }\n for (let i = 0; i < storyboard.required_any_of_tools.length; i++) {\n const family = storyboard.required_any_of_tools[i] as unknown;\n if (family === null || typeof family !== 'object' || Array.isArray(family)) {\n throw new Error(`[${storyboard.id}] required_any_of_tools[${i}]: must be an object`);\n }\n const { tools, rationale } = family as { tools?: unknown; rationale?: unknown };\n if (!Array.isArray(tools) || tools.length < 2) {\n throw new Error(`[${storyboard.id}] required_any_of_tools[${i}].tools: must list at least two tool names`);\n }\n for (const tool of tools) {\n if (typeof tool !== 'string' || tool.length === 0) {\n throw new Error(`[${storyboard.id}] required_any_of_tools[${i}].tools: entries must be non-empty strings`);\n }\n }\n if (rationale !== undefined && typeof rationale !== 'string') {\n throw new Error(`[${storyboard.id}] required_any_of_tools[${i}].rationale: must be a string`);\n }\n }\n}\n\n/**\n * Authoring-time validation for `phase.depends_on` (#1161). Each entry\n * must reference a phase declared earlier in the storyboard. Forward\n * references and self-references fail loud at parse time so authoring\n * mistakes (typos, reorderings) don't degrade silently into \"phase\n * always runs\" / \"phase always cascades.\"\n *\n * Rules:\n * - Empty list (`depends_on: []`) is legal — it declares an\n * independent phase. No further validation needed.\n * - Each non-empty entry must be a non-empty string.\n * - Each entry must reference a phase that appears EARLIER in the\n * `storyboard.phases[]` array (forward references are rejected).\n * - A phase cannot depend on itself.\n */\nfunction validatePhaseDependsOn(storyboard: Storyboard): void {\n const phaseIdsSeen = new Set<string>();\n for (const phase of storyboard.phases) {\n if (phase.depends_on !== undefined) {\n if (!Array.isArray(phase.depends_on)) {\n throw new Error(`[${storyboard.id}] phase '${phase.id}': depends_on must be an array of phase ids`);\n }\n for (const dep of phase.depends_on) {\n if (typeof dep !== 'string' || dep.length === 0) {\n throw new Error(`[${storyboard.id}] phase '${phase.id}': depends_on entries must be non-empty strings`);\n }\n if (dep === phase.id) {\n throw new Error(`[${storyboard.id}] phase '${phase.id}': depends_on cannot reference itself`);\n }\n if (!phaseIdsSeen.has(dep)) {\n throw new Error(\n `[${storyboard.id}] phase '${phase.id}': depends_on '${dep}' is not a phase declared earlier in this storyboard (forward and unknown references are rejected)`\n );\n }\n }\n }\n phaseIdsSeen.add(phase.id);\n }\n}\n\n/**\n * Authoring-time validation for `Storyboard.requires` (#1626). The field is\n * an array of non-empty requirement names:\n *\n * - `requires: []` is rejected — an empty array reads as \"no\n * requirements,\" which is the same as omitting the field; failing\n * load forces the author to omit it explicitly.\n * - Each entry must be a non-empty string.\n *\n * Unknown string values are allowed for forward compatibility. Runners that\n * don't know how to satisfy a future requirement skip at runtime with\n * `skip_reason: 'requirement_unmet'` and the authored value in\n * `skip.requirement`.\n */\nfunction validateRequires(storyboard: Storyboard): void {\n if (storyboard.requires === undefined) return;\n if (!Array.isArray(storyboard.requires)) {\n throw new Error(\n `[${storyboard.id}] requires: must be an array of requirement names (got ${typeof storyboard.requires})`\n );\n }\n if (storyboard.requires.length === 0) {\n throw new Error(`[${storyboard.id}] requires: [] is not allowed — omit the field to use the default ([real_wire])`);\n }\n for (let i = 0; i < storyboard.requires.length; i++) {\n const name = storyboard.requires[i];\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error(`[${storyboard.id}] requires[${i}]: entries must be non-empty strings`);\n }\n }\n}\n\n/**\n * Issue #820: mutating tasks (per {@link MUTATING_TASKS}) must have a\n * `sample_request` authored. The fixture is authoritative at run time —\n * there's no sane default payload for a write, and silently fabricating\n * one was the bug factory that produced #780 / #792 / #793 / #802 / #805.\n *\n * Error messages point at the task name, the step id, the storyboard, and\n * suggest the concrete author action.\n *\n * Opt-out: steps with `expect_error: true` that deliberately exercise\n * missing-fixture / malformed-payload seller behavior skip this check —\n * the author is signaling the payload is the test condition.\n *\n * Synthesized phases (`request-signing/synthesize.ts`, controller seeding)\n * start with `phase.steps = []` in YAML and the loader doesn't see the\n * runtime-generated steps, so those paths are not affected.\n */\nfunction validateFixtureForMutatingStep(\n storyboardId: string,\n phase: Storyboard['phases'][number],\n step: Storyboard['phases'][number]['steps'][number]\n): void {\n if (!MUTATING_TASKS.has(step.task)) return;\n if (step.sample_request !== undefined) return;\n if (step.expect_error === true) return;\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}' (task=${step.task}): ` +\n `mutating tasks require a sample_request fixture — the runner no longer fabricates ` +\n `write payloads. Author sample_request in the step or, for intentionally malformed ` +\n `payloads, set expect_error: true.`\n );\n}\n\n/**\n * `omit_account: true` must be paired with `expect_error: true`.\n *\n * An accountless `create_media_buy` will always be rejected by a spec-compliant\n * seller; a step that sets `omit_account` without `expect_error` will be graded\n * as a failure (not a controlled negative test), producing a misleading\n * compliance result. Fail loud at parse time so the author sees the problem\n * during storyboard load, not at run time.\n */\nfunction validateOmitFlagCoherence(\n storyboardId: string,\n phase: Storyboard['phases'][number],\n step: Storyboard['phases'][number]['steps'][number]\n): void {\n if (step.omit_account && step.expect_error !== true) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ` +\n `omit_account: true requires expect_error: true — an accountless ` +\n `create_media_buy will always be rejected by a spec-compliant seller.`\n );\n }\n}\n\n/**\n * Each `context_outputs` entry must declare exactly one source: either\n * `path` (extract from response) or `generate` (mint at run time). An entry\n * with neither is a silent no-op; one with both would silently pick `generate`\n * and ignore `path`. Both are authoring foot-guns that should fail loud.\n */\nfunction validateContextOutputs(\n storyboardId: string,\n phase: Storyboard['phases'][number],\n step: Storyboard['phases'][number]['steps'][number]\n): void {\n if (!step.context_outputs?.length) return;\n for (const output of step.context_outputs) {\n const hasPath = output.path !== undefined;\n const hasGenerate = output.generate !== undefined;\n if (!hasPath && !hasGenerate) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': context_outputs entry ` +\n `'${output.key}' must set exactly one of 'path' or 'generate'.`\n );\n }\n if (hasPath && hasGenerate) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': context_outputs entry ` +\n `'${output.key}' sets both 'path' and 'generate' — they are mutually exclusive.`\n );\n }\n // Validate generator name. The runtime resolver also checks but the loader\n // catches typos at storyboard-load time so authors see the failure on\n // build, not on the first run.\n if (hasGenerate && output.generate !== 'uuid_v4' && output.generate !== 'opaque_id') {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': context_outputs entry ` +\n `'${output.key}' has unknown generate value '${output.generate}'. ` +\n `Supported: 'uuid_v4', 'opaque_id'.`\n );\n }\n }\n}\n\n/**\n * Authoring-time validation for `provides_state_for` (the AdCP 3.0.3 spec\n * field — adcp#3734) and the legacy `peer_substitutes_for` synonym. The\n * runner treats the field as same-phase-only and substitution-only-when-\n * stateful; surface those constraints at parse time so storyboard authors\n * see typos and cross-phase references on build, not as a silent no-rescue\n * at run time.\n *\n * Both field names parse to the same canonical normalized form on the step\n * object (the spec name `provides_state_for` is preferred when both are\n * declared). The deprecation alias is documented in `types.ts`.\n *\n * Rules:\n * - Each target must reference a step that exists in the same phase.\n * - A step cannot substitute for itself.\n * - The substitute step itself must be `stateful: true` — non-stateful\n * passes don't establish state per the cascade contract.\n * - The target step must be `stateful: true` — non-stateful targets\n * don't participate in cascade gating, so a substitution declaration\n * would be a no-op.\n * - When both fields are declared on the same step, they must match\n * element-for-element (the deprecation contract is \"synonym for\", not\n * \"additive with\").\n */\nfunction validatePeerSubstitutesFor(\n storyboardId: string,\n phase: Storyboard['phases'][number],\n step: Storyboard['phases'][number]['steps'][number]\n): void {\n const newField = step.provides_state_for;\n const legacyField = step.peer_substitutes_for;\n if (newField === undefined && legacyField === undefined) return;\n\n if (newField !== undefined && legacyField !== undefined) {\n // Order-sensitive equality: `[A, B]` vs `[B, A]` would throw despite being\n // semantically equivalent. Authors mid-migration should write the same list\n // in both fields; the deprecation alias is a literal synonym, not a\n // same-set restatement.\n const a = JSON.stringify(Array.isArray(newField) ? newField : [newField]);\n const b = JSON.stringify(Array.isArray(legacyField) ? legacyField : [legacyField]);\n if (a !== b) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': both provides_state_for and ` +\n `peer_substitutes_for declared with different values — pick one (provides_state_for is the ` +\n `spec field; peer_substitutes_for is a deprecated synonym)`\n );\n }\n }\n\n // Normalize onto provides_state_for so the runner can read a single field.\n // peer_substitutes_for stays for back-compat with any consumer code that\n // already reads it.\n if (newField === undefined && legacyField !== undefined) {\n step.provides_state_for = legacyField;\n } else if (newField !== undefined && legacyField === undefined) {\n step.peer_substitutes_for = newField;\n }\n\n const sourceFieldName = newField !== undefined ? 'provides_state_for' : 'peer_substitutes_for';\n const declared = step.provides_state_for!;\n const targets = Array.isArray(declared) ? declared : [declared];\n if (!step.stateful) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ${sourceFieldName} is only legal on stateful steps`\n );\n }\n const phaseStepIds = new Map(phase.steps.map(s => [s.id, s]));\n for (const target of targets) {\n if (typeof target !== 'string' || target.length === 0) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ${sourceFieldName} entries must be non-empty strings`\n );\n }\n if (target === step.id) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ${sourceFieldName} cannot reference itself`\n );\n }\n const targetStep = phaseStepIds.get(target);\n if (!targetStep) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ${sourceFieldName} target '${target}' is not a step in this phase (same-phase only)`\n );\n }\n if (!targetStep.stateful) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ${sourceFieldName} target '${target}' must be stateful`\n );\n }\n }\n}\n\nfunction validateBranchSet(storyboardId: string, phase: Storyboard['phases'][number]): void {\n if (phase.branch_set === undefined) return;\n const bs = phase.branch_set as unknown;\n if (!bs || typeof bs !== 'object') {\n throw new Error(`[${storyboardId}] phase '${phase.id}': branch_set must be an object with { id, semantics }`);\n }\n const { id, semantics } = bs as Record<string, unknown>;\n if (typeof id !== 'string' || id.length === 0) {\n throw new Error(`[${storyboardId}] phase '${phase.id}': branch_set.id must be a non-empty string`);\n }\n if (typeof semantics !== 'string' || semantics.length === 0) {\n throw new Error(`[${storyboardId}] phase '${phase.id}': branch_set.semantics must be a non-empty string`);\n }\n // Only `any_of` is defined in AdCP today (adcp#2646 lint rule 2 —\n // `at_least_n` and `all_of` are reserved but not defined). Reject unknown\n // values at parse rather than silently skipping grading at runtime, so\n // spec-drift typos fail loud instead of degrading to raw `failed` peers.\n if (!(BRANCH_SET_SEMANTICS as readonly string[]).includes(semantics)) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}': branch_set.semantics='${semantics}' is not supported (valid: ${BRANCH_SET_SEMANTICS.join(', ')})`\n );\n }\n // Schema constraint: every phase in a branch set MUST be optional. A\n // non-optional branch-set phase would fail the storyboard on any step\n // failure regardless of peer contribution, defeating the any_of gate.\n if (phase.optional !== true) {\n throw new Error(`[${storyboardId}] phase '${phase.id}': phases declaring branch_set must set 'optional: true'`);\n }\n}\n\n/**\n * Resolve the `contributes: true` boolean shorthand introduced alongside the\n * first-class `branch_set:` phase field (adcp-client#693, adcp#2646).\n *\n * Rules:\n * - `contributes: true` is legal only inside a phase that declares `branch_set:`.\n * - A step MUST NOT set both `contributes` and `contributes_to` (ambiguous).\n * - A string `contributes_to` inside a branch_set phase MUST equal `branch_set.id`\n * (otherwise the aggregation target drifts — same invariant the spec lint enforces).\n *\n * After resolution, `step.contributes_to` carries the flag name and `step.contributes`\n * is cleared, so the runner reads a single field regardless of authoring form.\n */\nfunction resolveContributesShorthand(\n storyboardId: string,\n phase: Storyboard['phases'][number],\n step: Storyboard['phases'][number]['steps'][number]\n): void {\n const hasBoolean = step.contributes !== undefined;\n const hasString = step.contributes_to !== undefined;\n\n if (hasBoolean && hasString) {\n throw new Error(`[${storyboardId}] step '${step.id}' declares both 'contributes' and 'contributes_to' — pick one`);\n }\n\n if (hasBoolean) {\n if (step.contributes === true) {\n if (!phase.branch_set) {\n throw new Error(\n `[${storyboardId}] step '${step.id}': 'contributes: true' is only legal inside a phase that declares branch_set`\n );\n }\n step.contributes_to = phase.branch_set.id;\n }\n delete step.contributes;\n return;\n }\n\n if (hasString && phase.branch_set && step.contributes_to !== phase.branch_set.id) {\n throw new Error(\n `[${storyboardId}] step '${step.id}': contributes_to='${step.contributes_to}' must equal enclosing phase's branch_set.id='${phase.branch_set.id}'`\n );\n }\n}\n"],"mappings":"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","names":["prefix","validSemver"]}
1
+ {"version":3,"sources":["../../../../src/lib/testing/storyboard/loader.ts"],"sourcesContent":["/**\n * Storyboard YAML parser.\n *\n * Storyboards are pulled from the compliance cache populated by\n * `npm run sync-schemas`. See `./compliance.ts` for capability-driven\n * resolution and bundle loading.\n */\n\nimport { readFileSync } from 'fs';\nimport { parse } from 'yaml';\nimport type { Storyboard } from './types';\nimport { MUTATING_TASKS } from '../../utils/idempotency';\nimport { validateFixtureResolutionDeclarations } from './fixture-resolution';\nimport { valid as validSemver } from 'semver';\n\n/**\n * Supported `branch_set.semantics` values. Extend when AdCP adds `all_of`,\n * `at_least_n`, etc. Exported so the runner can enforce the same whitelist\n * on programmatically-constructed storyboards that bypass the YAML parser.\n */\nexport const BRANCH_SET_SEMANTICS = ['any_of'] as const;\n\nconst IDENTIFIER_PATH_SEGMENT = String.raw`[A-Za-z_][A-Za-z0-9_-]*(?:\\[\\*\\])*`;\nconst IDENTIFIER_PATH_PATTERN = new RegExp(`^${IDENTIFIER_PATH_SEGMENT}(?:\\\\.${IDENTIFIER_PATH_SEGMENT})*$`);\n\n/** Parse a YAML string into a Storyboard. Throws if required fields are missing. */\nexport function parseStoryboard(yamlContent: string): Storyboard {\n const parsed = parse(yamlContent) as Storyboard;\n if (!parsed?.id || !parsed?.phases) {\n throw new Error('Invalid storyboard YAML: missing required fields (id, phases)');\n }\n if (Object.prototype.hasOwnProperty.call(parsed, 'compliance_dir')) {\n throw new Error(\n 'Invalid storyboard YAML: compliance_dir is loader-owned runtime provenance; select an external cache with runner options instead.'\n );\n }\n for (const phase of parsed.phases) {\n // Specialism YAMLs may declare a phase with no `steps:` — the steps are\n // synthesized at runtime from fixtures (see request-signing/synthesize.ts).\n // Treat missing steps as an empty list so the parser stays phase-agnostic.\n if (!phase.steps) phase.steps = [];\n // YAML uses `name:` for context outputs but our runtime expects `key:`.\n for (const step of phase.steps) {\n if (!step.context_outputs) continue;\n for (const output of step.context_outputs) {\n const raw = output as unknown as Record<string, unknown>;\n if (raw.name && !raw.key) {\n output.key = raw.name as string;\n }\n }\n }\n }\n validateStoryboardShape(parsed);\n return parsed;\n}\n\n/** Load and parse a single storyboard file. Useful for ad-hoc testing of in-development YAMLs. */\nexport function loadStoryboardFile(filePath: string): Storyboard {\n return parseStoryboard(readFileSync(filePath, 'utf-8'));\n}\n\n/**\n * Enforce authoring-time invariants on a Storyboard. Called by\n * `parseStoryboard`, and should also be called by any runner entry point\n * that accepts a programmatically-built `Storyboard` object so the same\n * loud-fail-on-drift guarantee holds regardless of how the storyboard was\n * constructed. Mutates only legacy shorthand fields (resolves\n * `contributes: true` to `contributes_to`) and is idempotent on\n * already-validated inputs.\n */\nexport function validateStoryboardShape(storyboard: Storyboard): void {\n validateRequires(storyboard);\n validateFixtureResolutionDeclarations(storyboard);\n validateRequiredAnyOfTools(storyboard);\n validatePhaseDependsOn(storyboard);\n for (const phase of storyboard.phases) {\n validateBranchSet(storyboard.id, phase);\n if (!phase.steps) continue;\n for (const step of phase.steps) {\n resolveContributesShorthand(storyboard.id, phase, step);\n validateFixtureForMutatingStep(storyboard.id, phase, step);\n validateOmitFlagCoherence(storyboard.id, phase, step);\n validateContextOutputs(storyboard.id, phase, step);\n validateUpstreamAttestationMode(storyboard.id, phase, step);\n validateUpstreamIdentifierPaths(storyboard.id, phase, step);\n validateAdvisoryDeclarations(storyboard.id, phase, step);\n validatePeerSubstitutesFor(storyboard.id, phase, step);\n }\n }\n}\n\nfunction validateAdvisoryDeclarations(\n storyboardId: string,\n phase: { id?: string },\n step: { id?: string; validations?: any[] }\n): void {\n for (let index = 0; index < (step.validations ?? []).length; index++) {\n const validation = step.validations![index];\n if (\n validation?.severity !== undefined &&\n validation.severity !== 'required' &&\n validation.severity !== 'advisory'\n ) {\n const prefix = `[${storyboardId}] ${phase.id ?? '?'}.${step.id ?? '?'}.validations[${index}]`;\n throw new Error(`${prefix}.severity: must be either \"required\" or \"advisory\"`);\n }\n if (validation?.severity !== 'advisory') continue;\n const prefix = `[${storyboardId}] ${phase.id ?? '?'}.${step.id ?? '?'}.validations[${index}]`;\n const hasExpiry = validation.expires_after_version !== undefined;\n const hasPermanent = validation.permanent_advisory !== undefined;\n if (hasExpiry === hasPermanent) {\n throw new Error(\n `${prefix}: severity \"advisory\" must declare exactly one of expires_after_version or permanent_advisory`\n );\n }\n if (\n hasExpiry &&\n (typeof validation.expires_after_version !== 'string' || !validSemver(validation.expires_after_version))\n ) {\n throw new Error(`${prefix}.expires_after_version: must be a valid semver string`);\n }\n if (\n hasPermanent &&\n (typeof validation.permanent_advisory !== 'object' ||\n validation.permanent_advisory === null ||\n typeof validation.permanent_advisory.reason !== 'string' ||\n validation.permanent_advisory.reason.trim().length === 0)\n ) {\n throw new Error(`${prefix}.permanent_advisory.reason: must be a non-empty string`);\n }\n }\n}\n\nfunction validateUpstreamAttestationMode(\n storyboardId: string,\n phase: { id?: string },\n step: { id?: string; validations?: any[] }\n): void {\n const validations = step.validations ?? [];\n for (let validationIndex = 0; validationIndex < validations.length; validationIndex++) {\n const validation = validations[validationIndex];\n if (validation?.check !== 'upstream_traffic') continue;\n const mode = validation.preferred_attestation_mode;\n if (mode !== undefined && mode !== 'raw' && mode !== 'digest') {\n throw new Error(\n `[${storyboardId}] ${phase.id ?? '?'}.${step.id ?? '?'}.validations[${validationIndex}].preferred_attestation_mode: must be \"raw\" or \"digest\"`\n );\n }\n }\n}\n\nfunction validateUpstreamIdentifierPaths(\n storyboardId: string,\n phase: { id?: string },\n step: { id?: string; validations?: any[] }\n): void {\n const validations = step.validations ?? [];\n for (let validationIndex = 0; validationIndex < validations.length; validationIndex++) {\n const validation = validations[validationIndex];\n if (validation?.check !== 'upstream_traffic' || validation.identifier_paths === undefined) continue;\n if (!Array.isArray(validation.identifier_paths)) {\n throw new Error(\n `[${storyboardId}] ${phase.id ?? '?'}.${\n step.id ?? '?'\n }.validations[${validationIndex}].identifier_paths: must be an array of request-payload paths`\n );\n }\n for (let pathIndex = 0; pathIndex < validation.identifier_paths.length; pathIndex++) {\n const path = validation.identifier_paths[pathIndex];\n if (typeof path !== 'string' || path.length === 0) {\n throw new Error(\n `[${storyboardId}] ${phase.id ?? '?'}.${step.id ?? '?'}.validations[${validationIndex}].identifier_paths[${pathIndex}]: must be a non-empty string`\n );\n }\n const pathErrorPrefix = `[${storyboardId}] ${phase.id ?? '?'}.${step.id ?? '?'}.validations[${validationIndex}].identifier_paths[${pathIndex}]`;\n let firstSegment: string;\n try {\n const validated = validateIdentifierPathSyntax(path);\n firstSegment = validated.firstSegment;\n } catch {\n throw new Error(\n `${pathErrorPrefix}: \"${path}\" is unsupported; identifier_paths resolve only against the request payload or sample_request using dotted paths with [*] array selectors`\n );\n }\n const root = firstSegment.toLowerCase();\n if (root === 'request' || root === 'response' || root === 'context') {\n throw new Error(\n `${pathErrorPrefix}: \"${path}\" is unsupported; identifier_paths resolve only against the request payload or sample_request`\n );\n }\n }\n }\n}\n\nfunction validateIdentifierPathSyntax(path: string): { normalized: string; firstSegment: string } {\n const trimmed = path.trim();\n const normalized = trimmed.startsWith('$.') ? trimmed.slice(2) : trimmed;\n if (!IDENTIFIER_PATH_PATTERN.test(normalized)) {\n throw new Error('unsupported identifier path syntax');\n }\n return { normalized, firstSegment: normalized.split(/[.[\\]]/, 1)[0] ?? '' };\n}\n\nfunction validateRequiredAnyOfTools(storyboard: Storyboard): void {\n if (storyboard.required_any_of_tools === undefined) return;\n if (!Array.isArray(storyboard.required_any_of_tools)) {\n throw new Error(`[${storyboard.id}] required_any_of_tools: must be an array of tool-family objects`);\n }\n if (storyboard.required_any_of_tools.length === 0) {\n throw new Error(`[${storyboard.id}] required_any_of_tools: [] is not allowed — omit the field to use no gate`);\n }\n for (let i = 0; i < storyboard.required_any_of_tools.length; i++) {\n const family = storyboard.required_any_of_tools[i] as unknown;\n if (family === null || typeof family !== 'object' || Array.isArray(family)) {\n throw new Error(`[${storyboard.id}] required_any_of_tools[${i}]: must be an object`);\n }\n const { tools, rationale } = family as { tools?: unknown; rationale?: unknown };\n if (!Array.isArray(tools) || tools.length < 2) {\n throw new Error(`[${storyboard.id}] required_any_of_tools[${i}].tools: must list at least two tool names`);\n }\n for (const tool of tools) {\n if (typeof tool !== 'string' || tool.length === 0) {\n throw new Error(`[${storyboard.id}] required_any_of_tools[${i}].tools: entries must be non-empty strings`);\n }\n }\n if (rationale !== undefined && typeof rationale !== 'string') {\n throw new Error(`[${storyboard.id}] required_any_of_tools[${i}].rationale: must be a string`);\n }\n }\n}\n\n/**\n * Authoring-time validation for `phase.depends_on` (#1161). Each entry\n * must reference a phase declared earlier in the storyboard. Forward\n * references and self-references fail loud at parse time so authoring\n * mistakes (typos, reorderings) don't degrade silently into \"phase\n * always runs\" / \"phase always cascades.\"\n *\n * Rules:\n * - Empty list (`depends_on: []`) is legal — it declares an\n * independent phase. No further validation needed.\n * - Each non-empty entry must be a non-empty string.\n * - Each entry must reference a phase that appears EARLIER in the\n * `storyboard.phases[]` array (forward references are rejected).\n * - A phase cannot depend on itself.\n */\nfunction validatePhaseDependsOn(storyboard: Storyboard): void {\n const phaseIdsSeen = new Set<string>();\n for (const phase of storyboard.phases) {\n if (phase.depends_on !== undefined) {\n if (!Array.isArray(phase.depends_on)) {\n throw new Error(`[${storyboard.id}] phase '${phase.id}': depends_on must be an array of phase ids`);\n }\n for (const dep of phase.depends_on) {\n if (typeof dep !== 'string' || dep.length === 0) {\n throw new Error(`[${storyboard.id}] phase '${phase.id}': depends_on entries must be non-empty strings`);\n }\n if (dep === phase.id) {\n throw new Error(`[${storyboard.id}] phase '${phase.id}': depends_on cannot reference itself`);\n }\n if (!phaseIdsSeen.has(dep)) {\n throw new Error(\n `[${storyboard.id}] phase '${phase.id}': depends_on '${dep}' is not a phase declared earlier in this storyboard (forward and unknown references are rejected)`\n );\n }\n }\n }\n phaseIdsSeen.add(phase.id);\n }\n}\n\n/**\n * Authoring-time validation for `Storyboard.requires` (#1626). The field is\n * an array of non-empty requirement names:\n *\n * - `requires: []` is rejected — an empty array reads as \"no\n * requirements,\" which is the same as omitting the field; failing\n * load forces the author to omit it explicitly.\n * - Each entry must be a non-empty string.\n *\n * Unknown string values are allowed for forward compatibility. Runners that\n * don't know how to satisfy a future requirement skip at runtime with\n * `skip_reason: 'requirement_unmet'` and the authored value in\n * `skip.requirement`.\n */\nfunction validateRequires(storyboard: Storyboard): void {\n if (storyboard.requires === undefined) return;\n if (!Array.isArray(storyboard.requires)) {\n throw new Error(\n `[${storyboard.id}] requires: must be an array of requirement names (got ${typeof storyboard.requires})`\n );\n }\n if (storyboard.requires.length === 0) {\n throw new Error(`[${storyboard.id}] requires: [] is not allowed — omit the field to use the default ([real_wire])`);\n }\n for (let i = 0; i < storyboard.requires.length; i++) {\n const name = storyboard.requires[i];\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error(`[${storyboard.id}] requires[${i}]: entries must be non-empty strings`);\n }\n }\n}\n\n/**\n * Issue #820: mutating tasks (per {@link MUTATING_TASKS}) must have a\n * `sample_request` authored. The fixture is authoritative at run time —\n * there's no sane default payload for a write, and silently fabricating\n * one was the bug factory that produced #780 / #792 / #793 / #802 / #805.\n *\n * Error messages point at the task name, the step id, the storyboard, and\n * suggest the concrete author action.\n *\n * Opt-out: steps with `expect_error: true` that deliberately exercise\n * missing-fixture / malformed-payload seller behavior skip this check —\n * the author is signaling the payload is the test condition.\n *\n * Synthesized phases (`request-signing/synthesize.ts`, controller seeding)\n * start with `phase.steps = []` in YAML and the loader doesn't see the\n * runtime-generated steps, so those paths are not affected.\n */\nfunction validateFixtureForMutatingStep(\n storyboardId: string,\n phase: Storyboard['phases'][number],\n step: Storyboard['phases'][number]['steps'][number]\n): void {\n if (!MUTATING_TASKS.has(step.task)) return;\n if (step.sample_request !== undefined) return;\n if (step.expect_error === true) return;\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}' (task=${step.task}): ` +\n `mutating tasks require a sample_request fixture — the runner no longer fabricates ` +\n `write payloads. Author sample_request in the step or, for intentionally malformed ` +\n `payloads, set expect_error: true.`\n );\n}\n\n/**\n * `omit_account: true` must be paired with `expect_error: true`.\n *\n * An accountless `create_media_buy` will always be rejected by a spec-compliant\n * seller; a step that sets `omit_account` without `expect_error` will be graded\n * as a failure (not a controlled negative test), producing a misleading\n * compliance result. Fail loud at parse time so the author sees the problem\n * during storyboard load, not at run time.\n */\nfunction validateOmitFlagCoherence(\n storyboardId: string,\n phase: Storyboard['phases'][number],\n step: Storyboard['phases'][number]['steps'][number]\n): void {\n if (step.omit_account && step.expect_error !== true) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ` +\n `omit_account: true requires expect_error: true — an accountless ` +\n `create_media_buy will always be rejected by a spec-compliant seller.`\n );\n }\n}\n\n/**\n * Each `context_outputs` entry must declare exactly one source: either\n * `path` (extract from response) or `generate` (mint at run time). An entry\n * with neither is a silent no-op; one with both would silently pick `generate`\n * and ignore `path`. Both are authoring foot-guns that should fail loud.\n */\nfunction validateContextOutputs(\n storyboardId: string,\n phase: Storyboard['phases'][number],\n step: Storyboard['phases'][number]['steps'][number]\n): void {\n if (!step.context_outputs?.length) return;\n for (const output of step.context_outputs) {\n const hasPath = output.path !== undefined;\n const hasGenerate = output.generate !== undefined;\n if (!hasPath && !hasGenerate) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': context_outputs entry ` +\n `'${output.key}' must set exactly one of 'path' or 'generate'.`\n );\n }\n if (hasPath && hasGenerate) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': context_outputs entry ` +\n `'${output.key}' sets both 'path' and 'generate' — they are mutually exclusive.`\n );\n }\n // Validate generator name. The runtime resolver also checks but the loader\n // catches typos at storyboard-load time so authors see the failure on\n // build, not on the first run.\n if (hasGenerate && output.generate !== 'uuid_v4' && output.generate !== 'opaque_id') {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': context_outputs entry ` +\n `'${output.key}' has unknown generate value '${output.generate}'. ` +\n `Supported: 'uuid_v4', 'opaque_id'.`\n );\n }\n }\n}\n\n/**\n * Authoring-time validation for `provides_state_for` (the AdCP 3.0.3 spec\n * field — adcp#3734) and the legacy `peer_substitutes_for` synonym. The\n * runner treats the field as same-phase-only and substitution-only-when-\n * stateful; surface those constraints at parse time so storyboard authors\n * see typos and cross-phase references on build, not as a silent no-rescue\n * at run time.\n *\n * Both field names parse to the same canonical normalized form on the step\n * object (the spec name `provides_state_for` is preferred when both are\n * declared). The deprecation alias is documented in `types.ts`.\n *\n * Rules:\n * - Each target must reference a step that exists in the same phase.\n * - A step cannot substitute for itself.\n * - The substitute step itself must be `stateful: true` — non-stateful\n * passes don't establish state per the cascade contract.\n * - The target step must be `stateful: true` — non-stateful targets\n * don't participate in cascade gating, so a substitution declaration\n * would be a no-op.\n * - When both fields are declared on the same step, they must match\n * element-for-element (the deprecation contract is \"synonym for\", not\n * \"additive with\").\n */\nfunction validatePeerSubstitutesFor(\n storyboardId: string,\n phase: Storyboard['phases'][number],\n step: Storyboard['phases'][number]['steps'][number]\n): void {\n const newField = step.provides_state_for;\n const legacyField = step.peer_substitutes_for;\n if (newField === undefined && legacyField === undefined) return;\n\n if (newField !== undefined && legacyField !== undefined) {\n // Order-sensitive equality: `[A, B]` vs `[B, A]` would throw despite being\n // semantically equivalent. Authors mid-migration should write the same list\n // in both fields; the deprecation alias is a literal synonym, not a\n // same-set restatement.\n const a = JSON.stringify(Array.isArray(newField) ? newField : [newField]);\n const b = JSON.stringify(Array.isArray(legacyField) ? legacyField : [legacyField]);\n if (a !== b) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': both provides_state_for and ` +\n `peer_substitutes_for declared with different values — pick one (provides_state_for is the ` +\n `spec field; peer_substitutes_for is a deprecated synonym)`\n );\n }\n }\n\n // Normalize onto provides_state_for so the runner can read a single field.\n // peer_substitutes_for stays for back-compat with any consumer code that\n // already reads it.\n if (newField === undefined && legacyField !== undefined) {\n step.provides_state_for = legacyField;\n } else if (newField !== undefined && legacyField === undefined) {\n step.peer_substitutes_for = newField;\n }\n\n const sourceFieldName = newField !== undefined ? 'provides_state_for' : 'peer_substitutes_for';\n const declared = step.provides_state_for!;\n const targets = Array.isArray(declared) ? declared : [declared];\n if (!step.stateful) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ${sourceFieldName} is only legal on stateful steps`\n );\n }\n const phaseStepIds = new Map(phase.steps.map(s => [s.id, s]));\n for (const target of targets) {\n if (typeof target !== 'string' || target.length === 0) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ${sourceFieldName} entries must be non-empty strings`\n );\n }\n if (target === step.id) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ${sourceFieldName} cannot reference itself`\n );\n }\n const targetStep = phaseStepIds.get(target);\n if (!targetStep) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ${sourceFieldName} target '${target}' is not a step in this phase (same-phase only)`\n );\n }\n if (!targetStep.stateful) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}' step '${step.id}': ${sourceFieldName} target '${target}' must be stateful`\n );\n }\n }\n}\n\nfunction validateBranchSet(storyboardId: string, phase: Storyboard['phases'][number]): void {\n if (phase.branch_set === undefined) return;\n const bs = phase.branch_set as unknown;\n if (!bs || typeof bs !== 'object') {\n throw new Error(`[${storyboardId}] phase '${phase.id}': branch_set must be an object with { id, semantics }`);\n }\n const { id, semantics } = bs as Record<string, unknown>;\n if (typeof id !== 'string' || id.length === 0) {\n throw new Error(`[${storyboardId}] phase '${phase.id}': branch_set.id must be a non-empty string`);\n }\n if (typeof semantics !== 'string' || semantics.length === 0) {\n throw new Error(`[${storyboardId}] phase '${phase.id}': branch_set.semantics must be a non-empty string`);\n }\n // Only `any_of` is defined in AdCP today (adcp#2646 lint rule 2 —\n // `at_least_n` and `all_of` are reserved but not defined). Reject unknown\n // values at parse rather than silently skipping grading at runtime, so\n // spec-drift typos fail loud instead of degrading to raw `failed` peers.\n if (!(BRANCH_SET_SEMANTICS as readonly string[]).includes(semantics)) {\n throw new Error(\n `[${storyboardId}] phase '${phase.id}': branch_set.semantics='${semantics}' is not supported (valid: ${BRANCH_SET_SEMANTICS.join(', ')})`\n );\n }\n // Schema constraint: every phase in a branch set MUST be optional. A\n // non-optional branch-set phase would fail the storyboard on any step\n // failure regardless of peer contribution, defeating the any_of gate.\n if (phase.optional !== true) {\n throw new Error(`[${storyboardId}] phase '${phase.id}': phases declaring branch_set must set 'optional: true'`);\n }\n}\n\n/**\n * Resolve the `contributes: true` boolean shorthand introduced alongside the\n * first-class `branch_set:` phase field (adcp-client#693, adcp#2646).\n *\n * Rules:\n * - `contributes: true` is legal only inside a phase that declares `branch_set:`.\n * - A step MUST NOT set both `contributes` and `contributes_to` (ambiguous).\n * - A string `contributes_to` inside a branch_set phase MUST equal `branch_set.id`\n * (otherwise the aggregation target drifts — same invariant the spec lint enforces).\n *\n * After resolution, `step.contributes_to` carries the flag name and `step.contributes`\n * is cleared, so the runner reads a single field regardless of authoring form.\n */\nfunction resolveContributesShorthand(\n storyboardId: string,\n phase: Storyboard['phases'][number],\n step: Storyboard['phases'][number]['steps'][number]\n): void {\n const hasBoolean = step.contributes !== undefined;\n const hasString = step.contributes_to !== undefined;\n\n if (hasBoolean && hasString) {\n throw new Error(`[${storyboardId}] step '${step.id}' declares both 'contributes' and 'contributes_to' — pick one`);\n }\n\n if (hasBoolean) {\n if (step.contributes === true) {\n if (!phase.branch_set) {\n throw new Error(\n `[${storyboardId}] step '${step.id}': 'contributes: true' is only legal inside a phase that declares branch_set`\n );\n }\n step.contributes_to = phase.branch_set.id;\n }\n delete step.contributes;\n return;\n }\n\n if (hasString && phase.branch_set && step.contributes_to !== phase.branch_set.id) {\n throw new Error(\n `[${storyboardId}] step '${step.id}': contributes_to='${step.contributes_to}' must equal enclosing phase's branch_set.id='${phase.branch_set.id}'`\n );\n }\n}\n"],"mappings":"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","names":["prefix","validSemver"]}
@@ -11,6 +11,11 @@ function parseStoryboard(yamlContent) {
11
11
  if (!parsed?.id || !parsed?.phases) {
12
12
  throw new Error("Invalid storyboard YAML: missing required fields (id, phases)");
13
13
  }
14
+ if (Object.prototype.hasOwnProperty.call(parsed, "compliance_dir")) {
15
+ throw new Error(
16
+ "Invalid storyboard YAML: compliance_dir is loader-owned runtime provenance; select an external cache with runner options instead."
17
+ );
18
+ }
14
19
  for (const phase of parsed.phases) {
15
20
  if (!phase.steps) phase.steps = [];
16
21
  for (const step of phase.steps) {