@opengsd/gsd-core 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (551) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.opencode/plugins/gsd-core.js +85 -5
  4. package/README.ja-JP.md +3 -3
  5. package/README.ko-KR.md +3 -3
  6. package/README.pt-BR.md +3 -3
  7. package/README.zh-CN.md +3 -3
  8. package/agents/gsd-code-fixer.compact.md +7 -6
  9. package/agents/gsd-code-fixer.md +9 -8
  10. package/agents/gsd-code-reviewer.compact.md +5 -3
  11. package/agents/gsd-code-reviewer.md +8 -6
  12. package/agents/gsd-debug-session-manager.compact.md +17 -2
  13. package/agents/gsd-debug-session-manager.md +17 -2
  14. package/agents/gsd-debugger.md +3 -3
  15. package/agents/gsd-eval-auditor.compact.md +1 -1
  16. package/agents/gsd-eval-auditor.md +1 -1
  17. package/agents/gsd-executor.md +17 -12
  18. package/agents/gsd-intel-updater.compact.md +1 -1
  19. package/agents/gsd-intel-updater.md +1 -1
  20. package/agents/gsd-mempalace-curator.md +2 -2
  21. package/agents/gsd-phase-researcher.md +19 -11
  22. package/agents/gsd-plan-checker.md +15 -9
  23. package/agents/gsd-planner.md +15 -11
  24. package/agents/gsd-project-researcher.compact.md +1 -1
  25. package/agents/gsd-project-researcher.md +1 -1
  26. package/agents/gsd-research-synthesizer.compact.md +1 -1
  27. package/agents/gsd-research-synthesizer.md +1 -1
  28. package/agents/gsd-ui-auditor.compact.md +21 -30
  29. package/agents/gsd-ui-auditor.md +166 -37
  30. package/agents/gsd-ui-researcher.compact.md +1 -1
  31. package/agents/gsd-ui-researcher.md +1 -1
  32. package/agents/gsd-verifier.md +37 -14
  33. package/bin/install.js +764 -287
  34. package/commands/gsd/add-tests.md +6 -1
  35. package/commands/gsd/ai-integration-phase.md +6 -1
  36. package/commands/gsd/audit-fix.md +5 -0
  37. package/commands/gsd/audit-milestone.md +6 -1
  38. package/commands/gsd/autonomous.md +7 -2
  39. package/commands/gsd/capture.md +9 -5
  40. package/commands/gsd/code-review.md +7 -2
  41. package/commands/gsd/complete-milestone.md +4 -0
  42. package/commands/gsd/config.md +7 -3
  43. package/commands/gsd/debug.md +11 -7
  44. package/commands/gsd/discuss-phase.md +7 -3
  45. package/commands/gsd/docs-update.md +12 -7
  46. package/commands/gsd/eval-review.md +6 -1
  47. package/commands/gsd/execute-phase.md +12 -7
  48. package/commands/gsd/extract-learnings.md +5 -0
  49. package/commands/gsd/fast.md +4 -0
  50. package/commands/gsd/forensics.md +5 -1
  51. package/commands/gsd/graphify.md +10 -6
  52. package/commands/gsd/health.md +5 -0
  53. package/commands/gsd/help.md +7 -2
  54. package/commands/gsd/import.md +7 -3
  55. package/commands/gsd/inbox.md +5 -0
  56. package/commands/gsd/ingest-docs.md +5 -1
  57. package/commands/gsd/manager.md +6 -1
  58. package/commands/gsd/map-codebase.md +7 -3
  59. package/commands/gsd/mempalace-capture.md +12 -4
  60. package/commands/gsd/mempalace-recall.md +5 -1
  61. package/commands/gsd/milestone-summary.md +5 -1
  62. package/commands/gsd/mvp-phase.md +8 -3
  63. package/commands/gsd/new-milestone.md +6 -1
  64. package/commands/gsd/new-project.md +5 -0
  65. package/commands/gsd/next.md +6 -1
  66. package/commands/gsd/ns-context.md +4 -0
  67. package/commands/gsd/ns-ideate.md +4 -0
  68. package/commands/gsd/ns-manage.md +4 -0
  69. package/commands/gsd/ns-project.md +4 -0
  70. package/commands/gsd/ns-review.md +4 -0
  71. package/commands/gsd/ns-workflow.md +4 -0
  72. package/commands/gsd/onboard.md +6 -1
  73. package/commands/gsd/pause-work.md +5 -1
  74. package/commands/gsd/phase.md +8 -4
  75. package/commands/gsd/plan-phase.md +6 -1
  76. package/commands/gsd/plan-review-convergence.md +11 -7
  77. package/commands/gsd/pr-branch.md +4 -0
  78. package/commands/gsd/profile-user.md +5 -1
  79. package/commands/gsd/progress.md +7 -2
  80. package/commands/gsd/quick-batch.md +21 -9
  81. package/commands/gsd/quick.md +12 -7
  82. package/commands/gsd/review.md +7 -4
  83. package/commands/gsd/secure-phase.md +6 -1
  84. package/commands/gsd/ship.md +5 -0
  85. package/commands/gsd/sketch.md +7 -2
  86. package/commands/gsd/spec-phase.md +5 -1
  87. package/commands/gsd/spike.md +8 -3
  88. package/commands/gsd/surface.md +5 -1
  89. package/commands/gsd/thread.md +4 -0
  90. package/commands/gsd/ui-phase.md +6 -1
  91. package/commands/gsd/ui-review.md +6 -1
  92. package/commands/gsd/ultraplan-phase.md +5 -1
  93. package/commands/gsd/undo.md +5 -1
  94. package/commands/gsd/update.md +6 -2
  95. package/commands/gsd/validate-phase.md +6 -1
  96. package/commands/gsd/verify-work.md +6 -1
  97. package/commands/gsd/workspace.md +7 -3
  98. package/gsd-core/bin/gsd-tools.cjs +477 -78
  99. package/gsd-core/bin/lib/active-workstream-store.cjs +15 -0
  100. package/gsd-core/bin/lib/adr-parser.cjs +3 -1
  101. package/gsd-core/bin/lib/agent-install-check.cjs +4 -1
  102. package/gsd-core/bin/lib/audit.cjs +144 -42
  103. package/gsd-core/bin/lib/broken-windows.cjs +13 -13
  104. package/gsd-core/bin/lib/capability-activation.cjs +9 -4
  105. package/gsd-core/bin/lib/capability-registry.cjs +197 -222
  106. package/gsd-core/bin/lib/capability-validator.cjs +16 -1
  107. package/gsd-core/bin/lib/check-auto-mode.cjs +35 -0
  108. package/gsd-core/bin/lib/check-command-router.cjs +164 -1625
  109. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +13 -2
  110. package/gsd-core/bin/lib/cli-exit.cjs +12 -0
  111. package/gsd-core/bin/lib/codex-agent-toml.cjs +32 -33
  112. package/gsd-core/bin/lib/command-aliases.cjs +7 -0
  113. package/gsd-core/bin/lib/command-routing-hub.cjs +48 -1
  114. package/gsd-core/bin/lib/commands.cjs +343 -207
  115. package/gsd-core/bin/lib/complexity-trigger.cjs +8 -7
  116. package/gsd-core/bin/lib/config-loader.cjs +65 -4
  117. package/gsd-core/bin/lib/config.cjs +76 -19
  118. package/gsd-core/bin/lib/core-utils.cjs +6 -1
  119. package/gsd-core/bin/lib/coverage.cjs +4 -8
  120. package/gsd-core/bin/lib/decision-coverage-support.cjs +259 -0
  121. package/gsd-core/bin/lib/decisions.cjs +30 -14
  122. package/gsd-core/bin/lib/drift.cjs +177 -42
  123. package/gsd-core/bin/lib/frontmatter-fence.cjs +90 -0
  124. package/gsd-core/bin/lib/frontmatter-splice.cjs +494 -0
  125. package/gsd-core/bin/lib/frontmatter.cjs +426 -234
  126. package/gsd-core/bin/lib/gap-checker.cjs +72 -29
  127. package/gsd-core/bin/lib/gate-api-coverage-verify-pre.cjs +381 -0
  128. package/gsd-core/bin/lib/gate-args.cjs +53 -0
  129. package/gsd-core/bin/lib/gate-codebase-drift.cjs +285 -0
  130. package/gsd-core/bin/lib/gate-config.cjs +46 -0
  131. package/gsd-core/bin/lib/gate-context-drift.cjs +141 -0
  132. package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +169 -0
  133. package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +126 -0
  134. package/gsd-core/bin/lib/gate-evaluation-scope.cjs +555 -0
  135. package/gsd-core/bin/lib/gate-evidence.cjs +138 -0
  136. package/gsd-core/bin/lib/gate-exit.cjs +27 -0
  137. package/gsd-core/bin/lib/gate-gap-analysis-plan-post.cjs +61 -0
  138. package/gsd-core/bin/lib/gate-phase-context.cjs +170 -0
  139. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +1 -1
  140. package/gsd-core/bin/lib/gate-predicate.cjs +165 -0
  141. package/gsd-core/bin/lib/gate-prohibition-enforcement.cjs +94 -0
  142. package/gsd-core/bin/lib/gate-schema-drift.cjs +165 -0
  143. package/gsd-core/bin/lib/gate-tdd-red-evidence.cjs +100 -0
  144. package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +182 -0
  145. package/gsd-core/bin/lib/gate-ui-plan.cjs +86 -0
  146. package/gsd-core/bin/lib/gate-ui-safety.cjs +80 -0
  147. package/gsd-core/bin/lib/gate-verdict.cjs +64 -0
  148. package/gsd-core/bin/lib/gate-verify-command-paths.cjs +78 -0
  149. package/gsd-core/bin/lib/gate-verify-failure-directions.cjs +41 -0
  150. package/gsd-core/bin/lib/graphify.cjs +10 -2
  151. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +43 -47
  152. package/gsd-core/bin/lib/health-diagnostic.cjs +45 -8
  153. package/gsd-core/bin/lib/host-runtime-detection.cjs +9 -0
  154. package/gsd-core/bin/lib/init.cjs +364 -132
  155. package/gsd-core/bin/lib/install-engine.cjs +30 -33
  156. package/gsd-core/bin/lib/install-profiles.cjs +7 -4
  157. package/gsd-core/bin/lib/installer-migrations.cjs +8 -1
  158. package/gsd-core/bin/lib/io.cjs +122 -3
  159. package/gsd-core/bin/lib/loop-resolver.cjs +95 -0
  160. package/gsd-core/bin/lib/markdown-sectionizer.cjs +75 -1
  161. package/gsd-core/bin/lib/milestone.cjs +37 -6
  162. package/gsd-core/bin/lib/model-resolver.cjs +171 -62
  163. package/gsd-core/bin/lib/observability/event.cjs +1 -1
  164. package/gsd-core/bin/lib/observability/logger.cjs +46 -1
  165. package/gsd-core/bin/lib/pattern.cjs +10 -0
  166. package/gsd-core/bin/lib/phase-command-router.cjs +20 -5
  167. package/gsd-core/bin/lib/phase-estimation.cjs +5 -4
  168. package/gsd-core/bin/lib/phase-id-card.cjs +32 -0
  169. package/gsd-core/bin/lib/phase-id-display.cjs +78 -0
  170. package/gsd-core/bin/lib/phase-id.cjs +110 -8
  171. package/gsd-core/bin/lib/phase-lifecycle.cjs +9 -2
  172. package/gsd-core/bin/lib/phase-locator.cjs +29 -10
  173. package/gsd-core/bin/lib/phase-status.cjs +360 -0
  174. package/gsd-core/bin/lib/phase.cjs +489 -88
  175. package/gsd-core/bin/lib/plan-document.cjs +142 -20
  176. package/gsd-core/bin/lib/plan-drift-guard.cjs +5 -0
  177. package/gsd-core/bin/lib/planning-document.cjs +692 -0
  178. package/gsd-core/bin/lib/planning-inspect.cjs +60 -9
  179. package/gsd-core/bin/lib/planning-snapshot.cjs +18 -0
  180. package/gsd-core/bin/lib/planning-workspace.cjs +83 -55
  181. package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
  182. package/gsd-core/bin/lib/pristine-baseline.cjs +10 -0
  183. package/gsd-core/bin/lib/probe-core.cjs +7 -1
  184. package/gsd-core/bin/lib/profile-output.cjs +6 -3
  185. package/gsd-core/bin/lib/prohibition-enforcement.cjs +0 -55
  186. package/gsd-core/bin/lib/project-root.cjs +41 -2
  187. package/gsd-core/bin/lib/quick-batch-command-router.cjs +35 -9
  188. package/gsd-core/bin/lib/quick-batch-dispatch.cjs +11 -8
  189. package/gsd-core/bin/lib/real-home-guard.cjs +9 -1
  190. package/gsd-core/bin/lib/report-parser.cjs +269 -0
  191. package/gsd-core/bin/lib/review-lane-descriptor.cjs +10 -30
  192. package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
  193. package/gsd-core/bin/lib/roadmap-command-router.cjs +25 -19
  194. package/gsd-core/bin/lib/roadmap-parser.cjs +242 -15
  195. package/gsd-core/bin/lib/roadmap-upgrade.cjs +1653 -65
  196. package/gsd-core/bin/lib/roadmap.cjs +405 -88
  197. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +373 -187
  198. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +5 -2
  199. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +57 -1
  200. package/gsd-core/bin/lib/runtime-homes.cjs +14 -7
  201. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +522 -624
  202. package/gsd-core/bin/lib/runtime-name-policy.cjs +246 -21
  203. package/gsd-core/bin/lib/runtime-slash.cjs +47 -30
  204. package/gsd-core/bin/lib/shell-command-projection.cjs +47 -8
  205. package/gsd-core/bin/lib/smart-entry.cjs +19 -3
  206. package/gsd-core/bin/lib/stale-bake-guard.cjs +32 -48
  207. package/gsd-core/bin/lib/state-contract.cjs +15 -18
  208. package/gsd-core/bin/lib/state-document.cjs +100 -22
  209. package/gsd-core/bin/lib/state-transition.cjs +39 -2
  210. package/gsd-core/bin/lib/state.cjs +256 -105
  211. package/gsd-core/bin/lib/surface.cjs +19 -2
  212. package/gsd-core/bin/lib/tdd-red-evidence.cjs +48 -79
  213. package/gsd-core/bin/lib/uat-predicate.cjs +359 -38
  214. package/gsd-core/bin/lib/uat.cjs +432 -7
  215. package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
  216. package/gsd-core/bin/lib/ui-frontend-evidence.cjs +167 -40
  217. package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
  218. package/gsd-core/bin/lib/vendor/README.md +31 -9
  219. package/gsd-core/bin/lib/vendor/saxes.cjs +1934 -0
  220. package/gsd-core/bin/lib/vendor/saxes.cjs.LICENSE.txt +92 -0
  221. package/gsd-core/bin/lib/vendor/tap-parser.cjs +8927 -0
  222. package/gsd-core/bin/lib/vendor/tap-parser.cjs.LICENSE.txt +152 -0
  223. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  224. package/gsd-core/bin/lib/verification.cjs +1378 -274
  225. package/gsd-core/bin/lib/verify-command-grounding.cjs +46 -2
  226. package/gsd-core/bin/lib/verify-command-router.cjs +18 -7
  227. package/gsd-core/bin/lib/verify.cjs +357 -531
  228. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +14 -6
  229. package/gsd-core/bin/lib/workstream-inventory.cjs +31 -21
  230. package/gsd-core/bin/lib/workstream-name-policy.cjs +31 -1
  231. package/gsd-core/bin/lib/workstream.cjs +11 -2
  232. package/gsd-core/bin/lib/worktree-base-ref.cjs +482 -73
  233. package/gsd-core/bin/lib/worktree-safety.cjs +784 -51
  234. package/gsd-core/bin/shared/config-defaults.manifest.json +8 -0
  235. package/gsd-core/bin/shared/config-schema.manifest.json +5 -0
  236. package/gsd-core/references/autonomous-smart-discuss.md +2 -1
  237. package/gsd-core/references/autonomous-ui-design-contract.md +3 -3
  238. package/gsd-core/references/checkpoints.md +5 -3
  239. package/gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +28 -3
  240. package/gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +37 -4
  241. package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +28 -3
  242. package/gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +28 -3
  243. package/gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +37 -4
  244. package/gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +37 -4
  245. package/gsd-core/references/edge-probe.md +195 -21
  246. package/gsd-core/references/execute-mvp-tdd.md +5 -10
  247. package/gsd-core/references/execute-phase-between-wave-reset.md +10 -6
  248. package/gsd-core/references/execute-phase-response-language.md +1 -1
  249. package/gsd-core/references/execute-phase-wave-guard.md +22 -11
  250. package/gsd-core/references/gsd-run-resolver.md +1 -1
  251. package/gsd-core/references/loop-hook-dispatch.md +7 -1
  252. package/gsd-core/references/model-profiles.md +1 -1
  253. package/gsd-core/references/offer-next.md +1 -1
  254. package/gsd-core/references/phase-argument-parsing.md +9 -7
  255. package/gsd-core/references/phase-id-convention.md +28 -0
  256. package/gsd-core/references/planner-gap-closure.md +2 -0
  257. package/gsd-core/references/planner-load-graph-context.md +24 -13
  258. package/gsd-core/references/planner-verify-command-grounding.md +14 -0
  259. package/gsd-core/references/planning-config.md +12 -3
  260. package/gsd-core/references/spidr-splitting.md +1 -1
  261. package/gsd-core/references/tdd.md +37 -8
  262. package/gsd-core/references/ui-consideration-probe.md +10 -5
  263. package/gsd-core/references/verifier-phase-gates.md +5 -2
  264. package/gsd-core/references/verify-command-path-resolvability.md +10 -2
  265. package/gsd-core/references/verify-mvp-mode.md +2 -2
  266. package/gsd-core/references/workstream-flag.md +33 -3
  267. package/gsd-core/references/worktree-path-safety.md +321 -0
  268. package/gsd-core/templates/README.md +1 -1
  269. package/gsd-core/templates/UAT.md +17 -1
  270. package/gsd-core/templates/config.json +2 -11
  271. package/gsd-core/templates/verification-report.md +1 -1
  272. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  273. package/gsd-core/workflows/add-backlog.md +1 -1
  274. package/gsd-core/workflows/add-phase.md +8 -7
  275. package/gsd-core/workflows/add-tests.md +4 -3
  276. package/gsd-core/workflows/add-todo.md +6 -5
  277. package/gsd-core/workflows/ai-integration-phase.md +13 -4
  278. package/gsd-core/workflows/audit-fix.md +1 -1
  279. package/gsd-core/workflows/audit-milestone.md +4 -3
  280. package/gsd-core/workflows/audit-uat.md +1 -1
  281. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +9 -18
  282. package/gsd-core/workflows/autonomous.md +43 -23
  283. package/gsd-core/workflows/check-todos.md +7 -6
  284. package/gsd-core/workflows/cleanup.md +2 -2
  285. package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
  286. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +20 -13
  287. package/gsd-core/workflows/code-review-fix.md +112 -25
  288. package/gsd-core/workflows/code-review.md +146 -135
  289. package/gsd-core/workflows/complete-milestone/detail/elaboration.md +4 -3
  290. package/gsd-core/workflows/complete-milestone.md +13 -8
  291. package/gsd-core/workflows/debug.md +32 -7
  292. package/gsd-core/workflows/diagnose-issues.md +3 -2
  293. package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
  294. package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
  295. package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
  296. package/gsd-core/workflows/discuss-phase.md +4 -3
  297. package/gsd-core/workflows/do.md +2 -2
  298. package/gsd-core/workflows/docs-update.md +6 -5
  299. package/gsd-core/workflows/edit-phase.md +4 -3
  300. package/gsd-core/workflows/eval-review.md +14 -5
  301. package/gsd-core/workflows/execute-phase/detail/elaboration.md +2 -2
  302. package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1019 -0
  303. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +15 -4
  304. package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +10 -7
  305. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +37 -3
  306. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +3 -1
  307. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +2 -2
  308. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
  309. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +1 -1
  310. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +46 -9
  311. package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
  312. package/gsd-core/workflows/execute-phase/steps/ready-wave-gate.md +37 -0
  313. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
  314. package/gsd-core/workflows/execute-phase/steps/regression-gate.md +2 -0
  315. package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
  316. package/gsd-core/workflows/execute-phase/steps/threat-id-gate.md +28 -0
  317. package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +187 -0
  318. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +2 -3
  319. package/gsd-core/workflows/execute-phase/steps/worktree-base-check.md +25 -0
  320. package/gsd-core/workflows/execute-phase.md +96 -178
  321. package/gsd-core/workflows/execute-plan.md +18 -23
  322. package/gsd-core/workflows/explore.md +4 -4
  323. package/gsd-core/workflows/extract-learnings.md +4 -2
  324. package/gsd-core/workflows/fast.md +1 -1
  325. package/gsd-core/workflows/forensics.md +1 -1
  326. package/gsd-core/workflows/graduation.md +1 -1
  327. package/gsd-core/workflows/health.md +3 -2
  328. package/gsd-core/workflows/help/modes/full.compact.md +3 -3
  329. package/gsd-core/workflows/help/modes/full.md +5 -5
  330. package/gsd-core/workflows/help/modes/topic.md +15 -5
  331. package/gsd-core/workflows/import.md +4 -3
  332. package/gsd-core/workflows/inbox.md +2 -2
  333. package/gsd-core/workflows/ingest-docs.md +3 -3
  334. package/gsd-core/workflows/insert-phase.md +4 -3
  335. package/gsd-core/workflows/list-seeds.md +1 -1
  336. package/gsd-core/workflows/list-workspaces.md +1 -1
  337. package/gsd-core/workflows/manager.md +6 -4
  338. package/gsd-core/workflows/map-codebase.md +5 -4
  339. package/gsd-core/workflows/milestone-summary.md +3 -2
  340. package/gsd-core/workflows/mvp-phase.md +14 -14
  341. package/gsd-core/workflows/new-milestone.md +11 -11
  342. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +3 -3
  343. package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +1 -1
  344. package/gsd-core/workflows/new-project.md +7 -7
  345. package/gsd-core/workflows/new-workspace.md +2 -2
  346. package/gsd-core/workflows/next.md +1 -1
  347. package/gsd-core/workflows/note.md +1 -1
  348. package/gsd-core/workflows/onboard.md +1 -1
  349. package/gsd-core/workflows/pause-work.md +2 -2
  350. package/gsd-core/workflows/plan-phase/detail/elaboration.md +1 -1
  351. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
  352. package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +1 -1
  353. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
  354. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +23 -5
  355. package/gsd-core/workflows/plan-phase.md +50 -24
  356. package/gsd-core/workflows/plan-review-convergence.md +21 -5
  357. package/gsd-core/workflows/plant-seed.md +62 -20
  358. package/gsd-core/workflows/pr-branch.md +113 -13
  359. package/gsd-core/workflows/profile-user.md +2 -2
  360. package/gsd-core/workflows/progress.md +19 -49
  361. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +27 -0
  362. package/gsd-core/workflows/quick/steps/quick-verification.md +4 -4
  363. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +30 -11
  364. package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
  365. package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
  366. package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
  367. package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
  368. package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
  369. package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
  370. package/gsd-core/workflows/quick-batch/steps/verification-wave.md +9 -3
  371. package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
  372. package/gsd-core/workflows/quick-batch.md +15 -10
  373. package/gsd-core/workflows/quick.md +62 -39
  374. package/gsd-core/workflows/reapply-patches.md +9 -3
  375. package/gsd-core/workflows/remove-phase.md +3 -2
  376. package/gsd-core/workflows/remove-workspace.md +2 -2
  377. package/gsd-core/workflows/resume-project.md +3 -2
  378. package/gsd-core/workflows/review.md +33 -17
  379. package/gsd-core/workflows/scan.md +3 -2
  380. package/gsd-core/workflows/secure-phase.md +13 -13
  381. package/gsd-core/workflows/settings-advanced.md +30 -10
  382. package/gsd-core/workflows/settings-integrations.md +2 -3
  383. package/gsd-core/workflows/settings.md +4 -4
  384. package/gsd-core/workflows/ship.md +14 -13
  385. package/gsd-core/workflows/sketch-wrap-up.md +1 -1
  386. package/gsd-core/workflows/sketch.md +1 -1
  387. package/gsd-core/workflows/smart-entry.md +2 -2
  388. package/gsd-core/workflows/spec-phase.md +15 -5
  389. package/gsd-core/workflows/spike-wrap-up.md +1 -1
  390. package/gsd-core/workflows/spike.md +1 -1
  391. package/gsd-core/workflows/stats.md +1 -1
  392. package/gsd-core/workflows/sync-skills.md +5 -5
  393. package/gsd-core/workflows/thread.md +2 -2
  394. package/gsd-core/workflows/transition.md +13 -23
  395. package/gsd-core/workflows/ui-phase.md +48 -11
  396. package/gsd-core/workflows/ui-review.md +21 -6
  397. package/gsd-core/workflows/ultraplan-phase.md +3 -2
  398. package/gsd-core/workflows/undo.md +339 -20
  399. package/gsd-core/workflows/update.md +7 -7
  400. package/gsd-core/workflows/validate-phase.md +12 -13
  401. package/gsd-core/workflows/verify-work/detail/elaboration.md +43 -3
  402. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
  403. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -3
  404. package/gsd-core/workflows/verify-work.md +129 -55
  405. package/hooks/dist/gsd-agent-isolation-guard.js +32 -0
  406. package/hooks/dist/gsd-check-update-worker.js +8 -0
  407. package/hooks/dist/gsd-check-update.js +8 -0
  408. package/hooks/dist/gsd-context-monitor.js +31 -8
  409. package/hooks/dist/gsd-cursor-subagent-start.js +8 -0
  410. package/hooks/dist/gsd-secret-read-guard.js +161 -4
  411. package/hooks/dist/gsd-statusline.js +85 -20
  412. package/hooks/dist/gsd-update-banner.js +8 -0
  413. package/hooks/dist/gsd-validate-commit.sh +63 -4
  414. package/hooks/dist/gsd-windsurf-pre-write.js +11 -2
  415. package/hooks/dist/gsd-workflow-guard.js +5 -4
  416. package/hooks/dist/gsd-worktree-path-guard.js +6 -2
  417. package/hooks/dist/lib/cli-exit.js +12 -0
  418. package/hooks/dist/lib/git-probe.js +17 -1
  419. package/hooks/dist/lib/isolation-sentinel.js +2 -2
  420. package/hooks/gsd-agent-isolation-guard.js +32 -0
  421. package/hooks/gsd-check-update-worker.js +8 -0
  422. package/hooks/gsd-check-update.js +8 -0
  423. package/hooks/gsd-context-monitor.js +31 -8
  424. package/hooks/gsd-cursor-subagent-start.js +8 -0
  425. package/hooks/gsd-secret-read-guard.js +161 -4
  426. package/hooks/gsd-statusline.js +85 -20
  427. package/hooks/gsd-update-banner.js +8 -0
  428. package/hooks/gsd-validate-commit.sh +63 -4
  429. package/hooks/gsd-windsurf-pre-write.js +11 -2
  430. package/hooks/gsd-workflow-guard.js +5 -4
  431. package/hooks/gsd-worktree-path-guard.js +6 -2
  432. package/hooks/hooks.json +5 -5
  433. package/hooks/lib/cli-exit.js +12 -0
  434. package/hooks/lib/git-probe.js +17 -1
  435. package/hooks/lib/isolation-sentinel.js +2 -2
  436. package/package.json +22 -4
  437. package/scripts/build-hooks.js +15 -6
  438. package/scripts/changeset/parse.cjs +52 -4
  439. package/scripts/check-contract-drift.cjs +127 -11
  440. package/scripts/ci-timeout-report.cjs +770 -4
  441. package/scripts/command-contract-helpers.cjs +15 -8
  442. package/scripts/docs-guard-registry.cjs +34 -0
  443. package/scripts/gen-features.cjs +13 -8
  444. package/scripts/gen-hooks-cli-exit.cjs +12 -28
  445. package/scripts/gen-loop-host-contract.cjs +79 -1
  446. package/scripts/gen-platform-conformance-tier.cjs +187 -1
  447. package/scripts/gen-plugin-skills.cjs +87 -1
  448. package/scripts/gen-research-agents.cjs +24 -31
  449. package/scripts/gen-scripts-cli-exit.cjs +30 -3
  450. package/scripts/gen-test-timings.cjs +32 -7
  451. package/scripts/lib/cli-exit.cjs +12 -0
  452. package/scripts/lib/macos-conformance-tier.generated.cjs +34 -2
  453. package/scripts/lib/ndjson-reporter.cjs +31 -5
  454. package/scripts/lib/platform-conformance-tier.generated.cjs +45 -5
  455. package/scripts/lib/registration-ledger-preload.cjs +155 -0
  456. package/scripts/lib/vendor-bundle.cjs +59 -0
  457. package/scripts/lib/vendor-licenses/saxes-6.0.0.txt +64 -0
  458. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
  459. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  460. package/scripts/lint-completion-predicate-drift.cjs +18 -19
  461. package/scripts/lint-descriptions.cjs +7 -3
  462. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +38 -1
  463. package/scripts/lint-eslint-glob-coverage.allowlist.json +20 -0
  464. package/scripts/lint-frontmatter-fence-drift.cjs +313 -0
  465. package/scripts/lint-frontmatter-scalar-broad-grep.cjs +122 -16
  466. package/scripts/lint-phase-arg-assignment.cjs +257 -0
  467. package/scripts/lint-phase-enumeration-drift.cjs +12 -8
  468. package/scripts/lint-phase-id-drift.cjs +319 -5
  469. package/scripts/lint-planning-document-positive-control.cjs +329 -0
  470. package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
  471. package/scripts/lint-response-language-coverage.cjs +3 -0
  472. package/scripts/lint-retired-runtime-name.cjs +619 -0
  473. package/scripts/lint-skill-deps.cjs +7 -3
  474. package/scripts/lint-state-write-path-drift.cjs +93 -0
  475. package/scripts/lint-test-file-count.allowlist.json +38 -9
  476. package/scripts/lint-test-file-count.cjs +34 -1
  477. package/scripts/lint-vendored-deps.cjs +41 -5
  478. package/scripts/lint-workflow-shellcheck-baseline.json +25 -10
  479. package/scripts/mutation-matrix.cjs +50 -5
  480. package/scripts/prompt-injection-scan.sh +4 -0
  481. package/scripts/release-tarball-smoke.cjs +194 -1
  482. package/scripts/require-issue-link-policy.cjs +6 -2
  483. package/scripts/sync-runtime-launcher.cjs +184 -2
  484. package/scripts/verify-npm-publish.cjs +76 -20
  485. package/skills/gsd-add-tests/SKILL.md +6 -1
  486. package/skills/gsd-ai-integration-phase/SKILL.md +6 -1
  487. package/skills/gsd-audit-fix/SKILL.md +5 -0
  488. package/skills/gsd-audit-milestone/SKILL.md +6 -1
  489. package/skills/gsd-autonomous/SKILL.md +7 -2
  490. package/skills/gsd-capture/SKILL.md +9 -5
  491. package/skills/gsd-code-review/SKILL.md +7 -2
  492. package/skills/gsd-complete-milestone/SKILL.md +4 -0
  493. package/skills/gsd-config/SKILL.md +8 -4
  494. package/skills/gsd-debug/SKILL.md +11 -7
  495. package/skills/gsd-discuss-phase/SKILL.md +7 -3
  496. package/skills/gsd-docs-update/SKILL.md +12 -7
  497. package/skills/gsd-eval-review/SKILL.md +6 -1
  498. package/skills/gsd-execute-phase/SKILL.md +12 -7
  499. package/skills/gsd-extract-learnings/SKILL.md +5 -0
  500. package/skills/gsd-fast/SKILL.md +4 -0
  501. package/skills/gsd-forensics/SKILL.md +5 -1
  502. package/skills/gsd-graphify/SKILL.md +10 -6
  503. package/skills/gsd-health/SKILL.md +5 -0
  504. package/skills/gsd-help/SKILL.md +7 -2
  505. package/skills/gsd-import/SKILL.md +7 -3
  506. package/skills/gsd-inbox/SKILL.md +5 -0
  507. package/skills/gsd-ingest-docs/SKILL.md +5 -1
  508. package/skills/gsd-manager/SKILL.md +6 -1
  509. package/skills/gsd-map-codebase/SKILL.md +7 -3
  510. package/skills/gsd-mempalace-capture/SKILL.md +12 -4
  511. package/skills/gsd-mempalace-recall/SKILL.md +5 -1
  512. package/skills/gsd-milestone-summary/SKILL.md +5 -1
  513. package/skills/gsd-mvp-phase/SKILL.md +8 -3
  514. package/skills/gsd-new-milestone/SKILL.md +6 -1
  515. package/skills/gsd-new-project/SKILL.md +5 -0
  516. package/skills/gsd-next/SKILL.md +6 -1
  517. package/skills/gsd-ns-context/SKILL.md +4 -0
  518. package/skills/gsd-ns-ideate/SKILL.md +4 -0
  519. package/skills/gsd-ns-manage/SKILL.md +4 -0
  520. package/skills/gsd-ns-project/SKILL.md +4 -0
  521. package/skills/gsd-ns-review/SKILL.md +4 -0
  522. package/skills/gsd-ns-workflow/SKILL.md +4 -0
  523. package/skills/gsd-onboard/SKILL.md +6 -1
  524. package/skills/gsd-pause-work/SKILL.md +5 -1
  525. package/skills/gsd-phase/SKILL.md +8 -4
  526. package/skills/gsd-plan-phase/SKILL.md +6 -1
  527. package/skills/gsd-plan-review-convergence/SKILL.md +10 -6
  528. package/skills/gsd-pr-branch/SKILL.md +4 -0
  529. package/skills/gsd-profile-user/SKILL.md +5 -1
  530. package/skills/gsd-progress/SKILL.md +7 -2
  531. package/skills/gsd-quick/SKILL.md +16 -10
  532. package/skills/gsd-quick-batch/SKILL.md +21 -9
  533. package/skills/gsd-review/SKILL.md +7 -4
  534. package/skills/gsd-review-backlog/SKILL.md +3 -2
  535. package/skills/gsd-secure-phase/SKILL.md +6 -1
  536. package/skills/gsd-ship/SKILL.md +5 -0
  537. package/skills/gsd-sketch/SKILL.md +7 -2
  538. package/skills/gsd-spec-phase/SKILL.md +5 -1
  539. package/skills/gsd-spike/SKILL.md +8 -3
  540. package/skills/gsd-surface/SKILL.md +5 -1
  541. package/skills/gsd-thread/SKILL.md +4 -0
  542. package/skills/gsd-ui-phase/SKILL.md +6 -1
  543. package/skills/gsd-ui-review/SKILL.md +6 -1
  544. package/skills/gsd-ultraplan-phase/SKILL.md +5 -1
  545. package/skills/gsd-undo/SKILL.md +5 -1
  546. package/skills/gsd-update/SKILL.md +6 -2
  547. package/skills/gsd-validate-phase/SKILL.md +6 -1
  548. package/skills/gsd-verify-work/SKILL.md +6 -1
  549. package/skills/gsd-workspace/SKILL.md +7 -3
  550. package/skills/gsd-workstreams/SKILL.md +6 -6
  551. package/vscode/package.json +1 -1
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ /**
3
+ * GateVerdict — the value a gate module returns instead of printing (#5139, epic #5056,
4
+ * ADR-5057 §4 first bullet, design D1).
5
+ *
6
+ * A gate module decides; the command router formats. A gate imports no io module and performs no
7
+ * direct console/stdout/stderr write (ESLint-enforced) — it returns one of two shapes:
8
+ *
9
+ * - `GateVerdict` the gate reached an answer. `outcome` names it, `block` is the gate's
10
+ * own blocking decision (set explicitly by each arm, never derived from
11
+ * `outcome`), and `payload` is the exact ordered object the router
12
+ * serializes (insertion order is the wire order).
13
+ * - `GateUsageFailure` the caller invoked the gate wrongly (missing argument, escaping path).
14
+ * The router turns it into `error(message, code)`.
15
+ *
16
+ * Pure: no I/O, no imports.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.GATE_FAILURE_CODE = void 0;
20
+ exports.gateVerdict = gateVerdict;
21
+ exports.gateUnreadable = gateUnreadable;
22
+ exports.gateUsageFailure = gateUsageFailure;
23
+ exports.isGateUsageFailure = isGateUsageFailure;
24
+ /**
25
+ * The `GateUsageFailure.failure.code` values a gate module produces. A gate module may not import
26
+ * `./io.cjs` (whose `ERROR_REASON` owns these wire strings), so it names them here; the router
27
+ * hands the code straight to `error()`. Values are pinned equal to `ERROR_REASON.USAGE` /
28
+ * `ERROR_REASON.SDK_MISSING_ARG` / `ERROR_REASON.UNKNOWN` by the cutover-equivalence goldens and
29
+ * the parity test in tests/check-router-cutover-equivalence.test.cjs.
30
+ *
31
+ * `UNKNOWN` is the reason `error()` records when its caller names none: the drift verbs' usage
32
+ * failures never named one (#5219), and the JSON diagnostic's `reason` and the exit-contract v2
33
+ * status (UNKNOWN is FAIL, 1; SDK_MISSING_ARG is USAGE, 64) are observable, so they keep it.
34
+ */
35
+ exports.GATE_FAILURE_CODE = Object.freeze({
36
+ USAGE: 'usage',
37
+ SDK_MISSING_ARG: 'sdk_missing_arg',
38
+ UNKNOWN: 'unknown',
39
+ });
40
+ /**
41
+ * Build a verdict. `payload` is copied (insertion order preserved) and the copy frozen, so a
42
+ * verdict cannot be mutated after the gate returned it.
43
+ */
44
+ function gateVerdict(outcome, block, payload) {
45
+ return { outcome, block, payload: Object.freeze({ ...payload }) };
46
+ }
47
+ /**
48
+ * Build the verdict for evidence that could not be read. `block` is the gate's own policy for that
49
+ * arm (unchanged by this outcome); the exit status is derived from the outcome, never from `block`.
50
+ */
51
+ function gateUnreadable(block, payload) {
52
+ return gateVerdict('unreadable', block, payload);
53
+ }
54
+ /** Build a usage failure: exactly `{ failure: { code, message } }`. */
55
+ function gateUsageFailure(code, message) {
56
+ return { failure: { code, message } };
57
+ }
58
+ /** Narrow a `GateResult` (or any value) to a `GateUsageFailure`. */
59
+ function isGateUsageFailure(result) {
60
+ if (result === null || typeof result !== 'object')
61
+ return false;
62
+ const failure = result.failure;
63
+ return typeof failure === 'object' && failure !== null;
64
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ /**
3
+ * `check verify-command-paths` as a gate module (#5139, epic #5056, ADR-5057 §4 first bullet,
4
+ * #2401): it returns a `GateResult`; the command router formats it. Imports no io module and
5
+ * performs no direct console/stdout/stderr write (ESLint-enforced).
6
+ *
7
+ * Probes every `<automated>` verify command declared in a phase's `-PLAN.md` files against the
8
+ * filesystem WITHOUT executing anything — see `verify-command-grounding.cts` for the recognizer
9
+ * contract.
10
+ *
11
+ * Argv after the verb: `<phase>` | `--dir <plan-dir>`.
12
+ *
13
+ * `--dir` (#4767) names a directory holding `-PLAN.md` files directly, for plans that live outside
14
+ * `.planning/phases/` (quick mode's `.planning/quick/<id>/`). It is resolved against the project
15
+ * root AND CONTAINED WITHIN IT — an absolute or climbing `--dir` that lands outside the root is
16
+ * `unresolvable`, never read — then probed exactly as a phase directory is; `projectRoot` stays the
17
+ * project root in both forms. `--dir <value>` is the only accepted spelling: `--dir=<value>`
18
+ * yields no `dir` flag and falls through to the no-argument arm, as does an empty value (both are
19
+ * `partitionPredicateArgs` behaviour, inherited and unchanged).
20
+ *
21
+ * When the phase cannot be resolved (or `--dir` escapes the root, or neither is given) the gate
22
+ * returns a non-throwing degraded payload (status/commands/counts zeroed, `readError` populated)
23
+ * rather than a usage failure — the plan-checker parses this result and must be able to tell
24
+ * "nothing to report" from "could not look", which a thrown error would collapse.
25
+ *
26
+ * Containment is decided on the resolved target (ADR-4650: the probe's reads follow symlinks).
27
+ * RESIDUAL, stated rather than left to be rediscovered: this is check-then-use, so a symlink
28
+ * planted at the resolved path BETWEEN the containment check and the reads inside the probe would
29
+ * be followed. A link already in place when the command runs IS refused. Closing the window needs
30
+ * O_NOFOLLOW/dirfd semantics inside the ADR-4650 predicate — a wider change than this gate.
31
+ */
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.evaluateVerifyCommandPaths = evaluateVerifyCommandPaths;
34
+ const gate_verdict_cjs_1 = require("./gate-verdict.cjs");
35
+ const gate_args_cjs_1 = require("./gate-args.cjs");
36
+ const gate_phase_context_cjs_1 = require("./gate-phase-context.cjs");
37
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
38
+ const verifyCommandGroundingMod = require("./verify-command-grounding.cjs");
39
+ const { probePhaseVerifyCommands } = verifyCommandGroundingMod;
40
+ function evaluateVerifyCommandPaths(input) {
41
+ const { projectDir } = input;
42
+ const { flags, positionals } = (0, gate_args_cjs_1.partitionPredicateArgs)(input.args);
43
+ const dirFlag = typeof flags['dir'] === 'string' ? flags['dir'] : '';
44
+ // First non-flag positional: `--raw` (valueless) lands in positionals too, and its position
45
+ // relative to the phase argument is the caller's choice.
46
+ const phase = positionals.find(p => !p.startsWith('--')) ?? '';
47
+ if (!phase && !dirFlag) {
48
+ return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)('verify-command-paths requires a phase argument or --dir: check verify-command-paths <phase> | --dir <plan-dir>');
49
+ }
50
+ let phaseDir = '';
51
+ if (dirFlag) {
52
+ // `--dir` is CALLER-SUPPLIED: contain it before it reaches the reads in the probe. Read the
53
+ // value the predicate RETURNED; never re-derive the path. An escape degrades to the same
54
+ // non-throwing payload the unresolvable-phase arm emits.
55
+ const contained = (0, gate_phase_context_cjs_1.resolveContainedPath)(dirFlag, projectDir);
56
+ if ((0, gate_verdict_cjs_1.isGateUsageFailure)(contained)) {
57
+ return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)(`--dir resolves outside the project root: ${dirFlag}`);
58
+ }
59
+ phaseDir = contained;
60
+ }
61
+ else {
62
+ const located = (0, gate_phase_context_cjs_1.resolvePhaseDir)(projectDir, phase);
63
+ if (located.kind === 'unreadable') {
64
+ return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)(`could not read the phase directory for phase ${phase}: ${located.reason}`);
65
+ }
66
+ if (located.kind === 'found')
67
+ phaseDir = located.value;
68
+ }
69
+ if (!phaseDir) {
70
+ return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)(`could not resolve phase directory for phase ${phase}`);
71
+ }
72
+ const probed = probePhaseVerifyCommands({ phaseDir, projectRoot: projectDir });
73
+ const blocked = probed.counts.blocker > 0;
74
+ // A probe that could not look (`unresolvable`) is `unreadable`: never a pass, exit UNAVAILABLE (#5170).
75
+ if (!blocked && probed.status === 'unresolvable')
76
+ return (0, gate_verdict_cjs_1.gateUnreadable)(false, { ...probed });
77
+ return (0, gate_verdict_cjs_1.gateVerdict)(blocked ? 'block' : 'pass', blocked, { ...probed });
78
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /**
3
+ * `check verify-failure-directions` as a gate module (#5139, epic #5056, ADR-5057 §4 first bullet,
4
+ * #3172): it returns a `GateResult`; the command router formats it. Imports no io module and
5
+ * performs no direct console/stdout/stderr write (ESLint-enforced).
6
+ *
7
+ * Probes every `<automated>` verify command declared in a phase's `-PLAN.md` files for a stated
8
+ * `<fails_when>` failing direction — see `verify-command-grounding.cts` for the recognizer
9
+ * contract.
10
+ *
11
+ * Argv after the verb: `<phase>`. When the phase is missing or cannot be resolved to a directory
12
+ * the gate returns a non-throwing degraded payload (status/commands/counts zeroed, `readError`
13
+ * populated) rather than a usage failure — the plan-checker parses this result and must be able to
14
+ * tell "nothing to report" from "could not look".
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.evaluateVerifyFailureDirections = evaluateVerifyFailureDirections;
18
+ const gate_verdict_cjs_1 = require("./gate-verdict.cjs");
19
+ const gate_phase_context_cjs_1 = require("./gate-phase-context.cjs");
20
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
21
+ const verifyCommandGroundingMod = require("./verify-command-grounding.cjs");
22
+ const { probePhaseFailingDirections } = verifyCommandGroundingMod;
23
+ function evaluateVerifyFailureDirections(input) {
24
+ const phase = input.args[0] || '';
25
+ if (!phase) {
26
+ return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)('verify-failure-directions requires a phase argument: check verify-failure-directions <phase>');
27
+ }
28
+ const located = (0, gate_phase_context_cjs_1.resolvePhaseDir)(input.projectDir, phase);
29
+ if (located.kind === 'unreadable') {
30
+ return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)(`could not read the phase directory for phase ${phase}: ${located.reason}`);
31
+ }
32
+ if (located.kind === 'none') {
33
+ return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)(`could not resolve phase directory for phase ${phase}`);
34
+ }
35
+ const probed = probePhaseFailingDirections({ phaseDir: located.value });
36
+ const blocked = probed.counts.blocker > 0;
37
+ // A probe that could not look (`unresolvable`) is `unreadable`: never a pass, exit UNAVAILABLE (#5170).
38
+ if (!blocked && probed.status === 'unresolvable')
39
+ return (0, gate_verdict_cjs_1.gateUnreadable)(false, { ...probed });
40
+ return (0, gate_verdict_cjs_1.gateVerdict)(blocked ? 'block' : 'pass', blocked, { ...probed });
41
+ }
@@ -445,14 +445,17 @@ function graphifyStatus(cwd) {
445
445
  return disabledResponse();
446
446
  const { graphPath, configured } = resolveGraphLocation(cwd, planningDir);
447
447
  if (!node_fs_1.default.existsSync(graphPath)) {
448
- return { exists: false, message: configured
448
+ return { exists: false, graph_path: graphPath, message: configured
449
449
  ? `Configured graph not found at ${graphPath}. Set graphify.graph_path or run /gsd:graphify build.`
450
450
  : 'No graph built yet. Run graphify build to create one.' };
451
451
  }
452
452
  const stat = node_fs_1.default.statSync(graphPath);
453
453
  const graph = safeReadJson(graphPath);
454
454
  if (!graph) {
455
- return { error: 'Failed to parse graph.json' };
455
+ // Still surface graph_path (#4836 Minor 1): callers gate on `exists`, not
456
+ // on this outcome, so without it they'd fall through to the CLI-first
457
+ // branch with no --graph value to substitute for the <graph> placeholder.
458
+ return { error: 'Failed to parse graph.json', graph_path: graphPath };
456
459
  }
457
460
  const STALE_MS = 24 * 60 * 60 * 1000; // 24 hours
458
461
  const age = Date.now() - stat.mtimeMs;
@@ -482,6 +485,11 @@ function graphifyStatus(cwd) {
482
485
  (lastBuildAutoUpdate.status === 'failed' || lastBuildAutoUpdate.status === 'running');
483
486
  return {
484
487
  exists: true,
488
+ // The absolute location the whole graphify surface reads, already resolved
489
+ // through `graphify.graph_path` (#1825). Callers that shell out to the
490
+ // graphify CLI pass this as `--graph` so the umbrella override is honoured
491
+ // there too, instead of re-deriving `.planning/graphs/graph.json` (#4836).
492
+ graph_path: graphPath,
485
493
  last_build: stat.mtime.toISOString(),
486
494
  node_count: (graph.nodes || []).length,
487
495
  edge_count: (graph.edges || graph.links || []).length,
@@ -4,7 +4,7 @@
4
4
  * ADR-3180 §8.2/§8.3/§8.5).
5
5
  *
6
6
  * Group: "Phase directory structure" (design doc, "Rule table organization"
7
- * table) — W005, W023, I001, W009.
7
+ * table) — W005, W023, I001, W009, and W030 (#5118).
8
8
  *
9
9
  * Ported behavior-preserving from `cmdValidateHealth`
10
10
  * (`src/verify.cts:1893-1990`, the exact call sites for W005/W023/I001/W009),
@@ -15,25 +15,14 @@
15
15
  * phases.value[i]` exposes only `planCount`/`summaryCount`, not per-plan
16
16
  * filenames) — this rule reports a coarser per-PHASE message instead.
17
17
  * - W023's original "described" list called `determinePhaseStatus`
18
- * (`commands.cts:154`), a SIX-way status string ('Not Started'/'Planned'/
19
- * 'In Progress'/'Executed'/'Needs Review'/'Complete') computed from its own
20
- * raw `readdirSync` + `*-VERIFICATION.md` frontmatter read of `phaseDir`.
21
- * This rule cannot re-run that raw read (§8.1 rule 1 forbids ambient I/O in
22
- * `check`), so `derivePhaseStatusLabel` below reconstructs the same
23
- * six-way label from fields `PlanningSnapshot` already exposes —
24
- * `PhaseSnapshot.planCount`/`summaryCount` (the plan/no-plan and
25
- * in-progress/planned branches, identical inputs to the original) and
26
- * `PhaseSnapshot.complete`/`verificationStatus` (`isPhaseComplete`'s own
27
- * §7.4 disk-strict routing of the SAME `*-VERIFICATION.md` file) for the
28
- * verification-gated branches. This is a disclosed fidelity reduction, not
29
- * a byte-for-byte guarantee: `verificationStatus` is the DIFFERENT,
30
- * `readVerificationStatus`-routed vocabulary ('passed'/'gaps_found'/
31
- * 'human_needed'/'stale'/'unknown'/'missing') and can disagree with a raw
32
- * frontmatter re-read in edge cases (e.g. a stale-but-frontmatter-"passed"
33
- * VERIFICATION.md routes to 'stale', not 'passed', under §7.4's staleness
34
- * handling — this rule reports 'Executed' there, not 'Complete'). No new
35
- * ambient I/O and no new `PlanningSnapshot` field were needed — every input
36
- * was already on `PhaseSnapshot`.
18
+ * (`commands.cts:154`, since deleted, #5060). The label now comes from the
19
+ * Phase Status Module's pure ladder (`phaseStatusFromFacts` +
20
+ * `toDisplayLabel`, `../phase-status.cjs`) over the same `PhaseSnapshot`
21
+ * facts this rule already had — `planCount`/`summaryCount`,
22
+ * `complete`/`verificationStatus` (`isPhaseComplete`'s §7.4 disk-strict
23
+ * routing of the SAME `*-VERIFICATION.md` file). §8.1 rule 1 (no ambient
24
+ * I/O in `check`) still holds: the module's ladder is a pure function of
25
+ * facts already on the snapshot, no new I/O or snapshot field is needed.
37
26
  *
38
27
  * W009's original message interpolates `${slash('plan-phase')}`
39
28
  * (`verify.cts:1982`, ``Re-run ${slash('plan-phase')} with --research to
@@ -66,6 +55,8 @@ const { isPhaseDirName } = validateMod;
66
55
  // eslint-disable-next-line @typescript-eslint/no-require-imports
67
56
  const phaseIdMod = require("../phase-id.cjs");
68
57
  const { extractPhaseToken, normalizePhaseName, comparePhaseNum } = phaseIdMod;
58
+ // #5060: the Phase Status Module owns the status-label ladder.
59
+ const phase_status_cjs_1 = require("../phase-status.cjs");
69
60
  // ─── W005 — phase directory doesn't follow NN-name format (verify.cts:1893-1902) ─
70
61
  function checkW005(snapshot) {
71
62
  const diagnostics = [];
@@ -89,31 +80,6 @@ function checkW005(snapshot) {
89
80
  // `comparePhaseNum` + a `localeCompare` tiebreak, mirroring
90
81
  // `verify.cts:1930-1932`'s deterministic-output rationale. See the file-level
91
82
  // comment for the disclosed "described" fidelity reduction.
92
- /**
93
- * Reconstruct `commands.cts:154`'s `determinePhaseStatus` six-way label from
94
- * fields `PhaseSnapshot` already exposes (no ambient I/O, no new snapshot
95
- * field — see file-level comment). `complete`/`verificationStatus` come from
96
- * `isPhaseComplete`'s §7.4 disk-strict routing of the same `*-VERIFICATION.md`
97
- * file the original raw read targeted.
98
- */
99
- function derivePhaseStatusLabel(planCount, summaryCount, complete, verificationStatus) {
100
- if (planCount === 0)
101
- return 'Not Started';
102
- if (summaryCount < planCount && summaryCount > 0)
103
- return 'In Progress';
104
- if (summaryCount < planCount)
105
- return 'Planned';
106
- // summaryCount >= planCount > 0 — verification-gated, same as the original's
107
- // post-count fall-through.
108
- if (complete)
109
- return 'Complete';
110
- if (verificationStatus === 'human_needed')
111
- return 'Needs Review';
112
- // gaps_found / stale / missing / unknown all land here, same as the
113
- // original's "verification exists but unrecognized" and "no verification
114
- // file" branches both returning 'Executed'.
115
- return 'Executed';
116
- }
117
83
  function checkW023(snapshot) {
118
84
  const groups = new Map();
119
85
  for (const name of snapshot.phaseDirs.value) {
@@ -138,8 +104,8 @@ function checkW023(snapshot) {
138
104
  const plans = phase ? phase.planCount : 0;
139
105
  const summaries = phase ? phase.summaryCount : 0;
140
106
  const complete = phase ? phase.complete : false;
141
- const verificationStatus = phase ? phase.verificationStatus : 'missing';
142
- const status = derivePhaseStatusLabel(plans, summaries, complete, verificationStatus);
107
+ const verificationStatus = phase ? phase.verificationStatus : null;
108
+ const status = (0, phase_status_cjs_1.toDisplayLabel)((0, phase_status_cjs_1.phaseStatusFromFacts)({ planCount: plans, summaryCount: summaries, complete, verificationStatus }), { pendingWord: 'Not Started' });
143
109
  return `${d} (${status})`;
144
110
  })
145
111
  .join(', ');
@@ -194,6 +160,29 @@ function checkW009(snapshot) {
194
160
  }
195
161
  return diagnostics;
196
162
  }
