@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.b1abb545

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 (375) hide show
  1. package/dist/cli-web-branch.d.ts +2 -0
  2. package/dist/cli-web-branch.js +9 -2
  3. package/dist/help-text.js +5 -0
  4. package/dist/resources/.managed-resources-content-hash +1 -1
  5. package/dist/resources/extensions/ask-user-questions.js +78 -23
  6. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +84 -228
  7. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  8. package/dist/resources/extensions/github-sync/templates.js +3 -3
  9. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  10. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  11. package/dist/resources/extensions/gsd/auto/orchestrator.js +109 -11
  12. package/dist/resources/extensions/gsd/auto/phases.js +28 -3
  13. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  14. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  15. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  16. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  17. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  19. package/dist/resources/extensions/gsd/auto-prompts.js +81 -8
  20. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  21. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  22. package/dist/resources/extensions/gsd/auto-start.js +12 -23
  23. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  24. package/dist/resources/extensions/gsd/auto-tool-tracking.js +32 -0
  25. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +4 -29
  26. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  27. package/dist/resources/extensions/gsd/auto-worktree.js +21 -19
  28. package/dist/resources/extensions/gsd/auto.js +11 -7
  29. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  30. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
  31. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  32. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +100 -138
  33. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
  34. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  35. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  36. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  37. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  38. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  39. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  40. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  41. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  42. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  43. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  44. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  45. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  46. package/dist/resources/extensions/gsd/doctor.js +16 -9
  47. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  48. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  49. package/dist/resources/extensions/gsd/gsd-db.js +12 -0
  50. package/dist/resources/extensions/gsd/guided-flow.js +34 -468
  51. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  52. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
  53. package/dist/resources/extensions/gsd/mcp-filter.js +2 -1
  54. package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
  55. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  56. package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
  57. package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
  58. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  59. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  60. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  61. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  62. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  63. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  64. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  65. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  66. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  67. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  68. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  69. package/dist/resources/extensions/gsd/preferences.js +147 -29
  70. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  71. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  72. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  73. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  74. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  75. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  76. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  77. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  78. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  79. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  80. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  81. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  82. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  83. package/dist/resources/extensions/gsd/state.js +13 -5
  84. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  85. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  86. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  87. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  88. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  89. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  90. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  91. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  92. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  93. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  94. package/dist/resources/extensions/gsd/uat-policy.js +16 -10
  95. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  96. package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
  97. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  98. package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
  99. package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
  100. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  101. package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
  102. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  103. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  104. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  105. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  106. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  107. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  108. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  109. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  110. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  111. package/dist/update-cmd.js +20 -0
  112. package/dist/web/standalone/.next/BUILD_ID +1 -1
  113. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  114. package/dist/web/standalone/.next/build-manifest.json +3 -3
  115. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  116. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  117. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/index.html +1 -1
  134. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  141. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  142. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  145. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  146. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  147. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  148. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  149. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  150. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  151. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  152. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  153. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  154. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  155. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  156. package/dist/web-mode.d.ts +2 -0
  157. package/dist/web-mode.js +20 -8
  158. package/package.json +2 -1
  159. package/packages/cloud-mcp-gateway/package.json +2 -2
  160. package/packages/contracts/package.json +1 -1
  161. package/packages/daemon/package.json +4 -4
  162. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  163. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  164. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  165. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  166. package/packages/gsd-agent-core/package.json +5 -5
  167. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  168. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  169. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  170. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  171. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  172. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  173. package/packages/gsd-agent-modes/package.json +7 -7
  174. package/packages/mcp-server/dist/server.d.ts +10 -0
  175. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  176. package/packages/mcp-server/dist/server.js +8 -0
  177. package/packages/mcp-server/dist/server.js.map +1 -1
  178. package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
  179. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  180. package/packages/mcp-server/dist/workflow-tools.js +2 -1
  181. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  182. package/packages/mcp-server/package.json +3 -3
  183. package/packages/native/package.json +1 -1
  184. package/packages/pi-agent-core/package.json +1 -1
  185. package/packages/pi-ai/dist/models.generated.d.ts +8 -93
  186. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  187. package/packages/pi-ai/dist/models.generated.js +35 -120
  188. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  189. package/packages/pi-ai/package.json +1 -1
  190. package/packages/pi-coding-agent/package.json +7 -7
  191. package/packages/pi-tui/dist/components/input.js +1 -1
  192. package/packages/pi-tui/dist/components/input.js.map +1 -1
  193. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  194. package/packages/pi-tui/dist/keys.js +39 -30
  195. package/packages/pi-tui/dist/keys.js.map +1 -1
  196. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  197. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  198. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  199. package/packages/pi-tui/package.json +2 -2
  200. package/packages/rpc-client/package.json +2 -2
  201. package/pkg/package.json +1 -1
  202. package/src/resources/extensions/ask-user-questions.ts +87 -24
  203. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +108 -281
  204. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +240 -0
  205. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  206. package/src/resources/extensions/github-sync/templates.ts +3 -3
  207. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  208. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  209. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  210. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  211. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  212. package/src/resources/extensions/gsd/auto/orchestrator.ts +125 -12
  213. package/src/resources/extensions/gsd/auto/phases.ts +35 -3
  214. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  215. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  216. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  217. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  218. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  219. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
  220. package/src/resources/extensions/gsd/auto-prompts.ts +107 -9
  221. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  222. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  223. package/src/resources/extensions/gsd/auto-start.ts +17 -20
  224. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  225. package/src/resources/extensions/gsd/auto-tool-tracking.ts +35 -0
  226. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +9 -30
  227. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  228. package/src/resources/extensions/gsd/auto-worktree.ts +33 -26
  229. package/src/resources/extensions/gsd/auto.ts +15 -8
  230. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  231. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
  232. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  233. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +116 -151
  234. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
  235. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  236. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  237. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  238. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  239. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  240. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  241. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  242. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  243. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  244. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  245. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  246. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  247. package/src/resources/extensions/gsd/doctor.ts +15 -5
  248. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  249. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  250. package/src/resources/extensions/gsd/gsd-db.ts +12 -0
  251. package/src/resources/extensions/gsd/guided-flow.ts +47 -558
  252. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  253. package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
  254. package/src/resources/extensions/gsd/mcp-filter.ts +2 -1
  255. package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
  256. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  257. package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
  258. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  259. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  260. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  261. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  262. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  263. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  264. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  265. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  266. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  267. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  268. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  269. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  270. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  271. package/src/resources/extensions/gsd/preferences.ts +173 -28
  272. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  273. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  274. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  275. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  276. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  277. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  278. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  279. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  280. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  281. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  282. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  283. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  284. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  285. package/src/resources/extensions/gsd/state.ts +15 -5
  286. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  287. package/src/resources/extensions/gsd/templates/project.md +1 -0
  288. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  289. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  290. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  291. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  292. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
  293. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  294. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  295. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
  296. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  297. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  298. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  299. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  300. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
  301. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  302. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
  303. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  304. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  305. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  306. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  307. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  308. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  309. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
  310. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  311. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  312. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  313. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  314. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  315. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  316. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  317. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  318. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  319. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  320. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  321. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
  322. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  323. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  324. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  325. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
  326. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  327. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
  328. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  329. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
  330. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  331. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
  332. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  333. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  334. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
  335. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
  336. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
  337. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  338. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
  339. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
  340. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  341. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
  342. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  343. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  344. package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
  345. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  346. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  347. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  348. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  349. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  350. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  351. package/src/resources/extensions/gsd/uat-policy.ts +19 -10
  352. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  353. package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
  354. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  355. package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
  356. package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
  357. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  358. package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
  359. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  360. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  361. package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
  362. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  363. package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
  364. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  365. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  366. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  367. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  368. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  369. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  370. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  371. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  372. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  373. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  374. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → 3PtrU9qGPEXwNLWkIyiqk}/_buildManifest.js +0 -0
  375. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → 3PtrU9qGPEXwNLWkIyiqk}/_ssgManifest.js +0 -0
