@sun-asterisk/sungen 3.2.34-beta.1 → 3.3.0-alpha.1

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 (858) hide show
  1. package/dist/basis/anchor-grammar.d.ts +32 -0
  2. package/dist/basis/anchor-grammar.d.ts.map +1 -0
  3. package/dist/basis/anchor-grammar.js +82 -0
  4. package/dist/basis/anchor-grammar.js.map +1 -0
  5. package/dist/basis/anchor-hash.d.ts +6 -0
  6. package/dist/basis/anchor-hash.d.ts.map +1 -0
  7. package/dist/basis/anchor-hash.js +28 -0
  8. package/dist/basis/anchor-hash.js.map +1 -0
  9. package/dist/basis/bm51-tables.d.ts +20 -0
  10. package/dist/basis/bm51-tables.d.ts.map +1 -0
  11. package/dist/basis/bm51-tables.js +71 -0
  12. package/dist/basis/bm51-tables.js.map +1 -0
  13. package/dist/basis/extract-spec-anchors.d.ts +39 -0
  14. package/dist/basis/extract-spec-anchors.d.ts.map +1 -0
  15. package/dist/basis/extract-spec-anchors.js +81 -0
  16. package/dist/basis/extract-spec-anchors.js.map +1 -0
  17. package/dist/basis/migration-sentinel.d.ts +47 -0
  18. package/dist/basis/migration-sentinel.d.ts.map +1 -0
  19. package/dist/basis/migration-sentinel.js +219 -0
  20. package/dist/basis/migration-sentinel.js.map +1 -0
  21. package/dist/basis/spec-frontmatter.d.ts +18 -0
  22. package/dist/basis/spec-frontmatter.d.ts.map +1 -0
  23. package/dist/basis/spec-frontmatter.js +55 -0
  24. package/dist/basis/spec-frontmatter.js.map +1 -0
  25. package/dist/basis/spec-sections.d.ts +18 -0
  26. package/dist/basis/spec-sections.d.ts.map +1 -0
  27. package/dist/basis/spec-sections.js +27 -0
  28. package/dist/basis/spec-sections.js.map +1 -0
  29. package/dist/basis/test-basis-schema.d.ts +28 -0
  30. package/dist/basis/test-basis-schema.d.ts.map +1 -0
  31. package/dist/basis/test-basis-schema.js +141 -0
  32. package/dist/basis/test-basis-schema.js.map +1 -0
  33. package/dist/capabilities/registry.d.ts +15 -0
  34. package/dist/capabilities/registry.d.ts.map +1 -1
  35. package/dist/capabilities/registry.js.map +1 -1
  36. package/dist/cli/commands/audit.d.ts.map +1 -1
  37. package/dist/cli/commands/audit.js +3 -29
  38. package/dist/cli/commands/audit.js.map +1 -1
  39. package/dist/cli/commands/capability.js +1 -1
  40. package/dist/cli/commands/capability.js.map +1 -1
  41. package/dist/cli/commands/contract-derive-command.d.ts +10 -0
  42. package/dist/cli/commands/contract-derive-command.d.ts.map +1 -0
  43. package/dist/cli/commands/contract-derive-command.js +99 -0
  44. package/dist/cli/commands/contract-derive-command.js.map +1 -0
  45. package/dist/cli/commands/contract.d.ts +17 -0
  46. package/dist/cli/commands/contract.d.ts.map +1 -0
  47. package/dist/cli/commands/contract.js +162 -0
  48. package/dist/cli/commands/contract.js.map +1 -0
  49. package/dist/cli/commands/delivery.d.ts.map +1 -1
  50. package/dist/cli/commands/delivery.js +52 -3
  51. package/dist/cli/commands/delivery.js.map +1 -1
  52. package/dist/cli/commands/generate.d.ts.map +1 -1
  53. package/dist/cli/commands/generate.js +3 -1
  54. package/dist/cli/commands/generate.js.map +1 -1
  55. package/dist/cli/commands/journey.d.ts.map +1 -1
  56. package/dist/cli/commands/journey.js +41 -13
  57. package/dist/cli/commands/journey.js.map +1 -1
  58. package/dist/cli/commands/next.d.ts +8 -0
  59. package/dist/cli/commands/next.d.ts.map +1 -1
  60. package/dist/cli/commands/next.js +64 -6
  61. package/dist/cli/commands/next.js.map +1 -1
  62. package/dist/cli/commands/update.d.ts +11 -0
  63. package/dist/cli/commands/update.d.ts.map +1 -1
  64. package/dist/cli/commands/update.js +31 -6
  65. package/dist/cli/commands/update.js.map +1 -1
  66. package/dist/cli/index.js +20 -35
  67. package/dist/cli/index.js.map +1 -1
  68. package/dist/contract/approve-contract.d.ts +31 -0
  69. package/dist/contract/approve-contract.d.ts.map +1 -0
  70. package/dist/contract/approve-contract.js +87 -0
  71. package/dist/contract/approve-contract.js.map +1 -0
  72. package/dist/contract/assertion-matcher-vocabulary.d.ts +24 -0
  73. package/dist/contract/assertion-matcher-vocabulary.d.ts.map +1 -0
  74. package/dist/contract/assertion-matcher-vocabulary.js +100 -0
  75. package/dist/contract/assertion-matcher-vocabulary.js.map +1 -0
  76. package/dist/contract/build-contract-verdict.d.ts +32 -0
  77. package/dist/contract/build-contract-verdict.d.ts.map +1 -0
  78. package/dist/contract/build-contract-verdict.js +123 -0
  79. package/dist/contract/build-contract-verdict.js.map +1 -0
  80. package/dist/contract/build-trace-conformance.d.ts +18 -0
  81. package/dist/contract/build-trace-conformance.d.ts.map +1 -0
  82. package/dist/contract/build-trace-conformance.js +153 -0
  83. package/dist/contract/build-trace-conformance.js.map +1 -0
  84. package/dist/contract/classify-contract-change.d.ts +23 -0
  85. package/dist/contract/classify-contract-change.d.ts.map +1 -0
  86. package/dist/contract/classify-contract-change.js +98 -0
  87. package/dist/contract/classify-contract-change.js.map +1 -0
  88. package/dist/contract/classify-contract-unit.d.ts +18 -0
  89. package/dist/contract/classify-contract-unit.d.ts.map +1 -0
  90. package/dist/contract/classify-contract-unit.js +49 -0
  91. package/dist/contract/classify-contract-unit.js.map +1 -0
  92. package/dist/contract/classify-trace-conformance.d.ts +32 -0
  93. package/dist/contract/classify-trace-conformance.d.ts.map +1 -0
  94. package/dist/contract/classify-trace-conformance.js +117 -0
  95. package/dist/contract/classify-trace-conformance.js.map +1 -0
  96. package/dist/contract/contract-git.d.ts +24 -0
  97. package/dist/contract/contract-git.d.ts.map +1 -0
  98. package/dist/contract/contract-git.js +144 -0
  99. package/dist/contract/contract-git.js.map +1 -0
  100. package/dist/contract/contract-hash.d.ts +7 -0
  101. package/dist/contract/contract-hash.d.ts.map +1 -0
  102. package/dist/contract/contract-hash.js +38 -0
  103. package/dist/contract/contract-hash.js.map +1 -0
  104. package/dist/contract/contract-report-file.d.ts +4 -0
  105. package/dist/contract/contract-report-file.d.ts.map +1 -0
  106. package/dist/contract/contract-report-file.js +60 -0
  107. package/dist/contract/contract-report-file.js.map +1 -0
  108. package/dist/contract/contract-schema.d.ts +71 -0
  109. package/dist/contract/contract-schema.d.ts.map +1 -0
  110. package/dist/contract/contract-schema.js +102 -0
  111. package/dist/contract/contract-schema.js.map +1 -0
  112. package/dist/contract/contract-units.d.ts +12 -0
  113. package/dist/contract/contract-units.d.ts.map +1 -0
  114. package/dist/contract/contract-units.js +96 -0
  115. package/dist/contract/contract-units.js.map +1 -0
  116. package/dist/contract/contracts-lock-file.d.ts +24 -0
  117. package/dist/contract/contracts-lock-file.d.ts.map +1 -0
  118. package/dist/contract/contracts-lock-file.js +140 -0
  119. package/dist/contract/contracts-lock-file.js.map +1 -0
  120. package/dist/contract/data-normalize.d.ts +10 -0
  121. package/dist/contract/data-normalize.d.ts.map +1 -0
  122. package/dist/contract/data-normalize.js +110 -0
  123. package/dist/contract/data-normalize.js.map +1 -0
  124. package/dist/contract/derive-free-feature.d.ts +30 -0
  125. package/dist/contract/derive-free-feature.d.ts.map +1 -0
  126. package/dist/contract/derive-free-feature.js +145 -0
  127. package/dist/contract/derive-free-feature.js.map +1 -0
  128. package/dist/contract/field-semantic-redaction.d.ts +21 -0
  129. package/dist/contract/field-semantic-redaction.d.ts.map +1 -0
  130. package/dist/contract/field-semantic-redaction.js +118 -0
  131. package/dist/contract/field-semantic-redaction.js.map +1 -0
  132. package/dist/contract/free-feature-blocks.d.ts +10 -0
  133. package/dist/contract/free-feature-blocks.d.ts.map +1 -0
  134. package/dist/contract/free-feature-blocks.js +94 -0
  135. package/dist/contract/free-feature-blocks.js.map +1 -0
  136. package/dist/contract/lock-secret-guard.d.ts +22 -0
  137. package/dist/contract/lock-secret-guard.d.ts.map +1 -0
  138. package/dist/contract/lock-secret-guard.js +134 -0
  139. package/dist/contract/lock-secret-guard.js.map +1 -0
  140. package/dist/contract/lock-vs-git-head.d.ts +26 -0
  141. package/dist/contract/lock-vs-git-head.d.ts.map +1 -0
  142. package/dist/contract/lock-vs-git-head.js +28 -0
  143. package/dist/contract/lock-vs-git-head.js.map +1 -0
  144. package/dist/contract/normalize-contract-step.d.ts +21 -0
  145. package/dist/contract/normalize-contract-step.d.ts.map +1 -0
  146. package/dist/contract/normalize-contract-step.js +70 -0
  147. package/dist/contract/normalize-contract-step.js.map +1 -0
  148. package/dist/contract/normalize-feature-steps.d.ts +7 -0
  149. package/dist/contract/normalize-feature-steps.d.ts.map +1 -0
  150. package/dist/contract/normalize-feature-steps.js +127 -0
  151. package/dist/contract/normalize-feature-steps.js.map +1 -0
  152. package/dist/contract/oracle-strength.d.ts +12 -0
  153. package/dist/contract/oracle-strength.d.ts.map +1 -0
  154. package/dist/contract/oracle-strength.js +88 -0
  155. package/dist/contract/oracle-strength.js.map +1 -0
  156. package/dist/contract/project-contract-blockers.d.ts +10 -0
  157. package/dist/contract/project-contract-blockers.d.ts.map +1 -0
  158. package/dist/contract/project-contract-blockers.js +73 -0
  159. package/dist/contract/project-contract-blockers.js.map +1 -0
  160. package/dist/contract/record-contract-approval.d.ts +21 -0
  161. package/dist/contract/record-contract-approval.d.ts.map +1 -0
  162. package/dist/contract/record-contract-approval.js +98 -0
  163. package/dist/contract/record-contract-approval.js.map +1 -0
  164. package/dist/contract/render-free-gherkin.d.ts +40 -0
  165. package/dist/contract/render-free-gherkin.d.ts.map +1 -0
  166. package/dist/contract/render-free-gherkin.js +141 -0
  167. package/dist/contract/render-free-gherkin.js.map +1 -0
  168. package/dist/contract/render-trace-sentence.d.ts +20 -0
  169. package/dist/contract/render-trace-sentence.d.ts.map +1 -0
  170. package/dist/contract/render-trace-sentence.js +109 -0
  171. package/dist/contract/render-trace-sentence.js.map +1 -0
  172. package/dist/contract/render-trace-target.d.ts +14 -0
  173. package/dist/contract/render-trace-target.d.ts.map +1 -0
  174. package/dist/contract/render-trace-target.js +70 -0
  175. package/dist/contract/render-trace-target.js.map +1 -0
  176. package/dist/contract/resolve-unit-trace-identities.d.ts +8 -0
  177. package/dist/contract/resolve-unit-trace-identities.d.ts.map +1 -0
  178. package/dist/contract/resolve-unit-trace-identities.js +78 -0
  179. package/dist/contract/resolve-unit-trace-identities.js.map +1 -0
  180. package/dist/contract/trace/collect-trace-evidence.d.ts +33 -0
  181. package/dist/contract/trace/collect-trace-evidence.d.ts.map +1 -0
  182. package/dist/contract/trace/collect-trace-evidence.js +161 -0
  183. package/dist/contract/trace/collect-trace-evidence.js.map +1 -0
  184. package/dist/contract/trace/identity-cache.d.ts +19 -0
  185. package/dist/contract/trace/identity-cache.d.ts.map +1 -0
  186. package/dist/contract/trace/identity-cache.js +104 -0
  187. package/dist/contract/trace/identity-cache.js.map +1 -0
  188. package/dist/contract/trace/select-final-attempt.d.ts +27 -0
  189. package/dist/contract/trace/select-final-attempt.d.ts.map +1 -0
  190. package/dist/contract/trace/select-final-attempt.js +116 -0
  191. package/dist/contract/trace/select-final-attempt.js.map +1 -0
  192. package/dist/contract/trace/snapshot-html-renderer.d.ts +31 -0
  193. package/dist/contract/trace/snapshot-html-renderer.d.ts.map +1 -0
  194. package/dist/contract/trace/snapshot-html-renderer.js +172 -0
  195. package/dist/contract/trace/snapshot-html-renderer.js.map +1 -0
  196. package/dist/contract/trace/snapshot-resolver.d.ts +21 -0
  197. package/dist/contract/trace/snapshot-resolver.d.ts.map +1 -0
  198. package/dist/contract/trace/snapshot-resolver.js +65 -0
  199. package/dist/contract/trace/snapshot-resolver.js.map +1 -0
  200. package/dist/contract/trace/snapshot-store.d.ts +66 -0
  201. package/dist/contract/trace/snapshot-store.d.ts.map +1 -0
  202. package/dist/contract/trace/snapshot-store.js +173 -0
  203. package/dist/contract/trace/snapshot-store.js.map +1 -0
  204. package/dist/contract/trace/target-identity.d.ts +74 -0
  205. package/dist/contract/trace/target-identity.d.ts.map +1 -0
  206. package/dist/contract/trace/target-identity.js +68 -0
  207. package/dist/contract/trace/target-identity.js.map +1 -0
  208. package/dist/contract/trace/test-step-join.d.ts +65 -0
  209. package/dist/contract/trace/test-step-join.d.ts.map +1 -0
  210. package/dist/contract/trace/test-step-join.js +80 -0
  211. package/dist/contract/trace/test-step-join.js.map +1 -0
  212. package/dist/contract/trace/trace-binding.d.ts +21 -0
  213. package/dist/contract/trace/trace-binding.d.ts.map +1 -0
  214. package/dist/contract/trace/trace-binding.js +88 -0
  215. package/dist/contract/trace/trace-binding.js.map +1 -0
  216. package/dist/contract/trace/trace-file-reader.d.ts +35 -0
  217. package/dist/contract/trace/trace-file-reader.d.ts.map +1 -0
  218. package/dist/contract/trace/trace-file-reader.js +155 -0
  219. package/dist/contract/trace/trace-file-reader.js.map +1 -0
  220. package/dist/contract/trace/trace-fingerprint.d.ts +22 -0
  221. package/dist/contract/trace/trace-fingerprint.d.ts.map +1 -0
  222. package/dist/contract/trace/trace-fingerprint.js +96 -0
  223. package/dist/contract/trace/trace-fingerprint.js.map +1 -0
  224. package/dist/contract/trace/trace-identity-resolution.d.ts +26 -0
  225. package/dist/contract/trace/trace-identity-resolution.d.ts.map +1 -0
  226. package/dist/contract/trace/trace-identity-resolution.js +84 -0
  227. package/dist/contract/trace/trace-identity-resolution.js.map +1 -0
  228. package/dist/contract/trace/trace-run-record.d.ts +27 -0
  229. package/dist/contract/trace/trace-run-record.d.ts.map +1 -0
  230. package/dist/contract/trace/trace-run-record.js +115 -0
  231. package/dist/contract/trace/trace-run-record.js.map +1 -0
  232. package/dist/contract/trace/trace-steps.d.ts +19 -0
  233. package/dist/contract/trace/trace-steps.d.ts.map +1 -0
  234. package/dist/contract/trace/trace-steps.js +79 -0
  235. package/dist/contract/trace/trace-steps.js.map +1 -0
  236. package/dist/contract/trace/trace-zip-limits.d.ts +41 -0
  237. package/dist/contract/trace/trace-zip-limits.d.ts.map +1 -0
  238. package/dist/contract/trace/trace-zip-limits.js +48 -0
  239. package/dist/contract/trace/trace-zip-limits.js.map +1 -0
  240. package/dist/contract/trace/trace-zip-reader.d.ts +10 -0
  241. package/dist/contract/trace/trace-zip-reader.d.ts.map +1 -0
  242. package/dist/contract/trace/trace-zip-reader.js +186 -0
  243. package/dist/contract/trace/trace-zip-reader.js.map +1 -0
  244. package/dist/contract/verify-approval-decisions.d.ts +5 -0
  245. package/dist/contract/verify-approval-decisions.d.ts.map +1 -0
  246. package/dist/contract/verify-approval-decisions.js +104 -0
  247. package/dist/contract/verify-approval-decisions.js.map +1 -0
  248. package/dist/decisions/append-decision.d.ts +12 -0
  249. package/dist/decisions/append-decision.d.ts.map +1 -0
  250. package/dist/decisions/append-decision.js +73 -0
  251. package/dist/decisions/append-decision.js.map +1 -0
  252. package/dist/decisions/confirmed-decision-commands.d.ts +30 -0
  253. package/dist/decisions/confirmed-decision-commands.d.ts.map +1 -0
  254. package/dist/decisions/confirmed-decision-commands.js +172 -0
  255. package/dist/decisions/confirmed-decision-commands.js.map +1 -0
  256. package/dist/decisions/decision-file.d.ts +31 -0
  257. package/dist/decisions/decision-file.d.ts.map +1 -0
  258. package/dist/decisions/decision-file.js +139 -0
  259. package/dist/decisions/decision-file.js.map +1 -0
  260. package/dist/decisions/decision-identity.d.ts +12 -0
  261. package/dist/decisions/decision-identity.d.ts.map +1 -0
  262. package/dist/decisions/decision-identity.js +78 -0
  263. package/dist/decisions/decision-identity.js.map +1 -0
  264. package/dist/decisions/decision-integrity-check.d.ts +12 -0
  265. package/dist/decisions/decision-integrity-check.d.ts.map +1 -0
  266. package/dist/decisions/decision-integrity-check.js +102 -0
  267. package/dist/decisions/decision-integrity-check.js.map +1 -0
  268. package/dist/decisions/decision-schema.d.ts +42 -0
  269. package/dist/decisions/decision-schema.d.ts.map +1 -0
  270. package/dist/decisions/decision-schema.js +75 -0
  271. package/dist/decisions/decision-schema.js.map +1 -0
  272. package/dist/decisions/decision-source.d.ts +2 -0
  273. package/dist/decisions/decision-source.d.ts.map +1 -0
  274. package/dist/decisions/decision-source.js +18 -0
  275. package/dist/decisions/decision-source.js.map +1 -0
  276. package/dist/decisions/exclusive-file-create.d.ts +3 -0
  277. package/dist/decisions/exclusive-file-create.d.ts.map +1 -0
  278. package/dist/decisions/exclusive-file-create.js +84 -0
  279. package/dist/decisions/exclusive-file-create.js.map +1 -0
  280. package/dist/decisions/git-head-trust.d.ts +7 -0
  281. package/dist/decisions/git-head-trust.d.ts.map +1 -0
  282. package/dist/decisions/git-head-trust.js +76 -0
  283. package/dist/decisions/git-head-trust.js.map +1 -0
  284. package/dist/decisions/human-confirmation.d.ts +33 -0
  285. package/dist/decisions/human-confirmation.d.ts.map +1 -0
  286. package/dist/decisions/human-confirmation.js +155 -0
  287. package/dist/decisions/human-confirmation.js.map +1 -0
  288. package/dist/decisions/legacy-waiver-migration.d.ts +31 -0
  289. package/dist/decisions/legacy-waiver-migration.d.ts.map +1 -0
  290. package/dist/decisions/legacy-waiver-migration.js +170 -0
  291. package/dist/decisions/legacy-waiver-migration.js.map +1 -0
  292. package/dist/decisions/read-decisions.d.ts +19 -0
  293. package/dist/decisions/read-decisions.d.ts.map +1 -0
  294. package/dist/decisions/read-decisions.js +90 -0
  295. package/dist/decisions/read-decisions.js.map +1 -0
  296. package/dist/decisions/viewpoint-baseline-adapter.d.ts +7 -0
  297. package/dist/decisions/viewpoint-baseline-adapter.d.ts.map +1 -0
  298. package/dist/decisions/viewpoint-baseline-adapter.js +109 -0
  299. package/dist/decisions/viewpoint-baseline-adapter.js.map +1 -0
  300. package/dist/decisions/waiver-decisions.d.ts +24 -0
  301. package/dist/decisions/waiver-decisions.d.ts.map +1 -0
  302. package/dist/decisions/waiver-decisions.js +46 -0
  303. package/dist/decisions/waiver-decisions.js.map +1 -0
  304. package/dist/exporters/matrix/build.d.ts +3 -0
  305. package/dist/exporters/matrix/build.d.ts.map +1 -1
  306. package/dist/exporters/matrix/build.js +10 -9
  307. package/dist/exporters/matrix/build.js.map +1 -1
  308. package/dist/exporters/matrix/export.d.ts +3 -0
  309. package/dist/exporters/matrix/export.d.ts.map +1 -1
  310. package/dist/exporters/matrix/export.js +2 -0
  311. package/dist/exporters/matrix/export.js.map +1 -1
  312. package/dist/exporters/matrix/gates.d.ts +6 -1
  313. package/dist/exporters/matrix/gates.d.ts.map +1 -1
  314. package/dist/exporters/matrix/gates.js +57 -128
  315. package/dist/exporters/matrix/gates.js.map +1 -1
  316. package/dist/exporters/matrix/render-csv.d.ts.map +1 -1
  317. package/dist/exporters/matrix/render-csv.js +3 -0
  318. package/dist/exporters/matrix/render-csv.js.map +1 -1
  319. package/dist/exporters/matrix/render-gate-overrides-sheet.d.ts +13 -0
  320. package/dist/exporters/matrix/render-gate-overrides-sheet.d.ts.map +1 -0
  321. package/dist/exporters/matrix/render-gate-overrides-sheet.js +44 -0
  322. package/dist/exporters/matrix/render-gate-overrides-sheet.js.map +1 -0
  323. package/dist/exporters/matrix/render-xlsx.d.ts +1 -0
  324. package/dist/exporters/matrix/render-xlsx.d.ts.map +1 -1
  325. package/dist/exporters/matrix/render-xlsx.js +3 -0
  326. package/dist/exporters/matrix/render-xlsx.js.map +1 -1
  327. package/dist/exporters/matrix/types.d.ts +4 -1
  328. package/dist/exporters/matrix/types.d.ts.map +1 -1
  329. package/dist/exporters/matrix/types.js.map +1 -1
  330. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  331. package/dist/generators/test-generator/code-generator.js +13 -0
  332. package/dist/generators/test-generator/code-generator.js.map +1 -1
  333. package/dist/graph/evaluate-graph.d.ts +21 -0
  334. package/dist/graph/evaluate-graph.d.ts.map +1 -0
  335. package/dist/graph/evaluate-graph.js +49 -0
  336. package/dist/graph/evaluate-graph.js.map +1 -0
  337. package/dist/graph/locate-finding.d.ts +20 -0
  338. package/dist/graph/locate-finding.d.ts.map +1 -0
  339. package/dist/graph/locate-finding.js +137 -0
  340. package/dist/graph/locate-finding.js.map +1 -0
  341. package/dist/graph/node-decl.d.ts +59 -0
  342. package/dist/graph/node-decl.d.ts.map +1 -0
  343. package/dist/graph/node-decl.js +8 -0
  344. package/dist/graph/node-decl.js.map +1 -0
  345. package/dist/graph/nodes/core-node-catalog.d.ts +7 -0
  346. package/dist/graph/nodes/core-node-catalog.d.ts.map +1 -0
  347. package/dist/graph/nodes/core-node-catalog.js +13 -0
  348. package/dist/graph/nodes/core-node-catalog.js.map +1 -0
  349. package/dist/graph/nodes/test-case-contract-nodes.d.ts +19 -0
  350. package/dist/graph/nodes/test-case-contract-nodes.d.ts.map +1 -0
  351. package/dist/graph/nodes/test-case-contract-nodes.js +56 -0
  352. package/dist/graph/nodes/test-case-contract-nodes.js.map +1 -0
  353. package/dist/graph/nodes/test-case-nodes.d.ts +26 -0
  354. package/dist/graph/nodes/test-case-nodes.d.ts.map +1 -0
  355. package/dist/graph/nodes/test-case-nodes.js +66 -0
  356. package/dist/graph/nodes/test-case-nodes.js.map +1 -0
  357. package/dist/graph/nodes/unit-audit-nodes.d.ts +18 -0
  358. package/dist/graph/nodes/unit-audit-nodes.d.ts.map +1 -0
  359. package/dist/graph/nodes/unit-audit-nodes.js +95 -0
  360. package/dist/graph/nodes/unit-audit-nodes.js.map +1 -0
  361. package/dist/graph/nodes/unit-contract-node.d.ts +20 -0
  362. package/dist/graph/nodes/unit-contract-node.d.ts.map +1 -0
  363. package/dist/graph/nodes/unit-contract-node.js +81 -0
  364. package/dist/graph/nodes/unit-contract-node.js.map +1 -0
  365. package/dist/graph/nodes/unit-design-nodes.d.ts +14 -0
  366. package/dist/graph/nodes/unit-design-nodes.d.ts.map +1 -0
  367. package/dist/graph/nodes/unit-design-nodes.js +90 -0
  368. package/dist/graph/nodes/unit-design-nodes.js.map +1 -0
  369. package/dist/graph/nodes/unit-execution-nodes.d.ts +16 -0
  370. package/dist/graph/nodes/unit-execution-nodes.d.ts.map +1 -0
  371. package/dist/graph/nodes/unit-execution-nodes.js +79 -0
  372. package/dist/graph/nodes/unit-execution-nodes.js.map +1 -0
  373. package/dist/graph/test-case-identity.d.ts +13 -0
  374. package/dist/graph/test-case-identity.d.ts.map +1 -0
  375. package/dist/graph/test-case-identity.js +106 -0
  376. package/dist/graph/test-case-identity.js.map +1 -0
  377. package/dist/graph/test-case-results.d.ts +11 -0
  378. package/dist/graph/test-case-results.d.ts.map +1 -0
  379. package/dist/graph/test-case-results.js +137 -0
  380. package/dist/graph/test-case-results.js.map +1 -0
  381. package/dist/graph/test-case-satisfied.d.ts +25 -0
  382. package/dist/graph/test-case-satisfied.d.ts.map +1 -0
  383. package/dist/graph/test-case-satisfied.js +51 -0
  384. package/dist/graph/test-case-satisfied.js.map +1 -0
  385. package/dist/graph/test-case-state-shape.d.ts +67 -0
  386. package/dist/graph/test-case-state-shape.d.ts.map +1 -0
  387. package/dist/graph/test-case-state-shape.js +3 -0
  388. package/dist/graph/test-case-state-shape.js.map +1 -0
  389. package/dist/graph/test-case-states.d.ts +9 -0
  390. package/dist/graph/test-case-states.d.ts.map +1 -0
  391. package/dist/graph/test-case-states.js +116 -0
  392. package/dist/graph/test-case-states.js.map +1 -0
  393. package/dist/graph/unit-artifact-probes.d.ts +19 -0
  394. package/dist/graph/unit-artifact-probes.d.ts.map +1 -0
  395. package/dist/graph/unit-artifact-probes.js +133 -0
  396. package/dist/graph/unit-artifact-probes.js.map +1 -0
  397. package/dist/graph/unit-state-facts.d.ts +43 -0
  398. package/dist/graph/unit-state-facts.d.ts.map +1 -0
  399. package/dist/graph/unit-state-facts.js +87 -0
  400. package/dist/graph/unit-state-facts.js.map +1 -0
  401. package/dist/harness/audit.d.ts +11 -0
  402. package/dist/harness/audit.d.ts.map +1 -1
  403. package/dist/harness/audit.js +18 -17
  404. package/dist/harness/audit.js.map +1 -1
  405. package/dist/harness/catalog/gate-rules.yaml +647 -0
  406. package/dist/harness/gates/audit-gate-terms.d.ts +41 -0
  407. package/dist/harness/gates/audit-gate-terms.d.ts.map +1 -0
  408. package/dist/harness/gates/audit-gate-terms.js +72 -0
  409. package/dist/harness/gates/audit-gate-terms.js.map +1 -0
  410. package/dist/harness/gates/audit-gate-verdict.d.ts +31 -0
  411. package/dist/harness/gates/audit-gate-verdict.d.ts.map +1 -0
  412. package/dist/harness/gates/audit-gate-verdict.js +101 -0
  413. package/dist/harness/gates/audit-gate-verdict.js.map +1 -0
  414. package/dist/harness/gates/audit-input-hash.d.ts +4 -0
  415. package/dist/harness/gates/audit-input-hash.d.ts.map +1 -0
  416. package/dist/harness/gates/audit-input-hash.js +96 -0
  417. package/dist/harness/gates/audit-input-hash.js.map +1 -0
  418. package/dist/harness/gates/audit-report-verification.d.ts +32 -0
  419. package/dist/harness/gates/audit-report-verification.d.ts.map +1 -0
  420. package/dist/harness/gates/audit-report-verification.js +207 -0
  421. package/dist/harness/gates/audit-report-verification.js.map +1 -0
  422. package/dist/harness/gates/decisions-hash.d.ts +13 -0
  423. package/dist/harness/gates/decisions-hash.d.ts.map +1 -0
  424. package/dist/harness/gates/decisions-hash.js +72 -0
  425. package/dist/harness/gates/decisions-hash.js.map +1 -0
  426. package/dist/harness/gates/delivery-checklist.d.ts +21 -0
  427. package/dist/harness/gates/delivery-checklist.d.ts.map +1 -0
  428. package/dist/harness/gates/delivery-checklist.js +128 -0
  429. package/dist/harness/gates/delivery-checklist.js.map +1 -0
  430. package/dist/harness/gates/delivery-decision-gate.d.ts +29 -0
  431. package/dist/harness/gates/delivery-decision-gate.d.ts.map +1 -0
  432. package/dist/harness/gates/delivery-decision-gate.js +91 -0
  433. package/dist/harness/gates/delivery-decision-gate.js.map +1 -0
  434. package/dist/harness/gates/delivery-decision-step.d.ts +16 -0
  435. package/dist/harness/gates/delivery-decision-step.d.ts.map +1 -0
  436. package/dist/harness/gates/delivery-decision-step.js +71 -0
  437. package/dist/harness/gates/delivery-decision-step.js.map +1 -0
  438. package/dist/harness/gates/gate-override-report.d.ts +59 -0
  439. package/dist/harness/gates/gate-override-report.d.ts.map +1 -0
  440. package/dist/harness/gates/gate-override-report.js +86 -0
  441. package/dist/harness/gates/gate-override-report.js.map +1 -0
  442. package/dist/harness/gates/gate-override-scope.d.ts +18 -0
  443. package/dist/harness/gates/gate-override-scope.d.ts.map +1 -0
  444. package/dist/harness/gates/gate-override-scope.js +98 -0
  445. package/dist/harness/gates/gate-override-scope.js.map +1 -0
  446. package/dist/harness/gates/gate-override-validation.d.ts +25 -0
  447. package/dist/harness/gates/gate-override-validation.d.ts.map +1 -0
  448. package/dist/harness/gates/gate-override-validation.js +81 -0
  449. package/dist/harness/gates/gate-override-validation.js.map +1 -0
  450. package/dist/harness/gates/gate-rule-catalog.d.ts +24 -0
  451. package/dist/harness/gates/gate-rule-catalog.d.ts.map +1 -0
  452. package/dist/harness/gates/gate-rule-catalog.js +112 -0
  453. package/dist/harness/gates/gate-rule-catalog.js.map +1 -0
  454. package/dist/harness/gates/gate-terms.d.ts +33 -0
  455. package/dist/harness/gates/gate-terms.d.ts.map +1 -0
  456. package/dist/harness/gates/gate-terms.js +41 -0
  457. package/dist/harness/gates/gate-terms.js.map +1 -0
  458. package/dist/harness/gates/in-run-decision-check.d.ts +21 -0
  459. package/dist/harness/gates/in-run-decision-check.d.ts.map +1 -0
  460. package/dist/harness/gates/in-run-decision-check.js +138 -0
  461. package/dist/harness/gates/in-run-decision-check.js.map +1 -0
  462. package/dist/harness/gates/journey-gate-inputs.d.ts +37 -0
  463. package/dist/harness/gates/journey-gate-inputs.d.ts.map +1 -0
  464. package/dist/harness/gates/journey-gate-inputs.js +81 -0
  465. package/dist/harness/gates/journey-gate-inputs.js.map +1 -0
  466. package/dist/harness/gates/migrated-waiver-review.d.ts +6 -0
  467. package/dist/harness/gates/migrated-waiver-review.d.ts.map +1 -0
  468. package/dist/harness/gates/migrated-waiver-review.js +116 -0
  469. package/dist/harness/gates/migrated-waiver-review.js.map +1 -0
  470. package/dist/harness/gates/resolve-rule.d.ts +59 -0
  471. package/dist/harness/gates/resolve-rule.d.ts.map +1 -0
  472. package/dist/harness/gates/resolve-rule.js +41 -0
  473. package/dist/harness/gates/resolve-rule.js.map +1 -0
  474. package/dist/harness/gates/unit-gate-overrides.d.ts +25 -0
  475. package/dist/harness/gates/unit-gate-overrides.d.ts.map +1 -0
  476. package/dist/harness/gates/unit-gate-overrides.js +122 -0
  477. package/dist/harness/gates/unit-gate-overrides.js.map +1 -0
  478. package/dist/harness/journey.d.ts +24 -1
  479. package/dist/harness/journey.d.ts.map +1 -1
  480. package/dist/harness/journey.js +114 -23
  481. package/dist/harness/journey.js.map +1 -1
  482. package/dist/harness/manifest.d.ts +12 -0
  483. package/dist/harness/manifest.d.ts.map +1 -1
  484. package/dist/harness/manifest.js +71 -43
  485. package/dist/harness/manifest.js.map +1 -1
  486. package/dist/harness/next-step.d.ts +39 -6
  487. package/dist/harness/next-step.d.ts.map +1 -1
  488. package/dist/harness/next-step.js +34 -218
  489. package/dist/harness/next-step.js.map +1 -1
  490. package/dist/harness/parse.d.ts +10 -6
  491. package/dist/harness/parse.d.ts.map +1 -1
  492. package/dist/harness/parse.js +22 -11
  493. package/dist/harness/parse.js.map +1 -1
  494. package/dist/harness/script-check.d.ts.map +1 -1
  495. package/dist/harness/script-check.js +22 -5
  496. package/dist/harness/script-check.js.map +1 -1
  497. package/dist/harness/sensors.d.ts +14 -3
  498. package/dist/harness/sensors.d.ts.map +1 -1
  499. package/dist/harness/sensors.js +50 -49
  500. package/dist/harness/sensors.js.map +1 -1
  501. package/dist/harness/viewpoint-baseline.d.ts.map +1 -1
  502. package/dist/harness/viewpoint-baseline.js +1 -7
  503. package/dist/harness/viewpoint-baseline.js.map +1 -1
  504. package/dist/harness/viewpoint-ledger.d.ts +3 -13
  505. package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
  506. package/dist/harness/viewpoint-ledger.js +8 -38
  507. package/dist/harness/viewpoint-ledger.js.map +1 -1
  508. package/dist/hooks/bash-write-targets.d.ts +15 -0
  509. package/dist/hooks/bash-write-targets.d.ts.map +1 -0
  510. package/dist/hooks/bash-write-targets.js +173 -0
  511. package/dist/hooks/bash-write-targets.js.map +1 -0
  512. package/dist/hooks/claude-hook-entry.d.ts +11 -0
  513. package/dist/hooks/claude-hook-entry.d.ts.map +1 -0
  514. package/dist/hooks/claude-hook-entry.js +137 -0
  515. package/dist/hooks/claude-hook-entry.js.map +1 -0
  516. package/dist/hooks/claude-transcript-turn.d.ts +11 -0
  517. package/dist/hooks/claude-transcript-turn.d.ts.map +1 -0
  518. package/dist/hooks/claude-transcript-turn.js +143 -0
  519. package/dist/hooks/claude-transcript-turn.js.map +1 -0
  520. package/dist/hooks/guard-delivery-contract-rule.d.ts +10 -0
  521. package/dist/hooks/guard-delivery-contract-rule.d.ts.map +1 -0
  522. package/dist/hooks/guard-delivery-contract-rule.js +152 -0
  523. package/dist/hooks/guard-delivery-contract-rule.js.map +1 -0
  524. package/dist/hooks/guard-protected-paths.d.ts +9 -0
  525. package/dist/hooks/guard-protected-paths.d.ts.map +1 -0
  526. package/dist/hooks/guard-protected-paths.js +106 -0
  527. package/dist/hooks/guard-protected-paths.js.map +1 -0
  528. package/dist/hooks/guard-rules.d.ts +37 -0
  529. package/dist/hooks/guard-rules.d.ts.map +1 -0
  530. package/dist/hooks/guard-rules.js +61 -0
  531. package/dist/hooks/guard-rules.js.map +1 -0
  532. package/dist/hooks/guard-tty-spoof-rule.d.ts +15 -0
  533. package/dist/hooks/guard-tty-spoof-rule.d.ts.map +1 -0
  534. package/dist/hooks/guard-tty-spoof-rule.js +21 -0
  535. package/dist/hooks/guard-tty-spoof-rule.js.map +1 -0
  536. package/dist/hooks/hand-back-core.d.ts +37 -0
  537. package/dist/hooks/hand-back-core.d.ts.map +1 -0
  538. package/dist/hooks/hand-back-core.js +115 -0
  539. package/dist/hooks/hand-back-core.js.map +1 -0
  540. package/dist/hooks/hook-cli-command.d.ts +9 -0
  541. package/dist/hooks/hook-cli-command.d.ts.map +1 -0
  542. package/dist/hooks/hook-cli-command.js +46 -0
  543. package/dist/hooks/hook-cli-command.js.map +1 -0
  544. package/dist/hooks/hook-registry.d.ts +10 -0
  545. package/dist/hooks/hook-registry.d.ts.map +1 -0
  546. package/dist/hooks/hook-registry.js +24 -0
  547. package/dist/hooks/hook-registry.js.map +1 -0
  548. package/dist/hooks/hook-result-contract.d.ts +50 -0
  549. package/dist/hooks/hook-result-contract.d.ts.map +1 -0
  550. package/dist/hooks/hook-result-contract.js +80 -0
  551. package/dist/hooks/hook-result-contract.js.map +1 -0
  552. package/dist/hooks/hook-toggles.d.ts +10 -0
  553. package/dist/hooks/hook-toggles.d.ts.map +1 -0
  554. package/dist/hooks/hook-toggles.js +107 -0
  555. package/dist/hooks/hook-toggles.js.map +1 -0
  556. package/dist/hooks/pre-tool-guard-hook.d.ts +10 -0
  557. package/dist/hooks/pre-tool-guard-hook.d.ts.map +1 -0
  558. package/dist/hooks/pre-tool-guard-hook.js +105 -0
  559. package/dist/hooks/pre-tool-guard-hook.js.map +1 -0
  560. package/dist/hooks/session-start-unit-state-hook.d.ts +13 -0
  561. package/dist/hooks/session-start-unit-state-hook.d.ts.map +1 -0
  562. package/dist/hooks/session-start-unit-state-hook.js +55 -0
  563. package/dist/hooks/session-start-unit-state-hook.js.map +1 -0
  564. package/dist/hooks/stop-next-step-hook.d.ts +16 -0
  565. package/dist/hooks/stop-next-step-hook.d.ts.map +1 -0
  566. package/dist/hooks/stop-next-step-hook.js +42 -0
  567. package/dist/hooks/stop-next-step-hook.js.map +1 -0
  568. package/dist/hooks/sungen-project-root.d.ts +19 -0
  569. package/dist/hooks/sungen-project-root.d.ts.map +1 -0
  570. package/dist/hooks/sungen-project-root.js +130 -0
  571. package/dist/hooks/sungen-project-root.js.map +1 -0
  572. package/dist/orchestrator/ai-skills/command-partial-includes.d.ts +15 -0
  573. package/dist/orchestrator/ai-skills/command-partial-includes.d.ts.map +1 -0
  574. package/dist/orchestrator/ai-skills/command-partial-includes.js +106 -0
  575. package/dist/orchestrator/ai-skills/command-partial-includes.js.map +1 -0
  576. package/dist/orchestrator/ai-skills/commands.d.ts +5 -1
  577. package/dist/orchestrator/ai-skills/commands.d.ts.map +1 -1
  578. package/dist/orchestrator/ai-skills/commands.js +16 -6
  579. package/dist/orchestrator/ai-skills/commands.js.map +1 -1
  580. package/dist/orchestrator/ai-skills/golden-skills.test.js +29 -0
  581. package/dist/orchestrator/ai-skills/golden-skills.test.js.map +1 -1
  582. package/dist/orchestrator/claude-hooks-install.d.ts +27 -0
  583. package/dist/orchestrator/claude-hooks-install.d.ts.map +1 -0
  584. package/dist/orchestrator/claude-hooks-install.js +203 -0
  585. package/dist/orchestrator/claude-hooks-install.js.map +1 -0
  586. package/dist/orchestrator/flow-manager.d.ts +1 -0
  587. package/dist/orchestrator/flow-manager.d.ts.map +1 -1
  588. package/dist/orchestrator/flow-manager.js +52 -3
  589. package/dist/orchestrator/flow-manager.js.map +1 -1
  590. package/dist/orchestrator/lockstep-version.d.ts +15 -5
  591. package/dist/orchestrator/lockstep-version.d.ts.map +1 -1
  592. package/dist/orchestrator/lockstep-version.js +30 -17
  593. package/dist/orchestrator/lockstep-version.js.map +1 -1
  594. package/dist/orchestrator/project-initializer.d.ts +6 -0
  595. package/dist/orchestrator/project-initializer.d.ts.map +1 -1
  596. package/dist/orchestrator/project-initializer.js +23 -0
  597. package/dist/orchestrator/project-initializer.js.map +1 -1
  598. package/dist/orchestrator/screen-manager.d.ts.map +1 -1
  599. package/dist/orchestrator/screen-manager.js +52 -4
  600. package/dist/orchestrator/screen-manager.js.map +1 -1
  601. package/dist/orchestrator/templates/ai-src/commands/add-api.md +2 -0
  602. package/dist/orchestrator/templates/ai-src/commands/add-flow.md +2 -0
  603. package/dist/orchestrator/templates/ai-src/commands/add-screen.md +2 -0
  604. package/dist/orchestrator/templates/ai-src/commands/create-data-test.md +1 -0
  605. package/dist/orchestrator/templates/ai-src/commands/create-test.md +36 -46
  606. package/dist/orchestrator/templates/ai-src/commands/dashboard.md +2 -0
  607. package/dist/orchestrator/templates/ai-src/commands/delivery.md +2 -0
  608. package/dist/orchestrator/templates/ai-src/commands/design.md +2 -0
  609. package/dist/orchestrator/templates/ai-src/commands/feedback.md +2 -0
  610. package/dist/orchestrator/templates/ai-src/commands/locale.md +2 -0
  611. package/dist/orchestrator/templates/ai-src/commands/review.md +2 -0
  612. package/dist/orchestrator/templates/ai-src/commands/run-test.md +6 -8
  613. package/dist/orchestrator/templates/ai-src/config/claude.md +20 -7
  614. package/dist/orchestrator/templates/ai-src/config/copilot.md +20 -7
  615. package/dist/orchestrator/templates/ai-src/partials/hand-back-rule.claude.md +20 -0
  616. package/dist/orchestrator/templates/ai-src/partials/hand-back-rule.codex.md +20 -0
  617. package/dist/orchestrator/templates/ai-src/partials/hand-back-rule.copilot.md +20 -0
  618. package/dist/orchestrator/templates/ai-src/skills/sungen-api-coverage-model/SKILL.md +1 -1
  619. package/dist/orchestrator/templates/ai-src/skills/sungen-capture-mobile/SKILL.md +3 -3
  620. package/dist/orchestrator/templates/ai-src/skills/sungen-data-factory/SKILL.md +9 -0
  621. package/dist/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +1 -3
  622. package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +1 -1
  623. package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +0 -18
  624. package/dist/orchestrator/templates/claude-hooks/sungen-hook.cjs +64 -0
  625. package/dist/orchestrator/viewpoint-pattern-catalog.d.ts +1 -4
  626. package/dist/orchestrator/viewpoint-pattern-catalog.d.ts.map +1 -1
  627. package/dist/orchestrator/viewpoint-pattern-catalog.js +2 -5
  628. package/dist/orchestrator/viewpoint-pattern-catalog.js.map +1 -1
  629. package/dist/utils/safe-yaml-parse.d.ts +8 -0
  630. package/dist/utils/safe-yaml-parse.d.ts.map +1 -0
  631. package/dist/utils/safe-yaml-parse.js +51 -0
  632. package/dist/utils/safe-yaml-parse.js.map +1 -0
  633. package/package.json +3 -3
  634. package/src/basis/anchor-grammar.ts +83 -0
  635. package/src/basis/anchor-hash.ts +27 -0
  636. package/src/basis/bm51-tables.ts +65 -0
  637. package/src/basis/extract-spec-anchors.ts +95 -0
  638. package/src/basis/migration-sentinel.ts +175 -0
  639. package/src/basis/spec-frontmatter.ts +68 -0
  640. package/src/basis/spec-sections.ts +35 -0
  641. package/src/basis/test-basis-schema.ts +81 -0
  642. package/src/capabilities/registry.ts +16 -0
  643. package/src/cli/commands/audit.ts +3 -26
  644. package/src/cli/commands/capability.ts +1 -1
  645. package/src/cli/commands/contract-derive-command.ts +60 -0
  646. package/src/cli/commands/contract.ts +130 -0
  647. package/src/cli/commands/delivery.ts +52 -3
  648. package/src/cli/commands/generate.ts +3 -1
  649. package/src/cli/commands/journey.ts +39 -14
  650. package/src/cli/commands/next.ts +60 -8
  651. package/src/cli/commands/update.ts +35 -8
  652. package/src/cli/index.ts +20 -32
  653. package/src/contract/approve-contract.ts +94 -0
  654. package/src/contract/assertion-matcher-vocabulary.ts +93 -0
  655. package/src/contract/build-contract-verdict.ts +108 -0
  656. package/src/contract/build-trace-conformance.ts +100 -0
  657. package/src/contract/classify-contract-change.ts +92 -0
  658. package/src/contract/classify-contract-unit.ts +47 -0
  659. package/src/contract/classify-trace-conformance.ts +116 -0
  660. package/src/contract/contract-git.ts +106 -0
  661. package/src/contract/contract-hash.ts +34 -0
  662. package/src/contract/contract-report-file.ts +25 -0
  663. package/src/contract/contract-schema.ts +137 -0
  664. package/src/contract/contract-units.ts +52 -0
  665. package/src/contract/contracts-lock-file.ts +97 -0
  666. package/src/contract/data-normalize.ts +66 -0
  667. package/src/contract/derive-free-feature.ts +110 -0
  668. package/src/contract/field-semantic-redaction.ts +80 -0
  669. package/src/contract/free-feature-blocks.ts +56 -0
  670. package/src/contract/lock-secret-guard.ts +95 -0
  671. package/src/contract/lock-vs-git-head.ts +38 -0
  672. package/src/contract/normalize-contract-step.ts +74 -0
  673. package/src/contract/normalize-feature-steps.ts +93 -0
  674. package/src/contract/oracle-strength.ts +80 -0
  675. package/src/contract/project-contract-blockers.ts +36 -0
  676. package/src/contract/record-contract-approval.ts +70 -0
  677. package/src/contract/render-free-gherkin.ts +113 -0
  678. package/src/contract/render-trace-sentence.ts +98 -0
  679. package/src/contract/render-trace-target.ts +68 -0
  680. package/src/contract/resolve-unit-trace-identities.ts +35 -0
  681. package/src/contract/trace/collect-trace-evidence.ts +109 -0
  682. package/src/contract/trace/identity-cache.ts +61 -0
  683. package/src/contract/trace/select-final-attempt.ts +70 -0
  684. package/src/contract/trace/snapshot-html-renderer.ts +136 -0
  685. package/src/contract/trace/snapshot-resolver.ts +66 -0
  686. package/src/contract/trace/snapshot-store.ts +151 -0
  687. package/src/contract/trace/target-identity.ts +104 -0
  688. package/src/contract/trace/test-step-join.ts +103 -0
  689. package/src/contract/trace/trace-binding.ts +56 -0
  690. package/src/contract/trace/trace-file-reader.ts +123 -0
  691. package/src/contract/trace/trace-fingerprint.ts +68 -0
  692. package/src/contract/trace/trace-identity-resolution.ts +74 -0
  693. package/src/contract/trace/trace-run-record.ts +74 -0
  694. package/src/contract/trace/trace-steps.ts +88 -0
  695. package/src/contract/trace/trace-zip-limits.ts +73 -0
  696. package/src/contract/trace/trace-zip-reader.ts +127 -0
  697. package/src/contract/verify-approval-decisions.ts +60 -0
  698. package/src/decisions/append-decision.ts +35 -0
  699. package/src/decisions/confirmed-decision-commands.ts +128 -0
  700. package/src/decisions/decision-file.ts +93 -0
  701. package/src/decisions/decision-identity.ts +73 -0
  702. package/src/decisions/decision-integrity-check.ts +61 -0
  703. package/src/decisions/decision-schema.ts +76 -0
  704. package/src/decisions/decision-source.ts +14 -0
  705. package/src/decisions/exclusive-file-create.ts +42 -0
  706. package/src/decisions/git-head-trust.ts +32 -0
  707. package/src/decisions/human-confirmation.ts +114 -0
  708. package/src/decisions/legacy-waiver-migration.ts +135 -0
  709. package/src/decisions/read-decisions.ts +61 -0
  710. package/src/decisions/viewpoint-baseline-adapter.ts +74 -0
  711. package/src/decisions/waiver-decisions.ts +56 -0
  712. package/src/exporters/matrix/build.ts +11 -9
  713. package/src/exporters/matrix/export.ts +5 -0
  714. package/src/exporters/matrix/gates.ts +62 -129
  715. package/src/exporters/matrix/render-csv.ts +3 -0
  716. package/src/exporters/matrix/render-gate-overrides-sheet.ts +50 -0
  717. package/src/exporters/matrix/render-xlsx.ts +3 -0
  718. package/src/exporters/matrix/types.ts +4 -1
  719. package/src/generators/test-generator/code-generator.ts +13 -0
  720. package/src/graph/evaluate-graph.ts +62 -0
  721. package/src/graph/locate-finding.ts +93 -0
  722. package/src/graph/node-decl.ts +65 -0
  723. package/src/graph/nodes/core-node-catalog.ts +15 -0
  724. package/src/graph/nodes/test-case-contract-nodes.ts +69 -0
  725. package/src/graph/nodes/test-case-nodes.ts +68 -0
  726. package/src/graph/nodes/unit-audit-nodes.ts +95 -0
  727. package/src/graph/nodes/unit-contract-node.ts +82 -0
  728. package/src/graph/nodes/unit-design-nodes.ts +88 -0
  729. package/src/graph/nodes/unit-execution-nodes.ts +77 -0
  730. package/src/graph/test-case-identity.ts +75 -0
  731. package/src/graph/test-case-results.ts +90 -0
  732. package/src/graph/test-case-satisfied.ts +55 -0
  733. package/src/graph/test-case-state-shape.ts +62 -0
  734. package/src/graph/test-case-states.ts +84 -0
  735. package/src/graph/unit-artifact-probes.ts +77 -0
  736. package/src/graph/unit-state-facts.ts +112 -0
  737. package/src/harness/audit.ts +29 -18
  738. package/src/harness/catalog/gate-rules.yaml +647 -0
  739. package/src/harness/gates/audit-gate-terms.ts +80 -0
  740. package/src/harness/gates/audit-gate-verdict.ts +78 -0
  741. package/src/harness/gates/audit-input-hash.ts +55 -0
  742. package/src/harness/gates/audit-report-verification.ts +173 -0
  743. package/src/harness/gates/decisions-hash.ts +42 -0
  744. package/src/harness/gates/delivery-checklist.ts +120 -0
  745. package/src/harness/gates/delivery-decision-gate.ts +111 -0
  746. package/src/harness/gates/delivery-decision-step.ts +73 -0
  747. package/src/harness/gates/gate-override-report.ts +114 -0
  748. package/src/harness/gates/gate-override-scope.ts +66 -0
  749. package/src/harness/gates/gate-override-validation.ts +75 -0
  750. package/src/harness/gates/gate-rule-catalog.ts +82 -0
  751. package/src/harness/gates/gate-terms.ts +59 -0
  752. package/src/harness/gates/in-run-decision-check.ts +99 -0
  753. package/src/harness/gates/journey-gate-inputs.ts +89 -0
  754. package/src/harness/gates/migrated-waiver-review.ts +68 -0
  755. package/src/harness/gates/resolve-rule.ts +94 -0
  756. package/src/harness/gates/unit-gate-overrides.ts +99 -0
  757. package/src/harness/journey.ts +122 -27
  758. package/src/harness/manifest.ts +67 -43
  759. package/src/harness/next-step.ts +59 -210
  760. package/src/harness/parse.ts +25 -15
  761. package/src/harness/script-check.ts +20 -5
  762. package/src/harness/sensors.ts +55 -49
  763. package/src/harness/viewpoint-baseline.ts +1 -7
  764. package/src/harness/viewpoint-ledger.ts +11 -52
  765. package/src/hooks/bash-write-targets.ts +109 -0
  766. package/src/hooks/claude-hook-entry.ts +85 -0
  767. package/src/hooks/claude-transcript-turn.ts +96 -0
  768. package/src/hooks/guard-delivery-contract-rule.ts +110 -0
  769. package/src/hooks/guard-protected-paths.ts +70 -0
  770. package/src/hooks/guard-rules.ts +98 -0
  771. package/src/hooks/guard-tty-spoof-rule.ts +31 -0
  772. package/src/hooks/hand-back-core.ts +106 -0
  773. package/src/hooks/hook-cli-command.ts +17 -0
  774. package/src/hooks/hook-registry.ts +24 -0
  775. package/src/hooks/hook-result-contract.ts +114 -0
  776. package/src/hooks/hook-toggles.ts +66 -0
  777. package/src/hooks/pre-tool-guard-hook.ts +67 -0
  778. package/src/hooks/session-start-unit-state-hook.ts +54 -0
  779. package/src/hooks/stop-next-step-hook.ts +37 -0
  780. package/src/hooks/sungen-project-root.ts +80 -0
  781. package/src/orchestrator/ai-skills/command-partial-includes.ts +72 -0
  782. package/src/orchestrator/ai-skills/commands.ts +22 -8
  783. package/src/orchestrator/ai-skills/golden-skills.test.ts +23 -0
  784. package/src/orchestrator/claude-hooks-install.ts +168 -0
  785. package/src/orchestrator/flow-manager.ts +53 -3
  786. package/src/orchestrator/lockstep-version.ts +28 -15
  787. package/src/orchestrator/project-initializer.ts +21 -0
  788. package/src/orchestrator/screen-manager.ts +52 -4
  789. package/src/orchestrator/templates/ai-src/commands/add-api.md +2 -0
  790. package/src/orchestrator/templates/ai-src/commands/add-flow.md +2 -0
  791. package/src/orchestrator/templates/ai-src/commands/add-screen.md +2 -0
  792. package/src/orchestrator/templates/ai-src/commands/create-data-test.md +1 -0
  793. package/src/orchestrator/templates/ai-src/commands/create-test.md +36 -46
  794. package/src/orchestrator/templates/ai-src/commands/dashboard.md +2 -0
  795. package/src/orchestrator/templates/ai-src/commands/delivery.md +2 -0
  796. package/src/orchestrator/templates/ai-src/commands/design.md +2 -0
  797. package/src/orchestrator/templates/ai-src/commands/feedback.md +2 -0
  798. package/src/orchestrator/templates/ai-src/commands/locale.md +2 -0
  799. package/src/orchestrator/templates/ai-src/commands/review.md +2 -0
  800. package/src/orchestrator/templates/ai-src/commands/run-test.md +6 -8
  801. package/src/orchestrator/templates/ai-src/config/claude.md +20 -7
  802. package/src/orchestrator/templates/ai-src/config/copilot.md +20 -7
  803. package/src/orchestrator/templates/ai-src/partials/hand-back-rule.claude.md +20 -0
  804. package/src/orchestrator/templates/ai-src/partials/hand-back-rule.codex.md +20 -0
  805. package/src/orchestrator/templates/ai-src/partials/hand-back-rule.copilot.md +20 -0
  806. package/src/orchestrator/templates/ai-src/skills/sungen-api-coverage-model/SKILL.md +1 -1
  807. package/src/orchestrator/templates/ai-src/skills/sungen-capture-mobile/SKILL.md +3 -3
  808. package/src/orchestrator/templates/ai-src/skills/sungen-data-factory/SKILL.md +9 -0
  809. package/src/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +1 -3
  810. package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +1 -1
  811. package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +0 -18
  812. package/src/orchestrator/templates/claude-hooks/sungen-hook.cjs +64 -0
  813. package/src/orchestrator/viewpoint-pattern-catalog.ts +2 -5
  814. package/src/utils/safe-yaml-parse.ts +44 -0
  815. package/dist/cli/commands/viewpoint.d.ts +0 -7
  816. package/dist/cli/commands/viewpoint.d.ts.map +0 -1
  817. package/dist/cli/commands/viewpoint.js +0 -70
  818. package/dist/cli/commands/viewpoint.js.map +0 -1
  819. package/dist/harness/viewpoint-draft-header.d.ts +0 -7
  820. package/dist/harness/viewpoint-draft-header.d.ts.map +0 -1
  821. package/dist/harness/viewpoint-draft-header.js +0 -100
  822. package/dist/harness/viewpoint-draft-header.js.map +0 -1
  823. package/dist/harness/viewpoint-mode.d.ts +0 -9
  824. package/dist/harness/viewpoint-mode.d.ts.map +0 -1
  825. package/dist/harness/viewpoint-mode.js +0 -52
  826. package/dist/harness/viewpoint-mode.js.map +0 -1
  827. package/dist/harness/viewpoint-priority.d.ts +0 -19
  828. package/dist/harness/viewpoint-priority.d.ts.map +0 -1
  829. package/dist/harness/viewpoint-priority.js +0 -36
  830. package/dist/harness/viewpoint-priority.js.map +0 -1
  831. package/dist/harness/viewpoint-review-open.d.ts +0 -6
  832. package/dist/harness/viewpoint-review-open.d.ts.map +0 -1
  833. package/dist/harness/viewpoint-review-open.js +0 -90
  834. package/dist/harness/viewpoint-review-open.js.map +0 -1
  835. package/dist/harness/viewpoint-scan-refs.d.ts +0 -50
  836. package/dist/harness/viewpoint-scan-refs.d.ts.map +0 -1
  837. package/dist/harness/viewpoint-scan-refs.js +0 -200
  838. package/dist/harness/viewpoint-scan-refs.js.map +0 -1
  839. package/dist/harness/viewpoint-scan.d.ts +0 -41
  840. package/dist/harness/viewpoint-scan.d.ts.map +0 -1
  841. package/dist/harness/viewpoint-scan.js +0 -118
  842. package/dist/harness/viewpoint-scan.js.map +0 -1
  843. package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/review-checklist.md +0 -63
  844. package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/viewpoint-template.md +0 -158
  845. package/dist/orchestrator/viewpoint-scaffold.d.ts +0 -3
  846. package/dist/orchestrator/viewpoint-scaffold.d.ts.map +0 -1
  847. package/dist/orchestrator/viewpoint-scaffold.js +0 -70
  848. package/dist/orchestrator/viewpoint-scaffold.js.map +0 -1
  849. package/src/cli/commands/viewpoint.ts +0 -58
  850. package/src/harness/viewpoint-draft-header.ts +0 -55
  851. package/src/harness/viewpoint-mode.ts +0 -49
  852. package/src/harness/viewpoint-priority.ts +0 -38
  853. package/src/harness/viewpoint-review-open.ts +0 -51
  854. package/src/harness/viewpoint-scan-refs.ts +0 -154
  855. package/src/harness/viewpoint-scan.ts +0 -111
  856. package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/review-checklist.md +0 -63
  857. package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/viewpoint-template.md +0 -158
  858. package/src/orchestrator/viewpoint-scaffold.ts +0 -36
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * sungen — Claude Code hook launcher. Written by `sungen init` / `sungen update`; edits are
5
+ * overwritten. `.claude/settings.json` runs it in exec form (no shell):
6
+ * { "command": "node", "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/sungen-hook.cjs", "<hook>"] }
7
+ *
8
+ * Finds the installed sungen and runs one hook IN-PROCESS (node on dist — no npx — so a hook costs
9
+ * one Node start). Lookup: $SUNGEN_HOOK_ENTRY when set (exactly that file), else the project's own
10
+ * dependency, else the global npm prefix.
11
+ *
12
+ * FAILS OPEN: kill-switch set, sungen not found, or any error → prints `{}` and exits 0. A hook can
13
+ * never block or derail a session.
14
+ *
15
+ * Off switches: SUNGEN_HOOKS=off (all) · SUNGEN_HOOK_<NAME>=off (one) · qa/sungen.config.yaml `hooks:`.
16
+ */
17
+ const fs = require('fs');
18
+ const os = require('os');
19
+ const path = require('path');
20
+
21
+ const ENTRY = ['@sun-asterisk', 'sungen', 'dist', 'hooks', 'claude-hook-entry.js'];
22
+
23
+ function noop() {
24
+ process.stdout.write('{}\n', () => process.exit(0));
25
+ }
26
+
27
+ function npmrcPrefix() {
28
+ try {
29
+ const m = fs.readFileSync(path.join(os.homedir(), '.npmrc'), 'utf8').match(/^\s*prefix\s*=\s*(.+?)\s*$/m);
30
+ return m ? m[1].replace(/^~(?=$|[\\/])/, os.homedir()) : null;
31
+ } catch (_) {
32
+ return null;
33
+ }
34
+ }
35
+
36
+ function findEntry() {
37
+ const override = process.env.SUNGEN_HOOK_ENTRY;
38
+ if (override) return fs.existsSync(override) ? override : null;
39
+ const project = process.env.CLAUDE_PROJECT_DIR || process.cwd();
40
+ try {
41
+ return require.resolve(ENTRY.join('/'), { paths: [project] });
42
+ } catch (_) { /* not a project dependency — try the global install */ }
43
+ const bin = path.dirname(process.execPath);
44
+ const prefixes = [process.env.npm_config_prefix, npmrcPrefix(), path.join(bin, '..'), bin].filter(Boolean);
45
+ for (const prefix of prefixes) {
46
+ for (const lib of [path.join(prefix, 'lib', 'node_modules'), path.join(prefix, 'node_modules')]) {
47
+ const candidate = path.join(lib, ...ENTRY);
48
+ if (fs.existsSync(candidate)) return candidate;
49
+ }
50
+ }
51
+ return null;
52
+ }
53
+
54
+ try {
55
+ if (/^(?:off|0|false|no|disabled?)$/i.test(String(process.env.SUNGEN_HOOKS || '').trim())) {
56
+ noop();
57
+ } else {
58
+ const entry = findEntry();
59
+ if (!entry) noop();
60
+ else Promise.resolve(require(entry).main(process.argv[2] || '')).then(() => process.exit(0), noop);
61
+ }
62
+ } catch (_) {
63
+ noop();
64
+ }
@@ -15,9 +15,6 @@ export interface ViewpointPattern {
15
15
  mobile?: boolean;
16
16
  }
