@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,111 @@
1
+ /**
2
+ * The decision checks `sungen delivery` runs before it writes anything (OES-11.3–11.6):
3
+ *
4
+ * hard, block a decision in reach that does not verify or a committed one edited/deleted
5
+ * (decision.id-reuse / decision.mutated); a rejected override (gate.override-rejected);
6
+ * a decision recorded during the run (decision.in-run) — unless a human accepts it
7
+ * on a TTY with `--accept-in-run`
8
+ * no trusted no audit report, or one that does not count (stale, invalid, verdict-mismatch):
9
+ * audit a real delivery stops and asks for `sungen audit` (owner decision 2026-10-22);
10
+ * `--preview` / `--check` go on with a warning — the caller decides (`untrustedAudits`)
11
+ * It also hands each target its gate rules (catalog + overrides) for the matrix gates, and the
12
+ * override rows the XLSX may show. With no decision in reach nothing here changes the delivery.
13
+ */
14
+ import { checkDecisionIntegrity, DecisionFinding } from '../../decisions/decision-integrity-check';
15
+ import { PROJECT_SCOPE } from '../../decisions/decision-file';
16
+ import { auditCounts, verifyAuditReport } from './audit-report-verification';
17
+ import { GateOverrideReport, gateOverrideReports, gateOverrideSummaryLine, InRunAcceptance } from './gate-override-report';
18
+ import { unitsCoveredByScope } from './gate-override-scope';
19
+ import { committedDecisionPaths, hasInRunKindDecisions, inRunDecisions, InRunDecision, IN_RUN_RULE, runStartOf } from './in-run-decision-check';
20
+ import { resolveRule, trackGateRules, TrackedGateRules } from './resolve-rule';
21
+ import { loadUnitGateOverrides, unitScopeOfDir, UnitGateOverrides } from './unit-gate-overrides';
22
+
23
+ export interface DeliveryUnitRef { label: string; unitName: string; unitDir: string; resultsPath: string | null }
24
+
25
+ interface UnitState {
26
+ ref: DeliveryUnitRef;
27
+ /** Every delivered run of the unit (one per feature file); a decision after ANY of their starts is in-run. */
28
+ resultsPaths: Array<string | null>;
29
+ overrides: UnitGateOverrides;
30
+ rules: TrackedGateRules;
31
+ auditTriggered: Set<string>;
32
+ }
33
+
34
+ export interface DeliveryDecisionGate {
35
+ blocking: string[];
36
+ /** Units with no trusted audit — a real delivery stops on them, --preview / --check warn. */
37
+ untrustedAudits: string[];
38
+ notes: string[];
39
+ inRun: Array<InRunDecision & { unit: string }>;
40
+ /** The unit's tracked gate rules, for the matrix gates of its targets. */
41
+ rulesFor(unitDir: string): TrackedGateRules | undefined;
42
+ /** Every override touching the unit, with what changed an outcome (audit or matrix). */
43
+ overridesFor(unitDir: string): GateOverrideReport[];
44
+ summaryLines(): string[];
45
+ /** Set when a human accepted the in-run decisions on a terminal (--accept-in-run) — goes into the deliverable. */
46
+ acceptedInRun?: InRunAcceptance;
47
+ }
48
+
49
+ const reachOf = (scope: string | null): string[] => [`qa/decisions/`, ...(scope ? [`qa/${scope}/decisions/`] : [])];
50
+
51
+ export function evaluateDeliveryDecisions(projectRoot: string, refs: DeliveryUnitRef[]): DeliveryDecisionGate {
52
+ const blocking: string[] = [];
53
+ const untrustedAudits: string[] = [];
54
+ const notes: string[] = [];
55
+ const inRun: DeliveryDecisionGate['inRun'] = [];
56
+ const units = new Map<string, UnitState>();
57
+ for (const ref of refs) {
58
+ const known = units.get(ref.unitDir);
59
+ if (known) { known.resultsPaths.push(ref.resultsPath); continue; }
60
+ const overrides = loadUnitGateOverrides(projectRoot, unitScopeOfDir(projectRoot, ref.unitDir));
61
+ const audit = verifyAuditReport(projectRoot, ref.unitName);
62
+ const auditTriggered = new Set(auditCounts(audit) && Array.isArray(audit.report?.gateOverrides)
63
+ ? (audit.report!.gateOverrides as GateOverrideReport[]).filter((g) => g?.triggered).map((g) => g.rule) : []);
64
+ units.set(ref.unitDir, { ref, resultsPaths: [ref.resultsPath], overrides, rules: trackGateRules(overrides.context), auditTriggered });
65
+ for (const r of overrides.rejected) blocking.push(`${ref.label}: gate.override-rejected — ${r.decisionId} (${r.path}): ${r.reason}`);
66
+ if (!auditCounts(audit)) {
67
+ const why = audit.state === 'absent' ? 'no audit report' : `the audit is ${audit.state === 'stale' ? 'stale' : 'not trusted'}: ${audit.problems.map((p) => p.message).join('; ')}`;
68
+ const flag = /[\\/]qa[\\/]api[\\/]/.test(ref.unitDir) ? '--api' : '--screen';
69
+ untrustedAudits.push(`${ref.label}: ${why} — re-run \`sungen audit ${flag} ${ref.unitName}\``);
70
+ }
71
+ for (const n of audit.notes) notes.push(`${ref.label}: ${n}`);
72
+ }
73
+
74
+ const reach = new Set([...units.values()].flatMap((u) => reachOf(u.overrides.unitScope)));
75
+ const integrity: DecisionFinding[] = checkDecisionIntegrity(projectRoot).filter((f) => [...reach].some((r) => f.path.startsWith(r)));
76
+ for (const f of integrity) if (resolveRule(f.rule).blocking) blocking.push(`${f.rule} — ${f.path}: ${f.message}`);
77
+
78
+ const committed = committedDecisionPaths(projectRoot);
79
+ for (const u of units.values()) {
80
+ const scopes = [PROJECT_SCOPE, ...(u.overrides.unitScope ? [u.overrides.unitScope] : [])];
81
+ const starts = u.resultsPaths.map(runStartOf).filter((t): t is string => !!t).sort((x, y) => Date.parse(x) - Date.parse(y));
82
+ const runStart = starts[0] ?? null;
83
+ if (!committed && hasInRunKindDecisions(projectRoot, scopes)) {
84
+ notes.push(runStart
85
+ ? `${u.ref.label}: no git repository — ${IN_RUN_RULE} is judged by the run start time only (lower confidence)`
86
+ : `${u.ref.label}: no git repository and no run results — ${IN_RUN_RULE} cannot be judged for its decisions`);
87
+ }
88
+ for (const d of inRunDecisions(projectRoot, scopes, runStart, committed)) {
89
+ if (!inRun.some((x) => x.id === d.id)) inRun.push({ ...d, unit: u.ref.label });
90
+ }
91
+ }
92
+
93
+ const reportsFor = (u: UnitState): GateOverrideReport[] =>
94
+ gateOverrideReports(u.overrides, new Set([...u.auditTriggered, ...u.rules.triggered()]));
95
+ return {
96
+ blocking,
97
+ untrustedAudits,
98
+ notes,
99
+ inRun,
100
+ rulesFor: (dir) => units.get(dir)?.rules,
101
+ overridesFor: (dir) => { const u = units.get(dir); return u ? reportsFor(u) : []; },
102
+ summaryLines: () => [...units.values()]
103
+ .map((u) => gateOverrideSummaryLine(u.ref.label, reportsFor(u), (scope) => unitsCoveredByScope(projectRoot, scope)))
104
+ .filter((l): l is string => !!l),
105
+ };
106
+ }
107
+
108
+ /** The in-run decisions, one line each, for the refusal or the TTY confirmation. */
109
+ export function inRunLines(inRun: DeliveryDecisionGate['inRun']): string[] {
110
+ return inRun.map((d) => `${d.unit}: ${d.kind} ${d.id} (${d.path}) — ${d.why.join('; ')}`);
111
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The `sungen delivery` step for decisions (OES-11.5): evaluate, print, and either stop or go.
3
+ * In-run decisions stop the delivery unless a human passes `--accept-in-run` AND confirms on a TTY
4
+ * (DOS-13.4) — without a TTY the refusal prints the exact command for a human to run.
5
+ */
6
+ import { gitUserName } from '../../decisions/decision-source';
7
+ import { ConfirmationIO, formatCommand, HumanConfirmationRefused, requireTypedConfirmation } from '../../decisions/human-confirmation';
8
+ import { DeliveryDecisionGate, DeliveryUnitRef, evaluateDeliveryDecisions, inRunLines } from './delivery-decision-gate';
9
+ import { IN_RUN_RULE } from './in-run-decision-check';
10
+
11
+ export interface DeliveryDecisionStepInput {
12
+ projectRoot: string;
13
+ refs: DeliveryUnitRef[];
14
+ acceptInRun: boolean;
15
+ /** The delivery command line to print for a human, without `--accept-in-run`. */
16
+ argv: string[];
17
+ io: ConfirmationIO;
18
+ log: (line: string) => void;
19
+ /** A real export needs a trusted audit per unit (owner decision 2026-10-22); false for --preview / --check. */
20
+ requireTrustedAudit: boolean;
21
+ }
22
+
23
+ /** The gate when the delivery may proceed; null when it must stop (already explained on `log`). */
24
+ export async function runDeliveryDecisionStep(i: DeliveryDecisionStepInput): Promise<DeliveryDecisionGate | null> {
25
+ const gate = evaluateDeliveryDecisions(i.projectRoot, i.refs);
26
+ for (const n of gate.notes) i.log(` · ${n}`);
27
+ if (gate.blocking.length) {
28
+ i.log(`✗ Delivery blocked by ${gate.blocking.length} decision problem(s) (hard rules):`);
29
+ for (const b of gate.blocking) i.log(` - ${b}`);
30
+ return null;
31
+ }
32
+ if (gate.untrustedAudits.length) {
33
+ i.log(i.requireTrustedAudit
34
+ ? `✗ Delivery blocked — ${gate.untrustedAudits.length} unit(s) without a trusted audit (a delivery stands on an audit that matches today's suite):`
35
+ : `⚠ Rendering ${gate.untrustedAudits.length} unit(s) without a trusted audit — a draft, not an official delivery:`);
36
+ for (const u of gate.untrustedAudits) i.log(` - ${u}`);
37
+ if (i.requireTrustedAudit) {
38
+ i.log(' Or render a watermarked draft with --preview.');
39
+ return null;
40
+ }
41
+ }
42
+ if (gate.inRun.length === 0) return gate;
43
+ const acceptCommand = formatCommand([...i.argv, '--accept-in-run']);
44
+ if (!i.acceptInRun) {
45
+ i.log(`✗ Delivery blocked — ${gate.inRun.length} decision(s) recorded during the run (${IN_RUN_RULE}, hard):`);
46
+ for (const l of inRunLines(gate.inRun)) i.log(` - ${l}`);
47
+ i.log(' Commit them through review and re-run the tests, or have a human accept them on a terminal:');
48
+ i.log(` ${acceptCommand}`);
49
+ return null;
50
+ }
51
+ try {
52
+ await requireTypedConfirmation({
53
+ what: `deliver with ${gate.inRun.length} decision(s) recorded during the run (${IN_RUN_RULE})`,
54
+ phrase: 'accept-in-run',
55
+ command: acceptCommand,
56
+ summary: [...inRunLines(gate.inRun), `accepted by: ${gitUserName(i.projectRoot)}`],
57
+ io: i.io,
58
+ });
59
+ } catch (err) {
60
+ if (!(err instanceof HumanConfirmationRefused)) throw err;
61
+ i.log(`✗ ${err.message}`);
62
+ return null;
63
+ }
64
+ const by = gitUserName(i.projectRoot);
65
+ i.log(` ✓ ${gate.inRun.length} in-run decision(s) accepted by ${by} on a terminal.`);
66
+ // Persisted into the deliverable's manifest (L5): who, when, which — internal ones only counted.
67
+ gate.acceptedInRun = {
68
+ by, at: new Date().toISOString(),
69
+ ids: gate.inRun.filter((d) => d.visibility === 'client').map((d) => d.id),
70
+ internalCount: gate.inRun.filter((d) => d.visibility !== 'client').length,
71
+ };
72
+ return gate;
73
+ }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * How gate overrides are SHOWN (OES-11.6, red-team #14): `audit.json` `gateOverrides[]`, the
3
+ * delivery's one-line summary, the XLSX "Gate overrides" sheet and the CSV manifest line, with the
4
+ * `PASS (overridden)` status. A `visibility: internal` decision is counted everywhere and exported
5
+ * nowhere (XLSX/CSV) — not even its id.
6
+ */
7
+ import { GateSeverity, findGateRule } from './gate-rule-catalog';
8
+ import { OverrideIssue, UnitGateOverrides } from './unit-gate-overrides';
9
+ import { ActiveOverride } from './resolve-rule';
10
+
11
+ export type GateOverrideStatus = 'applied' | 'ineffective' | 'rejected';
12
+
13
+ export interface GateOverrideReport {
14
+ decisionId: string;
15
+ rule: string;
16
+ severity: string;
17
+ catalogSeverity: GateSeverity | null;
18
+ scope: string;
19
+ reason: string;
20
+ visibility: 'internal' | 'client';
21
+ by: string;
22
+ validFrom: string;
23
+ status: GateOverrideStatus;
24
+ /** An applied override that changed an outcome here (it lowered a condition that was met). */
25
+ triggered: boolean;
26
+ /** In git HEAD when this was written; null outside git. False = counted here, refused at release. */
27
+ committed: boolean | null;
28
+ detail?: string;
29
+ }
30
+
31
+ const fromActive = (o: ActiveOverride, triggered: boolean): GateOverrideReport => ({
32
+ decisionId: o.decisionId, rule: o.rule, severity: o.severity, catalogSeverity: findGateRule(o.rule)?.severity ?? null,
33
+ scope: o.scope, reason: o.reason, visibility: o.visibility, by: o.by, validFrom: o.validFrom, status: 'applied', triggered,
34
+ committed: o.committed,
35
+ });
36
+
37
+ function fromIssue(i: OverrideIssue, status: GateOverrideStatus): GateOverrideReport {
38
+ const p = (i.entry.payload ?? {}) as Record<string, unknown>;
39
+ const rule = typeof p.rule === 'string' ? p.rule : String(p.rule ?? '');
40
+ return {
41
+ decisionId: i.decisionId, rule, severity: String(p.severity ?? ''), catalogSeverity: findGateRule(rule)?.severity ?? null,
42
+ scope: String(p.scope ?? ''), reason: i.entry.reason, visibility: i.entry.visibility, by: i.entry.source.by,
43
+ validFrom: i.entry.valid_from, status, triggered: false, committed: i.committed, detail: i.reason,
44
+ };
45
+ }
46
+
47
+ /** Every override that touches the unit, in a stable order: applied, then ineffective, then rejected. */
48
+ export function gateOverrideReports(o: UnitGateOverrides, triggered: ReadonlySet<string>): GateOverrideReport[] {
49
+ return [
50
+ ...o.inForce.map((x) => fromActive(x, triggered.has(x.rule))),
51
+ ...o.ineffective.map((x) => fromIssue(x, 'ineffective')),
52
+ ...o.rejected.map((x) => fromIssue(x, 'rejected')),
53
+ ];
54
+ }
55
+
56
+ /** `PASS (overridden)` when a pass leaned on at least one applied override. */
57
+ export function gateStatusLabel(status: 'PASS' | 'FAIL', reports: GateOverrideReport[]): string {
58
+ return status === 'PASS' && reports.some((r) => r.status === 'applied' && r.triggered) ? 'PASS (overridden)' : status;
59
+ }
60
+
61
+ /** What a deliverable may carry: client-visible rows only, plus how many internal ones were withheld. */
62
+ export function exportableOverrides(reports: GateOverrideReport[]): { rows: GateOverrideReport[]; internalCount: number } {
63
+ return {
64
+ rows: reports.filter((r) => r.visibility === 'client'),
65
+ internalCount: reports.filter((r) => r.visibility !== 'client').length,
66
+ };
67
+ }
68
+
69
+ /**
70
+ * One line for the delivery summary, or null when nothing touches the unit. With `unitsCovered`, each
71
+ * applied glob override also says how many units it reaches (L1) — a glob is easy to underestimate.
72
+ */
73
+ export function gateOverrideSummaryLine(unit: string, reports: GateOverrideReport[], unitsCovered?: (scope: string) => number): string | null {
74
+ if (reports.length === 0) return null;
75
+ const count = (s: GateOverrideStatus) => reports.filter((r) => r.status === s).length;
76
+ const { rows, internalCount } = exportableOverrides(reports);
77
+ const globs = unitsCovered
78
+ ? reports.filter((r) => r.status === 'applied' && /[*?]/.test(r.scope)).map((r) => ` · ${r.decisionId} (${r.scope}) covers ${unitsCovered(r.scope)} units`)
79
+ : [];
80
+ return `${unit}: gate overrides — ${count('applied')} applied (${reports.filter((r) => r.triggered).length} changed an outcome), `
81
+ + `${count('ineffective')} ineffective, ${count('rejected')} rejected · ${rows.length} client-visible, ${internalCount} internal (counted, never exported)`
82
+ + globs.join('');
83
+ }
84
+
85
+ /** Who accepted in-run decisions on a terminal for this delivery (L5) — ids of client-visible ones only. */
86
+ export interface InRunAcceptance { by: string; at: string; ids: string[]; internalCount: number }
87
+
88
+ /** What a matrix deliverable carries about overrides: client rows only, the internal count, and the status. */
89
+ export interface DeliverableGateOverrides {
90
+ status: string;
91
+ rows: GateOverrideReport[];
92
+ internalCount: number;
93
+ acceptedInRun?: InRunAcceptance;
94
+ }
95
+
96
+ /** The XLSX sheet / CSV manifest payload, or undefined when nothing touches the unit (no sheet at all). */
97
+ export function deliverableGateOverrides(reports: GateOverrideReport[], reviewPending: boolean, acceptedInRun?: InRunAcceptance): DeliverableGateOverrides | undefined {
98
+ if (reports.length === 0 && !acceptedInRun) return undefined;
99
+ const { rows, internalCount } = exportableOverrides(reports);
100
+ return {
101
+ status: reviewPending ? 'REVIEW PENDING (draft)' : gateStatusLabel('PASS', reports), rows, internalCount,
102
+ ...(acceptedInRun ? { acceptedInRun } : {}),
103
+ };
104
+ }
105
+
106
+ /** The CSV manifest lines (L4/L5): a CSV-only reader still learns what the delivery leaned on. */
107
+ export function overrideManifestLines(o: DeliverableGateOverrides | undefined): string[] {
108
+ if (!o) return [];
109
+ const rows = o.rows.map((r) => `${r.rule} ${r.catalogSeverity ?? '?'} → ${r.severity} (${r.decisionId}, ${r.scope})`).join('; ');
110
+ const lines = [`# gate overrides: ${o.status}${rows ? ` · ${rows}` : ''} · ${o.internalCount} internal not listed`];
111
+ const a = o.acceptedInRun;
112
+ if (a) lines.push(`# accepted in-run decisions: by ${a.by} at ${a.at}${a.ids.length ? ` — ${a.ids.join(', ')}` : ''}${a.internalCount ? ` (${a.internalCount} internal, ids withheld)` : ''}`);
113
+ return lines;
114
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * The `scope` of a gate override (OES-11.3, red-team #15): one unit, or a glob inside ONE kind.
3
+ *
4
+ * screens/login one unit api/flows/signup one api flow
5
+ * screens/log* every screen whose name matches flows/* every flow
6
+ * ** · screens/** rejected — a switch that turns the gate off for everything
7
+ * * /login · s*s/x rejected — the kind must be literal, so a scope never crosses kinds
8
+ *
9
+ * Only `*` and `?` are glob characters, and neither crosses a `/`; so `api/*` never reaches an api
10
+ * flow (`api/flows/<f>`), which is its own kind.
11
+ */
12
+ import * as fs from 'fs';
13
+ import * as path from 'path';
14
+
15
+ export const OVERRIDE_SCOPE_KINDS =['screens', 'flows', 'api', 'api/flows'] as const;
16
+ export type OverrideScopeKind = typeof OVERRIDE_SCOPE_KINDS[number];
17
+
18
+ export interface OverrideScope {
19
+ kind: OverrideScopeKind;
20
+ unit: string;
21
+ glob: boolean;
22
+ text: string;
23
+ }
24
+
25
+ const UNIT_RE = /^[A-Za-z0-9._*?-]+$/;
26
+
27
+ export function parseOverrideScope(scope: unknown): { scope: OverrideScope } | { error: string } {
28
+ if (typeof scope !== 'string' || !scope.trim()) return { error: 'scope is required: one unit (screens/login) or a glob inside one kind (screens/log*)' };
29
+ const text = scope.trim();
30
+ if (text.includes('**')) return { error: `scope "${text}" uses \`**\` — an override covers one unit or a glob inside one kind, never everything` };
31
+ const kind = text.startsWith('api/flows/') ? 'api/flows' : text.split('/')[0];
32
+ if (/[*?]/.test(kind)) return { error: `scope "${text}" globs the unit kind — a scope must stay inside one kind (screens, flows, api, api/flows)` };
33
+ if (!(OVERRIDE_SCOPE_KINDS as readonly string[]).includes(kind)) {
34
+ return { error: `scope "${text}" names no unit kind — start it with screens/, flows/, api/ or api/flows/` };
35
+ }
36
+ const unit = text.slice(kind.length + 1);
37
+ if (!unit || unit === '.' || unit === '..' || !UNIT_RE.test(unit)) {
38
+ return { error: `scope "${text}" must name one unit (or a glob of unit names with * and ?) after "${kind}/"` };
39
+ }
40
+ return { scope: { kind: kind as OverrideScopeKind, unit, glob: /[*?]/.test(unit), text } };
41
+ }
42
+
43
+ function globRegex(glob: string): RegExp {
44
+ const body = glob.replace(/[.+^${}()|[\]\\-]/g, '\\$&').replace(/\*/g, '[^/]*').replace(/\?/g, '[^/]');
45
+ return new RegExp(`^${body}$`);
46
+ }
47
+
48
+ /** How many of the project's units a (valid) scope reaches — 0 for an unparseable one. */
49
+ export function unitsCoveredByScope(projectRoot: string, scope: string): number {
50
+ const parsed = parseOverrideScope(scope);
51
+ if ('error' in parsed) return 0;
52
+ let names: string[] = [];
53
+ try {
54
+ names = fs.readdirSync(path.join(projectRoot, 'qa', ...parsed.scope.kind.split('/')), { withFileTypes: true })
55
+ .filter((e) => e.isDirectory() && !(parsed.scope.kind === 'api' && e.name === 'flows')).map((e) => e.name);
56
+ } catch { /* the project has no unit of that kind */ }
57
+ return names.filter((n) => overrideScopeMatches(parsed.scope, `${parsed.scope.kind}/${n}`)).length;
58
+ }
59
+
60
+ /** Does the override scope cover the unit whose decision scope is `unitScope` (e.g. `screens/login`)? */
61
+ export function overrideScopeMatches(s: OverrideScope, unitScope: string): boolean {
62
+ const kind = unitScope.startsWith('api/flows/') ? 'api/flows' : unitScope.split('/')[0];
63
+ if (kind !== s.kind) return false;
64
+ const unit = unitScope.slice(kind.length + 1);
65
+ return s.glob ? globRegex(s.unit).test(unit) : unit === s.unit;
66
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Is a `gate-override` decision admissible, and for which unit? (OES-11.3, red-team #15, takumi T5)
3
+ *
4
+ * Shape: payload `{rule, severity: warning|info|off, scope, humanAccepted?}` + the entry's `reason`.
5
+ * rejected (gate.override-rejected, hard) — unknown rule or key, hard rule, severity outside
6
+ * warning|info|off, `off` on a rule without `offAllowed`, reason under 15 characters,
7
+ * a bad scope, a unit's own decision reaching another unit, humanAccepted not `true`
8
+ * ineffective — well-formed but `humanAccepted` absent: present means effective, so it relaxes
9
+ * nothing; and its absence alone blocks nothing either
10
+ * irrelevant — a valid scope that does not cover the unit being judged
11
+ * An unparseable scope cannot be placed, so it is rejected for every unit.
12
+ */
13
+ import { PROJECT_SCOPE } from '../../decisions/decision-file';
14
+ import { ReadDecision } from '../../decisions/read-decisions';
15
+ import { findGateRule } from './gate-rule-catalog';
16
+ import { overrideScopeMatches, parseOverrideScope } from './gate-override-scope';
17
+ import { ActiveOverride, OverrideSeverity } from './resolve-rule';
18
+
19
+ export const OVERRIDE_SEVERITIES: readonly OverrideSeverity[] = ['warning', 'info', 'off'];
20
+ export const MIN_OVERRIDE_REASON = 15;
21
+ const PAYLOAD_KEYS = new Set(['rule', 'severity', 'scope', 'humanAccepted']);
22
+
23
+ export type OverrideJudgement =
24
+ | { status: 'irrelevant' }
25
+ | { status: 'rejected'; reason: string }
26
+ | { status: 'ineffective'; reason: string; override: ActiveOverride }
27
+ | { status: 'accepted'; override: ActiveOverride };
28
+
29
+ /**
30
+ * Everything that makes an override inadmissible regardless of the unit being judged — the checks
31
+ * `journey --decide gate-override` runs BEFORE the prompt, so a human never confirms a rejected one.
32
+ * `humanAccepted` is checked separately: the confirmation sets it, a caller never supplies it.
33
+ */
34
+ export function overridePayloadErrors(payload: unknown, reason: string, fileScope: string): string[] {
35
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return ['payload must be {rule, severity, scope}'];
36
+ const p = payload as Record<string, unknown>;
37
+ const errors: string[] = [];
38
+ for (const k of Object.keys(p)) if (!PAYLOAD_KEYS.has(k)) errors.push(`unknown payload key "${k}" (allowed: rule, severity, scope)`);
39
+ const parsed = parseOverrideScope(p.scope);
40
+ if ('error' in parsed) errors.push(parsed.error);
41
+ else if (fileScope !== PROJECT_SCOPE && (parsed.scope.glob || parsed.scope.text !== fileScope)) {
42
+ errors.push(`a decision recorded under qa/${fileScope}/ can only override ${fileScope} (scope is "${parsed.scope.text}") — record a wider one in qa/decisions/`);
43
+ }
44
+ const rule = typeof p.rule === 'string' ? findGateRule(p.rule) : undefined;
45
+ if (!rule) errors.push(`unknown rule "${String(p.rule)}" — it must be an id from harness/catalog/gate-rules.yaml`);
46
+ else if (rule.kind === 'hard') errors.push(`${rule.id} is a hard rule — it can never be overridden (${rule.rationale})`);
47
+ if (!OVERRIDE_SEVERITIES.includes(p.severity as OverrideSeverity)) errors.push(`severity must be warning | info | off (got ${JSON.stringify(p.severity)})`);
48
+ else if (p.severity === 'off' && rule && rule.kind === 'soft' && !rule.offAllowed) errors.push(`${rule.id} cannot be switched off (offAllowed: false) — lower it to warning or info instead`);
49
+ if (reason.trim().length < MIN_OVERRIDE_REASON) errors.push(`the reason must say why in at least ${MIN_OVERRIDE_REASON} characters`);
50
+ return errors;
51
+ }
52
+
53
+ function asOverride(e: ReadDecision, p: Record<string, unknown>): ActiveOverride {
54
+ return {
55
+ decisionId: e.id, rule: String(p.rule), severity: p.severity as OverrideSeverity, scope: String(p.scope).trim(),
56
+ reason: e.reason, visibility: e.visibility, by: e.source.by, validFrom: e.valid_from, path: e.path, committed: null,
57
+ };
58
+ }
59
+
60
+ export function judgeOverride(e: ReadDecision, unitScope: string | null): OverrideJudgement {
61
+ const p = (e.payload ?? {}) as Record<string, unknown>;
62
+ const parsed = parseOverrideScope(p.scope);
63
+ if ('scope' in parsed && (!unitScope || !overrideScopeMatches(parsed.scope, unitScope))) {
64
+ // A unit's own decision that names another unit is still that unit's problem.
65
+ if (e.scope === PROJECT_SCOPE || e.scope !== unitScope) return { status: 'irrelevant' };
66
+ }
67
+ const errors = overridePayloadErrors(p, e.reason, e.scope);
68
+ if (p.humanAccepted !== undefined && p.humanAccepted !== true) errors.push('humanAccepted is set only by a TTY confirmation, and only to true');
69
+ if (errors.length) return { status: 'rejected', reason: errors.join('; ') };
70
+ const override = asOverride(e, p);
71
+ if (p.humanAccepted !== true) {
72
+ return { status: 'ineffective', reason: 'not confirmed by a human on a TTY (humanAccepted absent) — it relaxes nothing', override };
73
+ }
74
+ return { status: 'accepted', override };
75
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * The gate-rule catalog (OES-11.1): `harness/catalog/gate-rules.yaml`, shipped next to the code
3
+ * (`copy-templates` copies it into `dist/harness/catalog/`).
4
+ *
5
+ * The catalog is code-owned data — a malformed one is a build defect, so loading it throws rather
6
+ * than degrading to "no rules" (which would silently stop every gate from blocking).
7
+ */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import { parse } from 'yaml';
11
+
12
+ export const GATE_SEVERITIES = ['error', 'review', 'warning', 'info'] as const;
13
+ export type GateSeverity = typeof GATE_SEVERITIES[number];
14
+ export type GateKind = 'hard' | 'soft';
15
+ export const GATE_STAGES = ['spec', 'create', 'generate', 'run', 'deliver'] as const;
16
+ export type GateStage = typeof GATE_STAGES[number];
17
+
18
+ export interface GateRule {
19
+ id: string;
20
+ stage: GateStage;
21
+ severity: GateSeverity;
22
+ kind: GateKind;
23
+ rationale: string;
24
+ fix: string;
25
+ since: string;
26
+ offAllowed: boolean;
27
+ }
28
+
29
+ const CATALOG_FILE = path.join(__dirname, '..', 'catalog', 'gate-rules.yaml');
30
+ const ID_RE = /^[a-z0-9]+(\.[a-z0-9]+(-[a-z0-9]+)*)+$/;
31
+
32
+ /** Parse and validate catalog text. Throws on the first structural defect. */
33
+ export function parseGateRuleCatalog(text: string): Map<string, GateRule> {
34
+ const doc = parse(text) as { rules?: unknown } | null;
35
+ if (!doc || !Array.isArray(doc.rules)) throw new Error('gate-rules.yaml: no `rules:` list');
36
+ const out = new Map<string, GateRule>();
37
+ for (const raw of doc.rules as Array<Record<string, unknown>>) {
38
+ const id = String(raw?.id ?? '');
39
+ const bad = (why: string): never => { throw new Error(`gate-rules.yaml: rule "${id}" ${why}`); };
40
+ if (!ID_RE.test(id)) bad('has no dotted kebab-case id');
41
+ if (out.has(id)) bad('is declared twice');
42
+ if (!GATE_STAGES.includes(raw.stage as GateStage)) bad(`has an unknown stage "${raw.stage}"`);
43
+ if (!GATE_SEVERITIES.includes(raw.severity as GateSeverity)) bad(`has an unknown severity "${raw.severity}"`);
44
+ if (raw.kind !== 'hard' && raw.kind !== 'soft') bad('kind must be hard|soft');
45
+ if (typeof raw.offAllowed !== 'boolean') bad('offAllowed must be a boolean');
46
+ if (raw.kind === 'hard' && raw.offAllowed) bad('is hard, so it can never be switched off');
47
+ out.set(id, {
48
+ id,
49
+ stage: raw.stage as GateStage,
50
+ severity: raw.severity as GateSeverity,
51
+ kind: raw.kind as GateKind,
52
+ rationale: String(raw.rationale ?? ''),
53
+ fix: String(raw.fix ?? ''),
54
+ since: String(raw.since ?? ''),
55
+ offAllowed: raw.offAllowed as boolean,
56
+ });
57
+ }
58
+ return out;
59
+ }
60
+
61
+ let cached: ReadonlyMap<string, GateRule> | null = null;
62
+
63
+ /** Every rule, keyed by id (loaded once per process). */
64
+ export function gateRuleCatalog(): ReadonlyMap<string, GateRule> {
65
+ if (!cached) cached = parseGateRuleCatalog(fs.readFileSync(CATALOG_FILE, 'utf8'));
66
+ return cached;
67
+ }
68
+
69
+ export function findGateRule(id: string): GateRule | undefined {
70
+ return gateRuleCatalog().get(id);
71
+ }
72
+
73
+ /** A rule the CODE names. An unknown id is a programming error, never user input — so it throws. */
74
+ export function gateRule(id: string): GateRule {
75
+ const rule = findGateRule(id);
76
+ if (!rule) throw new Error(`gate rule "${id}" is not in harness/catalog/gate-rules.yaml`);
77
+ return rule;
78
+ }
79
+
80
+ export function listRules(): GateRule[] {
81
+ return [...gateRuleCatalog().values()];
82
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Turning a gate CONDITION into an outcome through `resolveRule` — the only shapes a gate site uses,
3
+ * so no site writes a severity literal of its own (OES-11.2).
4
+ *
5
+ * evaluateGateTerms a conjunction (audit gateStatus, script-check status): each term names its
6
+ * rule and whether its condition holds; a violated term blocks only when its
7
+ * resolved severity blocks
8
+ * ruleVerdict a sensor verdict (pass | warn | fail) for one rule
9
+ * sensorSeverityOf a per-finding sensor severity (fail | warn | info), or null when switched off
10
+ */
11
+ import { GateRules, ResolvedRule } from './resolve-rule';
12
+
13
+ export interface GateTerm {
14
+ rule: string;
15
+ /** The condition the rule wants to see — `true` means the term passes. */
16
+ holds: boolean;
17
+ }
18
+
19
+ export interface GateTermsOutcome {
20
+ pass: boolean;
21
+ /** Violated rules whose resolved severity blocks. */
22
+ blocking: string[];
23
+ /** Violated rules an override lowered to advisory. */
24
+ relaxed: string[];
25
+ }
26
+
27
+ export function evaluateGateTerms(terms: GateTerm[], rules: GateRules): GateTermsOutcome {
28
+ const blocking: string[] = [];
29
+ const relaxed: string[] = [];
30
+ for (const t of terms) {
31
+ if (t.holds) continue;
32
+ const r = rules.resolve(t.rule);
33
+ if (r.blocking) blocking.push(t.rule);
34
+ else if (r.overriddenBy) relaxed.push(t.rule);
35
+ }
36
+ return { pass: blocking.length === 0, blocking, relaxed };
37
+ }
38
+
39
+ export type SensorVerdict = 'pass' | 'warn' | 'fail';
40
+
41
+ /**
42
+ * A sensor verdict for one rule. `advisoryAnyway` is a reason the miss can never block that is not
43
+ * a severity (the `smoke` focus, or no failing row) — the rule is then not consulted at all.
44
+ */
45
+ export function ruleVerdict(rules: GateRules, id: string, conditionMet: boolean, advisoryAnyway: boolean): SensorVerdict {
46
+ if (!conditionMet) return 'pass';
47
+ if (advisoryAnyway) return 'warn';
48
+ const r = rules.resolve(id);
49
+ if (r.severity === 'off') return 'pass';
50
+ return r.blocking ? 'fail' : 'warn';
51
+ }
52
+
53
+ export type SensorSeverity = 'fail' | 'warn' | 'info';
54
+
55
+ export function sensorSeverityOf(r: ResolvedRule): SensorSeverity | null {
56
+ if (r.severity === 'off') return null;
57
+ if (r.blocking) return 'fail';
58
+ return r.severity === 'info' ? 'info' : 'warn';
59
+ }