@@ -287,10 +287,23 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
287
287
  }, 15000);
288
288
 
289
289
  // ── 3. Hard timeout ──
290
- s.unitTimeoutHandle = setTimeout(async () => {
290
+ const hardTimeoutBody = async () => {
291
291
  try {
292
292
  s.unitTimeoutHandle = null;
293
293
  if (!s.active) return;
294
+ // User-interactive tools (ask_user_questions, secure_env_collect) block
295
+ // waiting for human input by design. Unlike the idle watchdog (above),
296
+ // the hard timeout had no interactive exemption, so a long human
297
+ // deliberation crossing the hard cap would still closeout + recover
298
+ // (triggerTurn) and abort the turn hosting the elicitation, reintroducing
299
+ // the self-cancel loop on slow answers (#2676). Re-arm instead of firing
300
+ // while a human is being asked, mirroring the idle watchdog's
301
+ // refresh-and-return. Conditional on hasInteractiveToolInFlight(), so a
302
+ // genuinely hung non-interactive unit still hits the hard cap.
303
+ if (getInFlightToolCount() > 0 && hasInteractiveToolInFlight()) {
304
+ s.unitTimeoutHandle = setTimeout(hardTimeoutBody, hardTimeoutMs);
305
+ return;
306
+ }
294
307
  const expectedCurrentUnit = s.currentUnit
295
308
  ? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
296
309
  : null;
@@ -323,7 +336,8 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
323
336
  logWarning("timer", `notification failed: ${err instanceof Error ? err.message : String(err)}`);
324
337
  }
325
338
  }
326
- }, hardTimeoutMs);
339
+ };
340
+ s.unitTimeoutHandle = setTimeout(hardTimeoutBody, hardTimeoutMs);
327
341
 
328
342
  // ── 4. Context-pressure continue-here monitor ──
