@accelerator-mzq/forge 1.4.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 (663) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSE-THIRD-PARTY.md +50 -0
  3. package/README.md +159 -0
  4. package/dist/cli/commands/ack.d.ts +7 -0
  5. package/dist/cli/commands/ack.d.ts.map +1 -0
  6. package/dist/cli/commands/ack.js +223 -0
  7. package/dist/cli/commands/ack.js.map +1 -0
  8. package/dist/cli/commands/archive.d.ts +44 -0
  9. package/dist/cli/commands/archive.d.ts.map +1 -0
  10. package/dist/cli/commands/archive.js +689 -0
  11. package/dist/cli/commands/archive.js.map +1 -0
  12. package/dist/cli/commands/backlog.d.ts +3 -0
  13. package/dist/cli/commands/backlog.d.ts.map +1 -0
  14. package/dist/cli/commands/backlog.js +55 -0
  15. package/dist/cli/commands/backlog.js.map +1 -0
  16. package/dist/cli/commands/config.d.ts +3 -0
  17. package/dist/cli/commands/config.d.ts.map +1 -0
  18. package/dist/cli/commands/config.js +107 -0
  19. package/dist/cli/commands/config.js.map +1 -0
  20. package/dist/cli/commands/evidence.d.ts +7 -0
  21. package/dist/cli/commands/evidence.d.ts.map +1 -0
  22. package/dist/cli/commands/evidence.js +662 -0
  23. package/dist/cli/commands/evidence.js.map +1 -0
  24. package/dist/cli/commands/finding.d.ts +3 -0
  25. package/dist/cli/commands/finding.d.ts.map +1 -0
  26. package/dist/cli/commands/finding.js +93 -0
  27. package/dist/cli/commands/finding.js.map +1 -0
  28. package/dist/cli/commands/init.d.ts +3 -0
  29. package/dist/cli/commands/init.d.ts.map +1 -0
  30. package/dist/cli/commands/init.js +126 -0
  31. package/dist/cli/commands/init.js.map +1 -0
  32. package/dist/cli/commands/legacy-bridge.d.ts +11 -0
  33. package/dist/cli/commands/legacy-bridge.d.ts.map +1 -0
  34. package/dist/cli/commands/legacy-bridge.js +586 -0
  35. package/dist/cli/commands/legacy-bridge.js.map +1 -0
  36. package/dist/cli/commands/migrate.d.ts +3 -0
  37. package/dist/cli/commands/migrate.d.ts.map +1 -0
  38. package/dist/cli/commands/migrate.js +34 -0
  39. package/dist/cli/commands/migrate.js.map +1 -0
  40. package/dist/cli/commands/monitor.d.ts +3 -0
  41. package/dist/cli/commands/monitor.d.ts.map +1 -0
  42. package/dist/cli/commands/monitor.js +113 -0
  43. package/dist/cli/commands/monitor.js.map +1 -0
  44. package/dist/cli/commands/preflight.d.ts +7 -0
  45. package/dist/cli/commands/preflight.d.ts.map +1 -0
  46. package/dist/cli/commands/preflight.js +63 -0
  47. package/dist/cli/commands/preflight.js.map +1 -0
  48. package/dist/cli/commands/scope.d.ts +3 -0
  49. package/dist/cli/commands/scope.d.ts.map +1 -0
  50. package/dist/cli/commands/scope.js +32 -0
  51. package/dist/cli/commands/scope.js.map +1 -0
  52. package/dist/cli/commands/stage-extensions.d.ts +45 -0
  53. package/dist/cli/commands/stage-extensions.d.ts.map +1 -0
  54. package/dist/cli/commands/stage-extensions.js +590 -0
  55. package/dist/cli/commands/stage-extensions.js.map +1 -0
  56. package/dist/cli/commands/update.d.ts +3 -0
  57. package/dist/cli/commands/update.d.ts.map +1 -0
  58. package/dist/cli/commands/update.js +98 -0
  59. package/dist/cli/commands/update.js.map +1 -0
  60. package/dist/cli/commands/upgrade.d.ts +3 -0
  61. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  62. package/dist/cli/commands/upgrade.js +277 -0
  63. package/dist/cli/commands/upgrade.js.map +1 -0
  64. package/dist/cli/commands/validate.d.ts +3 -0
  65. package/dist/cli/commands/validate.d.ts.map +1 -0
  66. package/dist/cli/commands/validate.js +66 -0
  67. package/dist/cli/commands/validate.js.map +1 -0
  68. package/dist/cli/index.d.ts +3 -0
  69. package/dist/cli/index.d.ts.map +1 -0
  70. package/dist/cli/index.js +69 -0
  71. package/dist/cli/index.js.map +1 -0
  72. package/dist/core/ack-log.d.ts +107 -0
  73. package/dist/core/ack-log.d.ts.map +1 -0
  74. package/dist/core/ack-log.js +197 -0
  75. package/dist/core/ack-log.js.map +1 -0
  76. package/dist/core/archive/ack-log-consistency.d.ts +15 -0
  77. package/dist/core/archive/ack-log-consistency.d.ts.map +1 -0
  78. package/dist/core/archive/ack-log-consistency.js +164 -0
  79. package/dist/core/archive/ack-log-consistency.js.map +1 -0
  80. package/dist/core/archive/fence.d.ts +66 -0
  81. package/dist/core/archive/fence.d.ts.map +1 -0
  82. package/dist/core/archive/fence.js +218 -0
  83. package/dist/core/archive/fence.js.map +1 -0
  84. package/dist/core/archive/index.d.ts +4 -0
  85. package/dist/core/archive/index.d.ts.map +1 -0
  86. package/dist/core/archive/index.js +6 -0
  87. package/dist/core/archive/index.js.map +1 -0
  88. package/dist/core/archive/legacy-exemption.d.ts +14 -0
  89. package/dist/core/archive/legacy-exemption.d.ts.map +1 -0
  90. package/dist/core/archive/legacy-exemption.js +82 -0
  91. package/dist/core/archive/legacy-exemption.js.map +1 -0
  92. package/dist/core/archive/lock.d.ts +46 -0
  93. package/dist/core/archive/lock.d.ts.map +1 -0
  94. package/dist/core/archive/lock.js +98 -0
  95. package/dist/core/archive/lock.js.map +1 -0
  96. package/dist/core/archive/pause-decisions-fence.d.ts +13 -0
  97. package/dist/core/archive/pause-decisions-fence.d.ts.map +1 -0
  98. package/dist/core/archive/pause-decisions-fence.js +384 -0
  99. package/dist/core/archive/pause-decisions-fence.js.map +1 -0
  100. package/dist/core/archive/process-evidence-fence.d.ts +110 -0
  101. package/dist/core/archive/process-evidence-fence.d.ts.map +1 -0
  102. package/dist/core/archive/process-evidence-fence.js +449 -0
  103. package/dist/core/archive/process-evidence-fence.js.map +1 -0
  104. package/dist/core/archive/process-evidence-rerun.d.ts +9 -0
  105. package/dist/core/archive/process-evidence-rerun.d.ts.map +1 -0
  106. package/dist/core/archive/process-evidence-rerun.js +238 -0
  107. package/dist/core/archive/process-evidence-rerun.js.map +1 -0
  108. package/dist/core/archive/recover-prompt.d.ts +10 -0
  109. package/dist/core/archive/recover-prompt.d.ts.map +1 -0
  110. package/dist/core/archive/recover-prompt.js +29 -0
  111. package/dist/core/archive/recover-prompt.js.map +1 -0
  112. package/dist/core/archive/recover.d.ts +83 -0
  113. package/dist/core/archive/recover.d.ts.map +1 -0
  114. package/dist/core/archive/recover.js +219 -0
  115. package/dist/core/archive/recover.js.map +1 -0
  116. package/dist/core/archive/resume-summary.d.ts +22 -0
  117. package/dist/core/archive/resume-summary.d.ts.map +1 -0
  118. package/dist/core/archive/resume-summary.js +82 -0
  119. package/dist/core/archive/resume-summary.js.map +1 -0
  120. package/dist/core/archive/summary-builder.d.ts +28 -0
  121. package/dist/core/archive/summary-builder.d.ts.map +1 -0
  122. package/dist/core/archive/summary-builder.js +287 -0
  123. package/dist/core/archive/summary-builder.js.map +1 -0
  124. package/dist/core/archive/summary-render.d.ts +8 -0
  125. package/dist/core/archive/summary-render.d.ts.map +1 -0
  126. package/dist/core/archive/summary-render.js +64 -0
  127. package/dist/core/archive/summary-render.js.map +1 -0
  128. package/dist/core/archive/three-level-fence.d.ts +10 -0
  129. package/dist/core/archive/three-level-fence.d.ts.map +1 -0
  130. package/dist/core/archive/three-level-fence.js +93 -0
  131. package/dist/core/archive/three-level-fence.js.map +1 -0
  132. package/dist/core/archive/transaction.d.ts +41 -0
  133. package/dist/core/archive/transaction.d.ts.map +1 -0
  134. package/dist/core/archive/transaction.js +184 -0
  135. package/dist/core/archive/transaction.js.map +1 -0
  136. package/dist/core/archive/verify-findings-fence.d.ts +11 -0
  137. package/dist/core/archive/verify-findings-fence.d.ts.map +1 -0
  138. package/dist/core/archive/verify-findings-fence.js +80 -0
  139. package/dist/core/archive/verify-findings-fence.js.map +1 -0
  140. package/dist/core/archive/version-retrograde-fence.d.ts +10 -0
  141. package/dist/core/archive/version-retrograde-fence.d.ts.map +1 -0
  142. package/dist/core/archive/version-retrograde-fence.js +103 -0
  143. package/dist/core/archive/version-retrograde-fence.js.map +1 -0
  144. package/dist/core/artifact-graph/builder.d.ts +16 -0
  145. package/dist/core/artifact-graph/builder.d.ts.map +1 -0
  146. package/dist/core/artifact-graph/builder.js +32 -0
  147. package/dist/core/artifact-graph/builder.js.map +1 -0
  148. package/dist/core/artifact-graph/index.d.ts +3 -0
  149. package/dist/core/artifact-graph/index.d.ts.map +1 -0
  150. package/dist/core/artifact-graph/index.js +4 -0
  151. package/dist/core/artifact-graph/index.js.map +1 -0
  152. package/dist/core/artifact-graph/types.d.ts +14 -0
  153. package/dist/core/artifact-graph/types.d.ts.map +1 -0
  154. package/dist/core/artifact-graph/types.js +2 -0
  155. package/dist/core/artifact-graph/types.js.map +1 -0
  156. package/dist/core/backlog/assets/backlog-readme.md +11 -0
  157. package/dist/core/backlog/index.d.ts +20 -0
  158. package/dist/core/backlog/index.d.ts.map +1 -0
  159. package/dist/core/backlog/index.js +60 -0
  160. package/dist/core/backlog/index.js.map +1 -0
  161. package/dist/core/backlog/render.d.ts +51 -0
  162. package/dist/core/backlog/render.d.ts.map +1 -0
  163. package/dist/core/backlog/render.js +196 -0
  164. package/dist/core/backlog/render.js.map +1 -0
  165. package/dist/core/bootstrap/index.d.ts +2 -0
  166. package/dist/core/bootstrap/index.d.ts.map +1 -0
  167. package/dist/core/bootstrap/index.js +5 -0
  168. package/dist/core/bootstrap/index.js.map +1 -0
  169. package/dist/core/canonical-json.d.ts +11 -0
  170. package/dist/core/canonical-json.d.ts.map +1 -0
  171. package/dist/core/canonical-json.js +43 -0
  172. package/dist/core/canonical-json.js.map +1 -0
  173. package/dist/core/git/utils.d.ts +27 -0
  174. package/dist/core/git/utils.d.ts.map +1 -0
  175. package/dist/core/git/utils.js +53 -0
  176. package/dist/core/git/utils.js.map +1 -0
  177. package/dist/core/harness-adapters/claude.d.ts +13 -0
  178. package/dist/core/harness-adapters/claude.d.ts.map +1 -0
  179. package/dist/core/harness-adapters/claude.js +53 -0
  180. package/dist/core/harness-adapters/claude.js.map +1 -0
  181. package/dist/core/harness-adapters/codex.d.ts +14 -0
  182. package/dist/core/harness-adapters/codex.d.ts.map +1 -0
  183. package/dist/core/harness-adapters/codex.js +60 -0
  184. package/dist/core/harness-adapters/codex.js.map +1 -0
  185. package/dist/core/harness-adapters/detector.d.ts +15 -0
  186. package/dist/core/harness-adapters/detector.d.ts.map +1 -0
  187. package/dist/core/harness-adapters/detector.js +45 -0
  188. package/dist/core/harness-adapters/detector.js.map +1 -0
  189. package/dist/core/harness-adapters/hash-compare.d.ts +21 -0
  190. package/dist/core/harness-adapters/hash-compare.d.ts.map +1 -0
  191. package/dist/core/harness-adapters/hash-compare.js +49 -0
  192. package/dist/core/harness-adapters/hash-compare.js.map +1 -0
  193. package/dist/core/harness-adapters/index.d.ts +8 -0
  194. package/dist/core/harness-adapters/index.d.ts.map +1 -0
  195. package/dist/core/harness-adapters/index.js +8 -0
  196. package/dist/core/harness-adapters/index.js.map +1 -0
  197. package/dist/core/harness-adapters/interface.d.ts +52 -0
  198. package/dist/core/harness-adapters/interface.d.ts.map +1 -0
  199. package/dist/core/harness-adapters/interface.js +3 -0
  200. package/dist/core/harness-adapters/interface.js.map +1 -0
  201. package/dist/core/harness-adapters/legacy-detector.d.ts +14 -0
  202. package/dist/core/harness-adapters/legacy-detector.d.ts.map +1 -0
  203. package/dist/core/harness-adapters/legacy-detector.js +83 -0
  204. package/dist/core/harness-adapters/legacy-detector.js.map +1 -0
  205. package/dist/core/harness-adapters/transaction.d.ts +12 -0
  206. package/dist/core/harness-adapters/transaction.d.ts.map +1 -0
  207. package/dist/core/harness-adapters/transaction.js +113 -0
  208. package/dist/core/harness-adapters/transaction.js.map +1 -0
  209. package/dist/core/harness-adapters/types.d.ts +45 -0
  210. package/dist/core/harness-adapters/types.d.ts.map +1 -0
  211. package/dist/core/harness-adapters/types.js +3 -0
  212. package/dist/core/harness-adapters/types.js.map +1 -0
  213. package/dist/core/hash/content.d.ts +10 -0
  214. package/dist/core/hash/content.d.ts.map +1 -0
  215. package/dist/core/hash/content.js +131 -0
  216. package/dist/core/hash/content.js.map +1 -0
  217. package/dist/core/hash/diff.d.ts +26 -0
  218. package/dist/core/hash/diff.d.ts.map +1 -0
  219. package/dist/core/hash/diff.js +40 -0
  220. package/dist/core/hash/diff.js.map +1 -0
  221. package/dist/core/hash/index.d.ts +6 -0
  222. package/dist/core/hash/index.d.ts.map +1 -0
  223. package/dist/core/hash/index.js +7 -0
  224. package/dist/core/hash/index.js.map +1 -0
  225. package/dist/core/hash/log.d.ts +7 -0
  226. package/dist/core/hash/log.d.ts.map +1 -0
  227. package/dist/core/hash/log.js +14 -0
  228. package/dist/core/hash/log.js.map +1 -0
  229. package/dist/core/hash/tasks.d.ts +9 -0
  230. package/dist/core/hash/tasks.d.ts.map +1 -0
  231. package/dist/core/hash/tasks.js +20 -0
  232. package/dist/core/hash/tasks.js.map +1 -0
  233. package/dist/core/legacy-bridge/ack.d.ts +30 -0
  234. package/dist/core/legacy-bridge/ack.d.ts.map +1 -0
  235. package/dist/core/legacy-bridge/ack.js +133 -0
  236. package/dist/core/legacy-bridge/ack.js.map +1 -0
  237. package/dist/core/legacy-bridge/anchors.d.ts +15 -0
  238. package/dist/core/legacy-bridge/anchors.d.ts.map +1 -0
  239. package/dist/core/legacy-bridge/anchors.js +119 -0
  240. package/dist/core/legacy-bridge/anchors.js.map +1 -0
  241. package/dist/core/legacy-bridge/budget.d.ts +39 -0
  242. package/dist/core/legacy-bridge/budget.d.ts.map +1 -0
  243. package/dist/core/legacy-bridge/budget.js +83 -0
  244. package/dist/core/legacy-bridge/budget.js.map +1 -0
  245. package/dist/core/legacy-bridge/conflict.d.ts +44 -0
  246. package/dist/core/legacy-bridge/conflict.d.ts.map +1 -0
  247. package/dist/core/legacy-bridge/conflict.js +105 -0
  248. package/dist/core/legacy-bridge/conflict.js.map +1 -0
  249. package/dist/core/legacy-bridge/diff-report.d.ts +14 -0
  250. package/dist/core/legacy-bridge/diff-report.d.ts.map +1 -0
  251. package/dist/core/legacy-bridge/diff-report.js +105 -0
  252. package/dist/core/legacy-bridge/diff-report.js.map +1 -0
  253. package/dist/core/legacy-bridge/encoding.d.ts +42 -0
  254. package/dist/core/legacy-bridge/encoding.d.ts.map +1 -0
  255. package/dist/core/legacy-bridge/encoding.js +104 -0
  256. package/dist/core/legacy-bridge/encoding.js.map +1 -0
  257. package/dist/core/legacy-bridge/excel.d.ts +32 -0
  258. package/dist/core/legacy-bridge/excel.d.ts.map +1 -0
  259. package/dist/core/legacy-bridge/excel.js +124 -0
  260. package/dist/core/legacy-bridge/excel.js.map +1 -0
  261. package/dist/core/legacy-bridge/hash-anchor.d.ts +23 -0
  262. package/dist/core/legacy-bridge/hash-anchor.d.ts.map +1 -0
  263. package/dist/core/legacy-bridge/hash-anchor.js +55 -0
  264. package/dist/core/legacy-bridge/hash-anchor.js.map +1 -0
  265. package/dist/core/legacy-bridge/indexer.d.ts +28 -0
  266. package/dist/core/legacy-bridge/indexer.d.ts.map +1 -0
  267. package/dist/core/legacy-bridge/indexer.js +145 -0
  268. package/dist/core/legacy-bridge/indexer.js.map +1 -0
  269. package/dist/core/legacy-bridge/mapper.d.ts +40 -0
  270. package/dist/core/legacy-bridge/mapper.d.ts.map +1 -0
  271. package/dist/core/legacy-bridge/mapper.js +241 -0
  272. package/dist/core/legacy-bridge/mapper.js.map +1 -0
  273. package/dist/core/legacy-bridge/quality-judge.d.ts +65 -0
  274. package/dist/core/legacy-bridge/quality-judge.d.ts.map +1 -0
  275. package/dist/core/legacy-bridge/quality-judge.js +277 -0
  276. package/dist/core/legacy-bridge/quality-judge.js.map +1 -0
  277. package/dist/core/legacy-bridge/redact.d.ts +28 -0
  278. package/dist/core/legacy-bridge/redact.d.ts.map +1 -0
  279. package/dist/core/legacy-bridge/redact.js +121 -0
  280. package/dist/core/legacy-bridge/redact.js.map +1 -0
  281. package/dist/core/legacy-bridge/regenerator.d.ts +50 -0
  282. package/dist/core/legacy-bridge/regenerator.d.ts.map +1 -0
  283. package/dist/core/legacy-bridge/regenerator.js +193 -0
  284. package/dist/core/legacy-bridge/regenerator.js.map +1 -0
  285. package/dist/core/legacy-bridge/resolve.d.ts +28 -0
  286. package/dist/core/legacy-bridge/resolve.d.ts.map +1 -0
  287. package/dist/core/legacy-bridge/resolve.js +75 -0
  288. package/dist/core/legacy-bridge/resolve.js.map +1 -0
  289. package/dist/core/legacy-bridge/sync-check.d.ts +47 -0
  290. package/dist/core/legacy-bridge/sync-check.d.ts.map +1 -0
  291. package/dist/core/legacy-bridge/sync-check.js +198 -0
  292. package/dist/core/legacy-bridge/sync-check.js.map +1 -0
  293. package/dist/core/legacy-bridge/types.d.ts +114 -0
  294. package/dist/core/legacy-bridge/types.d.ts.map +1 -0
  295. package/dist/core/legacy-bridge/types.js +4 -0
  296. package/dist/core/legacy-bridge/types.js.map +1 -0
  297. package/dist/core/markers/index.d.ts +3 -0
  298. package/dist/core/markers/index.d.ts.map +1 -0
  299. package/dist/core/markers/index.js +3 -0
  300. package/dist/core/markers/index.js.map +1 -0
  301. package/dist/core/markers/parse.d.ts +12 -0
  302. package/dist/core/markers/parse.d.ts.map +1 -0
  303. package/dist/core/markers/parse.js +31 -0
  304. package/dist/core/markers/parse.js.map +1 -0
  305. package/dist/core/markers/types.d.ts +142 -0
  306. package/dist/core/markers/types.d.ts.map +1 -0
  307. package/dist/core/markers/types.js +3 -0
  308. package/dist/core/markers/types.js.map +1 -0
  309. package/dist/core/migrate/ack.d.ts +13 -0
  310. package/dist/core/migrate/ack.d.ts.map +1 -0
  311. package/dist/core/migrate/ack.js +62 -0
  312. package/dist/core/migrate/ack.js.map +1 -0
  313. package/dist/core/migrate/archive-detect.d.ts +19 -0
  314. package/dist/core/migrate/archive-detect.d.ts.map +1 -0
  315. package/dist/core/migrate/archive-detect.js +89 -0
  316. package/dist/core/migrate/archive-detect.js.map +1 -0
  317. package/dist/core/migrate/budget.d.ts +7 -0
  318. package/dist/core/migrate/budget.d.ts.map +1 -0
  319. package/dist/core/migrate/budget.js +25 -0
  320. package/dist/core/migrate/budget.js.map +1 -0
  321. package/dist/core/migrate/conflict.d.ts +49 -0
  322. package/dist/core/migrate/conflict.d.ts.map +1 -0
  323. package/dist/core/migrate/conflict.js +99 -0
  324. package/dist/core/migrate/conflict.js.map +1 -0
  325. package/dist/core/migrate/index.d.ts +7 -0
  326. package/dist/core/migrate/index.d.ts.map +1 -0
  327. package/dist/core/migrate/index.js +389 -0
  328. package/dist/core/migrate/index.js.map +1 -0
  329. package/dist/core/migrate/markdown-aware.d.ts +27 -0
  330. package/dist/core/migrate/markdown-aware.d.ts.map +1 -0
  331. package/dist/core/migrate/markdown-aware.js +112 -0
  332. package/dist/core/migrate/markdown-aware.js.map +1 -0
  333. package/dist/core/migrate/quality.d.ts +66 -0
  334. package/dist/core/migrate/quality.d.ts.map +1 -0
  335. package/dist/core/migrate/quality.js +302 -0
  336. package/dist/core/migrate/quality.js.map +1 -0
  337. package/dist/core/migrate/regenerate.d.ts +24 -0
  338. package/dist/core/migrate/regenerate.d.ts.map +1 -0
  339. package/dist/core/migrate/regenerate.js +145 -0
  340. package/dist/core/migrate/regenerate.js.map +1 -0
  341. package/dist/core/migrate/report.d.ts +36 -0
  342. package/dist/core/migrate/report.d.ts.map +1 -0
  343. package/dist/core/migrate/report.js +154 -0
  344. package/dist/core/migrate/report.js.map +1 -0
  345. package/dist/core/migrate/sources/index.d.ts +4 -0
  346. package/dist/core/migrate/sources/index.d.ts.map +1 -0
  347. package/dist/core/migrate/sources/index.js +17 -0
  348. package/dist/core/migrate/sources/index.js.map +1 -0
  349. package/dist/core/migrate/sources/openspec.d.ts +14 -0
  350. package/dist/core/migrate/sources/openspec.d.ts.map +1 -0
  351. package/dist/core/migrate/sources/openspec.js +453 -0
  352. package/dist/core/migrate/sources/openspec.js.map +1 -0
  353. package/dist/core/migrate/sources/superpowers.d.ts +12 -0
  354. package/dist/core/migrate/sources/superpowers.d.ts.map +1 -0
  355. package/dist/core/migrate/sources/superpowers.js +310 -0
  356. package/dist/core/migrate/sources/superpowers.js.map +1 -0
  357. package/dist/core/migrate/types.d.ts +183 -0
  358. package/dist/core/migrate/types.d.ts.map +1 -0
  359. package/dist/core/migrate/types.js +5 -0
  360. package/dist/core/migrate/types.js.map +1 -0
  361. package/dist/core/migrate/utils.d.ts +2 -0
  362. package/dist/core/migrate/utils.d.ts.map +1 -0
  363. package/dist/core/migrate/utils.js +28 -0
  364. package/dist/core/migrate/utils.js.map +1 -0
  365. package/dist/core/monitor/artifact-observer.d.ts +9 -0
  366. package/dist/core/monitor/artifact-observer.d.ts.map +1 -0
  367. package/dist/core/monitor/artifact-observer.js +180 -0
  368. package/dist/core/monitor/artifact-observer.js.map +1 -0
  369. package/dist/core/monitor/config.d.ts +16 -0
  370. package/dist/core/monitor/config.d.ts.map +1 -0
  371. package/dist/core/monitor/config.js +48 -0
  372. package/dist/core/monitor/config.js.map +1 -0
  373. package/dist/core/monitor/divergence-map.d.ts +5 -0
  374. package/dist/core/monitor/divergence-map.d.ts.map +1 -0
  375. package/dist/core/monitor/divergence-map.js +92 -0
  376. package/dist/core/monitor/divergence-map.js.map +1 -0
  377. package/dist/core/monitor/exit-handler.d.ts +6 -0
  378. package/dist/core/monitor/exit-handler.d.ts.map +1 -0
  379. package/dist/core/monitor/exit-handler.js +27 -0
  380. package/dist/core/monitor/exit-handler.js.map +1 -0
  381. package/dist/core/monitor/health-verdict.d.ts +9 -0
  382. package/dist/core/monitor/health-verdict.d.ts.map +1 -0
  383. package/dist/core/monitor/health-verdict.js +55 -0
  384. package/dist/core/monitor/health-verdict.js.map +1 -0
  385. package/dist/core/monitor/report-renderer.d.ts +4 -0
  386. package/dist/core/monitor/report-renderer.d.ts.map +1 -0
  387. package/dist/core/monitor/report-renderer.js +82 -0
  388. package/dist/core/monitor/report-renderer.js.map +1 -0
  389. package/dist/core/monitor/trace-store.d.ts +39 -0
  390. package/dist/core/monitor/trace-store.d.ts.map +1 -0
  391. package/dist/core/monitor/trace-store.js +130 -0
  392. package/dist/core/monitor/trace-store.js.map +1 -0
  393. package/dist/core/monitor/types.d.ts +63 -0
  394. package/dist/core/monitor/types.d.ts.map +1 -0
  395. package/dist/core/monitor/types.js +26 -0
  396. package/dist/core/monitor/types.js.map +1 -0
  397. package/dist/core/parse/design.d.ts +14 -0
  398. package/dist/core/parse/design.d.ts.map +1 -0
  399. package/dist/core/parse/design.js +17 -0
  400. package/dist/core/parse/design.js.map +1 -0
  401. package/dist/core/parse/fenced-yaml.d.ts +18 -0
  402. package/dist/core/parse/fenced-yaml.d.ts.map +1 -0
  403. package/dist/core/parse/fenced-yaml.js +45 -0
  404. package/dist/core/parse/fenced-yaml.js.map +1 -0
  405. package/dist/core/parse/index.d.ts +7 -0
  406. package/dist/core/parse/index.d.ts.map +1 -0
  407. package/dist/core/parse/index.js +8 -0
  408. package/dist/core/parse/index.js.map +1 -0
  409. package/dist/core/parse/markdown.d.ts +30 -0
  410. package/dist/core/parse/markdown.d.ts.map +1 -0
  411. package/dist/core/parse/markdown.js +66 -0
  412. package/dist/core/parse/markdown.js.map +1 -0
  413. package/dist/core/parse/proposal.d.ts +18 -0
  414. package/dist/core/parse/proposal.d.ts.map +1 -0
  415. package/dist/core/parse/proposal.js +22 -0
  416. package/dist/core/parse/proposal.js.map +1 -0
  417. package/dist/core/parse/specs.d.ts +25 -0
  418. package/dist/core/parse/specs.d.ts.map +1 -0
  419. package/dist/core/parse/specs.js +58 -0
  420. package/dist/core/parse/specs.js.map +1 -0
  421. package/dist/core/parse/tasks.d.ts +33 -0
  422. package/dist/core/parse/tasks.d.ts.map +1 -0
  423. package/dist/core/parse/tasks.js +82 -0
  424. package/dist/core/parse/tasks.js.map +1 -0
  425. package/dist/core/parse/yaml.d.ts +13 -0
  426. package/dist/core/parse/yaml.d.ts.map +1 -0
  427. package/dist/core/parse/yaml.js +39 -0
  428. package/dist/core/parse/yaml.js.map +1 -0
  429. package/dist/core/process-evidence-freeze-warnings.d.ts +24 -0
  430. package/dist/core/process-evidence-freeze-warnings.d.ts.map +1 -0
  431. package/dist/core/process-evidence-freeze-warnings.js +153 -0
  432. package/dist/core/process-evidence-freeze-warnings.js.map +1 -0
  433. package/dist/core/schema/index.d.ts +5 -0
  434. package/dist/core/schema/index.d.ts.map +1 -0
  435. package/dist/core/schema/index.js +6 -0
  436. package/dist/core/schema/index.js.map +1 -0
  437. package/dist/core/schema/model-tiers-config.d.ts +41 -0
  438. package/dist/core/schema/model-tiers-config.d.ts.map +1 -0
  439. package/dist/core/schema/model-tiers-config.js +85 -0
  440. package/dist/core/schema/model-tiers-config.js.map +1 -0
  441. package/dist/core/schema/process-verification-config.d.ts +18 -0
  442. package/dist/core/schema/process-verification-config.d.ts.map +1 -0
  443. package/dist/core/schema/process-verification-config.js +74 -0
  444. package/dist/core/schema/process-verification-config.js.map +1 -0
  445. package/dist/core/schema/stage-extensions-config.d.ts +28 -0
  446. package/dist/core/schema/stage-extensions-config.d.ts.map +1 -0
  447. package/dist/core/schema/stage-extensions-config.js +228 -0
  448. package/dist/core/schema/stage-extensions-config.js.map +1 -0
  449. package/dist/core/schema/types.d.ts +262 -0
  450. package/dist/core/schema/types.d.ts.map +1 -0
  451. package/dist/core/schema/types.js +51 -0
  452. package/dist/core/schema/types.js.map +1 -0
  453. package/dist/core/schema/writing-plans-config.d.ts +11 -0
  454. package/dist/core/schema/writing-plans-config.d.ts.map +1 -0
  455. package/dist/core/schema/writing-plans-config.js +40 -0
  456. package/dist/core/schema/writing-plans-config.js.map +1 -0
  457. package/dist/core/schemas/archive-summary.d.ts +131 -0
  458. package/dist/core/schemas/archive-summary.d.ts.map +1 -0
  459. package/dist/core/schemas/archive-summary.js +31 -0
  460. package/dist/core/schemas/archive-summary.js.map +1 -0
  461. package/dist/core/schemas/process-evidence.d.ts +156 -0
  462. package/dist/core/schemas/process-evidence.d.ts.map +1 -0
  463. package/dist/core/schemas/process-evidence.js +12 -0
  464. package/dist/core/schemas/process-evidence.js.map +1 -0
  465. package/dist/core/schemas/scope-entries.d.ts +68 -0
  466. package/dist/core/schemas/scope-entries.d.ts.map +1 -0
  467. package/dist/core/schemas/scope-entries.js +47 -0
  468. package/dist/core/schemas/scope-entries.js.map +1 -0
  469. package/dist/core/schemas/severity.d.ts +58 -0
  470. package/dist/core/schemas/severity.d.ts.map +1 -0
  471. package/dist/core/schemas/severity.js +26 -0
  472. package/dist/core/schemas/severity.js.map +1 -0
  473. package/dist/core/scope/aggregator.d.ts +49 -0
  474. package/dist/core/scope/aggregator.d.ts.map +1 -0
  475. package/dist/core/scope/aggregator.js +141 -0
  476. package/dist/core/scope/aggregator.js.map +1 -0
  477. package/dist/core/scope/index.d.ts +2 -0
  478. package/dist/core/scope/index.d.ts.map +1 -0
  479. package/dist/core/scope/index.js +2 -0
  480. package/dist/core/scope/index.js.map +1 -0
  481. package/dist/core/specs-sync/apply.d.ts +8 -0
  482. package/dist/core/specs-sync/apply.d.ts.map +1 -0
  483. package/dist/core/specs-sync/apply.js +26 -0
  484. package/dist/core/specs-sync/apply.js.map +1 -0
  485. package/dist/core/specs-sync/deltas.d.ts +15 -0
  486. package/dist/core/specs-sync/deltas.d.ts.map +1 -0
  487. package/dist/core/specs-sync/deltas.js +27 -0
  488. package/dist/core/specs-sync/deltas.js.map +1 -0
  489. package/dist/core/specs-sync/index.d.ts +3 -0
  490. package/dist/core/specs-sync/index.d.ts.map +1 -0
  491. package/dist/core/specs-sync/index.js +4 -0
  492. package/dist/core/specs-sync/index.js.map +1 -0
  493. package/dist/core/stage-extensions/convergence-judge.d.ts +35 -0
  494. package/dist/core/stage-extensions/convergence-judge.d.ts.map +1 -0
  495. package/dist/core/stage-extensions/convergence-judge.js +47 -0
  496. package/dist/core/stage-extensions/convergence-judge.js.map +1 -0
  497. package/dist/core/stage-extensions/index.d.ts +13 -0
  498. package/dist/core/stage-extensions/index.d.ts.map +1 -0
  499. package/dist/core/stage-extensions/index.js +11 -0
  500. package/dist/core/stage-extensions/index.js.map +1 -0
  501. package/dist/core/stage-extensions/output-watcher.d.ts +93 -0
  502. package/dist/core/stage-extensions/output-watcher.d.ts.map +1 -0
  503. package/dist/core/stage-extensions/output-watcher.js +163 -0
  504. package/dist/core/stage-extensions/output-watcher.js.map +1 -0
  505. package/dist/core/stage-extensions/severity-mapper.d.ts +21 -0
  506. package/dist/core/stage-extensions/severity-mapper.d.ts.map +1 -0
  507. package/dist/core/stage-extensions/severity-mapper.js +26 -0
  508. package/dist/core/stage-extensions/severity-mapper.js.map +1 -0
  509. package/dist/core/stage-extensions/state-machine.d.ts +43 -0
  510. package/dist/core/stage-extensions/state-machine.d.ts.map +1 -0
  511. package/dist/core/stage-extensions/state-machine.js +19 -0
  512. package/dist/core/stage-extensions/state-machine.js.map +1 -0
  513. package/dist/core/stage-extensions/thread-map.d.ts +60 -0
  514. package/dist/core/stage-extensions/thread-map.d.ts.map +1 -0
  515. package/dist/core/stage-extensions/thread-map.js +107 -0
  516. package/dist/core/stage-extensions/thread-map.js.map +1 -0
  517. package/dist/core/stage-extensions/trend-analyzer.d.ts +29 -0
  518. package/dist/core/stage-extensions/trend-analyzer.d.ts.map +1 -0
  519. package/dist/core/stage-extensions/trend-analyzer.js +60 -0
  520. package/dist/core/stage-extensions/trend-analyzer.js.map +1 -0
  521. package/dist/core/stage-extensions/types.d.ts +39 -0
  522. package/dist/core/stage-extensions/types.d.ts.map +1 -0
  523. package/dist/core/stage-extensions/types.js +5 -0
  524. package/dist/core/stage-extensions/types.js.map +1 -0
  525. package/dist/core/staging-lock.d.ts +36 -0
  526. package/dist/core/staging-lock.d.ts.map +1 -0
  527. package/dist/core/staging-lock.js +122 -0
  528. package/dist/core/staging-lock.js.map +1 -0
  529. package/dist/core/templates/commands/ack-confirm.md +32 -0
  530. package/dist/core/templates/commands/apply.md +220 -0
  531. package/dist/core/templates/commands/archive.md +178 -0
  532. package/dist/core/templates/commands/brainstorm.md +58 -0
  533. package/dist/core/templates/commands/codex-adversarial.md +95 -0
  534. package/dist/core/templates/commands/explore.md +29 -0
  535. package/dist/core/templates/commands/index.d.ts +12 -0
  536. package/dist/core/templates/commands/index.d.ts.map +1 -0
  537. package/dist/core/templates/commands/index.js +26 -0
  538. package/dist/core/templates/commands/index.js.map +1 -0
  539. package/dist/core/templates/commands/propose.md +90 -0
  540. package/dist/core/templates/commands/review.md +105 -0
  541. package/dist/core/templates/commands/upgrade.md +58 -0
  542. package/dist/core/templates/commands/verify.md +186 -0
  543. package/dist/core/templates/index.d.ts +3 -0
  544. package/dist/core/templates/index.d.ts.map +1 -0
  545. package/dist/core/templates/index.js +5 -0
  546. package/dist/core/templates/index.js.map +1 -0
  547. package/dist/core/templates/skills/_shared/scope-category-guidance.md +40 -0
  548. package/dist/core/templates/skills/brainstorming.md +161 -0
  549. package/dist/core/templates/skills/dispatching-parallel-agents.md +209 -0
  550. package/dist/core/templates/skills/exploring.md +476 -0
  551. package/dist/core/templates/skills/finishing-a-development-branch.md +251 -0
  552. package/dist/core/templates/skills/index.d.ts +17 -0
  553. package/dist/core/templates/skills/index.d.ts.map +1 -0
  554. package/dist/core/templates/skills/index.js +53 -0
  555. package/dist/core/templates/skills/index.js.map +1 -0
  556. package/dist/core/templates/skills/process-evidence.md +146 -0
  557. package/dist/core/templates/skills/receiving-code-review.md +294 -0
  558. package/dist/core/templates/skills/requesting-code-review.md +108 -0
  559. package/dist/core/templates/skills/subagent-driven-development.md +405 -0
  560. package/dist/core/templates/skills/subagent-driven-discipline/references/codex-tools.md +72 -0
  561. package/dist/core/templates/skills/subagent-driven-discipline/references/opencode-tools.md +104 -0
  562. package/dist/core/templates/skills/subagent-driven-discipline.md +725 -0
  563. package/dist/core/templates/skills/systematic-debugging.md +297 -0
  564. package/dist/core/templates/skills/test-driven-development.md +402 -0
  565. package/dist/core/templates/skills/using-forge.md +163 -0
  566. package/dist/core/templates/skills/using-git-worktrees.md +229 -0
  567. package/dist/core/templates/skills/verification-before-completion.md +175 -0
  568. package/dist/core/templates/skills/verifying-three-dimensions.md +245 -0
  569. package/dist/core/templates/skills/writing-plans.md +259 -0
  570. package/dist/core/templates/skills/writing-skills.md +214 -0
  571. package/dist/core/test-reporters/index.d.ts +41 -0
  572. package/dist/core/test-reporters/index.d.ts.map +1 -0
  573. package/dist/core/test-reporters/index.js +39 -0
  574. package/dist/core/test-reporters/index.js.map +1 -0
  575. package/dist/core/test-reporters/junit.d.ts +8 -0
  576. package/dist/core/test-reporters/junit.d.ts.map +1 -0
  577. package/dist/core/test-reporters/junit.js +94 -0
  578. package/dist/core/test-reporters/junit.js.map +1 -0
  579. package/dist/core/test-reporters/tap.d.ts +18 -0
  580. package/dist/core/test-reporters/tap.d.ts.map +1 -0
  581. package/dist/core/test-reporters/tap.js +73 -0
  582. package/dist/core/test-reporters/tap.js.map +1 -0
  583. package/dist/core/test-reporters/vitest-json.d.ts +8 -0
  584. package/dist/core/test-reporters/vitest-json.d.ts.map +1 -0
  585. package/dist/core/test-reporters/vitest-json.js +56 -0
  586. package/dist/core/test-reporters/vitest-json.js.map +1 -0
  587. package/dist/core/upgrade/resign-markers.d.ts +14 -0
  588. package/dist/core/upgrade/resign-markers.d.ts.map +1 -0
  589. package/dist/core/upgrade/resign-markers.js +245 -0
  590. package/dist/core/upgrade/resign-markers.js.map +1 -0
  591. package/dist/core/validate/archive-summary-schema.d.ts +8 -0
  592. package/dist/core/validate/archive-summary-schema.d.ts.map +1 -0
  593. package/dist/core/validate/archive-summary-schema.js +186 -0
  594. package/dist/core/validate/archive-summary-schema.js.map +1 -0
  595. package/dist/core/validate/auto-findings.d.ts +36 -0
  596. package/dist/core/validate/auto-findings.d.ts.map +1 -0
  597. package/dist/core/validate/auto-findings.js +38 -0
  598. package/dist/core/validate/auto-findings.js.map +1 -0
  599. package/dist/core/validate/candidate-validators.d.ts +22 -0
  600. package/dist/core/validate/candidate-validators.d.ts.map +1 -0
  601. package/dist/core/validate/candidate-validators.js +46 -0
  602. package/dist/core/validate/candidate-validators.js.map +1 -0
  603. package/dist/core/validate/change.d.ts +3 -0
  604. package/dist/core/validate/change.d.ts.map +1 -0
  605. package/dist/core/validate/change.js +205 -0
  606. package/dist/core/validate/change.js.map +1 -0
  607. package/dist/core/validate/coverage-gap.d.ts +37 -0
  608. package/dist/core/validate/coverage-gap.d.ts.map +1 -0
  609. package/dist/core/validate/coverage-gap.js +181 -0
  610. package/dist/core/validate/coverage-gap.js.map +1 -0
  611. package/dist/core/validate/finding-hash.d.ts +14 -0
  612. package/dist/core/validate/finding-hash.d.ts.map +1 -0
  613. package/dist/core/validate/finding-hash.js +29 -0
  614. package/dist/core/validate/finding-hash.js.map +1 -0
  615. package/dist/core/validate/index.d.ts +15 -0
  616. package/dist/core/validate/index.d.ts.map +1 -0
  617. package/dist/core/validate/index.js +19 -0
  618. package/dist/core/validate/index.js.map +1 -0
  619. package/dist/core/validate/marker-integrity.d.ts +28 -0
  620. package/dist/core/validate/marker-integrity.d.ts.map +1 -0
  621. package/dist/core/validate/marker-integrity.js +170 -0
  622. package/dist/core/validate/marker-integrity.js.map +1 -0
  623. package/dist/core/validate/marker-schema.d.ts +10 -0
  624. package/dist/core/validate/marker-schema.d.ts.map +1 -0
  625. package/dist/core/validate/marker-schema.js +661 -0
  626. package/dist/core/validate/marker-schema.js.map +1 -0
  627. package/dist/core/validate/orphan-tmp.d.ts +13 -0
  628. package/dist/core/validate/orphan-tmp.d.ts.map +1 -0
  629. package/dist/core/validate/orphan-tmp.js +49 -0
  630. package/dist/core/validate/orphan-tmp.js.map +1 -0
  631. package/dist/core/validate/proposal.d.ts +4 -0
  632. package/dist/core/validate/proposal.d.ts.map +1 -0
  633. package/dist/core/validate/proposal.js +40 -0
  634. package/dist/core/validate/proposal.js.map +1 -0
  635. package/dist/core/validate/scope-entries.d.ts +23 -0
  636. package/dist/core/validate/scope-entries.d.ts.map +1 -0
  637. package/dist/core/validate/scope-entries.js +108 -0
  638. package/dist/core/validate/scope-entries.js.map +1 -0
  639. package/dist/core/validate/specs.d.ts +4 -0
  640. package/dist/core/validate/specs.d.ts.map +1 -0
  641. package/dist/core/validate/specs.js +74 -0
  642. package/dist/core/validate/specs.js.map +1 -0
  643. package/dist/core/validate/tasks.d.ts +4 -0
  644. package/dist/core/validate/tasks.d.ts.map +1 -0
  645. package/dist/core/validate/tasks.js +48 -0
  646. package/dist/core/validate/tasks.js.map +1 -0
  647. package/dist/core/validate/test-failure-stub.d.ts +23 -0
  648. package/dist/core/validate/test-failure-stub.d.ts.map +1 -0
  649. package/dist/core/validate/test-failure-stub.js +21 -0
  650. package/dist/core/validate/test-failure-stub.js.map +1 -0
  651. package/dist/core/validate/types.d.ts +33 -0
  652. package/dist/core/validate/types.d.ts.map +1 -0
  653. package/dist/core/validate/types.js +20 -0
  654. package/dist/core/validate/types.js.map +1 -0
  655. package/dist/core/worktree.d.ts +52 -0
  656. package/dist/core/worktree.d.ts.map +1 -0
  657. package/dist/core/worktree.js +145 -0
  658. package/dist/core/worktree.js.map +1 -0
  659. package/dist/index.d.ts +12 -0
  660. package/dist/index.d.ts.map +1 -0
  661. package/dist/index.js +14 -0
  662. package/dist/index.js.map +1 -0
  663. package/package.json +82 -0