17
17
  export declare const VIEWPOINT_PATTERNS: readonly ViewpointPattern[];
18
- /**
19
- * The scaffold's pattern-table rows: 1–17 for every screen, plus Group F on a mobile project.
20
- * `Áp dụng?` is left empty for the QA to mark ✅ / ❌, as the QA template does.
21
- */
18
+ /** The scaffold's pattern-table rows: 1–17 for every screen, plus Group F on a mobile project. */
22
19
  export declare function uiPatternRows(isMobile: boolean): string[];
23
20
  //# sourceMappingURL=viewpoint-pattern-catalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewpoint-pattern-catalog.d.ts","sourceRoot":"","sources":["../../src/orchestrator/viewpoint-pattern-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,kBAAkB,EAAE,SAAS,gBAAgB,EAiCzD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAIzD"}
1
+ {"version":3,"file":"viewpoint-pattern-catalog.d.ts","sourceRoot":"","sources":["../../src/orchestrator/viewpoint-pattern-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,kBAAkB,EAAE,SAAS,gBAAgB,EAiCzD,CAAC;AAEF,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAIzD"}
@@ -36,13 +36,10 @@ exports.VIEWPOINT_PATTERNS = [
36
36
  { n: 31, name: 'Settings Toggle List', mobile: true },
37
37
  { n: 32, name: 'App Lifecycle & Orientation', mobile: true },
38
38
  ];
39
- /**
40
- * The scaffold's pattern-table rows: 1–17 for every screen, plus Group F on a mobile project.
41
- * `Áp dụng?` is left empty for the QA to mark ✅ / ❌, as the QA template does.
42
- */
39
+ /** The scaffold's pattern-table rows: 1–17 for every screen, plus Group F on a mobile project. */
43
40
  function uiPatternRows(isMobile) {
44
41
  return exports.VIEWPOINT_PATTERNS
45
42
  .filter((p) => isMobile || !p.mobile)
46
- .map((p) => `| ${p.n} | ${p.name} | | |`);
43
+ .map((p) => `| ${p.n} | ${p.name} | ☐ | |`);
47
44
  }
48
45
  //# sourceMappingURL=viewpoint-pattern-catalog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewpoint-pattern-catalog.js","sourceRoot":"","sources":["../../src/orchestrator/viewpoint-pattern-catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viewpoint-pattern-catalog.js","sourceRoot":"","sources":["../../src/orchestrator/viewpoint-pattern-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const SAFE_YAML_MAX_ALIAS_COUNT = 10;
2
+ export declare const SAFE_YAML_MAX_BYTES: number;
3
+ export declare class UnsafeYamlError extends Error {
4
+ readonly source: string;
5
+ constructor(source: string, detail: string);
6
+ }
7
+ export declare function safeYamlParse(text: string, source?: string): unknown;
8
+ //# sourceMappingURL=safe-yaml-parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-yaml-parse.d.ts","sourceRoot":"","sources":["../../src/utils/safe-yaml-parse.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAE/C,qBAAa,eAAgB,SAAQ,KAAK;aACZ,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAI3D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG,OAAO,CAiBtE"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnsafeYamlError = exports.SAFE_YAML_MAX_BYTES = exports.SAFE_YAML_MAX_ALIAS_COUNT = void 0;
4
+ exports.safeYamlParse = safeYamlParse;
5
+ /**
6
+ * Parse YAML that a person or an agent wrote into `qa/` — decisions, test-basis, locks — without
7
+ * letting the file attack the reader (red-team #14, DOS-13.8).
8
+ *
9
+ * - `maxAliasCount` small: a "billion laughs" document that multiplies one anchor through nested
10
+ * aliases is refused instead of expanding to gigabytes. None of these files has a reason to
11
+ * alias at all; a handful is allowed so a hand-written file with one shared block still reads.
12
+ * - YAML **core** schema and nothing else: `!!binary`, `!!timestamp`, `!!js/…` or any custom tag is
13
+ * an error (the library would otherwise resolve "known" extra tags even under core), and yaml-1.1
14
+ * merge keys (`<<`) are not merged. `2026-10-21` stays the string it was written as, so a hash
15
+ * over the parsed value equals a hash over the text's intent.
16
+ * - duplicate keys are an error: two `reason:` lines must not let the second silently win.
17
+ * - a byte cap: these files are a few hundred bytes; a 100 MB one is an attack or an accident.
18
+ */
19
+ const yaml_1 = require("yaml");
20
+ exports.SAFE_YAML_MAX_ALIAS_COUNT = 10;
21
+ exports.SAFE_YAML_MAX_BYTES = 1024 * 1024;
22
+ class UnsafeYamlError extends Error {
23
+ constructor(source, detail) {
24
+ super(`${source}: ${detail}`);
25
+ this.source = source;
26
+ this.name = 'UnsafeYamlError';
27
+ }
28
+ }
29
+ exports.UnsafeYamlError = UnsafeYamlError;
30
+ function safeYamlParse(text, source = '<yaml>') {
31
+ if (Buffer.byteLength(text, 'utf8') > exports.SAFE_YAML_MAX_BYTES) {
32
+ throw new UnsafeYamlError(source, `larger than ${exports.SAFE_YAML_MAX_BYTES} bytes`);
33
+ }
34
+ let doc;
35
+ try {
36
+ doc = (0, yaml_1.parseDocument)(text, { schema: 'core', resolveKnownTags: false, merge: false, uniqueKeys: true, strict: true, prettyErrors: false });
37
+ }
38
+ catch (err) {
39
+ throw new UnsafeYamlError(source, err instanceof Error ? err.message : String(err));
40
+ }
41
+ const problem = doc.errors[0] ?? doc.warnings[0]; // an unresolved tag is only a warning to the library
42
+ if (problem)
43
+ throw new UnsafeYamlError(source, problem.message);
44
+ try {
45
+ return doc.toJS({ maxAliasCount: exports.SAFE_YAML_MAX_ALIAS_COUNT });
46
+ }
47
+ catch (err) {
48
+ throw new UnsafeYamlError(source, err instanceof Error ? err.message : String(err));
49
+ }
50
+ }
51
+ //# sourceMappingURL=safe-yaml-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-yaml-parse.js","sourceRoot":"","sources":["../../src/utils/safe-yaml-parse.ts"],"names":[],"mappings":";;;AA0BA,sCAiBC;AA3CD;;;;;;;;;;;;;GAaG;AACH,+BAAqC;AAExB,QAAA,yBAAyB,GAAG,EAAE,CAAC;AAC/B,QAAA,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAA4B,MAAc,EAAE,MAAc;QACxD,KAAK,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QADJ,WAAM,GAAN,MAAM,CAAQ;QAExC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC;AAED,SAAgB,aAAa,CAAC,IAAY,EAAE,MAAM,GAAG,QAAQ;IAC3D,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,2BAAmB,EAAE,CAAC;QAC1D,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,eAAe,2BAAmB,QAAQ,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,GAAqC,CAAC;IAC1C,IAAI,CAAC;QACH,GAAG,GAAG,IAAA,oBAAa,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5I,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAG,qDAAqD;IACzG,IAAI,OAAO;QAAE,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,iCAAyB,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACtF,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sun-asterisk/sungen",
3
- "version": "3.2.34-beta.1",
3
+ "version": "3.3.0-alpha.1",
4
4
  "description": "Deterministic E2E Test Compiler - Gherkin + Selectors → Playwright tests",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",
@@ -40,8 +40,8 @@
40
40
  "@babel/types": "^7.28.5",
41
41
  "@cucumber/gherkin": "^37.0.0",
42
42
  "@cucumber/messages": "^31.0.0",
43
- "@sungen/driver-data-factory": "3.2.34-beta.1",
44
- "@sungen/driver-ui": "3.2.34-beta.1",
43
+ "@sungen/driver-data-factory": "3.3.0-alpha.1",
44
+ "@sungen/driver-ui": "3.3.0-alpha.1",
45
45
  "chalk": "^5.6.2",
46
46
  "commander": "^14.0.2",
47
47
  "dotenv": "^17.2.3",
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Anchor grammar and the shared trace vocabulary (DOS-12.1, DOS-12.2; takumi T7).
3
+ *
4
+ * | anchor | example | label |
5
+ * |----------------------------|--------------------------|-------------|
6
+ * | `<docId>#<itemId>` | `SPEC-AUTH-001#A-2` | `EXTRACTED` |
7
+ * | `<docId>#<itemId>/val` | `SPEC-AUTH-001#A-2/val` | `EXTRACTED` |
8
+ * | `sec-<slug>` | `sec-login-form` | `INFERRED` |
9
+ * | duplicate id / fuzzy match | — | `AMBIGUOUS` |
10
+ *
11
+ * docId is the spec frontmatter `id`; itemId is COMPOSED from BM-51 §4.1 (`2.0` under section row
12
+ * `A` → `A-2`). BM-51 has no `VAL-xx` codes: a Validation row is keyed by its item. `screen_id` is
13
+ * metadata and never part of an anchor. Every anchor is cited as `repo@SHA:path#Lx-Ly`.
14
+ */
15
+ import { createHash } from 'crypto';
16
+
17
+ export type AnchorKind = 'item' | 'validation' | 'section';
18
+ export type AnchorConfidence = 'EXTRACTED' | 'INFERRED' | 'AMBIGUOUS';
19
+
20
+ /** Score band per label (takumi confidence taxonomy): inclusive lower, inclusive upper. */
21
+ export const CONFIDENCE_BANDS: Record<AnchorConfidence, readonly [number, number]> = {
22
+ EXTRACTED: [0.9, 1],
23
+ INFERRED: [0.5, 0.89],
24
+ AMBIGUOUS: [0, 0.49],
25
+ };
26
+
27
+ const DOC_ID = '[A-Z][A-Z0-9]*(?:-[A-Z0-9]+)+';
28
+ const ITEM_ID = '[A-Z]+-\\d+(?:\\.\\d+)?';
29
+ const ITEM_ANCHOR_RE = new RegExp(`^(${DOC_ID})#(${ITEM_ID})(/val)?$`);
30
+ const SECTION_ANCHOR_RE = /^sec-[a-z0-9]+(?:-[a-z0-9]+)*$/;
31
+ const CITATION_RE = /^([^@\s]+)@([^:\s]+):([^#\s]+)#L(\d+)-L(\d+)$/;
32
+
33
+ export interface ParsedAnchorId { kind: AnchorKind; docId?: string; itemId?: string; slug?: string }
34
+
35
+ export function parseAnchorId(id: string): ParsedAnchorId | null {
36
+ const item = ITEM_ANCHOR_RE.exec(id);
37
+ if (item) return { kind: item[3] ? 'validation' : 'item', docId: item[1], itemId: item[2] };
38
+ if (SECTION_ANCHOR_RE.test(id)) return { kind: 'section', slug: id.slice(4) };
39
+ return null;
40
+ }
41
+
42
+ export function isItemAnchorId(id: string): boolean {
43
+ return ITEM_ANCHOR_RE.test(id);
44
+ }
45
+
46
+ export function isDocId(id: string): boolean {
47
+ return new RegExp(`^${DOC_ID}$`).test(id);
48
+ }
49
+
50
+ export function itemAnchorId(docId: string, itemId: string, validation = false): string {
51
+ return `${docId}#${itemId}${validation ? '/val' : ''}`;
52
+ }
53
+
54
+ /**
55
+ * BM-51 §4.1 numbers items `1.0, 2.0 …` under a bold section row; the composed id drops the `.0`
56
+ * (`2.0` under `A` → `A-2`) and keeps a real sub-number (`2.1` → `A-2.1`). No section → null.
57
+ */
58
+ export function composeItemId(section: string | null, itemNumber: string): string | null {
59
+ if (!section || !/^[A-Z]+$/.test(section)) return null;
60
+ const n = itemNumber.trim().replace(/\.0+$/, '');
61
+ return /^\d+(?:\.\d+)?$/.test(n) ? `${section}-${n}` : null;
62
+ }
63
+
64
+ /** `sec-<slug>` from a heading: accents folded, ASCII kebab-case; a script with no ASCII gets a hash. */
65
+ export function sectionAnchorId(heading: string): string {
66
+ const slug = heading.normalize('NFKD').replace(/\p{M}/gu, '').replace(/[đĐ]/g, 'd').toLowerCase()
67
+ .replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
68
+ return `sec-${slug || createHash('sha1').update(heading).digest('hex').slice(0, 8)}`;
69
+ }
70
+
71
+ export interface CitationBase { repo: string; sha: string; path: string }
72
+
73
+ export function formatCitation(base: CitationBase, startLine: number, endLine: number): string {
74
+ return `${base.repo}@${base.sha}:${base.path.replace(/\\/g, '/')}#L${startLine}-L${endLine}`;
75
+ }
76
+
77
+ export function parseCitation(s: string): (CitationBase & { start: number; end: number }) | null {
78
+ const m = CITATION_RE.exec(s);
79
+ if (!m) return null;
80
+ const start = Number(m[4]);
81
+ const end = Number(m[5]);
82
+ return start >= 1 && end >= start ? { repo: m[1], sha: m[2], path: m[3], start, end } : null;
83
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Hash by anchor kind (DOS-12.3, red-team #1).
3
+ *
4
+ * | anchor kind | hash | why |
5
+ * |------------------------------|-------------|----------------------------------------------------------|
6
+ * | section `sec-<slug>` (legacy) | `sha1-12` | every manifest already on disk holds these; a new algorithm would read "changed" everywhere |
7
+ * | item `<docId>#<itemId>` | `sha256-12` | new in schema 2, so nothing old depends on it |
8
+ *
9
+ * `sectionHash` is the exact computation the manifest has always used: sha1 over the section
10
+ * body joined with LF and trimmed, first 12 hex. Do not "improve" it.
11
+ */
12
+ import { createHash } from 'crypto';
13
+
14
+ export type HashAlgo = 'sha1-12' | 'sha256-12';
15
+
16
+ export function sectionHash(bodyLines: string[]): string {
17
+ return createHash('sha1').update(bodyLines.join('\n').trim()).digest('hex').slice(0, 12);
18
+ }
19
+
20
+ /** One table row as compared: cells trimmed, inner whitespace collapsed, joined by `|`. */
21
+ export function normalizeRow(cells: string[]): string {
22
+ return cells.map((c) => c.normalize('NFC').replace(/\s+/g, ' ').trim()).join('|');
23
+ }
24
+
25
+ export function itemRowHash(cells: string[]): string {
26
+ return createHash('sha256').update(normalizeRow(cells)).digest('hex').slice(0, 12);
27
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Read the BM-51 screen-spec tables that carry item ids (company standard, DOS-12.0).
3
+ *
4
+ * `reports/mng/specs/_templates/BM-2-901-51-screen-specification-template.md`:
5
+ * §4.1 Item `| ID | Item Name | Item Type | Required | Note |` — bold section row `A`, then `1.0`, `2.0` …
6
+ * §4.2 Validation `| ID | Type | Min | Max | Default | … |` — rows keyed by the composed id `A-2`
7
+ * §4.3 Data Mapping `| ID | Data Source | API ID | … |` — same key
8
+ * §5 Event `| ID | Given (Pre-condition) | … |` — same key, or `-`
9
+ *
10
+ * Tables are recognised by their header (first column `ID` plus the second column's name), not by
11
+ * heading numbers, so a translated heading still reads. Rows keep their 1-based source line.
12
+ */
13
+ import { composeItemId } from './anchor-grammar';
14
+
15
+ export type Bm51TableKind = 'item' | 'validation' | 'mapping' | 'event';
16
+
17
+ export interface Bm51Row { table: Bm51TableKind; cells: string[]; id: string; line: number }
18
+ export interface Bm51ItemRow extends Bm51Row { section: string | null; itemId: string | null }
19
+ export interface Bm51Tables { items: Bm51ItemRow[]; validations: Bm51Row[]; mappings: Bm51Row[]; events: Bm51Row[] }
20
+
21
+ const SEPARATOR = /^\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)*\|?\s*$/;
22
+ const COMPOSED_ID = /^[A-Z]+-\d+(?:\.\d+)?$/;
23
+
24
+ function splitRow(line: string): string[] {
25
+ const body = line.trim().replace(/^\|/, '').replace(/\|$/, '');
26
+ return body.split(/(?<!\\)\|/).map((c) => c.replace(/\\\|/g, '|').trim());
27
+ }
28
+ const bare = (cell: string): string => cell.replace(/\*\*|__|`/g, '').trim();
29
+
30
+ function kindOf(header: string[]): Bm51TableKind | null {
31
+ if (bare(header[0] ?? '').toUpperCase() !== 'ID') return null;
32
+ const second = bare(header[1] ?? '').toLowerCase();
33
+ if (second === 'item name') return 'item';
34
+ if (second === 'type') return 'validation';
35
+ if (second === 'data source') return 'mapping';
36
+ if (second.startsWith('given')) return 'event';
37
+ return null;
38
+ }
39
+
40
+ /** `lines` are the spec's lines; `firstLine` is the 1-based number of `lines[0]`. */
41
+ export function readBm51Tables(lines: string[], firstLine = 1): Bm51Tables {
42
+ const out: Bm51Tables = { items: [], validations: [], mappings: [], events: [] };
43
+ for (let i = 0; i < lines.length - 1; i++) {
44
+ if (!lines[i].trim().startsWith('|') || !SEPARATOR.test(lines[i + 1].trim())) continue;
45
+ const kind = kindOf(splitRow(lines[i]));
46
+ let j = i + 2;
47
+ let section: string | null = null;
48
+ for (; j < lines.length && lines[j].trim().startsWith('|'); j++) {
49
+ if (!kind) continue;
50
+ const cells = splitRow(lines[j]);
51
+ const id = bare(cells[0] ?? '');
52
+ const line = firstLine + j;
53
+ if (kind === 'item') {
54
+ if (/^[A-Z]+$/.test(id)) { section = id; continue; }
55
+ if (!/^\d+(?:\.\d+)?$/.test(id)) continue;
56
+ out.items.push({ table: kind, cells, id, line, section, itemId: composeItemId(section, id) });
57
+ } else if (COMPOSED_ID.test(id)) {
58
+ const row: Bm51Row = { table: kind, cells, id, line };
59
+ (kind === 'validation' ? out.validations : kind === 'mapping' ? out.mappings : out.events).push(row);
60
+ }
61
+ }
62
+ i = j - 1;
63
+ }
64
+ return out;
65
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Every anchor a `spec.md` offers, with its hash, confidence label and citation (DOS-12.1 – 12.3).
3
+ *
4
+ * section `sec-<slug>` sha1-12 of the section body (the manifest's hash) INFERRED
5
+ * item `<docId>#<itemId>` sha256-12 of the normalized §4.1 row EXTRACTED
6
+ * val `<docId>#<itemId>/val` sha256-12 of the normalized §4.2 row EXTRACTED
7
+ * a duplicate id, or a §4.2 row naming no §4.1 item AMBIGUOUS
8
+ *
9
+ * A §4.3 / §5 row naming no §4.1 item is reported in `orphans` (AMBIGUOUS, not an error). Item
10
+ * anchors need a docId (frontmatter `id`); without one only section anchors exist. Pointers and
11
+ * hashes only — no spec text leaves this function (red-team #14).
12
+ */
13
+ import { AnchorConfidence, AnchorKind, CitationBase, formatCitation, itemAnchorId, sectionAnchorId } from './anchor-grammar';
14
+ import { HashAlgo, itemRowHash, sectionHash } from './anchor-hash';
15
+ import { readBm51Tables } from './bm51-tables';
16
+ import { normalizeSectionName, readSpecSectionBlocks } from './spec-sections';
17
+ import { readSpecFrontmatter, SpecFrontmatter } from './spec-frontmatter';
18
+
19
+ export interface SourceAnchor {
20
+ id: string;
21
+ kind: AnchorKind;
22
+ confidence: AnchorConfidence;
23
+ hash: string;
24
+ hashAlgo: HashAlgo;
25
+ location: string;
26
+ /** Why the label is AMBIGUOUS. */
27
+ note?: string;
28
+ }
29
+
30
+ export interface OrphanReference { table: 'mapping' | 'event'; itemId: string; location: string; confidence: 'AMBIGUOUS' }
31
+
32
+ export interface SpecAnchors {
33
+ frontmatter: SpecFrontmatter;
34
+ anchors: SourceAnchor[];
35
+ orphans: OrphanReference[];
36
+ problems: string[];
37
+ }
38
+
39
+ /** Mark every anchor whose id occurs more than once as AMBIGUOUS — a human must pick. */
40
+ function flagDuplicates(anchors: SourceAnchor[]): void {
41
+ const count = new Map<string, number>();
42
+ for (const a of anchors) count.set(a.id, (count.get(a.id) ?? 0) + 1);
43
+ for (const a of anchors) {
44
+ if ((count.get(a.id) ?? 0) > 1) { a.confidence = 'AMBIGUOUS'; a.note = 'duplicate id'; }
45
+ }
46
+ }
47
+
48
+ export function extractSpecAnchors(text: string, citation: CitationBase): SpecAnchors {
49
+ const lines = text.replace(/^/, '').replace(/\r\n?/g, '\n').split('\n');
50
+ const fm = readSpecFrontmatter(text, citation.path);
51
+ const problems = [...fm.problems];
52
+ const cite = (start: number, end: number): string => formatCitation(citation, start, end);
53
+
54
+ const sections: SourceAnchor[] = readSpecSectionBlocks(lines).map((s) => ({
55
+ id: sectionAnchorId(normalizeSectionName(s.name)),
56
+ kind: 'section',
57
+ confidence: 'INFERRED',
58
+ hash: sectionHash(s.body),
59
+ hashAlgo: 'sha1-12',
60
+ location: cite(s.headingIndex + 1, s.headingIndex + 1 + s.body.length),
61
+ }));
62
+ flagDuplicates(sections);
63
+
64
+ const docId = fm.frontmatter.id;
65
+ const tables = readBm51Tables(lines);
66
+ const items: SourceAnchor[] = [];
67
+ const orphans: OrphanReference[] = [];
68
+ if (!docId) {
69
+ if (tables.items.length) problems.push(`${citation.path}: a BM-51 item table is present but the frontmatter has no id; no item anchors`);
70
+ return { frontmatter: fm.frontmatter, anchors: sections, orphans, problems };
71
+ }
72
+
73
+ for (const row of tables.items) {
74
+ if (!row.itemId) { problems.push(`${citation.path}:${row.line}: item ${row.id} has no section row above it; skipped`); continue; }
75
+ items.push({ id: itemAnchorId(docId, row.itemId), kind: 'item', confidence: 'EXTRACTED', hash: itemRowHash(row.cells), hashAlgo: 'sha256-12', location: cite(row.line, row.line) });
76
+ }
77
+ flagDuplicates(items);
78
+ const known = new Set(tables.items.map((r) => r.itemId).filter(Boolean));
79
+
80
+ const vals: SourceAnchor[] = tables.validations.map((row) => ({
81
+ id: itemAnchorId(docId, row.id, true),
82
+ kind: 'validation',
83
+ confidence: known.has(row.id) ? 'EXTRACTED' : 'AMBIGUOUS',
84
+ hash: itemRowHash(row.cells),
85
+ hashAlgo: 'sha256-12',
86
+ location: cite(row.line, row.line),
87
+ ...(known.has(row.id) ? {} : { note: 'no §4.1 item with this id' }),
88
+ }));
89
+ flagDuplicates(vals);
90
+
91
+ for (const row of [...tables.mappings, ...tables.events]) {
92
+ if (!known.has(row.id)) orphans.push({ table: row.table as 'mapping' | 'event', itemId: row.id, location: cite(row.line, row.line), confidence: 'AMBIGUOUS' });
93
+ }
94
+ return { frontmatter: fm.frontmatter, anchors: [...items, ...vals, ...sections], orphans, problems };
95
+ }
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Write-ahead sentinel for migrations and re-baselines (takumi T6, DOS-13.6).
3
+ *
4
+ * Before a migration writes anything it records `.sungen/migrations/<slug>.pending.json`: every
5
+ * file it will touch plus a copy of each one's current bytes (or "did not exist"). The sentinel is
6
+ * deleted when the migration completes. An error inside the migration rolls the copies back at
7
+ * once; only a process that DIES mid-migration leaves the sentinel behind — and then the next run
8
+ * stops and asks a human for REVERT (restore every copy byte for byte) or KEEP (keep the new
9
+ * files). It never continues silently. (Reference: reports/takumi/docs/system-architecture.md:656-677.)
10
+ *
11
+ * A sentinel carries pid, host and startedAt. While its writer is alive on this host and it is under a
12
+ * minute old, another run is simply migrating: the answer is "retry", not a REVERT/KEEP prompt. Only a
13
+ * dead writer or an old sentinel is an interrupted migration. One slug per unit covers both writers:
14
+ * the waiver import (DOS-13.5) and the manifest upgrade to schema 2 on save (DOS-12.3).
15
+ */
16
+ import * as fs from 'fs';
17
+ import * as os from 'os';
18
+ import * as path from 'path';
19
+ import { createFileExclusive } from '../decisions/exclusive-file-create';
20
+
21
+ export interface SentinelFile { path: string; existed: boolean; contentBase64?: string }
22
+ export interface PendingMigration {
23
+ schema: 1; unit: string; slug: string; reason: string; startedAt: string; pid?: number; host?: string; files: SentinelFile[];
24
+ }
25
+ export type MigrationChoice = 'REVERT' | 'KEEP';
26
+ export const IN_PROGRESS_WINDOW_MS = 60_000;
27
+
28
+ export function sentinelPath(projectRoot: string, slug: string): string {
29
+ return path.join(projectRoot, '.sungen', 'migrations', `${slug}.pending.json`);
30
+ }
31
+
32
+ export class PendingMigrationError extends Error {
33
+ constructor(public readonly unit: string, public readonly slug: string, public readonly file: string, detail: string) {
34
+ super(
35
+ `An interrupted migration left ${file} (${detail}).\n`
36
+ + ' Nothing continues until a human chooses: REVERT restores every file it lists byte for byte;\n'
37
+ + ` KEEP keeps the new files. Run in a terminal and answer the prompt: sungen journey --screen ${unit}`,
38
+ );
39
+ this.name = 'PendingMigrationError';
40
+ }
41
+ }
42
+
43
+ /** The sentinel, or null when there is none. An unreadable sentinel still exists: `files` is then empty. */
44
+ export function readPendingMigration(projectRoot: string, slug: string): (PendingMigration & { readable: boolean }) | null {
45
+ const p = sentinelPath(projectRoot, slug);
46
+ if (!fs.existsSync(p)) return null;
47
+ try {
48
+ const raw = JSON.parse(fs.readFileSync(p, 'utf8')) as PendingMigration;
49
+ if (raw && raw.schema === 1 && Array.isArray(raw.files)) return { ...raw, readable: true };
50
+ } catch { /* fall through: a sentinel that cannot be read is still a stop sign */ }
51
+ return { schema: 1, unit: slug, slug, reason: 'unreadable sentinel', startedAt: '?', files: [], readable: false };
52
+ }
53
+
54
+ export class MigrationInProgressError extends Error {
55
+ constructor(public readonly unit: string, detail: string) {
56
+ super(`Another sungen run is migrating ${unit} right now (${detail}). Retry in a moment — nothing was changed.`);
57
+ this.name = 'MigrationInProgressError';
58
+ }
59
+ }
60
+
61
+ function pidAlive(pid: unknown): boolean {
62
+ if (typeof pid !== 'number' || !Number.isInteger(pid) || pid <= 0) return false;
63
+ try { process.kill(pid, 0); return true; } catch (e) { return (e as NodeJS.ErrnoException).code === 'EPERM'; }
64
+ }
65
+
66
+ /** in-progress: under a minute old and written by a process alive on this host (another host cannot be checked). */
67
+ export function pendingMigrationState(p: PendingMigration & { readable: boolean }): 'in-progress' | 'interrupted' {
68
+ if (!p.readable) return 'interrupted';
69
+ const age = Date.now() - Date.parse(p.startedAt);
70
+ if (!(age >= 0 && age < IN_PROGRESS_WINDOW_MS)) return 'interrupted';
71
+ if (p.host !== os.hostname()) return 'in-progress';
72
+ return pidAlive(p.pid) ? 'in-progress' : 'interrupted';
73
+ }
74
+
75
+ function pendingError(projectRoot: string, slug: string, pending: PendingMigration & { readable: boolean }): Error {
76
+ if (pendingMigrationState(pending) === 'in-progress') {
77
+ const age = Math.round((Date.now() - Date.parse(pending.startedAt)) / 1000);
78
+ return new MigrationInProgressError(pending.unit, `pid ${pending.pid} on ${pending.host}, started ${age}s ago: ${pending.reason}`);
79
+ }
80
+ const rel = path.relative(projectRoot, sentinelPath(projectRoot, slug));
81
+ return new PendingMigrationError(pending.unit, slug, rel, `started ${pending.startedAt}: ${pending.reason}`);
82
+ }
83
+
84
+ /** Throws MigrationInProgressError (retry) or PendingMigrationError (REVERT/KEEP) when a sentinel exists. */
85
+ export function assertNoPendingMigration(projectRoot: string, slug: string): void {
86
+ const pending = readPendingMigration(projectRoot, slug);
87
+ if (pending) throw pendingError(projectRoot, slug, pending);
88
+ }
89
+
90
+ /** A sentinel path must stay inside the project — it is data read back from disk. */
91
+ function inside(projectRoot: string, rel: string): string {
92
+ const abs = path.resolve(projectRoot, rel);
93
+ const back = path.relative(path.resolve(projectRoot), abs);
94
+ if (path.isAbsolute(rel) || back === '' || back.startsWith('..') || path.isAbsolute(back)) {
95
+ throw new Error(`refusing to restore "${rel}": outside the project`);
96
+ }
97
+ return abs;
98
+ }
99
+
100
+ /** Bytes, not text: REVERT must restore a file exactly, whatever its encoding. Tmp + rename = atomic. */
101
+ function writeBytesAtomic(abs: string, bytes: Buffer): void {
102
+ const tmp = `${abs}.tmp-${process.pid}`;
103
+ try {
104
+ fs.writeFileSync(tmp, bytes);
105
+ fs.renameSync(tmp, abs);
106
+ } catch (err) {
107
+ fs.rmSync(tmp, { force: true });
108
+ throw err;
109
+ }
110
+ }
111
+
112
+ function restore(projectRoot: string, files: SentinelFile[]): string[] {
113
+ const done: string[] = [];
114
+ for (const f of files) {
115
+ const abs = inside(projectRoot, f.path);
116
+ if (f.existed) {
117
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
118
+ writeBytesAtomic(abs, Buffer.from(f.contentBase64 ?? '', 'base64'));
119
+ } else {
120
+ fs.rmSync(abs, { force: true });
121
+ }
122
+ done.push(f.path);
123
+ }
124
+ return done;
125
+ }
126
+
127
+ /**
128
+ * Run `write` under a sentinel covering `files` (absolute paths). The sentinel is written atomically
129
+ * before `write` starts and removed after it returns. If `write` throws, the copies are restored and
130
+ * the sentinel removed before the error is rethrown; a failed rollback leaves the sentinel in place.
131
+ */
132
+ export function withMigrationSentinel<T>(
133
+ projectRoot: string, unit: string, slug: string, reason: string, files: string[], write: () => T,
134
+ ): T {
135
+ assertNoPendingMigration(projectRoot, slug);
136
+ const snapshot: SentinelFile[] = files.map((abs) => {
137
+ const rel = path.relative(projectRoot, abs).split(path.sep).join('/');
138
+ inside(projectRoot, rel);
139
+ return fs.existsSync(abs)
140
+ ? { path: rel, existed: true, contentBase64: fs.readFileSync(abs).toString('base64') }
141
+ : { path: rel, existed: false };
142
+ });
143
+ const p = sentinelPath(projectRoot, slug);
144
+ fs.mkdirSync(path.dirname(p), { recursive: true });
145
+ const pending: PendingMigration = {
146
+ schema: 1, unit, slug, reason, startedAt: new Date().toISOString(), pid: process.pid, host: os.hostname(), files: snapshot,
147
+ };
148
+ // Exclusive: a second migration of the same unit racing this one cannot also believe it holds it.
149
+ if (!createFileExclusive(p, `${JSON.stringify(pending, null, 2)}\n`)) {
150
+ const holder = readPendingMigration(projectRoot, slug);
151
+ throw holder ? pendingError(projectRoot, slug, holder) : new MigrationInProgressError(unit, 'it just finished');
152
+ }
153
+ let result: T;
154
+ try {
155
+ result = write();
156
+ } catch (err) {
157
+ restore(projectRoot, snapshot); // throws → the sentinel stays: the next run asks REVERT/KEEP
158
+ fs.rmSync(p, { force: true });
159
+ throw err;
160
+ }
161
+ fs.rmSync(p, { force: true });
162
+ return result;
163
+ }
164
+
165
+ /** Answer a leftover sentinel. REVERT restores every listed file exactly; KEEP only removes the sentinel. */
166
+ export function resolvePendingMigration(projectRoot: string, slug: string, choice: MigrationChoice): string[] {
167
+ const pending = readPendingMigration(projectRoot, slug);
168
+ if (!pending) return [];
169
+ if (choice === 'REVERT' && !pending.readable) {
170
+ throw new Error(`${sentinelPath(projectRoot, slug)} cannot be read, so there is nothing to restore from — choose KEEP.`);
171
+ }
172
+ const restored = choice === 'REVERT' ? restore(projectRoot, pending.files) : [];
173
+ fs.rmSync(sentinelPath(projectRoot, slug), { force: true });
174
+ return restored;
175
+ }