@adcp/sdk 6.9.0 โ†’ 6.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/bin/adcp.js +285 -5
  2. package/compliance/cache/3.0.6.previous/domains/brand/index.yaml +163 -0
  3. package/compliance/cache/3.0.6.previous/domains/creative/index.yaml +412 -0
  4. package/compliance/cache/3.0.6.previous/domains/governance/index.yaml +683 -0
  5. package/compliance/cache/3.0.6.previous/domains/media-buy/creative-reception.yaml +247 -0
  6. package/compliance/cache/3.0.6.previous/domains/media-buy/index.yaml +769 -0
  7. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
  8. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
  9. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
  10. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
  11. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
  12. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
  13. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
  14. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
  15. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
  16. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
  17. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
  18. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
  19. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
  20. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
  21. package/compliance/cache/3.0.6.previous/domains/media-buy/state-machine.yaml +442 -0
  22. package/compliance/cache/3.0.6.previous/domains/signals/index.yaml +266 -0
  23. package/compliance/cache/3.0.6.previous/domains/sponsored-intelligence/index.yaml +256 -0
  24. package/compliance/cache/3.0.6.previous/index.json +324 -0
  25. package/compliance/cache/3.0.6.previous/protocols/brand/index.yaml +163 -0
  26. package/compliance/cache/3.0.6.previous/protocols/creative/index.yaml +412 -0
  27. package/compliance/cache/3.0.6.previous/protocols/governance/index.yaml +683 -0
  28. package/compliance/cache/3.0.6.previous/protocols/media-buy/creative-reception.yaml +247 -0
  29. package/compliance/cache/3.0.6.previous/protocols/media-buy/index.yaml +769 -0
  30. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
  31. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
  32. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
  33. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
  34. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
  35. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
  36. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
  37. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
  38. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
  39. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
  40. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
  41. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
  42. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
  43. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  44. package/compliance/cache/3.0.6.previous/protocols/media-buy/state-machine.yaml +442 -0
  45. package/compliance/cache/3.0.6.previous/protocols/signals/index.yaml +266 -0
  46. package/compliance/cache/3.0.6.previous/protocols/sponsored-intelligence/index.yaml +256 -0
  47. package/compliance/cache/3.0.6.previous/specialisms/audience-sync/index.yaml +280 -0
  48. package/compliance/cache/3.0.6.previous/specialisms/brand-rights/index.yaml +350 -0
  49. package/compliance/cache/3.0.6.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
  50. package/compliance/cache/3.0.6.previous/specialisms/collection-lists/index.yaml +359 -0
  51. package/compliance/cache/3.0.6.previous/specialisms/content-standards/index.yaml +572 -0
  52. package/compliance/cache/3.0.6.previous/specialisms/creative-ad-server/index.yaml +383 -0
  53. package/compliance/cache/3.0.6.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
  54. package/compliance/cache/3.0.6.previous/specialisms/creative-generative/index.yaml +746 -0
  55. package/compliance/cache/3.0.6.previous/specialisms/creative-template/index.yaml +413 -0
  56. package/compliance/cache/3.0.6.previous/specialisms/governance-aware-seller/index.yaml +136 -0
  57. package/compliance/cache/3.0.6.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
  58. package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
  59. package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/index.yaml +330 -0
  60. package/compliance/cache/3.0.6.previous/specialisms/property-lists/index.yaml +482 -0
  61. package/compliance/cache/3.0.6.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
  62. package/compliance/cache/3.0.6.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
  63. package/compliance/cache/3.0.6.previous/specialisms/sales-guaranteed/index.yaml +504 -0
  64. package/compliance/cache/3.0.6.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
  65. package/compliance/cache/3.0.6.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
  66. package/compliance/cache/3.0.6.previous/specialisms/sales-social/index.yaml +584 -0
  67. package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/index.yaml +415 -0
  68. package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
  69. package/compliance/cache/3.0.6.previous/specialisms/signal-owned/index.yaml +316 -0
  70. package/compliance/cache/3.0.6.previous/test-kits/acme-outdoor.yaml +210 -0
  71. package/compliance/cache/3.0.6.previous/test-kits/bistro-oranje.yaml +126 -0
  72. package/compliance/cache/3.0.6.previous/test-kits/nova-motors.yaml +262 -0
  73. package/compliance/cache/3.0.6.previous/test-kits/osei-natural.yaml +126 -0
  74. package/compliance/cache/3.0.6.previous/test-kits/signed-requests-runner.yaml +155 -0
  75. package/compliance/cache/3.0.6.previous/test-kits/substitution-observer-runner.yaml +690 -0
  76. package/compliance/cache/3.0.6.previous/test-kits/summit-foods.yaml +125 -0
  77. package/compliance/cache/3.0.6.previous/test-kits/webhook-receiver-runner.yaml +265 -0
  78. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  79. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
  80. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  81. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  82. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  83. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  84. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  85. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  86. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  87. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  88. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  89. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/README.md +219 -0
  90. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/canonicalization.json +241 -0
  91. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/keys.json +60 -0
  92. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  93. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  94. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  95. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  96. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  97. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  98. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  99. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  100. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  101. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  102. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  103. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  104. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  105. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  106. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  107. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  108. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  109. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  110. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  111. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  112. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  113. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  114. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  115. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  116. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  117. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  118. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  119. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  120. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  121. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  122. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  123. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  124. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  125. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  126. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  127. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  128. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  129. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  130. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  131. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/README.md +211 -0
  132. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/keys.json +61 -0
  133. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  134. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  135. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  136. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  137. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  138. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  139. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  140. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  141. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  142. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  143. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  144. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  145. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  146. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  147. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  148. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  149. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  150. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  151. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  152. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  153. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  154. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  155. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  156. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  157. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  158. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  159. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  160. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  161. package/compliance/cache/3.0.6.previous/universal/capability-discovery.yaml +125 -0
  162. package/compliance/cache/3.0.6.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
  163. package/compliance/cache/3.0.6.previous/universal/content-standards-pagination-integrity.yaml +326 -0
  164. package/compliance/cache/3.0.6.previous/universal/deterministic-testing.yaml +1343 -0
  165. package/compliance/cache/3.0.6.previous/universal/error-compliance.yaml +474 -0
  166. package/compliance/cache/3.0.6.previous/universal/fictional-entities.yaml +307 -0
  167. package/compliance/cache/3.0.6.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
  168. package/compliance/cache/3.0.6.previous/universal/get-signals-pagination-integrity.yaml +211 -0
  169. package/compliance/cache/3.0.6.previous/universal/idempotency.yaml +593 -0
  170. package/compliance/cache/3.0.6.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
  171. package/compliance/cache/3.0.6.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
  172. package/compliance/cache/3.0.6.previous/universal/pagination-integrity.yaml +263 -0
  173. package/compliance/cache/3.0.6.previous/universal/property-lists-pagination-integrity.yaml +307 -0
  174. package/compliance/cache/3.0.6.previous/universal/runner-output-contract.yaml +358 -0
  175. package/compliance/cache/3.0.6.previous/universal/schema-validation.yaml +526 -0
  176. package/compliance/cache/3.0.6.previous/universal/security.yaml +431 -0
  177. package/compliance/cache/3.0.6.previous/universal/signed-requests.yaml +205 -0
  178. package/compliance/cache/3.0.6.previous/universal/storyboard-schema.yaml +1176 -0
  179. package/compliance/cache/3.0.6.previous/universal/v3-envelope-integrity.yaml +106 -0
  180. package/compliance/cache/3.0.6.previous/universal/webhook-emission.yaml +337 -0
  181. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  182. package/dist/lib/server/create-adcp-server.d.ts +33 -0
  183. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  184. package/dist/lib/server/create-adcp-server.js +127 -1
  185. package/dist/lib/server/create-adcp-server.js.map +1 -1
  186. package/dist/lib/server/credential-policy.d.ts +221 -0
  187. package/dist/lib/server/credential-policy.d.ts.map +1 -0
  188. package/dist/lib/server/credential-policy.js +260 -0
  189. package/dist/lib/server/credential-policy.js.map +1 -0
  190. package/dist/lib/server/dynamic-registry.d.ts +219 -0
  191. package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
  192. package/dist/lib/server/dynamic-registry.js +245 -0
  193. package/dist/lib/server/dynamic-registry.js.map +1 -0
  194. package/dist/lib/server/index.d.ts +8 -0
  195. package/dist/lib/server/index.d.ts.map +1 -1
  196. package/dist/lib/server/index.js +15 -4
  197. package/dist/lib/server/index.js.map +1 -1
  198. package/dist/lib/server/operational-platform.d.ts +239 -0
  199. package/dist/lib/server/operational-platform.d.ts.map +1 -0
  200. package/dist/lib/server/operational-platform.js +94 -0
  201. package/dist/lib/server/operational-platform.js.map +1 -0
  202. package/dist/lib/server/wire-safe.d.ts +211 -0
  203. package/dist/lib/server/wire-safe.d.ts.map +1 -0
  204. package/dist/lib/server/wire-safe.js +231 -0
  205. package/dist/lib/server/wire-safe.js.map +1 -0
  206. package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
  207. package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
  208. package/dist/lib/server/wire-spec-fields.generated.js +172 -0
  209. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
  210. package/dist/lib/testing/compliance/index.d.ts +2 -0
  211. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  212. package/dist/lib/testing/compliance/index.js +6 -1
  213. package/dist/lib/testing/compliance/index.js.map +1 -1
  214. package/dist/lib/testing/compliance/summary.d.ts +77 -0
  215. package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
  216. package/dist/lib/testing/compliance/summary.js +176 -0
  217. package/dist/lib/testing/compliance/summary.js.map +1 -0
  218. package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
  219. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  220. package/dist/lib/testing/storyboard/compliance.js +51 -0
  221. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  222. package/dist/lib/testing/storyboard/index.d.ts +2 -2
  223. package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
  224. package/dist/lib/testing/storyboard/index.js +4 -2
  225. package/dist/lib/testing/storyboard/index.js.map +1 -1
  226. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  227. package/dist/lib/testing/storyboard/runner.js +58 -5
  228. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  229. package/dist/lib/version.d.ts +3 -3
  230. package/dist/lib/version.d.ts.map +1 -1
  231. package/dist/lib/version.js +3 -3
  232. package/dist/lib/version.js.map +1 -1
  233. package/package.json +2 -2
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "GA-internal bookkeeping fields are stripped before hashing",
3
+ "spec_reference": "#plan-state-binding (closed exclusion list)",
4
+ "description": "A GA hashing its persisted plan state directly MUST strip version, status, syncedAt, revisionHistory, committedBudget, committedByType. This vector has those fields populated on the stored plan but the expected hash equals vector 001 (the same plan, no bookkeeping). NOTE: this invariant proves bookkeeping stripping is deterministic for identical business-content preimages. It does NOT generalize to \"business-equivalent plans hash identically\" โ€” see vectors 004a/004b (omitted vs explicit null), 005a/005b (array order), and 006a/006b (ext rotation) for cases where business-equivalent plans produce distinct hashes because JCS preserves those distinctions bit-exactly.",
5
+ "cross_reference": {
6
+ "same_hash_as": "001-minimal-plan",
7
+ "rationale": "Bookkeeping fields are in the closed exclusion list; stripping them yields the same preimage as vector 001."
8
+ },
9
+ "plan_as_supplied": {
10
+ "plan_id": "plan_minimal_2026",
11
+ "brand": {
12
+ "domain": "example.com"
13
+ },
14
+ "objectives": "Drive awareness for Q1 launch.",
15
+ "budget": {
16
+ "total": 100000,
17
+ "currency": "USD",
18
+ "reallocation_threshold": 5000
19
+ },
20
+ "flight": {
21
+ "start": "2026-04-01T00:00:00Z",
22
+ "end": "2026-06-30T00:00:00Z"
23
+ },
24
+ "version": 7,
25
+ "status": "active",
26
+ "syncedAt": "2026-04-19T12:00:00Z",
27
+ "revisionHistory": [
28
+ {
29
+ "version": 6,
30
+ "syncedAt": "2026-04-18T12:00:00Z"
31
+ }
32
+ ],
33
+ "committedBudget": 42500,
34
+ "committedByType": {
35
+ "media_buy": 42500
36
+ }
37
+ },
38
+ "expected": {
39
+ "preimage": {
40
+ "plan_id": "plan_minimal_2026",
41
+ "brand": {
42
+ "domain": "example.com"
43
+ },
44
+ "objectives": "Drive awareness for Q1 launch.",
45
+ "budget": {
46
+ "total": 100000,
47
+ "currency": "USD",
48
+ "reallocation_threshold": 5000
49
+ },
50
+ "flight": {
51
+ "start": "2026-04-01T00:00:00Z",
52
+ "end": "2026-06-30T00:00:00Z"
53
+ }
54
+ },
55
+ "jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"currency\":\"USD\",\"reallocation_threshold\":5000,\"total\":100000},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"objectives\":\"Drive awareness for Q1 launch.\",\"plan_id\":\"plan_minimal_2026\"}",
56
+ "sha256_hex": "a11d2314312dcdcc203db35ff8e7ddfdf64761f0320f54d16f318e1415421be7",
57
+ "plan_hash": "oR0jFDEtzcwgPbNf-Ofd_fZHYfAyD1TRbzGOFBVCG-c"
58
+ },
59
+ "$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
60
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "human_review_required omitted",
3
+ "spec_reference": "#plan-state-binding (JCS preserves omitted vs null)",
4
+ "description": "Paired with 004b. JCS and SHA-256 distinguish an omitted optional field from an explicit null.",
5
+ "plan_as_supplied": {
6
+ "plan_id": "plan_minimal_2026",
7
+ "brand": {
8
+ "domain": "example.com"
9
+ },
10
+ "objectives": "Drive awareness for Q1 launch.",
11
+ "budget": {
12
+ "total": 100000,
13
+ "currency": "USD",
14
+ "reallocation_threshold": 5000
15
+ },
16
+ "flight": {
17
+ "start": "2026-04-01T00:00:00Z",
18
+ "end": "2026-06-30T00:00:00Z"
19
+ }
20
+ },
21
+ "expected": {
22
+ "preimage": {
23
+ "plan_id": "plan_minimal_2026",
24
+ "brand": {
25
+ "domain": "example.com"
26
+ },
27
+ "objectives": "Drive awareness for Q1 launch.",
28
+ "budget": {
29
+ "total": 100000,
30
+ "currency": "USD",
31
+ "reallocation_threshold": 5000
32
+ },
33
+ "flight": {
34
+ "start": "2026-04-01T00:00:00Z",
35
+ "end": "2026-06-30T00:00:00Z"
36
+ }
37
+ },
38
+ "jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"currency\":\"USD\",\"reallocation_threshold\":5000,\"total\":100000},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"objectives\":\"Drive awareness for Q1 launch.\",\"plan_id\":\"plan_minimal_2026\"}",
39
+ "sha256_hex": "a11d2314312dcdcc203db35ff8e7ddfdf64761f0320f54d16f318e1415421be7",
40
+ "plan_hash": "oR0jFDEtzcwgPbNf-Ofd_fZHYfAyD1TRbzGOFBVCG-c"
41
+ },
42
+ "$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
43
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "human_review_required explicitly null",
3
+ "spec_reference": "#plan-state-binding (JCS preserves omitted vs null)",
4
+ "description": "Paired with 004a. Expected hash differs from 004a โ€” explicit null is a distinct encoding.",
5
+ "cross_reference": {
6
+ "differs_from": "004a-human-review-omitted",
7
+ "rationale": "Explicit null produces \"human_review_required\":null in JCS output; omitted produces no key at all. Distinct preimages โ†’ distinct hashes."
8
+ },
9
+ "plan_as_supplied": {
10
+ "plan_id": "plan_minimal_2026",
11
+ "brand": {
12
+ "domain": "example.com"
13
+ },
14
+ "objectives": "Drive awareness for Q1 launch.",
15
+ "budget": {
16
+ "total": 100000,
17
+ "currency": "USD",
18
+ "reallocation_threshold": 5000
19
+ },
20
+ "flight": {
21
+ "start": "2026-04-01T00:00:00Z",
22
+ "end": "2026-06-30T00:00:00Z"
23
+ },
24
+ "human_review_required": null
25
+ },
26
+ "expected": {
27
+ "preimage": {
28
+ "plan_id": "plan_minimal_2026",
29
+ "brand": {
30
+ "domain": "example.com"
31
+ },
32
+ "objectives": "Drive awareness for Q1 launch.",
33
+ "budget": {
34
+ "total": 100000,
35
+ "currency": "USD",
36
+ "reallocation_threshold": 5000
37
+ },
38
+ "flight": {
39
+ "start": "2026-04-01T00:00:00Z",
40
+ "end": "2026-06-30T00:00:00Z"
41
+ },
42
+ "human_review_required": null
43
+ },
44
+ "jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"currency\":\"USD\",\"reallocation_threshold\":5000,\"total\":100000},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"human_review_required\":null,\"objectives\":\"Drive awareness for Q1 launch.\",\"plan_id\":\"plan_minimal_2026\"}",
45
+ "sha256_hex": "3568d008c09986610eb381dcf458a9f501a766afd3e397c30751944f8eb0f7a7",
46
+ "plan_hash": "NWjQCMCZhmEOs4Hc9Fip9QGnZq_T45fDB1GUT46w96c"
47
+ },
48
+ "$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
49
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "policy_categories in order [fair_housing, fair_lending]",
3
+ "spec_reference": "#plan-state-binding (JCS preserves array order)",
4
+ "description": "Paired with 005b. JCS preserves array element order per RFC 8785 ยง3.2.3; buyers SHOULD emit in stable order across re-syncs.",
5
+ "plan_as_supplied": {
6
+ "plan_id": "plan_minimal_2026",
7
+ "brand": {
8
+ "domain": "example.com"
9
+ },
10
+ "objectives": "Drive awareness for Q1 launch.",
11
+ "budget": {
12
+ "total": 100000,
13
+ "currency": "USD",
14
+ "reallocation_threshold": 5000
15
+ },
16
+ "flight": {
17
+ "start": "2026-04-01T00:00:00Z",
18
+ "end": "2026-06-30T00:00:00Z"
19
+ },
20
+ "human_review_required": true,
21
+ "policy_categories": [
22
+ "fair_housing",
23
+ "fair_lending"
24
+ ]
25
+ },
26
+ "expected": {
27
+ "preimage": {
28
+ "plan_id": "plan_minimal_2026",
29
+ "brand": {
30
+ "domain": "example.com"
31
+ },
32
+ "objectives": "Drive awareness for Q1 launch.",
33
+ "budget": {
34
+ "total": 100000,
35
+ "currency": "USD",
36
+ "reallocation_threshold": 5000
37
+ },
38
+ "flight": {
39
+ "start": "2026-04-01T00:00:00Z",
40
+ "end": "2026-06-30T00:00:00Z"
41
+ },
42
+ "human_review_required": true,
43
+ "policy_categories": [
44
+ "fair_housing",
45
+ "fair_lending"
46
+ ]
47
+ },
48
+ "jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"currency\":\"USD\",\"reallocation_threshold\":5000,\"total\":100000},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"human_review_required\":true,\"objectives\":\"Drive awareness for Q1 launch.\",\"plan_id\":\"plan_minimal_2026\",\"policy_categories\":[\"fair_housing\",\"fair_lending\"]}",
49
+ "sha256_hex": "873140944d87fb2348f8c779314afaf14366ee6363ff4b442ad4f9c00ea1ffd7",
50
+ "plan_hash": "hzFAlE2H-yNI-Md5MUr68UNm7mNj_0tEKtT5wA6h_9c"
51
+ },
52
+ "$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
53
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "policy_categories in order [fair_lending, fair_housing]",
3
+ "spec_reference": "#plan-state-binding (JCS preserves array order)",
4
+ "description": "Paired with 005a. Same array contents, different order โ†’ different hash.",
5
+ "cross_reference": {
6
+ "differs_from": "005a-policy-categories-order-1",
7
+ "rationale": "JCS preserves array order; reordered elements produce distinct canonical bytes."
8
+ },
9
+ "plan_as_supplied": {
10
+ "plan_id": "plan_minimal_2026",
11
+ "brand": {
12
+ "domain": "example.com"
13
+ },
14
+ "objectives": "Drive awareness for Q1 launch.",
15
+ "budget": {
16
+ "total": 100000,
17
+ "currency": "USD",
18
+ "reallocation_threshold": 5000
19
+ },
20
+ "flight": {
21
+ "start": "2026-04-01T00:00:00Z",
22
+ "end": "2026-06-30T00:00:00Z"
23
+ },
24
+ "human_review_required": true,
25
+ "policy_categories": [
26
+ "fair_lending",
27
+ "fair_housing"
28
+ ]
29
+ },
30
+ "expected": {
31
+ "preimage": {
32
+ "plan_id": "plan_minimal_2026",
33
+ "brand": {
34
+ "domain": "example.com"
35
+ },
36
+ "objectives": "Drive awareness for Q1 launch.",
37
+ "budget": {
38
+ "total": 100000,
39
+ "currency": "USD",
40
+ "reallocation_threshold": 5000
41
+ },
42
+ "flight": {
43
+ "start": "2026-04-01T00:00:00Z",
44
+ "end": "2026-06-30T00:00:00Z"
45
+ },
46
+ "human_review_required": true,
47
+ "policy_categories": [
48
+ "fair_lending",
49
+ "fair_housing"
50
+ ]
51
+ },
52
+ "jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"currency\":\"USD\",\"reallocation_threshold\":5000,\"total\":100000},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"human_review_required\":true,\"objectives\":\"Drive awareness for Q1 launch.\",\"plan_id\":\"plan_minimal_2026\",\"policy_categories\":[\"fair_lending\",\"fair_housing\"]}",
53
+ "sha256_hex": "30aa868c704d6263eab60889cc96f78895a12cd4e7267f5a166491b49c8773b1",
54
+ "plan_hash": "MKqGjHBNYmPqtgiJzJb3iJWhLNTnJn9aFmSRtJyHc7E"
55
+ },
56
+ "$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
57
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "ext.trace_id set to trace_v1",
3
+ "spec_reference": "#plan-state-binding (ext is IN the preimage)",
4
+ "description": "Paired with 006b. ext is part of the preimage โ€” rotating values in ext invalidate outstanding tokens. Buyers MUST NOT put retry-unstable values in ext on a plan.",
5
+ "plan_as_supplied": {
6
+ "plan_id": "plan_minimal_2026",
7
+ "brand": {
8
+ "domain": "example.com"
9
+ },
10
+ "objectives": "Drive awareness for Q1 launch.",
11
+ "budget": {
12
+ "total": 100000,
13
+ "currency": "USD",
14
+ "reallocation_threshold": 5000
15
+ },
16
+ "flight": {
17
+ "start": "2026-04-01T00:00:00Z",
18
+ "end": "2026-06-30T00:00:00Z"
19
+ },
20
+ "ext": {
21
+ "trace_id": "trace_v1"
22
+ }
23
+ },
24
+ "expected": {
25
+ "preimage": {
26
+ "plan_id": "plan_minimal_2026",
27
+ "brand": {
28
+ "domain": "example.com"
29
+ },
30
+ "objectives": "Drive awareness for Q1 launch.",
31
+ "budget": {
32
+ "total": 100000,
33
+ "currency": "USD",
34
+ "reallocation_threshold": 5000
35
+ },
36
+ "flight": {
37
+ "start": "2026-04-01T00:00:00Z",
38
+ "end": "2026-06-30T00:00:00Z"
39
+ },
40
+ "ext": {
41
+ "trace_id": "trace_v1"
42
+ }
43
+ },
44
+ "jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"currency\":\"USD\",\"reallocation_threshold\":5000,\"total\":100000},\"ext\":{\"trace_id\":\"trace_v1\"},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"objectives\":\"Drive awareness for Q1 launch.\",\"plan_id\":\"plan_minimal_2026\"}",
45
+ "sha256_hex": "bbd9f05621f57c47192461637a0340f32c5e9a47471239fd88aafc6f3507493c",
46
+ "plan_hash": "u9nwViH1fEcZJGFjegNA8yxemkdHEjn9iKr8bzUHSTw"
47
+ },
48
+ "$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
49
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "ext.trace_id set to trace_v2",
3
+ "spec_reference": "#plan-state-binding (ext is IN the preimage)",
4
+ "description": "Paired with 006a. Different ext value โ†’ different hash.",
5
+ "cross_reference": {
6
+ "differs_from": "006a-ext-trace-v1",
7
+ "rationale": "ext is hashed. A rotating trace_id in ext produces a distinct hash on every re-sync even when declared intent is identical."
8
+ },
9
+ "plan_as_supplied": {
10
+ "plan_id": "plan_minimal_2026",
11
+ "brand": {
12
+ "domain": "example.com"
13
+ },
14
+ "objectives": "Drive awareness for Q1 launch.",
15
+ "budget": {
16
+ "total": 100000,
17
+ "currency": "USD",
18
+ "reallocation_threshold": 5000
19
+ },
20
+ "flight": {
21
+ "start": "2026-04-01T00:00:00Z",
22
+ "end": "2026-06-30T00:00:00Z"
23
+ },
24
+ "ext": {
25
+ "trace_id": "trace_v2"
26
+ }
27
+ },
28
+ "expected": {
29
+ "preimage": {
30
+ "plan_id": "plan_minimal_2026",
31
+ "brand": {
32
+ "domain": "example.com"
33
+ },
34
+ "objectives": "Drive awareness for Q1 launch.",
35
+ "budget": {
36
+ "total": 100000,
37
+ "currency": "USD",
38
+ "reallocation_threshold": 5000
39
+ },
40
+ "flight": {
41
+ "start": "2026-04-01T00:00:00Z",
42
+ "end": "2026-06-30T00:00:00Z"
43
+ },
44
+ "ext": {
45
+ "trace_id": "trace_v2"
46
+ }
47
+ },
48
+ "jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"currency\":\"USD\",\"reallocation_threshold\":5000,\"total\":100000},\"ext\":{\"trace_id\":\"trace_v2\"},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"objectives\":\"Drive awareness for Q1 launch.\",\"plan_id\":\"plan_minimal_2026\"}",
49
+ "sha256_hex": "fd4184804334c01b245ebd63c4b99dbd6c72d8a244bf4eabde3ceb3d15ba1194",
50
+ "plan_hash": "_UGEgEM0wBskXr1jxLmdvWxy2KJEv06r3jzrPRW6EZQ"
51
+ },
52
+ "$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
53
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "objectives contains emoji, combining marks, and RTL text",
3
+ "spec_reference": "#plan-state-binding (JCS does not Unicode-normalize per RFC 8785 ยง3.2.5)",
4
+ "description": "Verifies JCS implementations handle non-ASCII without normalization. The plan objectives field contains an emoji (๐Ÿš€), a combining mark (รฉ = U+0065 U+0301, not the precomposed U+00E9), and RTL Hebrew text.",
5
+ "plan_as_supplied": {
6
+ "plan_id": "plan_minimal_2026",
7
+ "brand": {
8
+ "domain": "example.com"
9
+ },
10
+ "objectives": "Spring launch ๐Ÿš€ for cafeฬ chain โ€” brand awareness. ืฉืœื•ื",
11
+ "budget": {
12
+ "total": 100000,
13
+ "currency": "USD",
14
+ "reallocation_threshold": 5000
15
+ },
16
+ "flight": {
17
+ "start": "2026-04-01T00:00:00Z",
18
+ "end": "2026-06-30T00:00:00Z"
19
+ }
20
+ },
21
+ "expected": {
22
+ "preimage": {
23
+ "plan_id": "plan_minimal_2026",
24
+ "brand": {
25
+ "domain": "example.com"
26
+ },
27
+ "objectives": "Spring launch ๐Ÿš€ for cafeฬ chain โ€” brand awareness. ืฉืœื•ื",
28
+ "budget": {
29
+ "total": 100000,
30
+ "currency": "USD",
31
+ "reallocation_threshold": 5000
32
+ },
33
+ "flight": {
34
+ "start": "2026-04-01T00:00:00Z",
35
+ "end": "2026-06-30T00:00:00Z"
36
+ }
37
+ },
38
+ "jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"currency\":\"USD\",\"reallocation_threshold\":5000,\"total\":100000},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"objectives\":\"Spring launch ๐Ÿš€ for cafeฬ chain โ€” brand awareness. ืฉืœื•ื\",\"plan_id\":\"plan_minimal_2026\"}",
39
+ "sha256_hex": "5e237889cb966d17dad1ec51e1a2087c086f528b81ffb1e02f45145f16e7d824",
40
+ "plan_hash": "XiN4icuWbRfa0exR4aIIfAhvUouB_7HgL0UUXxbn2CQ"
41
+ },
42
+ "$comment": "Generated by .context/generate-plan-hash-vectors.mjs. Re-run on spec changes."
43
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "Numeric canonicalization with fractional percentages",
3
+ "spec_reference": "#plan-state-binding",
4
+ "description": "Exercises RFC 8785 ยง3.2.2.3 number serialization with fractional values (33.33, 33.334, 66.666) in budget.per_seller_max_pct and budget.allocations[*].max_pct. Pins implementer library choice: a hand-rolled `JSON.stringify + key sort` will likely diverge on edge cases (trailing zeros, scientific notation borderline) that a JCS-compliant library handles correctly.",
5
+ "plan_as_supplied": {
6
+ "plan_id": "plan_numeric_2026",
7
+ "brand": {
8
+ "domain": "example.com"
9
+ },
10
+ "objectives": "Exercise JCS numeric canonicalization with fractional budget-allocation percentages.",
11
+ "budget": {
12
+ "total": 100000,
13
+ "currency": "USD",
14
+ "reallocation_threshold": 5000,
15
+ "per_seller_max_pct": 33.33,
16
+ "allocations": {
17
+ "media_buy": {
18
+ "amount": 66667,
19
+ "max_pct": 66.666
20
+ },
21
+ "rights_license": {
22
+ "amount": 33333,
23
+ "max_pct": 33.334
24
+ }
25
+ }
26
+ },
27
+ "flight": {
28
+ "start": "2026-04-01T00:00:00Z",
29
+ "end": "2026-06-30T00:00:00Z"
30
+ }
31
+ },
32
+ "expected": {
33
+ "preimage": {
34
+ "plan_id": "plan_numeric_2026",
35
+ "brand": {
36
+ "domain": "example.com"
37
+ },
38
+ "objectives": "Exercise JCS numeric canonicalization with fractional budget-allocation percentages.",
39
+ "budget": {
40
+ "total": 100000,
41
+ "currency": "USD",
42
+ "reallocation_threshold": 5000,
43
+ "per_seller_max_pct": 33.33,
44
+ "allocations": {
45
+ "media_buy": {
46
+ "amount": 66667,
47
+ "max_pct": 66.666
48
+ },
49
+ "rights_license": {
50
+ "amount": 33333,
51
+ "max_pct": 33.334
52
+ }
53
+ }
54
+ },
55
+ "flight": {
56
+ "start": "2026-04-01T00:00:00Z",
57
+ "end": "2026-06-30T00:00:00Z"
58
+ }
59
+ },
60
+ "jcs_bytes": "{\"brand\":{\"domain\":\"example.com\"},\"budget\":{\"allocations\":{\"media_buy\":{\"amount\":66667,\"max_pct\":66.666},\"rights_license\":{\"amount\":33333,\"max_pct\":33.334}},\"currency\":\"USD\",\"per_seller_max_pct\":33.33,\"reallocation_threshold\":5000,\"total\":100000},\"flight\":{\"end\":\"2026-06-30T00:00:00Z\",\"start\":\"2026-04-01T00:00:00Z\"},\"objectives\":\"Exercise JCS numeric canonicalization with fractional budget-allocation percentages.\",\"plan_id\":\"plan_numeric_2026\"}",
61
+ "sha256_hex": "3c16152597702b471c673eaa7ad501c3ad6e9720f8ff0b5c47f6cb3db79e0da5",
62
+ "plan_hash": "PBYVJZdwK0ccZz6qetUBw61ulyD4_wtcR_bLPbeeDaU"
63
+ },
64
+ "$comment": "Computed with canonicalize@3.0.0 + Node.js crypto.createHash('sha256'). Re-verify if the canonicalize dependency is upgraded; numeric serialization edge cases (trailing zeros, scientific-notation thresholds) may shift across library versions."
65
+ }