@@ -0,0 +1,661 @@
1
+ // Marker schema 类型校验 — spec §3.4.1
2
+ import { ok, failed, mergeResults } from './types.js';
3
+ // plan-9d Task 3 (v12 REG-IMPORT-001 修订):import 9a 三级 severity enum + isSeverity
4
+ // 用于 checkVerifyFindingsArray 校验 verify_findings[i].severity(CRITICAL/WARNING/SUGGESTION)
5
+ // 现有 local const SEVERITY_VALUES 已 rename → REVIEW_OUTCOME_SEVERITY_CODES 避免重名冲突
6
+ import { SEVERITY_VALUES, isSeverity } from '../schemas/severity.js';
7
+ // 已知合法的 schema 名称
8
+ const KNOWN_SCHEMAS = [
9
+ 'forge-verify/v1',
10
+ 'forge-review/v1',
11
+ 'forge-verify-failed/v1',
12
+ 'forge-review-failed/v1',
13
+ ];
14
+ // ISO 8601 UTC 格式正则(YYYY-MM-DDTHH:MM:SSZ)
15
+ const ISO_8601_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/;
16
+ // sha256: 前缀 + 64 位小写十六进制
17
+ const SHA256_RE = /^sha256:[a-f0-9]{64}$/;
18
+ // finding_hash:裸 64-hex(沿 9a finding-hash.ts:8,不带 sha256: 前缀)
19
+ const FINDING_HASH_RE = /^[a-f0-9]{64}$/;
20
+ // git commit hash:40 位小写十六进制
21
+ const GIT_HEAD_RE = /^[a-f0-9]{40}$/;
22
+ // plan-9j Task 1 新增:created_by_tool_version semver 校验
23
+ // 沿 archive-summary.ts SEMVER_RE 同模式(major.minor.patch[-prerelease][+build])
24
+ const SEMVER_RE = /^\d+\.\d+\.\d+(?:-[\w.-]+)?(?:\+[\w.-]+)?$/;
25
+ // actor 合法值
26
+ const ACTOR_VALUES = new Set(['ai-agent', 'human-override']);
27
+ // review_outcomes.severity 合法值(S/C/L 简码,语义独立于 9a 三级 enum CRITICAL/WARNING/SUGGESTION)
28
+ // plan-9d Task 3 (v12 REG-IMPORT-001 修订):rename 自 SEVERITY_VALUES → REVIEW_OUTCOME_SEVERITY_CODES
29
+ // v3 BLOCKER 4(plan-9j):union 扩 simcode + 全名(沿 types.ts ReviewOutcome.severity)
30
+ const REVIEW_OUTCOME_SEVERITY_CODES = new Set([
31
+ 'S',
32
+ 'C',
33
+ 'L', // v0.4 simcode(老 marker 兼容)
34
+ 'CRITICAL',
35
+ 'WARNING',
36
+ 'SUGGESTION', // v1.0 全名(resign 后或 v1.0 native 写入)
37
+ ]);
38
+ // verify_findings.dimension 合法值(沿 design §2.2.2 三维度 + plan-9g brainstorm v10 加 process_evidence)
39
+ const DIMENSION_VALUES = new Set([
40
+ 'completeness',
41
+ 'correctness',
42
+ 'coherence',
43
+ 'process_evidence', // plan-9g freeze-time WARNING 7/10(brainstorm spec §3 修订)
44
+ ]);
45
+ // plan-9c Task 1 新增:pause_decisions.chosen_option 合法值(1 | 2 | 3 | 4)
46
+ const CHOSEN_OPTION_VALUES = new Set([1, 2, 3, 4]);
47
+ /**
48
+ * 校验 marker 对象的 schema 合法性。
49
+ * @param m - 已解析的 marker 对象(AnyMarker 或 unknown)
50
+ * @param file - 可选:来源文件路径,用于错误报告
51
+ */
52
+ export function validateMarkerSchema(m, file) {
53
+ if (!m || typeof m !== 'object') {
54
+ return failed({ artifact: 'marker', message: 'marker must be a YAML mapping', file });
55
+ }
56
+ const obj = m;
57
+ // 1. schema 字段必须是已知值之一
58
+ if (typeof obj.schema !== 'string' || !KNOWN_SCHEMAS.includes(obj.schema)) {
59
+ return failed({
60
+ artifact: 'marker',
61
+ field: 'schema',
62
+ message: `schema must be one of: ${KNOWN_SCHEMAS.join(', ')}`,
63
+ file,
64
+ });
65
+ }
66
+ const schema = obj.schema;
67
+ const results = [];
68
+ // 2. 按 schema 类型分支校验各字段
69
+ if (schema === 'forge-verify/v1') {
70
+ results.push(checkTimestamp(obj, 'verified_at', file));
71
+ results.push(checkActor(obj, 'verified_by', file));
72
+ results.push(checkSha256(obj, 'tasks_hash', file));
73
+ results.push(checkSha256(obj, 'content_hash', file));
74
+ results.push(checkEvidenceArray(obj.evidence, file));
75
+ // plan-9d Task 3 新增:verify_findings 数组校验(可选 superset additive,老 marker 缺等价 [])
76
+ if (obj.verify_findings !== undefined) {
77
+ results.push(checkVerifyFindingsArray(obj.verify_findings, file));
78
+ }
79
+ // plan-9c Task 1 新增 — pause_decisions superset additive
80
+ if (obj.pause_decisions !== undefined) {
81
+ results.push(checkPauseDecisionsArray(obj.pause_decisions, file));
82
+ }
83
+ // plan-9j Task 1 新增:created_by_tool_version 可选 superset additive 字段
84
+ results.push(checkSemverString(obj, 'created_by_tool_version', file));
85
+ // v3 BLOCKER 2 新增:resigned_by_tool_version(沿 v2 选项 C — 区分 created vs resigned)
86
+ results.push(checkSemverString(obj, 'resigned_by_tool_version', file));
87
+ }
88
+ else if (schema === 'forge-review/v1') {
89
+ results.push(checkTimestamp(obj, 'reviewed_at', file));
90
+ results.push(checkActor(obj, 'reviewed_by', file));
91
+ results.push(checkSha256(obj, 'tasks_hash', file));
92
+ results.push(checkSha256(obj, 'content_hash', file));
93
+ results.push(checkGitInfo(obj.git, file));
94
+ results.push(checkReviewOutcomes(obj.review_outcomes, file));
95
+ // plan-9c Task 1 新增
96
+ if (obj.pause_decisions !== undefined) {
97
+ results.push(checkPauseDecisionsArray(obj.pause_decisions, file));
98
+ }
99
+ // plan-9j Task 1 新增:created_by_tool_version 可选 superset additive 字段
100
+ results.push(checkSemverString(obj, 'created_by_tool_version', file));
101
+ // v3 BLOCKER 2 新增:resigned_by_tool_version(沿 v2 选项 C — 区分 created vs resigned)
102
+ results.push(checkSemverString(obj, 'resigned_by_tool_version', file));
103
+ }
104
+ else if (schema === 'forge-verify-failed/v1') {
105
+ results.push(checkTimestamp(obj, 'failed_at', file));
106
+ results.push(checkStringArray(obj, 'reasons', file));
107
+ results.push(checkStringArray(obj, 'fake_completions', file));
108
+ results.push(checkStringArray(obj, 'appended_tasks', file));
109
+ // plan-9d Task 3 新增:verify_findings 数组校验(可选 superset)
110
+ if (obj.verify_findings !== undefined) {
111
+ results.push(checkVerifyFindingsArray(obj.verify_findings, file));
112
+ }
113
+ // plan-9c Task 1 新增
114
+ if (obj.pause_decisions !== undefined) {
115
+ results.push(checkPauseDecisionsArray(obj.pause_decisions, file));
116
+ }
117
+ // plan-9j Task 1 新增:created_by_tool_version 可选 superset additive 字段
118
+ results.push(checkSemverString(obj, 'created_by_tool_version', file));
119
+ // v3 BLOCKER 2 新增:resigned_by_tool_version(沿 v2 选项 C — 区分 created vs resigned)
120
+ results.push(checkSemverString(obj, 'resigned_by_tool_version', file));
121
+ }
122
+ else if (schema === 'forge-review-failed/v1') {
123
+ results.push(checkTimestamp(obj, 'failed_at', file));
124
+ if (!Array.isArray(obj.unresolved_outcomes)) {
125
+ results.push(failed({
126
+ artifact: 'marker',
127
+ field: 'unresolved_outcomes',
128
+ message: 'must be array',
129
+ file,
130
+ }));
131
+ }
132
+ results.push(checkStringArray(obj, 'appended_tasks', file));
133
+ // plan-9c Task 1 新增
134
+ if (obj.pause_decisions !== undefined) {
135
+ results.push(checkPauseDecisionsArray(obj.pause_decisions, file));
136
+ }
137
+ // plan-9j Task 1 新增:created_by_tool_version 可选 superset additive 字段
138
+ results.push(checkSemverString(obj, 'created_by_tool_version', file));
139
+ // v3 BLOCKER 2 新增:resigned_by_tool_version(沿 v2 选项 C — 区分 created vs resigned)
140
+ results.push(checkSemverString(obj, 'resigned_by_tool_version', file));
141
+ }
142
+ return mergeResults(...results);
143
+ }
144
+ // 校验 ISO 8601 UTC 时间戳字段
145
+ function checkTimestamp(obj, field, file) {
146
+ const v = obj[field];
147
+ if (typeof v !== 'string' || !ISO_8601_RE.test(v)) {
148
+ return failed({
149
+ artifact: 'marker',
150
+ field,
151
+ message: 'must be ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)',
152
+ file,
153
+ });
154
+ }
155
+ return ok();
156
+ }
157
+ // 校验 actor 字段(ai-agent 或 human-override)
158
+ function checkActor(obj, field, file) {
159
+ const v = obj[field];
160
+ if (typeof v !== 'string' || !ACTOR_VALUES.has(v)) {
161
+ return failed({
162
+ artifact: 'marker',
163
+ field,
164
+ message: 'must be "ai-agent" or "human-override"',
165
+ file,
166
+ });
167
+ }
168
+ return ok();
169
+ }
170
+ // 校验 sha256: 前缀的哈希字段
171
+ function checkSha256(obj, field, file) {
172
+ const v = obj[field];
173
+ if (typeof v !== 'string' || !SHA256_RE.test(v)) {
174
+ return failed({ artifact: 'marker', field, message: 'must match ^sha256:[a-f0-9]{64}$', file });
175
+ }
176
+ return ok();
177
+ }
178
+ // plan-9j Task 1 新增:校验 semver 字符串字段(可选字段,缺失等价 <1.0.0)
179
+ function checkSemverString(obj, field, file) {
180
+ const v = obj[field];
181
+ if (v === undefined) {
182
+ return ok(); // 字段缺失等价老 marker(<1.0.0),superset additive 兼容
183
+ }
184
+ if (typeof v !== 'string' || !SEMVER_RE.test(v)) {
185
+ return failed({
186
+ artifact: 'marker',
187
+ field,
188
+ message: `must be semver string (major.minor.patch[-prerelease][+build]) or omitted (老 marker <1.0.0,沿 design §3.4.1)`,
189
+ file,
190
+ });
191
+ }
192
+ return ok();
193
+ }
194
+ // 校验字符串数组字段
195
+ function checkStringArray(obj, field, file) {
196
+ const v = obj[field];
197
+ if (!Array.isArray(v) || !v.every((x) => typeof x === 'string')) {
198
+ return failed({ artifact: 'marker', field, message: 'must be array of strings', file });
199
+ }
200
+ return ok();
201
+ }
202
+ // 校验 evidence 数组(每项含 6 个必需字段)
203
+ function checkEvidenceArray(v, file) {
204
+ if (!Array.isArray(v)) {
205
+ return failed({ artifact: 'marker', field: 'evidence', message: 'must be array', file });
206
+ }
207
+ const results = [];
208
+ for (let i = 0; i < v.length; i++) {
209
+ const e = v[i];
210
+ if (!e || typeof e !== 'object') {
211
+ results.push(failed({ artifact: 'marker', field: `evidence[${i}]`, message: 'must be object', file }));
212
+ continue;
213
+ }
214
+ if (typeof e.scenario_id !== 'string' || !e.scenario_id) {
215
+ results.push(failed({
216
+ artifact: 'marker',
217
+ field: `evidence[${i}].scenario_id`,
218
+ message: 'required string',
219
+ file,
220
+ }));
221
+ }
222
+ if (typeof e.test_command !== 'string') {
223
+ results.push(failed({
224
+ artifact: 'marker',
225
+ field: `evidence[${i}].test_command`,
226
+ message: 'required string',
227
+ file,
228
+ }));
229
+ }
230
+ if (typeof e.test_file !== 'string') {
231
+ results.push(failed({
232
+ artifact: 'marker',
233
+ field: `evidence[${i}].test_file`,
234
+ message: 'required string',
235
+ file,
236
+ }));
237
+ }
238
+ // log_path 必须以 ./ 开头
239
+ if (typeof e.log_path !== 'string' || !e.log_path.startsWith('./')) {
240
+ results.push(failed({
241
+ artifact: 'marker',
242
+ field: `evidence[${i}].log_path`,
243
+ message: 'must start with "./"',
244
+ file,
245
+ }));
246
+ }
247
+ if (typeof e.log_hash !== 'string' || !SHA256_RE.test(e.log_hash)) {
248
+ results.push(failed({
249
+ artifact: 'marker',
250
+ field: `evidence[${i}].log_hash`,
251
+ message: 'must match sha256 regex',
252
+ file,
253
+ }));
254
+ }
255
+ if (typeof e.pass !== 'boolean') {
256
+ results.push(failed({
257
+ artifact: 'marker',
258
+ field: `evidence[${i}].pass`,
259
+ message: 'required boolean',
260
+ file,
261
+ }));
262
+ }
263
+ }
264
+ return mergeResults(...results);
265
+ }
266
+ // 校验 git 信息对象
267
+ function checkGitInfo(v, file) {
268
+ if (!v || typeof v !== 'object') {
269
+ return failed({ artifact: 'marker', field: 'git', message: 'must be object', file });
270
+ }
271
+ const g = v;
272
+ if (typeof g.is_git_repo !== 'boolean') {
273
+ return failed({
274
+ artifact: 'marker',
275
+ field: 'git.is_git_repo',
276
+ message: 'required boolean',
277
+ file,
278
+ });
279
+ }
280
+ // is_git_repo=true 时还需校验 head/diff_hash/diff_pathspec
281
+ if (g.is_git_repo) {
282
+ if (typeof g.head !== 'string' || !GIT_HEAD_RE.test(g.head)) {
283
+ return failed({
284
+ artifact: 'marker',
285
+ field: 'git.head',
286
+ message: 'must match ^[a-f0-9]{40}$',
287
+ file,
288
+ });
289
+ }
290
+ if (typeof g.diff_hash !== 'string' || !SHA256_RE.test(g.diff_hash)) {
291
+ return failed({
292
+ artifact: 'marker',
293
+ field: 'git.diff_hash',
294
+ message: 'must match sha256',
295
+ file,
296
+ });
297
+ }
298
+ if (!g.diff_pathspec || typeof g.diff_pathspec !== 'object') {
299
+ return failed({
300
+ artifact: 'marker',
301
+ field: 'git.diff_pathspec',
302
+ message: 'required object',
303
+ file,
304
+ });
305
+ }
306
+ // git.diff_pathspec.include / exclude 必须是 string array(spec §3.4.1)
307
+ const ps = g.diff_pathspec;
308
+ if (!Array.isArray(ps.include) || !ps.include.every((x) => typeof x === 'string')) {
309
+ return failed({
310
+ artifact: 'marker',
311
+ field: 'git.diff_pathspec.include',
312
+ message: 'must be array of strings',
313
+ file,
314
+ });
315
+ }
316
+ if (!Array.isArray(ps.exclude) || !ps.exclude.every((x) => typeof x === 'string')) {
317
+ return failed({
318
+ artifact: 'marker',
319
+ field: 'git.diff_pathspec.exclude',
320
+ message: 'must be array of strings',
321
+ file,
322
+ });
323
+ }
324
+ }
325
+ return ok();
326
+ }
327
+ // 校验 review_outcomes 数组
328
+ function checkReviewOutcomes(v, file) {
329
+ if (!Array.isArray(v)) {
330
+ return failed({ artifact: 'marker', field: 'review_outcomes', message: 'must be array', file });
331
+ }
332
+ const results = [];
333
+ for (let i = 0; i < v.length; i++) {
334
+ const o = v[i];
335
+ if (!o || typeof o !== 'object') {
336
+ results.push(failed({
337
+ artifact: 'marker',
338
+ field: `review_outcomes[${i}]`,
339
+ message: 'must be object',
340
+ file,
341
+ }));
342
+ continue;
343
+ }
344
+ // severity 必须是 6 元素之一(v0.4 simcode S/C/L + v1.0 全名 CRITICAL/WARNING/SUGGESTION;沿 plan-9j v3 BLOCKER 4 双格式扩)
345
+ if (typeof o.severity !== 'string' || !REVIEW_OUTCOME_SEVERITY_CODES.has(o.severity)) {
346
+ results.push(failed({
347
+ artifact: 'marker',
348
+ field: `review_outcomes[${i}].severity`,
349
+ message: 'must be one of: S / C / L (v0.4 simcode) or CRITICAL / WARNING / SUGGESTION (v1.0 全名)',
350
+ file,
351
+ }));
352
+ }
353
+ if (typeof o.accepted !== 'boolean') {
354
+ results.push(failed({
355
+ artifact: 'marker',
356
+ field: `review_outcomes[${i}].accepted`,
357
+ message: 'required boolean',
358
+ file,
359
+ }));
360
+ }
361
+ if (typeof o.resolved !== 'boolean') {
362
+ results.push(failed({
363
+ artifact: 'marker',
364
+ field: `review_outcomes[${i}].resolved`,
365
+ message: 'required boolean',
366
+ file,
367
+ }));
368
+ }
369
+ // accepted=true 必须有 task_ref;accepted=false 必须有 rationale
370
+ if (o.accepted === true && (typeof o.task_ref !== 'string' || !o.task_ref)) {
371
+ results.push(failed({
372
+ artifact: 'marker',
373
+ field: `review_outcomes[${i}].task_ref`,
374
+ message: 'required when accepted=true',
375
+ file,
376
+ }));
377
+ }
378
+ if (o.accepted === false && (typeof o.rationale !== 'string' || !o.rationale)) {
379
+ results.push(failed({
380
+ artifact: 'marker',
381
+ field: `review_outcomes[${i}].rationale`,
382
+ message: 'required when accepted=false',
383
+ file,
384
+ }));
385
+ }
386
+ }
387
+ return mergeResults(...results);
388
+ }
389
+ // plan-9d Task 3:verify_findings 数组校验
390
+ // 校验范围:必填字段存在性 + 类型 + 枚举值(沿 master §3.12.1)
391
+ // 不校验业务规则(resolved/ack 矩阵 + finding_hash 与 payload 一致性) — 那是 Task 6 fence 的事
392
+ function checkVerifyFindingsArray(v, file) {
393
+ if (!Array.isArray(v)) {
394
+ return failed({
395
+ artifact: 'marker',
396
+ field: 'verify_findings',
397
+ message: 'must be array',
398
+ file,
399
+ });
400
+ }
401
+ const results = [];
402
+ // v4 D-2 修订:finding id 唯一性校验(同一 marker 内不允许重复 id,沿 master §3.12.1)
403
+ const seenIds = new Set();
404
+ for (let i = 0; i < v.length; i++) {
405
+ const f = v[i];
406
+ if (typeof f?.id === 'number') {
407
+ if (seenIds.has(f.id)) {
408
+ results.push(failed({
409
+ artifact: 'marker',
410
+ field: `verify_findings[${i}].id`,
411
+ message: `finding id ${f.id} 重复(同一 marker 内 id 必须唯一,沿 master §3.12.1)`,
412
+ file,
413
+ }));
414
+ }
415
+ seenIds.add(f.id);
416
+ }
417
+ }
418
+ for (let i = 0; i < v.length; i++) {
419
+ const f = v[i];
420
+ if (!f || typeof f !== 'object') {
421
+ results.push(failed({
422
+ artifact: 'marker',
423
+ field: `verify_findings[${i}]`,
424
+ message: 'must be object',
425
+ file,
426
+ }));
427
+ continue;
428
+ }
429
+ // 必填 11 字段(沿 master §3.12.1 Finding):
430
+ // id / dimension / check_type / severity / automated / evidence / recommendation / resolved
431
+ // + finding_hash / content_hash / git_head
432
+ if (typeof f.id !== 'number') {
433
+ results.push(failed({
434
+ artifact: 'marker',
435
+ field: `verify_findings[${i}].id`,
436
+ message: 'required number',
437
+ file,
438
+ }));
439
+ }
440
+ if (typeof f.dimension !== 'string' || !DIMENSION_VALUES.has(f.dimension)) {
441
+ results.push(failed({
442
+ artifact: 'marker',
443
+ field: `verify_findings[${i}].dimension`,
444
+ message: 'must be completeness|correctness|coherence|process_evidence',
445
+ file,
446
+ }));
447
+ }
448
+ if (typeof f.check_type !== 'string' || !f.check_type) {
449
+ results.push(failed({
450
+ artifact: 'marker',
451
+ field: `verify_findings[${i}].check_type`,
452
+ message: 'required string',
453
+ file,
454
+ }));
455
+ }
456
+ if (!isSeverity(f.severity)) {
457
+ results.push(failed({
458
+ artifact: 'marker',
459
+ field: `verify_findings[${i}].severity`,
460
+ message: `must be one of ${[...SEVERITY_VALUES].join(', ')}`,
461
+ file,
462
+ }));
463
+ }
464
+ if (typeof f.automated !== 'boolean') {
465
+ results.push(failed({
466
+ artifact: 'marker',
467
+ field: `verify_findings[${i}].automated`,
468
+ message: 'required boolean',
469
+ file,
470
+ }));
471
+ }
472
+ if (typeof f.evidence !== 'string' || !f.evidence) {
473
+ results.push(failed({
474
+ artifact: 'marker',
475
+ field: `verify_findings[${i}].evidence`,
476
+ message: 'required non-empty string',
477
+ file,
478
+ }));
479
+ }
480
+ if (typeof f.recommendation !== 'string' || !f.recommendation) {
481
+ results.push(failed({
482
+ artifact: 'marker',
483
+ field: `verify_findings[${i}].recommendation`,
484
+ message: 'required non-empty string',
485
+ file,
486
+ }));
487
+ }
488
+ if (typeof f.resolved !== 'boolean') {
489
+ results.push(failed({
490
+ artifact: 'marker',
491
+ field: `verify_findings[${i}].resolved`,
492
+ message: 'required boolean',
493
+ file,
494
+ }));
495
+ }
496
+ // plan-9d v2 B-1 修订:finding_hash 是裸 64-hex(沿 9a finding-hash.ts:8)
497
+ if (typeof f.finding_hash !== 'string' || !FINDING_HASH_RE.test(f.finding_hash)) {
498
+ results.push(failed({
499
+ artifact: 'marker',
500
+ field: `verify_findings[${i}].finding_hash`,
501
+ message: 'must match ^[a-f0-9]{64}$ (裸 hex,无 sha256: 前缀,沿 9a)',
502
+ file,
503
+ }));
504
+ }
505
+ // content_hash / git_head 是 FindingHashPayload 字段(沿 9a;content_hash sha256: 前缀,git_head 裸 40-hex)
506
+ if (typeof f.content_hash !== 'string' || !SHA256_RE.test(f.content_hash)) {
507
+ results.push(failed({
508
+ artifact: 'marker',
509
+ field: `verify_findings[${i}].content_hash`,
510
+ message: 'must match ^sha256:[a-f0-9]{64}$',
511
+ file,
512
+ }));
513
+ }
514
+ if (typeof f.git_head !== 'string' || !GIT_HEAD_RE.test(f.git_head)) {
515
+ results.push(failed({
516
+ artifact: 'marker',
517
+ field: `verify_findings[${i}].git_head`,
518
+ message: 'must match ^[a-f0-9]{40}$',
519
+ file,
520
+ }));
521
+ }
522
+ }
523
+ return mergeResults(...results);
524
+ }
525
+ // plan-9c Task 1:pause_decisions 数组校验
526
+ // 校验范围:必填字段 / 类型 / 枚举值 / id 唯一性(沿 master §3.12.1 + design §2.1.5)
527
+ // 不校验业务规则(option=3 必须有 non_blocking_rationale 等)— 那是 Task 2 fence 的事
528
+ function checkPauseDecisionsArray(v, file) {
529
+ if (!Array.isArray(v)) {
530
+ return failed({
531
+ artifact: 'marker',
532
+ field: 'pause_decisions',
533
+ message: 'must be array',
534
+ file,
535
+ });
536
+ }
537
+ const results = [];
538
+ // id 唯一性校验(沿 checkVerifyFindingsArray 同模式)
539
+ const seenIds = new Set();
540
+ for (let i = 0; i < v.length; i++) {
541
+ const p = v[i];
542
+ if (typeof p?.id === 'number') {
543
+ if (seenIds.has(p.id)) {
544
+ results.push(failed({
545
+ artifact: 'marker',
546
+ field: `pause_decisions[${i}].id`,
547
+ message: `pause_decision id ${p.id} 重复(同一 marker 内 id 必须唯一)`,
548
+ file,
549
+ }));
550
+ }
551
+ seenIds.add(p.id);
552
+ }
553
+ }
554
+ for (let i = 0; i < v.length; i++) {
555
+ const p = v[i];
556
+ if (!p || typeof p !== 'object') {
557
+ results.push(failed({
558
+ artifact: 'marker',
559
+ field: `pause_decisions[${i}]`,
560
+ message: 'must be object',
561
+ file,
562
+ }));
563
+ continue;
564
+ }
565
+ const fieldBase = `pause_decisions[${i}]`;
566
+ // 必填 8 字段(沿 design §2.1.5,v3 codex NIT 11 修订:7 → 8):id / paused_at / task_ref / issue_summary / severity / chosen_option / target_artifact / target_anchor
567
+ if (typeof p.id !== 'number') {
568
+ results.push(failed({ artifact: 'marker', field: `${fieldBase}.id`, message: 'required number', file }));
569
+ }
570
+ if (typeof p.paused_at !== 'string' || !ISO_8601_RE.test(p.paused_at)) {
571
+ results.push(failed({
572
+ artifact: 'marker',
573
+ field: `${fieldBase}.paused_at`,
574
+ message: 'must be ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)',
575
+ file,
576
+ }));
577
+ }
578
+ if (typeof p.task_ref !== 'string' || !p.task_ref) {
579
+ results.push(failed({
580
+ artifact: 'marker',
581
+ field: `${fieldBase}.task_ref`,
582
+ message: 'required string (e.g., tasks.md#task-3)',
583
+ file,
584
+ }));
585
+ }
586
+ if (typeof p.issue_summary !== 'string' || !p.issue_summary) {
587
+ results.push(failed({
588
+ artifact: 'marker',
589
+ field: `${fieldBase}.issue_summary`,
590
+ message: 'required non-empty string',
591
+ file,
592
+ }));
593
+ }
594
+ if (!isSeverity(p.severity)) {
595
+ results.push(failed({
596
+ artifact: 'marker',
597
+ field: `${fieldBase}.severity`,
598
+ message: `must be one of ${[...SEVERITY_VALUES].join(', ')}`,
599
+ file,
600
+ }));
601
+ }
602
+ if (typeof p.chosen_option !== 'number' || !CHOSEN_OPTION_VALUES.has(p.chosen_option)) {
603
+ results.push(failed({
604
+ artifact: 'marker',
605
+ field: `${fieldBase}.chosen_option`,
606
+ message: 'must be number in {1, 2, 3, 4}',
607
+ file,
608
+ }));
609
+ }
610
+ if (typeof p.target_artifact !== 'string' || !p.target_artifact) {
611
+ results.push(failed({
612
+ artifact: 'marker',
613
+ field: `${fieldBase}.target_artifact`,
614
+ message: 'required string (e.g., proposal.md / tasks.md / design.md)',
615
+ file,
616
+ }));
617
+ }
618
+ if (typeof p.target_anchor !== 'string' || !p.target_anchor) {
619
+ results.push(failed({
620
+ artifact: 'marker',
621
+ field: `${fieldBase}.target_anchor`,
622
+ message: 'required string (e.g., "## Out of Scope")',
623
+ file,
624
+ }));
625
+ }
626
+ // severity_acked_by / severity_acked_at 类型校验(null 或 string)
627
+ if (p.severity_acked_by !== null &&
628
+ (typeof p.severity_acked_by !== 'string' || !p.severity_acked_by)) {
629
+ results.push(failed({
630
+ artifact: 'marker',
631
+ field: `${fieldBase}.severity_acked_by`,
632
+ message: 'must be null or non-empty string',
633
+ file,
634
+ }));
635
+ }
636
+ if (p.severity_acked_at !== null) {
637
+ if (typeof p.severity_acked_at !== 'string' || !ISO_8601_RE.test(p.severity_acked_at)) {
638
+ results.push(failed({
639
+ artifact: 'marker',
640
+ field: `${fieldBase}.severity_acked_at`,
641
+ message: 'must be null or ISO 8601 UTC',
642
+ file,
643
+ }));
644
+ }
645
+ }
646
+ // non_blocking_rationale / other_rationale / other_acked_by 类型校验(null 或 string;业务规则在 fence)
647
+ for (const field of ['non_blocking_rationale', 'other_rationale', 'other_acked_by']) {
648
+ const val = p[field];
649
+ if (val !== null && (typeof val !== 'string' || !val)) {
650
+ results.push(failed({
651
+ artifact: 'marker',
652
+ field: `${fieldBase}.${field}`,
653
+ message: 'must be null or non-empty string',
654
+ file,
655
+ }));
656
+ }
657
+ }
658
+ }
659
+ return mergeResults(...results);
660
+ }
661
+ //# sourceMappingURL=marker-schema.js.map