329
343
  if (s.continueHereHandle) {
@@ -19,6 +19,17 @@ const inFlightTools = new Map<string, InFlightTool>();
19
19
  */
20
20
  const INTERACTIVE_TOOLS = new Set(["ask_user_questions", "secure_env_collect"]);
21
21
 
22
+ /**
23
+ * Mode-agnostic refcount of in-flight interactive elicitations that are an
24
+ * active human boundary (the model ASKED via ask_user_questions). Unlike the
25
+ * `inFlightTools` Map, this is NOT gated by auto-session.active, so it is true
26
+ * in FOREGROUND (where s.active is false). Kept SEPARATE from inFlightTools so
27
+ * getInFlightToolCount()/getOldestInFlightToolAgeMs()/hasInteractiveToolInFlight()
28
+ * and the auto-watchdog accounting are byte-for-byte unchanged. A refcount (not
29
+ * a boolean) handles nested/back-to-back elicitations in a single turn.
30
+ */
31
+ let interactiveElicitationDepth = 0;
32
+
22
33
  /**
23
34
  * Mark a tool execution as in-flight.
24
35
  * Records start time and tool name so the idle watchdog can detect tools
@@ -36,6 +47,29 @@ export function markToolEnd(toolCallId: string): void {
36
47
  inFlightTools.delete(toolCallId);
37
48
  }
38
49
 
50
+ /**
51
+ * Mark an interactive elicitation (the model asking via ask_user_questions) as
52
+ * in flight. Ungated by auto-session.active so it is observable in foreground.
53
+ */
54
+ export function markInteractiveElicitationStart(): void {
55
+ interactiveElicitationDepth++;
56
+ }
57
+
58
+ /**
59
+ * Mark an interactive elicitation as completed. Idempotent below zero.
60
+ */
61
+ export function markInteractiveElicitationEnd(): void {
62
+ if (interactiveElicitationDepth > 0) interactiveElicitationDepth--;
63
+ }
64
+
65
+ /**
66
+ * Returns true if any interactive elicitation is currently the active human
67
+ * boundary. True in ALL modes (foreground and auto) while one is in flight.
68
+ */
69
+ export function isInteractiveElicitationInFlight(): boolean {
70
+ return interactiveElicitationDepth > 0;
71
+ }
72
+
39
73
  /**
40
74
  * Returns the age (ms) of the oldest currently in-flight tool, or 0 if none.
41
75
  */
@@ -84,6 +118,7 @@ export function hasInteractiveToolInFlight(): boolean {
84
118
  */
85
119
  export function clearInFlightTools(): void {
86
120
  inFlightTools.clear();
121
+ interactiveElicitationDepth = 0;
87
122
  }
88
123
 
89
124
  // ─── Tool invocation error classification (#2883) ────────────────────────
@@ -3,32 +3,18 @@ import {
3
3
  AUTO_UNIT_SCOPED_TOOLS,
4
4
  getForbiddenGsdToolReason,
5
5
  } from "./unit-tool-contracts.js";
6
+ import {
7
+ WORKFLOW_TOOL_ALIAS_PAIRS,
8
+ canonicalWorkflowSurfaceToolName,
9
+ isWorkflowSurfaceAliasTool,
10
+ stripMcpToolPrefix,
11
+ } from "./workflow-tool-surface.js";
6
12
 
7
13
  export {
8
14
  AUTO_UNIT_SCOPED_TOOLS,
9
15
  RUN_UAT_BROWSER_TOOL_NAMES,
10
16
  } from "./unit-tool-contracts.js";
11
17
 
12
- const WORKFLOW_TOOL_ALIASES: Record<string, string> = {
13
- gsd_save_decision: "gsd_decision_save",
14
- gsd_update_requirement: "gsd_requirement_update",
15
- gsd_save_requirement: "gsd_requirement_save",
16
- gsd_save_summary: "gsd_summary_save",
17
- gsd_generate_milestone_id: "gsd_milestone_generate_id",
18
- gsd_milestone_plan: "gsd_plan_milestone",
19
- gsd_slice_plan: "gsd_plan_slice",
20
- gsd_task_plan: "gsd_plan_task",
21
- gsd_slice_replan: "gsd_replan_slice",
22
- gsd_complete_slice: "gsd_slice_complete",
23
- gsd_milestone_complete: "gsd_complete_milestone",
24
- gsd_milestone_validate: "gsd_validate_milestone",
25
- gsd_roadmap_reassess: "gsd_reassess_roadmap",
26
- gsd_complete_task: "gsd_task_complete",
27
- gsd_reopen_task: "gsd_task_reopen",
28
- gsd_reopen_slice: "gsd_slice_reopen",
29
- gsd_reopen_milestone: "gsd_milestone_reopen",
30
- };
31
-
32
18
  const EXECUTE_TASK_UNIT_TYPES = new Set([
33
19
  "execute-task",
34
20
  "execute-task-simple",
@@ -55,7 +41,7 @@ const EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS = [
55
41
  const SCOPED_GSD_LIFECYCLE_TOOLS = new Set(
56
42
  [
57
43
  ...Object.values(AUTO_UNIT_SCOPED_TOOLS).flat(),
58
- ...Object.values(WORKFLOW_TOOL_ALIASES),
44
+ ...WORKFLOW_TOOL_ALIAS_PAIRS.map(({ canonical }) => canonical),
59
45
  ...EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS,
60
46
  ]
61
47
  .filter((tool) => tool.startsWith("gsd_"))
@@ -72,19 +58,12 @@ type AutoUnitToolScopeResult = {
72
58
  displayReason?: string;
73
59
  };
74
60
 
75
- function stripMcpToolPrefix(toolName: string): string {
76
- if (!toolName.startsWith("mcp__")) return toolName;
77
- const toolSeparator = toolName.indexOf("__", "mcp__".length);
78
- return toolSeparator >= 0 ? toolName.slice(toolSeparator + 2) : toolName;
79
- }
80
-
81
61
  export function canonicalWorkflowToolName(toolName: string): string {
82
- const base = stripMcpToolPrefix(toolName);
83
- return WORKFLOW_TOOL_ALIASES[base] ?? base;
62
+ return canonicalWorkflowSurfaceToolName(toolName);
84
63
  }
85
64
 
86
65
  export function isWorkflowAliasTool(toolName: string): boolean {
87
- return Object.prototype.hasOwnProperty.call(WORKFLOW_TOOL_ALIASES, stripMcpToolPrefix(toolName));
66
+ return isWorkflowSurfaceAliasTool(toolName);
88
67
  }
89
68
 
90
69
  function hardBlockReason(unitType: string, what: string): string {
@@ -16,13 +16,13 @@
16
16
  import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
17
17
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
18
18
  import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath, resolveMilestoneFile } from "./paths.js";
19
+ import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
19
20
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
20
21
  import { parseUnitId } from "./unit-id.js";
21
22
  import { isDbAvailable, getTask, getSliceTasks, getMilestoneSlices } from "./gsd-db.js";
22
23
  import type { TaskRow } from "./db-task-slice-rows.js";
23
24
  import { loadEffectiveGSDPreferences } from "./preferences.js";
24
25
  import type { GSDPreferences } from "./preferences-types.js";
25
- import { extractVerdict } from "./verdict-parser.js";
26
26
  import { isClosedStatus } from "./status-guards.js";
27
27
  import { loadFile } from "./files.js";
28
28
  import { parseRoadmap } from "./parsers-legacy.js";
@@ -269,28 +269,27 @@ async function runValidateMilestonePostCheck(
269
269
  mid,
270
270
  `${mid}-VALIDATION.md`,
271
271
  );
272
- if (!validationFile) {
272
+ const validationContent = await loadFile(validationFile);
273
+ if (validationContent !== null && validationContent.trim() === "") {
273
274
  if (await reassessmentInvalidatedValidation()) {
274
275
  clearValidationRetry();
275
276
  return "continue";
276
277
  }
277
278
  return setToolFailureRetry(
278
- "You must call gsd_validate_milestone to persist the validation results. No VALIDATION.md was created.",
279
+ "You must call gsd_validate_milestone to persist the validation results. VALIDATION.md exists but is empty.",
279
280
  );
280
281
  }
281
282
 
282
- const validationContent = await loadFile(validationFile);
283
- if (!validationContent) {
283
+ const verdict = await resolveMilestoneValidationVerdict(s.basePath, mid);
284
+ if (!verdict) {
284
285
  if (await reassessmentInvalidatedValidation()) {
285
286
  clearValidationRetry();
286
287
  return "continue";
287
288
  }
288
289
  return setToolFailureRetry(
289
- "You must call gsd_validate_milestone to persist the validation results. VALIDATION.md exists but is empty.",
290
+ "You must call gsd_validate_milestone to persist the validation results. No VALIDATION.md was created.",
290
291
  );
291
292
  }
292
-
293
- const verdict = extractVerdict(validationContent);
294
293
  if (verdict === "needs-attention") {
295
294
  ctx.ui.notify(
296
295
  `Milestone ${mid} validation returned verdict=needs-attention. Pausing for human review.`,
@@ -28,10 +28,12 @@ import {
28
28
  getMilestone,
29
29
  getMilestoneSlices,
30
30
  getSliceTasks,
31
- closeDatabase,
32
- openDatabase,
33
- getDbPath,
34
31
  } from "./gsd-db.js";
32
+ import {
33
+ closeWorkflowDatabase,
34
+ getWorkflowDatabasePath,
35
+ openWorkflowDatabasePath,
36
+ } from "./db-workspace.js";
35
37
  import { atomicWriteSync } from "./atomic-write.js";
36
38
  import { execFileSync } from "node:child_process";
37
39
  import { gsdRoot, resolveGsdPathContract } from "./paths.js";
@@ -53,8 +55,11 @@ import {
53
55
  resolveWorktreeProjectRoot,
54
56
  } from "./worktree-root.js";
55
57
  import { autoResolveSafeConflictPaths } from "./git-conflict-resolve.js";
56
- import { MergeConflictError, createDraftPR, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
57
- import { buildPrEvidence } from "./pr-evidence.js";
58
+ import { MergeConflictError, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
59
+ import {
60
+ buildPullRequestEvidence,
61
+ createDraftPullRequestFromEvidence,
62
+ } from "./pull-request-process.js";
58
63
  import { debugLog } from "./debug-logger.js";
59
64
  import { logWarning, logError } from "./workflow-logger.js";
60
65
  import { loadEffectiveGSDPreferences } from "./preferences.js";
@@ -86,16 +91,14 @@ import {
86
91
  } from "./native-git-bridge.js";
87
92
  import {
88
93
  CLOSEOUT_CONSISTENCY_BLOCKED_REASON,
89
- checkCloseoutConsistencyGate,
90
- formatCloseoutConsistencyBlock,
91
94
  } from "./closeout-consistency-gate.js";
95
+ import {
96
+ formatCloseoutProofBlock,
97
+ proveMilestoneCloseout,
98
+ } from "./milestone-closeout-proof.js";
92
99
  import { gsdHome } from "./gsd-home.js";
93
100
  import { type MilestoneScope, type GsdWorkspace, createWorkspace } from "./workspace.js";
94
- import {
95
- _finalizeProjectionForMergeImpl,
96
- _projectRootToWorktreeImpl,
97
- _projectWorktreeToRootImpl,
98
- } from "./worktree-state-projection.js";
101
+ import { WorktreeStateProjection } from "./worktree-state-projection.js";
99
102
 
100
103
  const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
101
104
  const LEGACY_PROJECT_PREFERENCES_FILE = "preferences.md";
@@ -584,7 +587,7 @@ export function syncProjectRootToWorktree(
584
587
  worktreePath_: string,
585
588
  milestoneId: string | null,
586
589
  ): void {
587
- _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestoneId);
590
+ new WorktreeStateProjection().projectRootToWorktreePaths(projectRoot, worktreePath_, milestoneId);
588
591
  }
589
592
 
590
593
  /**
@@ -597,7 +600,7 @@ export function syncStateToProjectRoot(
597
600
  projectRoot: string,
598
601
  milestoneId: string | null,
599
602
  ): void {
600
- _projectWorktreeToRootImpl(worktreePath_, projectRoot, milestoneId);
603
+ new WorktreeStateProjection().projectWorktreeToRootPaths(worktreePath_, projectRoot, milestoneId);
601
604
  }
602
605
 
603
606
  // ─── Resource Staleness ───────────────────────────────────────────────────
@@ -960,7 +963,11 @@ export function syncWorktreeStateBack(
960
963
  worktreePath: string,
961
964
  milestoneId: string,
962
965
  ): { synced: string[] } {
963
- return _finalizeProjectionForMergeImpl(mainBasePath, worktreePath, milestoneId);
966
+ return new WorktreeStateProjection().finalizeProjectionForMergePaths(
967
+ mainBasePath,
968
+ worktreePath,
969
+ milestoneId,
970
+ );
964
971
  }
965
972
  export { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
966
973
 
@@ -1782,10 +1789,10 @@ export function mergeMilestoneToMain(
1782
1789
  const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
1783
1790
  const mainDbPath = contract.projectDb;
1784
1791
  try {
1785
- const activeDbPath = getDbPath();
1792
+ const activeDbPath = getWorkflowDatabasePath();
1786
1793
  if (activeDbPath && _shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
1787
- closeDatabase();
1788
- if (!openDatabase(mainDbPath)) {
1794
+ closeWorkflowDatabase();
1795
+ if (!openWorkflowDatabasePath(mainDbPath)) {
1789
1796
  throw new Error(`cannot open project DB at ${mainDbPath}`);
1790
1797
  }
1791
1798
  }
@@ -1798,9 +1805,9 @@ export function mergeMilestoneToMain(
1798
1805
  throw new GSDError(GSD_GIT_ERROR, `${message}. Recovery reason: ${CLOSEOUT_CONSISTENCY_BLOCKED_REASON}.`);
1799
1806
  }
1800
1807
 
1801
- const closeoutGate = checkCloseoutConsistencyGate(milestoneId);
1802
- if (!closeoutGate.ok) {
1803
- throw new GSDError(GSD_GIT_ERROR, formatCloseoutConsistencyBlock(closeoutGate));
1808
+ const closeoutProof = proveMilestoneCloseout(milestoneId);
1809
+ if (!closeoutProof.ok) {
1810
+ throw new GSDError(GSD_GIT_ERROR, formatCloseoutProofBlock(closeoutProof));
1804
1811
  }
1805
1812
  }
1806
1813
 
@@ -2127,10 +2134,10 @@ export function mergeMilestoneToMain(
2127
2134
  // stashing so Windows releases the handles; reopen after. No-op on
2128
2135
  // POSIX, where advisory locks don't block git.
2129
2136
  const needsDbCycle = process.platform === "win32" && isDbAvailable();
2130
- const dbPathToReopen = needsDbCycle ? getDbPath() : null;
2137
+ const dbPathToReopen = needsDbCycle ? getWorkflowDatabasePath() : null;
2131
2138
  if (needsDbCycle) {
2132
2139
  try {
2133
- closeDatabase();
2140
+ closeWorkflowDatabase();
2134
2141
  } catch (err) {
2135
2142
  logWarning("worktree", `pre-stash db close failed: ${err instanceof Error ? err.message : String(err)}`);
2136
2143
  }
@@ -2180,7 +2187,7 @@ export function mergeMilestoneToMain(
2180
2187
  : nativeMergeSquash(originalBasePath_, milestoneBranch);
2181
2188
  if (needsDbCycle && dbPathToReopen) {
2182
2189
  try {
2183
- openDatabase(dbPathToReopen);
2190
+ openWorkflowDatabasePath(dbPathToReopen);
2184
2191
  } catch (err) {
2185
2192
  logWarning("worktree", `post-merge db reopen failed: ${err instanceof Error ? err.message : String(err)}`);
2186
2193
  }
@@ -2544,7 +2551,7 @@ export function mergeMilestoneToMain(
2544
2551
  stdio: ["ignore", "pipe", "pipe"],
2545
2552
  encoding: "utf-8",
2546
2553
  });
2547
- const prEvidence = buildPrEvidence({
2554
+ const prEvidence = buildPullRequestEvidence({
2548
2555
  milestoneId,
2549
2556
  milestoneTitle,
2550
2557
  changeType: "feat",
@@ -2553,7 +2560,7 @@ export function mergeMilestoneToMain(
2553
2560
  rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
2554
2561
  how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
2555
2562
  });
2556
- const prUrl = createDraftPR(originalBasePath_, milestoneId, prEvidence.title, prEvidence.body, {
2563
+ const prUrl = createDraftPullRequestFromEvidence(originalBasePath_, milestoneId, prEvidence, {
2557
2564
  head: milestoneBranch,
2558
2565
  base: prTarget,
2559
2566
  });
@@ -185,6 +185,7 @@ import {
185
185
  } from "./auto-worktree.js";
186
186
  import { pruneQueueOrder } from "./queue-order.js";
187
187
  import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
188
+ import { createMilestoneMergeTransaction } from "./milestone-merge-transaction.js";
188
189
 
189
190
  import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
190
191
  import {
@@ -225,8 +226,8 @@ import {
225
226
  getMilestoneSlices,
226
227
  getSlice,
227
228
  getTask,
228
- refreshOpenDatabaseFromDisk,
229
229
  } from "./gsd-db.js";
230
+ import { closeWorkflowDatabase } from "./db-workspace.js";
230
231
  import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
231
232
  import { writeUnitRuntimeRecord } from "./unit-runtime.js";
232
233
  import { countPendingCaptures } from "./captures.js";
@@ -320,7 +321,7 @@ export type {
320
321
  UnitRouting,
321
322
  StartModel,
322
323
  } from "./auto/session.js";
323
- import { autoSession as s } from "./auto-runtime-state.js";
324
+ import { autoSession as s, getAutoRuntimeSnapshot } from "./auto-runtime-state.js";
324
325
  import { gsdHome } from "./gsd-home.js";
325
326
  import { createWorkspace, scopeMilestone } from "./workspace.js";
326
327
  import {
@@ -791,6 +792,7 @@ export { type AutoDashboardData } from "./auto-dashboard.js";
791
792
 
792
793
  export function getAutoDashboardData(): AutoDashboardData {
793
794
  const ledger = getLedger();
795
+ const runtimeSnapshot = getAutoRuntimeSnapshot();
794
796
  const totals = ledger ? getProjectTotals(ledger.units) : null;
795
797
  const sessionId = s.cmdCtx?.sessionManager?.getSessionId?.() ?? null;
796
798
  const rtkSavings = sessionId && s.basePath
@@ -822,6 +824,7 @@ export function getAutoDashboardData(): AutoDashboardData {
822
824
  pendingCaptureCount,
823
825
  rtkSavings,
824
826
  rtkEnabled,
827
+ toolSurface: runtimeSnapshot.toolSurface,
825
828
  };
826
829
  }
827
830
 
@@ -1476,12 +1479,17 @@ export async function stopAuto(
1476
1479
  // worktree was active, and whether the current milestone was merged before
1477
1480
  // stopAuto. The unmerged-work warning is only meaningful for real worktrees.
1478
1481
  try {
1479
- const { emitAutoExit, normalizeAutoExitReason } = await import("./worktree-telemetry.js");
1482
+ const {
1483
+ autoExitReasonForTerminalOutcome,
1484
+ emitAutoExit,
1485
+ normalizeAutoExitReason,
1486
+ } = await import("./worktree-telemetry.js");
1480
1487
  // Normalize the free-form reason to a closed set so the telemetry
1481
1488
  // aggregator buckets stably. Raw detail is preserved in the phases.ts
1482
1489
  // notification and the notify'd error string.
1483
1490
  const rawReason = reason ?? "stop";
1484
- const normalizedReason = normalizeAutoExitReason(rawReason);
1491
+ const normalizedReason = autoExitReasonForTerminalOutcome(options.terminalOutcome)
1492
+ ?? normalizeAutoExitReason(rawReason);
1485
1493
  const telemetryBase = s.originalBasePath || s.basePath;
1486
1494
  emitAutoExit(telemetryBase, {
1487
1495
  reason: normalizedReason,
@@ -1674,8 +1682,7 @@ export async function stopAuto(
1674
1682
  // ── Step 6: DB cleanup ──
1675
1683
  if (isDbAvailable()) {
1676
1684
  try {
1677
- const { closeDatabase } = await import("./gsd-db.js");
1678
- closeDatabase();
1685
+ closeWorkflowDatabase();
1679
1686
  } catch (e) {
1680
1687
  debugLog("db-close-failed", {
1681
1688
  error: e instanceof Error ? e.message : String(e),
@@ -2143,7 +2150,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
2143
2150
  // C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
2144
2151
  //
2145
2152
  // Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
2146
- // worktreeProjection, mergeMilestoneToMain). Down from 18 at slice-7
2153
+ // worktreeProjection, mergeMilestoneToMain transaction runner). Down from 18 at slice-7
2147
2154
  // closure.
2148
2155
  return {
2149
2156
  gitServiceFactory: (basePath: string) => {
@@ -2152,7 +2159,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
2152
2159
  return new GitServiceImpl(basePath, gitConfig);
2153
2160
  },
2154
2161
  worktreeProjection: new WorktreeStateProjection(),
2155
- mergeMilestoneToMain,
2162
+ mergeMilestoneToMain: createMilestoneMergeTransaction(mergeMilestoneToMain),
2156
2163
  };
2157
2164
  }
2158
2165
 
@@ -12,6 +12,7 @@ import { logError } from "../workflow-logger.js";
12
12
  import { getErrorMessage } from "../error-utils.js";
13
13
  import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
14
14
  import { prepareSaveGateResultArguments } from "../tools/save-gate-result-args.js";
15
+ import { aliasesForWorkflowTool } from "../workflow-tool-surface.js";
15
16
 
16
17
  async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow-tool-executors.js")> {
17
18
  return importWorkflowExecutorsModule();
@@ -53,6 +54,14 @@ function registerAlias(pi: ExtensionAPI, toolDef: any, aliasName: string, canoni
53
54
  });
54
55
  }
55
56
 
57
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- toolDef shape matches ToolDefinition but varies by schema
58
+ function registerWorkflowTool(pi: ExtensionAPI, toolDef: any): void {
59
+ pi.registerTool(toolDef);
60
+ for (const alias of aliasesForWorkflowTool(toolDef.name)) {
61
+ registerAlias(pi, toolDef, alias, toolDef.name);
62
+ }
63
+ }
64
+
56
65
  function requirementRootWriteGuard(operation: string, basePath: string): { content: Array<{ type: "text"; text: string }>; details: Record<string, unknown>; isError: true } | null {
57
66
  const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(basePath), "REQUIREMENTS");
58
67
  if (!guard.block) return null;
@@ -171,8 +180,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
171
180
  },
172
181
  };
173
182
 
174
- pi.registerTool(decisionSaveTool);
175
- registerAlias(pi, decisionSaveTool, "gsd_save_decision", "gsd_decision_save");
183
+ registerWorkflowTool(pi, decisionSaveTool);
176
184
 
177
185
  // ─── gsd_requirement_update (formerly gsd_update_requirement) ───────────
178
186
 
@@ -252,8 +260,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
252
260
  },
253
261
  };
254
262
 
255
- pi.registerTool(requirementUpdateTool);
256
- registerAlias(pi, requirementUpdateTool, "gsd_update_requirement", "gsd_requirement_update");
263
+ registerWorkflowTool(pi, requirementUpdateTool);
257
264
 
258
265
  // ─── gsd_requirement_save ─────────────────────────────────────────────
259
266
 
@@ -355,8 +362,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
355
362
  },
356
363
  };
357
364
 
358
- pi.registerTool(requirementSaveTool);
359
- registerAlias(pi, requirementSaveTool, "gsd_save_requirement", "gsd_requirement_save");
365
+ registerWorkflowTool(pi, requirementSaveTool);
360
366
 
361
367
  // ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
362
368
 
@@ -413,8 +419,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
413
419
  },
414
420
  };
415
421
 
416
- pi.registerTool(summarySaveTool);
417
- registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
422
+ registerWorkflowTool(pi, summarySaveTool);
418
423
 
419
424
  // ─── gsd_uat_result_save ─────────────────────────────────────────────────
420
425
 
@@ -503,7 +508,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
503
508
  },
504
509
  };
505
510
 
506
- pi.registerTool(uatResultSaveTool);
511
+ registerWorkflowTool(pi, uatResultSaveTool);
507
512
 
508
513
  // ─── gsd_milestone_generate_id (formerly gsd_generate_milestone_id) ────
509
514
 
@@ -592,8 +597,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
592
597
  },
593
598
  };
594
599
 
595
- pi.registerTool(milestoneGenerateIdTool);
596
- registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
600
+ registerWorkflowTool(pi, milestoneGenerateIdTool);
597
601
 
598
602
  // ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
599
603
 
@@ -664,8 +668,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
664
668
  execute: planMilestoneExecute,
665
669
  };
666
670
 
667
- pi.registerTool(planMilestoneTool);
668
- registerAlias(pi, planMilestoneTool, "gsd_milestone_plan", "gsd_plan_milestone");
671
+ registerWorkflowTool(pi, planMilestoneTool);
669
672
 
670
673
  // ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
671
674
 
@@ -714,8 +717,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
714
717
  execute: planSliceExecute,
715
718
  };
716
719
 
717
- pi.registerTool(planSliceTool);
718
- registerAlias(pi, planSliceTool, "gsd_slice_plan", "gsd_plan_slice");
720
+ registerWorkflowTool(pi, planSliceTool);
719
721
 
720
722
  // ─── gsd_plan_task (gsd_task_plan alias) ───────────────────────────────
721
723
 
@@ -788,8 +790,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
788
790
  execute: planTaskExecute,
789
791
  };
790
792
 
791
- pi.registerTool(planTaskTool);
792
- registerAlias(pi, planTaskTool, "gsd_task_plan", "gsd_plan_task");
793
+ registerWorkflowTool(pi, planTaskTool);
793
794
 
794
795
  // ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
795
796
 
@@ -857,8 +858,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
857
858
  execute: taskCompleteExecute,
858
859
  };
859
860
 
860
- pi.registerTool(taskCompleteTool);
861
- registerAlias(pi, taskCompleteTool, "gsd_complete_task", "gsd_task_complete");
861
+ registerWorkflowTool(pi, taskCompleteTool);
862
862
 
863
863
  // ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
864
864
 
@@ -943,8 +943,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
943
943
  execute: sliceCompleteExecute,
944
944
  };
945
945
 
946
- pi.registerTool(sliceCompleteTool);
947
- registerAlias(pi, sliceCompleteTool, "gsd_complete_slice", "gsd_slice_complete");
946
+ registerWorkflowTool(pi, sliceCompleteTool);
948
947
 
949
948
  // ─── gsd_skip_slice (#3477 / #3487) ───────────────────────────────────
950
949
 
@@ -1016,7 +1015,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1016
1015
  }
1017
1016
  };
1018
1017
 
1019
- pi.registerTool({
1018
+ registerWorkflowTool(pi, {
1020
1019
  name: "gsd_skip_slice",
1021
1020
  label: "Skip Slice",
1022
1021
  description:
@@ -1081,8 +1080,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1081
1080
  execute: milestoneCompleteExecute,
1082
1081
  };
1083
1082
 
1084
- pi.registerTool(milestoneCompleteTool);
1085
- registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
1083
+ registerWorkflowTool(pi, milestoneCompleteTool);
1086
1084
 
1087
1085
  // ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
1088
1086
 
@@ -1121,8 +1119,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1121
1119
  execute: milestoneValidateExecute,
1122
1120
  };
1123
1121
 
1124
- pi.registerTool(milestoneValidateTool);
1125
- registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
1122
+ registerWorkflowTool(pi, milestoneValidateTool);
1126
1123
 
1127
1124
  // ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
1128
1125
 
@@ -1172,8 +1169,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1172
1169
  execute: replanSliceExecute,
1173
1170
  };
1174
1171
 
1175
- pi.registerTool(replanSliceTool);
1176
- registerAlias(pi, replanSliceTool, "gsd_slice_replan", "gsd_replan_slice");
1172
+ registerWorkflowTool(pi, replanSliceTool);
1177
1173
 
1178
1174
  // ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
1179
1175
 
@@ -1231,8 +1227,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1231
1227
  execute: reassessRoadmapExecute,
1232
1228
  };
1233
1229
 
1234
- pi.registerTool(reassessRoadmapTool);
1235
- registerAlias(pi, reassessRoadmapTool, "gsd_roadmap_reassess", "gsd_reassess_roadmap");
1230
+ registerWorkflowTool(pi, reassessRoadmapTool);
1236
1231
 
1237
1232
  // ─── gsd_task_reopen (gsd_reopen_task alias) ───────────────────────────
1238
1233
  // Single-writer v3, Stream 3: reversibility tools for closed units.
@@ -1299,8 +1294,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1299
1294
  execute: reopenTaskExecute,
1300
1295
  };
1301
1296
 
1302
- pi.registerTool(reopenTaskTool);
1303
- registerAlias(pi, reopenTaskTool, "gsd_reopen_task", "gsd_task_reopen");
1297
+ registerWorkflowTool(pi, reopenTaskTool);
1304
1298
 
1305
1299
  // ─── gsd_slice_reopen (gsd_reopen_slice alias) ─────────────────────────
1306
1300
 
@@ -1366,8 +1360,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1366
1360
  execute: reopenSliceExecute,
1367
1361
  };
1368
1362
 
1369
- pi.registerTool(reopenSliceTool);
1370
- registerAlias(pi, reopenSliceTool, "gsd_reopen_slice", "gsd_slice_reopen");
1363
+ registerWorkflowTool(pi, reopenSliceTool);
1371
1364
 
1372
1365
  // ─── gsd_milestone_reopen (gsd_reopen_milestone alias) ─────────────────
1373
1366
 
@@ -1431,8 +1424,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1431
1424
  execute: reopenMilestoneExecute,
1432
1425
  };
1433
1426
 
1434
- pi.registerTool(reopenMilestoneTool);
1435
- registerAlias(pi, reopenMilestoneTool, "gsd_reopen_milestone", "gsd_milestone_reopen");
1427
+ registerWorkflowTool(pi, reopenMilestoneTool);
1436
1428
 
1437
1429
  // ─── gsd_save_gate_result ──────────────────────────────────────────────
1438
1430
 
@@ -1500,5 +1492,5 @@ export function registerDbTools(pi: ExtensionAPI): void {
1500
1492
  },
1501
1493
  };
1502
1494
 
1503
- pi.registerTool(saveGateResultTool);
1495
+ registerWorkflowTool(pi, saveGateResultTool);
1504
1496
  }