163
+ // ─── W030 — verification report status outside the closed set (#5118) ─────
164
+ //
165
+ // `isPhaseComplete` absorbs an out-of-set report `status` (its no-throw
166
+ // contract) and the snapshot carries the typed error's file and message. A
167
+ // diagnostics surface must survive the defect it diagnoses, so health reports
168
+ // the file instead of failing with `verification_status_invalid` like the
169
+ // query surfaces do: `validate health` (exit 0) lists each such report as one
170
+ // W030 finding, built from the error the snapshot carries.
171
+ function checkW030(snapshot) {
172
+ const diagnostics = [];
173
+ for (const phase of snapshot.phases.value) {
174
+ const invalid = phase.verificationStatusError;
175
+ if (!invalid)
176
+ continue;
177
+ diagnostics.push({
178
+ code: 'W030',
179
+ severity: SEVERITY.WARNING,
180
+ message: `Phase ${phase.dir}: ${invalid.message}`,
181
+ remedy: adviseRemedy('Set the report frontmatter `status` to one of passed | gaps_found | human_needed, or delete the report and re-run the phase verification'),
182
+ });
183
+ }
184
+ return diagnostics;
185
+ }
197
186
  // ─── Exports ────────────────────────────────────────────────────────────────
198
187
  const RULES = [
199
188
  {
@@ -224,5 +213,12 @@ const RULES = [
224
213
  repairable: false,
225
214
  check: checkW009,
226
215
  },
216
+ {
217
+ code: 'W030',
218
+ severity: SEVERITY.WARNING,
219
+ description: 'Phase verification report status is outside the closed set',
220
+ repairable: false,
221
+ check: checkW030,
222
+ },
227
223
  ];
228
224
  module.exports = { RULES };
@@ -95,6 +95,10 @@ const RULES = [
95
95
  */
96
96
  const CONSISTENCY_RULES = [
97
97
  ...roadmapDiskConsistencyMod.RULES.filter((r) => ['W006', 'W007'].includes(r.code)),
98
+ // #5118: W030 (a verification report status outside the closed set) is
99
+ // REUSED too — the snapshot carries the error, and a diagnostics surface
100
+ // reports it as a finding instead of failing on the defect it diagnoses.
101
+ ...phaseStructureMod.RULES.filter((r) => r.code === 'W030'),
98
102
  ...consistencyMod.RULES,
99
103
  ];
100
104
  // ─── Repair-handler runtime dependencies ───────────────────────────────────
@@ -112,7 +116,7 @@ const roadmapParserMod = require("./roadmap-parser.cjs");
112
116
  const { getMilestoneInfo } = roadmapParserMod;
113
117
  // eslint-disable-next-line @typescript-eslint/no-require-imports
114
118
  const stateMod = require("./state.cjs");
115
- const { writeStateMd } = stateMod;
119
+ const { writeStateMd, assertVerificationReportsReadable } = stateMod;
116
120
  // eslint-disable-next-line @typescript-eslint/no-require-imports
117
121
  const frontmatter = require("./frontmatter.cjs");
118
122
  const { extractFrontmatter } = frontmatter;
@@ -149,7 +153,7 @@ function evaluateRules(snapshot) {
149
153
  return evaluateRuleTable(RULES, snapshot);
150
154
  }
151
155
  /**
152
- * Evaluate `CONSISTENCY_RULES` (W006/W007 + C001-C004) against `snapshot` —
156
+ * Evaluate `CONSISTENCY_RULES` (W006/W007/W030 + C001-C004) against `snapshot` —
153
157
  * `validate.consistency`'s evaluator entry point, mirroring `evaluateRules`
154
158
  * exactly but over the smaller, command-specific rule subset.
155
159
  */
@@ -258,12 +262,6 @@ function runRepairAction(cwd, action, paths) {
258
262
  }
259
263
  case REMEDY_ACTION.REGENERATE_STATE: {
260
264
  const extraDetails = [];
261
- if (node_fs_1.default.existsSync(statePath)) {
262
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
263
- const backupPath = `${statePath}.bak-${timestamp}`;
264
- node_fs_1.default.copyFileSync(statePath, backupPath);
265
- extraDetails.push({ action: 'backupState', success: true, path: backupPath });
266
- }
267
265
  const milestone = getMilestoneInfo(cwd).value;
268
266
  const projectRef = node_path_1.default
269
267
  .relative(cwd, node_path_1.default.join(rootBase, 'PROJECT.md'))
@@ -286,6 +284,17 @@ function runRepairAction(cwd, action, paths) {
286
284
  // STATE.md that had no parseable frontmatter — which is the usual
287
285
  // reason this repair fires.
288
286
  const priorState = node_fs_1.default.existsSync(statePath) ? ((0, shell_command_projection_cjs_1.platformReadSync)(statePath) ?? '') : '';
287
+ // #5118: the write below rebuilds the STATE frontmatter from every
288
+ // phase's report and throws on a `status` outside the closed set.
289
+ // `applyRepairs` validates ONCE, before the run's first write
290
+ // (`assertVerificationReportsReadable`), so this handler is only reached
291
+ // over readable reports and no earlier repair has written.
292
+ if (node_fs_1.default.existsSync(statePath)) {
293
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
294
+ const backupPath = `${statePath}.bak-${timestamp}`;
295
+ node_fs_1.default.copyFileSync(statePath, backupPath);
296
+ extraDetails.push({ action: 'backupState', success: true, path: backupPath });
297
+ }
289
298
  writeStateMd(statePath, stateContent, rebuildStateTransaction({
290
299
  snapshot: extractFrontmatter(priorState, statePath),
291
300
  }), cwd);
@@ -381,6 +390,23 @@ function applyRepairs(cwd, diagnostics, repair, backfill) {
381
390
  const refused = [];
382
391
  const details = [];
383
392
  const paths = repairPaths(cwd);
393
+ // #5118 (no write before the error): a requested REGENERATE_STATE rewrites
394
+ // STATE.md from every phase's report and throws on one whose `status` is
395
+ // outside the closed set — but other repairs in the SAME run (config,
396
+ // MILESTONES.md) may be ordered before it and would already have written.
397
+ // Validate once, before the run's first write; on a refusal no repair in the
398
+ // run is applied (each is reported failed — the dispatcher's exit-0 shape;
399
+ // the defect itself is W030) and the tree is untouched.
400
+ const regenerateRequested = repair && diagnostics.some((d) => d.remedy.action === REMEDY_ACTION.REGENERATE_STATE && d.remedy.risk !== REMEDY_RISK.DESTRUCTIVE);
401
+ let abortMessage = null;
402
+ if (regenerateRequested) {
403
+ try {
404
+ assertVerificationReportsReadable('', cwd);
405
+ }
406
+ catch (err) {
407
+ abortMessage = err instanceof Error ? err.message : String(err);
408
+ }
409
+ }
384
410
  for (const diagnostic of diagnostics) {
385
411
  const { remedy, code } = diagnostic;
386
412
  if (remedy.action === REMEDY_ACTION.ADVISE)
@@ -398,6 +424,17 @@ function applyRepairs(cwd, diagnostics, repair, backfill) {
398
424
  });
399
425
  continue;
400
426
  }
427
+ if (abortMessage !== null) {
428
+ details.push({
429
+ code,
430
+ action: remedy.action,
431
+ success: false,
432
+ error: remedy.action === REMEDY_ACTION.REGENERATE_STATE
433
+ ? abortMessage
434
+ : `not applied: the run stopped before its first write — ${abortMessage}`,
435
+ });
436
+ continue;
437
+ }
401
438
  try {
402
439
  const outcome = runRepairAction(cwd, remedy.action, paths);
403
440
  if (outcome.extraDetails) {
@@ -24,6 +24,7 @@ exports.resolveReportedRuntime = resolveReportedRuntime;
24
24
  const node_fs_1 = __importDefault(require("node:fs"));
25
25
  const node_path_1 = __importDefault(require("node:path"));
26
26
  const runtime_slash_cjs_1 = require("./runtime-slash.cjs");
27
+ const runtime_name_policy_cjs_1 = require("./runtime-name-policy.cjs");
27
28
  const update_context_cjs_1 = require("./update-context.cjs");
28
29
  Object.defineProperty(exports, "CODEX_CONFIG_MARKER", { enumerable: true, get: function () { return update_context_cjs_1.CODEX_CONFIG_MARKER; } });
29
30
  // Codex sandbox env vars set by the shell tool / Seatbelt child-process spawn.
@@ -127,6 +128,14 @@ function resolveReportedRuntimeUnsafe(projectDir, deps) {
127
128
  const explicit = (0, runtime_slash_cjs_1.resolveExplicitRuntime)(projectDir, deps?.env ?? process.env);
128
129
  if (explicit)
129
130
  return explicit;
131
+ // #4717: the per-install marker names the runtime that owns THIS tree — a
132
+ // stronger signal than host sniffing, which misreports every session on a
133
+ // multi-runtime machine (e.g. a globally exported CODEX_HOME makes a Claude
134
+ // Code session read as codex). Marker-less trees (dev/source, pre-#2297
135
+ // installs) fall through to host detection unchanged.
136
+ const marker = (0, runtime_name_policy_cjs_1.resolveRuntimeNameFromCandidates)((0, runtime_slash_cjs_1.readInstallRuntimeMarker)());
137
+ if (marker)
138
+ return marker;
130
139
  const detected = detectHostRuntime(deps);
131
140
  if (detected.runtime)
132
141
  return detected.runtime;