@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6

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 (500) 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/project-sessions.js +4 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/extensions/ask-user-questions.js +78 -23
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
  8. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  9. package/dist/resources/extensions/github-sync/templates.js +3 -3
  10. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  11. package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
  12. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
  14. package/dist/resources/extensions/gsd/auto/phases.js +28 -3
  15. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  16. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  17. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  21. package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
  22. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  23. package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
  24. package/dist/resources/extensions/gsd/auto-start.js +12 -23
  25. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  26. package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
  27. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
  28. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  29. package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
  30. package/dist/resources/extensions/gsd/auto.js +73 -471
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  32. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
  33. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
  36. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  37. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  38. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  39. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  40. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  41. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  42. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  43. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  44. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  45. package/dist/resources/extensions/gsd/debug-logger.js +10 -0
  46. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  47. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  48. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  49. package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
  50. package/dist/resources/extensions/gsd/doctor.js +16 -9
  51. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  52. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  53. package/dist/resources/extensions/gsd/gsd-db.js +12 -0
  54. package/dist/resources/extensions/gsd/guided-flow.js +36 -470
  55. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  56. package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
  57. package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
  58. package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
  59. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  60. package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
  61. package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
  62. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  63. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  64. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  65. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  66. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  67. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  68. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  69. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  70. package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
  71. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  72. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  73. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  74. package/dist/resources/extensions/gsd/preferences.js +147 -29
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  76. package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  78. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  79. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  80. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  84. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  85. package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  86. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  88. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  89. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  90. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  91. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  92. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  93. package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
  94. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  95. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
  96. package/dist/resources/extensions/gsd/state.js +13 -5
  97. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  98. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  99. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  100. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  101. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  102. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  103. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  104. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  105. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  106. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  107. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
  108. package/dist/resources/extensions/gsd/uat-policy.js +16 -10
  109. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  110. package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
  111. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  112. package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
  113. package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
  114. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  115. package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  117. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  118. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  119. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  120. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  121. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  122. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  123. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  125. package/dist/update-cmd.js +20 -0
  126. package/dist/web/standalone/.next/BUILD_ID +1 -1
  127. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  128. package/dist/web/standalone/.next/build-manifest.json +3 -3
  129. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  130. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  131. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/index.html +1 -1
  183. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  190. package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
  191. package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
  192. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  193. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  196. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  197. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  198. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  199. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  200. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  201. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  202. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  203. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  204. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  206. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  207. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  208. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  209. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  210. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  211. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  212. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  213. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  214. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  215. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  216. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  217. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  218. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  219. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  220. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  221. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  222. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  223. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  224. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  225. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  226. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  227. package/dist/web-mode.d.ts +2 -0
  228. package/dist/web-mode.js +20 -8
  229. package/package.json +17 -11
  230. package/packages/cloud-mcp-gateway/package.json +2 -2
  231. package/packages/contracts/package.json +1 -1
  232. package/packages/daemon/package.json +4 -4
  233. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  234. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  235. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  236. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  237. package/packages/gsd-agent-core/package.json +5 -5
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  249. package/packages/gsd-agent-modes/package.json +7 -7
  250. package/packages/mcp-server/dist/server.d.ts +10 -0
  251. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  252. package/packages/mcp-server/dist/server.js +8 -0
  253. package/packages/mcp-server/dist/server.js.map +1 -1
  254. package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
  255. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  256. package/packages/mcp-server/dist/workflow-tools.js +2 -1
  257. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  258. package/packages/mcp-server/package.json +3 -3
  259. package/packages/native/package.json +1 -1
  260. package/packages/pi-agent-core/package.json +1 -1
  261. package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
  262. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  263. package/packages/pi-ai/dist/image-models.generated.js +30 -0
  264. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  265. package/packages/pi-ai/dist/models.generated.d.ts +8 -127
  266. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  267. package/packages/pi-ai/dist/models.generated.js +47 -166
  268. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  269. package/packages/pi-ai/package.json +1 -1
  270. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
  272. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  273. package/packages/pi-coding-agent/package.json +7 -7
  274. package/packages/pi-tui/dist/components/input.js +1 -1
  275. package/packages/pi-tui/dist/components/input.js.map +1 -1
  276. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  277. package/packages/pi-tui/dist/keys.js +39 -30
  278. package/packages/pi-tui/dist/keys.js.map +1 -1
  279. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  280. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  281. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  282. package/packages/pi-tui/package.json +2 -2
  283. package/packages/rpc-client/package.json +2 -2
  284. package/pkg/package.json +1 -1
  285. package/scripts/install/deps.js +10 -0
  286. package/scripts/link-workspace-packages.cjs +7 -40
  287. package/src/resources/extensions/ask-user-questions.ts +87 -24
  288. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
  289. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
  290. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  291. package/src/resources/extensions/github-sync/templates.ts +3 -3
  292. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  293. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  294. package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
  295. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  296. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  297. package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
  298. package/src/resources/extensions/gsd/auto/phases.ts +35 -3
  299. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  300. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  301. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  302. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  303. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  304. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
  305. package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
  306. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  307. package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
  308. package/src/resources/extensions/gsd/auto-start.ts +17 -20
  309. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  310. package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
  311. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
  312. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  313. package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
  314. package/src/resources/extensions/gsd/auto.ts +96 -508
  315. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  316. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
  317. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  318. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
  319. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
  320. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  321. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  322. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  323. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  324. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  325. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  326. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  327. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  328. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  329. package/src/resources/extensions/gsd/debug-logger.ts +11 -0
  330. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  331. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  332. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  333. package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
  334. package/src/resources/extensions/gsd/doctor.ts +15 -5
  335. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  336. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  337. package/src/resources/extensions/gsd/gsd-db.ts +12 -0
  338. package/src/resources/extensions/gsd/guided-flow.ts +49 -560
  339. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  340. package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
  341. package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
  342. package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
  343. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  344. package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
  345. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  346. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  347. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  348. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  349. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  350. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  351. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  352. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  353. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  354. package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
  355. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  356. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  357. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  358. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  359. package/src/resources/extensions/gsd/preferences.ts +173 -28
  360. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  361. package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
  362. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  363. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  364. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  365. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  366. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  367. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  368. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  369. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  370. package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  371. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  372. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  373. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  374. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  375. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  376. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  377. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  378. package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
  379. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  380. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
  381. package/src/resources/extensions/gsd/state.ts +15 -5
  382. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  383. package/src/resources/extensions/gsd/templates/project.md +1 -0
  384. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  385. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  386. package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
  387. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  388. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  389. package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
  390. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
  391. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  392. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  393. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
  394. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
  395. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  396. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  397. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  398. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  399. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
  400. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
  401. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  402. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
  403. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  404. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
  405. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  406. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  407. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  408. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  409. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
  410. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
  411. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  412. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
  413. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  414. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  415. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  416. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  417. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  418. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  419. package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
  420. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
  421. package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
  422. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  423. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
  424. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  425. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  426. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  427. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
  428. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  429. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  430. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  431. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
  432. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
  433. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  434. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
  435. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  436. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
  437. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  438. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
  439. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
  440. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  441. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  442. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
  443. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
  444. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
  445. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  446. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
  447. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
  448. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  449. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
  450. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  451. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
  452. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  453. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
  454. package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
  455. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  456. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  457. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  458. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  459. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  460. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  461. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
  462. package/src/resources/extensions/gsd/uat-policy.ts +19 -10
  463. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  464. package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
  465. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  466. package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
  467. package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
  468. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  469. package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
  470. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  471. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  472. package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
  473. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  474. package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
  475. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  476. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  477. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  478. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  479. package/dist/web/standalone/.next/server/chunks/678.js +0 -2
  480. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  483. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  485. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  486. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
  487. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
  488. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
  489. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
  490. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
  491. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
  492. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
  493. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
  494. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
  495. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
  496. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
  497. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
  498. package/scripts/ensure-workspace-builds.cjs +0 -129
  499. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
  500. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
@@ -13,21 +13,25 @@ import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-exten
13
13
  import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
14
14
 
15
15
  import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
16
- import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isMilestoneDepthVerified, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
16
+ import { applyAskUserQuestionsGateResult, canonicalToolName, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, isMilestoneDepthVerified, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
17
17
  import { resolveManifest } from "../unit-context-manifest.js";
18
18
  import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
19
19
  import { loadFile, saveFile, formatContinue } from "../files.js";
20
20
  import {
21
+ clearAutoCompletionStopInProgress,
21
22
  clearToolInvocationError,
22
23
  getAutoRuntimeSnapshot,
23
24
  getSourceObservationStore,
24
25
  isAutoActive,
25
26
  isAutoCompletionStopInProgress,
26
27
  isAutoPaused,
28
+ isInteractiveElicitationInFlight,
27
29
  markToolEnd,
28
30
  markToolStart,
31
+ recordAutoToolSurfaceSnapshot,
29
32
  recordToolInvocationError,
30
33
  } from "../auto-runtime-state.js";
34
+ import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
31
35
 
32
36
  import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
33
37
  import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
@@ -39,17 +43,24 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
39
43
  import { installNotifyInterceptor } from "./notify-interceptor.js";
40
44
  import { initNotificationStore } from "../notification-store.js";
41
45
  import { initNotificationWidget } from "../notification-widget.js";
46
+ import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
42
47
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
43
48
  import { extractSubagentAgentClasses } from "./subagent-input.js";
44
- import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
49
+ import {
50
+ approvalGateIdForUnit,
51
+ isExplicitApprovalResponse,
52
+ messageHasPendingAskUserQuestionsTool,
53
+ shouldPauseForUserApprovalQuestion,
54
+ } from "../user-input-boundary.js";
45
55
  import { resolveSkillManifest } from "../skill-manifest.js";
46
56
  import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
47
57
  import { getGuidedUnitContext } from "../guided-unit-context.js";
48
58
  import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
49
- import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
59
+ import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, canonicalWorkflowToolName, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
50
60
  import { filterToolsForProvider } from "../model-router.js";
61
+ import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
51
62
  import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
52
- import { injectSourceContextBlockIntoPayload, supportsSourceObservationsForUnit } from "../source-observations.js";
63
+ import { supportsSourceObservationsForUnit } from "../source-observations.js";
53
64
 
54
65
  let approvalQuestionAbortInFlight = false;
55
66
 
@@ -138,7 +149,9 @@ export const MINIMAL_GSD_TOOL_NAMES = [
138
149
  "gsd_checkpoint_db",
139
150
  "gsd_plan_milestone",
140
151
  "memory_query",
152
+ "gsd_memory_query",
141
153
  "capture_thought",
154
+ "gsd_capture_thought",
142
155
  ] as const;
143
156
 
144
157
  export const MINIMAL_AUTO_BASE_TOOL_NAMES = [
@@ -207,16 +220,22 @@ function resolveScopedToolNames(
207
220
 
208
221
  for (const requested of requestedToolNames) {
209
222
  const scopedMatches: string[] = [];
223
+ const aliasFallbacks: string[] = [];
210
224
 
211
225
  for (const activeName of activeToolNames) {
212
- if (!activeName.startsWith("mcp__")) continue;
213
- const toolSeparator = activeName.indexOf("__", "mcp__".length);
214
- if (toolSeparator < 0) continue;
215
- if (activeName.slice(toolSeparator + 2) === requested) {
226
+ if (mcpToolMatchesBaseName(activeName, requested)) {
216
227
  scopedMatches.push(activeName);
228
+ } else if (isWorkflowAliasTool(activeName) && canonicalWorkflowToolName(activeName) === requested) {
229
+ aliasFallbacks.push(activeName);
217
230
  }
218
231
  }
219
232
 
233
+ // Only use alias as fallback when canonical is absent — not directly and not via MCP scoping.
234
+ // Prevents the alias from resurfacing alongside the canonical when both are in the active set.
235
+ if (!exact.has(requested) && scopedMatches.length === 0) {
236
+ scopedMatches.push(...aliasFallbacks);
237
+ }
238
+
220
239
  if (requested.startsWith("browser_") && scopedMatches.length > 0) {
221
240
  for (const match of scopedMatches) resolved.add(match);
222
241
  continue;
@@ -273,7 +292,7 @@ export function buildRunUatGsdToolSet(
273
292
  const resolved = [...new Set(scoped)];
274
293
 
275
294
  const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter(
276
- (tool) => !resolved.some((name) => name === tool || (name.startsWith("mcp__") && name.endsWith(`__${tool}`))),
295
+ (tool) => !resolved.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)),
277
296
  );
278
297
  if (unresolved.length > 0) {
279
298
  safetyLogWarning(
@@ -365,11 +384,21 @@ function applyMinimalGsdToolSurface(pi: ExtensionAPI): void {
365
384
  if (isFullGsdToolSurfaceRequested()) return;
366
385
  const dash = getAutoRuntimeSnapshot();
367
386
  if (dash.active && dash.currentUnit) {
368
- pi.setActiveTools(buildMinimalAutoGsdToolSet(
369
- pi.getActiveTools(),
387
+ const currentToolNames = pi.getActiveTools();
388
+ const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
389
+ const scopedToolNames = buildMinimalAutoGsdToolSet(
390
+ currentToolNames,
370
391
  dash.currentUnit.type,
371
- resolveRegisteredToolNames(pi, pi.getActiveTools()),
372
- ));
392
+ registeredToolNames,
393
+ );
394
+ recordAutoToolSurfaceSnapshot({
395
+ source: "runtime-scope",
396
+ unitType: dash.currentUnit.type,
397
+ modelFacingToolNames: scopedToolNames,
398
+ registeredToolNames,
399
+ scopedToolNames,
400
+ });
401
+ pi.setActiveTools(scopedToolNames);
373
402
  return;
374
403
  }
375
404
  if (!isGeneralGsdToolScopingRequested()) return;
@@ -386,6 +415,13 @@ export function scopeGsdWorkflowToolsForDispatch(
386
415
  const scoped = unitType
387
416
  ? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
388
417
  : buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
418
+ recordAutoToolSurfaceSnapshot({
419
+ source: "dispatch-scope",
420
+ unitType,
421
+ modelFacingToolNames: scoped,
422
+ registeredToolNames,
423
+ scopedToolNames: scoped,
424
+ });
389
425
  const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
390
426
  const canScopeSkills = unitHasSkillManifest(unitType) && pi.getVisibleSkills && pi.setVisibleSkills;
391
427
  if (!toolsChanged && !canScopeSkills) {
@@ -694,6 +730,7 @@ function initSessionNotifications(ctx: ExtensionContext): void {
694
730
  initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
695
731
  installNotifyInterceptor(ctx);
696
732
  initNotificationWidget(ctx);
733
+ notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
697
734
  }
698
735
 
699
736
  async function prepareWorkflowMcpForHookContext(
@@ -790,6 +827,7 @@ export function registerHooks(
790
827
  });
791
828
 
792
829
  pi.on("before_agent_start", async (event, ctx: ExtensionContext) => {
830
+ clearAutoCompletionStopInProgress();
793
831
  resetPendingGatePauseGuard();
794
832
  applyMinimalGsdToolSurface(pi);
795
833
 
@@ -990,6 +1028,18 @@ export function registerHooks(
990
1028
 
991
1029
  pi.on("message_update", async (event, ctx: ExtensionContext) => {
992
1030
  if (approvalQuestionAbortInFlight) return;
1031
+ // If the model asked via ask_user_questions, that in-flight elicitation IS
1032
+ // the human boundary. Arming the pause/gate here (and emitting the "waiting
1033
+ // for your approval - pausing" notice) would tear it down and trigger the
1034
+ // foreground self-cancel/re-ask loop. The marker is set only by the
1035
+ // claude-code-cli SDK elicitation handler and is ungated, so it is true in
1036
+ // foreground; under the native-TUI provider it is always false and this path
1037
+ // runs unchanged (#cc-elicitation-self-cancel).
1038
+ if (isInteractiveElicitationInFlight()) return;
1039
+ // Prose with "?" can stream before the MCP tool/elicitation starts. When the
1040
+ // structured ask_user_questions call is already in the partial message, the
1041
+ // tool IS the human boundary — do not arm the text-based approval pause.
1042
+ if (messageHasPendingAskUserQuestionsTool(event.message)) return;
993
1043
 
994
1044
  const dash = getAutoRuntimeSnapshot();
995
1045
  if (dash.active) return;
@@ -1324,81 +1374,37 @@ export function registerHooks(
1324
1374
 
1325
1375
  const details = event.details as any;
1326
1376
 
1327
- // ── Discussion gate enforcement: handle gate question responses ──
1328
- // If the result is cancelled or has no response, the pending gate stays active
1329
- // so the model is blocked from non-read-only tools until it re-asks.
1330
- // If the user responded at all (even "needs adjustment"), clear the pending gate
1331
- // because the user engaged — the prompt handles the re-ask-after-adjustment flow.
1332
1377
  const questions: any[] = (event.input as any)?.questions ?? [];
1333
- const currentPendingGate = getPendingGate(basePath);
1334
- if (currentPendingGate) {
1335
- if (details?.cancelled || !details?.response) {
1336
- // Gate stays pending. Direct the agent to the most reliable recovery
1337
- // path — re-calling ask_user_questions with the same gate id — without
1338
- // misrepresenting the plain-text path. The plain-text path also works
1339
- // (isExplicitApprovalResponse on the next before_agent_start clears
1340
- // the gate when the user replies with an approval keyword), but the
1341
- // structured re-ask is more deterministic and gives the user a clear UI.
1342
- resetToolCallLoopGuard();
1343
- const interrupted = details?.interrupted === true;
1344
- if (ctx) {
1345
- await maybePauseAutoForApprovalGate(
1346
- ctx,
1347
- pi,
1348
- true,
1349
- interrupted
1350
- ? "Depth confirmation was interrupted — pausing auto-mode until you respond."
1351
- : "Depth confirmation is waiting for your answer — pausing auto-mode.",
1352
- );
1353
- }
1354
- return {
1355
- content: [{
1356
- type: "text" as const,
1357
- text: [
1358
- `Waiting for depth confirmation on gate "${currentPendingGate}".`,
1359
- interrupted
1360
- ? "The confirmation question was interrupted before a response was recorded."
1361
- : "No user response was received for the confirmation question.",
1362
- "Do not infer approval from earlier or prior messages.",
1363
- "Do not proceed, write files, save artifacts, or call other tools.",
1364
- `Re-call ask_user_questions with the same gate question id ("${currentPendingGate}") and wait for the user's response.`,
1365
- ].join(" "),
1366
- }],
1367
- };
1368
- } else {
1369
- const pendingQuestion = questions.find((question) => question?.id === currentPendingGate);
1370
- if (pendingQuestion) {
1371
- const answer = details.response?.answers?.[currentPendingGate];
1372
- if (isDepthConfirmationAnswer(answer?.selected, pendingQuestion.options)) {
1373
- markApprovalGateVerified(currentPendingGate, basePath);
1374
- const milestoneIdFromGate = extractDepthVerificationMilestoneId(currentPendingGate);
1375
- if (milestoneIdFromGate) markDepthVerified(milestoneIdFromGate, basePath);
1376
- clearPendingGate(basePath);
1377
- clearDeferredApprovalGate(basePath);
1378
- }
1379
- }
1378
+ const gateResult = applyAskUserQuestionsGateResult({
1379
+ basePath,
1380
+ questions,
1381
+ details,
1382
+ fallbackMilestoneId: milestoneId,
1383
+ });
1384
+ if (gateResult.status === "waiting") {
1385
+ resetToolCallLoopGuard();
1386
+ if (ctx) {
1387
+ await maybePauseAutoForApprovalGate(
1388
+ ctx,
1389
+ pi,
1390
+ true,
1391
+ gateResult.interrupted
1392
+ ? "Depth confirmation was interrupted — pausing auto-mode until you respond."
1393
+ : "Depth confirmation is waiting for your answer — pausing auto-mode.",
1394
+ );
1380
1395
  }
1396
+ return {
1397
+ content: [{
1398
+ type: "text" as const,
1399
+ text: formatPendingAskUserQuestionsGateMessage(gateResult.pendingGateId, gateResult.interrupted),
1400
+ }],
1401
+ };
1381
1402
  }
1382
-
1383
- if (details?.cancelled || !details?.response) return;
1384
-
1385
- for (const question of questions) {
1386
- if (typeof question.id === "string" && question.id.includes("depth_verification")) {
1387
- // Only unlock the gate if the user selected the first option (confirmation).
1388
- // Cross-references against the question's defined options to reject free-form "Other" text.
1389
- const answer = details.response?.answers?.[question.id];
1390
- const inferredMilestoneId = extractDepthVerificationMilestoneId(question.id) ?? milestoneId;
1391
- if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
1392
- if (currentPendingGate && question.id !== currentPendingGate) break;
1393
- markApprovalGateVerified(question.id, basePath);
1394
- markDepthVerified(inferredMilestoneId, basePath);
1395
- clearPendingGate(basePath);
1396
- clearDeferredApprovalGate(basePath);
1397
- }
1398
- break;
1399
- }
1403
+ if (gateResult.status === "verified") {
1404
+ clearDeferredApprovalGate(basePath);
1400
1405
  }
1401
1406
 
1407
+ if (details?.cancelled || !details?.response) return;
1402
1408
  if (!milestoneId) return;
1403
1409
  await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
1404
1410
  });
@@ -1454,66 +1460,10 @@ export function registerHooks(
1454
1460
  const payload = event.payload as Record<string, unknown> | null;
1455
1461
  if (!payload || typeof payload !== "object") return;
1456
1462
 
1457
- // ── Context Management ──────────────────────────────────────────────
1458
- // Load preferences once for both masking and truncation.
1459
- try {
1460
- const { loadEffectiveGSDPreferences } = await import("../preferences.js");
1461
- const {
1462
- createObservationMask,
1463
- createResponsesInputObservationMask,
1464
- truncateContextResultMessages,
1465
- truncateResponsesInputResultItems,
1466
- } = await import("../context-masker.js");
1467
- const prefs = loadEffectiveGSDPreferences();
1468
- const cmConfig = prefs?.preferences.context_management;
1469
-
1470
- // Observation masking: replace old tool results with placeholders.
1471
- // Only active during auto-mode when context_management.observation_masking is enabled.
1472
- if (isAutoActive() && cmConfig?.observation_masking !== false) {
1473
- const keepTurns = cmConfig?.observation_mask_turns ?? 8;
1474
- const messages = payload.messages;
1475
- if (Array.isArray(messages)) {
1476
- payload.messages = createObservationMask(keepTurns)(messages);
1477
- }
1478
- const input = payload.input;
1479
- if (Array.isArray(input)) {
1480
- payload.input = createResponsesInputObservationMask(keepTurns)(input);
1481
- }
1482
- }
1483
-
1484
- // Tool result truncation: cap individual tool result content length.
1485
- // Applies in ALL modes (auto + interactive) to prevent context bloat.
1486
- // In pi-ai format, toolResult messages have role: "toolResult" and content: TextContent[].
1487
- // Creates new objects to avoid mutating shared conversation state.
1488
- const maxChars = cmConfig?.tool_result_max_chars ?? 800;
1489
- const msgs = payload.messages;
1490
- if (Array.isArray(msgs)) {
1491
- payload.messages = truncateContextResultMessages(msgs as any, maxChars);
1492
- }
1493
- const input = payload.input;
1494
- if (Array.isArray(input)) {
1495
- payload.input = truncateResponsesInputResultItems(input as any, maxChars);
1496
- }
1497
- } catch { /* non-fatal */ }
1498
-
1499
- try {
1500
- if (isAutoActive()) {
1501
- const sourceContextBlock = getSourceObservationStore().renderActiveBlock();
1502
- if (sourceContextBlock) {
1503
- const nextPayload = injectSourceContextBlockIntoPayload(payload, sourceContextBlock);
1504
- Object.assign(payload, nextPayload);
1505
- }
1506
- }
1507
- } catch { /* non-fatal */ }
1508
-
1509
- // ── Service Tier ────────────────────────────────────────────────────
1510
- const modelId = event.model?.id;
1511
- if (!modelId) return payload;
1512
- const { getEffectiveServiceTier, supportsServiceTier } = await import("../service-tier.js");
1513
- const tier = getEffectiveServiceTier();
1514
- if (!tier || !supportsServiceTier(modelId)) return payload;
1515
- payload.service_tier = tier;
1516
- return payload;
1463
+ return applyProviderPayloadPolicy({
1464
+ payload,
1465
+ modelId: event.model?.id,
1466
+ });
1517
1467
  });
1518
1468
 
1519
1469
  // Capability-aware model routing hook (ADR-004)
@@ -1555,25 +1505,44 @@ export function registerHooks(
1555
1505
  event.selectedModelProvider,
1556
1506
  ).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
1557
1507
  const guidedUnit = getGuidedUnitContext();
1508
+ const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
1509
+ ? compatibleRegisteredToolNames
1510
+ : registeredToolNames;
1558
1511
  const requestScoped = buildRequestScopedGsdToolSet(
1559
1512
  guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1560
1513
  event.requestCustomMessages,
1561
- guidedUnit?.unitType === "run-uat" ? compatibleRegisteredToolNames : registeredToolNames,
1514
+ requestRegisteredToolNames,
1562
1515
  guidedUnit?.unitType,
1563
1516
  );
1564
1517
  if (requestScoped) {
1518
+ recordAutoToolSurfaceSnapshot({
1519
+ source: "provider-adjustment",
1520
+ unitType: guidedUnit?.unitType,
1521
+ modelFacingToolNames: requestScoped,
1522
+ registeredToolNames: requestRegisteredToolNames,
1523
+ scopedToolNames: requestScoped,
1524
+ });
1565
1525
  return { toolNames: requestScoped };
1566
1526
  }
1567
1527
  const dash = getAutoRuntimeSnapshot();
1568
1528
  if (dash.active && dash.currentUnit) {
1529
+ const registeredForUnit = dash.currentUnit.type === "run-uat"
1530
+ ? compatibleRegisteredToolNames
1531
+ : resolveRegisteredToolNames(pi, event.activeToolNames);
1532
+ const scopedToolNames = buildMinimalAutoGsdToolSet(
1533
+ dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1534
+ dash.currentUnit.type,
1535
+ registeredForUnit,
1536
+ );
1537
+ recordAutoToolSurfaceSnapshot({
1538
+ source: "provider-adjustment",
1539
+ unitType: dash.currentUnit.type,
1540
+ modelFacingToolNames: scopedToolNames,
1541
+ registeredToolNames: registeredForUnit,
1542
+ scopedToolNames,
1543
+ });
1569
1544
  return {
1570
- toolNames: buildMinimalAutoGsdToolSet(
1571
- dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1572
- dash.currentUnit.type,
1573
- dash.currentUnit.type === "run-uat"
1574
- ? compatibleRegisteredToolNames
1575
- : resolveRegisteredToolNames(pi, event.activeToolNames),
1576
- ),
1545
+ toolNames: scopedToolNames,
1577
1546
  };
1578
1547
  }
1579
1548
  if (isGeneralGsdToolScopingRequested()) {
@@ -5,6 +5,7 @@ import { isAbsolute, join, relative, resolve, sep } from "node:path";
5
5
  import { minimatch } from "minimatch";
6
6
 
7
7
  import { GSD_PHASE_SCOPE_DISPLAY_REASON, shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.js";
8
+ import { stripMcpToolPrefix } from "../mcp-tool-name.js";
8
9
  import { getIsolationMode } from "../preferences.js";
9
10
  import { compileSubagentPermissionContract, type ToolsPolicy } from "../unit-context-manifest.js";
10
11
  import { logWarning } from "../workflow-logger.js";
@@ -123,9 +124,7 @@ const GATE_SAFE_TOOLS = new Set([
123
124
  ]);
124
125
 
125
126
  export function canonicalToolName(toolName: string): string {
126
- if (!toolName.startsWith("mcp__")) return toolName;
127
- const toolSeparator = toolName.indexOf("__", "mcp__".length);
128
- return toolSeparator >= 0 ? toolName.slice(toolSeparator + 2) : toolName;
127
+ return stripMcpToolPrefix(toolName);
129
128
  }
130
129
 
131
130
  export interface WriteGateSnapshot {
@@ -462,6 +461,111 @@ export function isDepthConfirmationAnswer(
462
461
  return false;
463
462
  }
464
463
 
464
+ export interface AskUserQuestionsGateQuestion {
465
+ id?: unknown;
466
+ options?: Array<{ label?: string }>;
467
+ }
468
+
469
+ export interface AskUserQuestionsGateDetails {
470
+ cancelled?: boolean;
471
+ interrupted?: boolean;
472
+ response?: {
473
+ answers?: Record<string, { selected?: unknown } | undefined>;
474
+ } | null;
475
+ }
476
+
477
+ export type AskUserQuestionsGateResult =
478
+ | { status: "not-gate" }
479
+ | { status: "waiting"; pendingGateId: string; interrupted: boolean }
480
+ | { status: "verified"; gateId: string; milestoneId: string | null }
481
+ | { status: "answered"; gateId: string };
482
+
483
+ function findGateQuestion(
484
+ questions: AskUserQuestionsGateQuestion[],
485
+ gateId: string,
486
+ ): AskUserQuestionsGateQuestion | undefined {
487
+ return questions.find((question) => question?.id === gateId);
488
+ }
489
+
490
+ function readSelectedGateAnswer(
491
+ details: AskUserQuestionsGateDetails,
492
+ questionId: string,
493
+ ): unknown {
494
+ return details.response?.answers?.[questionId]?.selected;
495
+ }
496
+
497
+ function verifyAnsweredGate(
498
+ basePath: string,
499
+ question: AskUserQuestionsGateQuestion,
500
+ fallbackMilestoneId?: string | null,
501
+ ): AskUserQuestionsGateResult {
502
+ const gateId = typeof question.id === "string" ? question.id : "";
503
+ const milestoneId = extractDepthVerificationMilestoneId(gateId) ?? fallbackMilestoneId ?? null;
504
+ markApprovalGateVerified(gateId, basePath);
505
+ markDepthVerified(milestoneId, basePath);
506
+ clearPendingGate(basePath);
507
+ return { status: "verified", gateId, milestoneId };
508
+ }
509
+
510
+ export function applyAskUserQuestionsGateResult(options: {
511
+ basePath: string;
512
+ questions: AskUserQuestionsGateQuestion[];
513
+ details: AskUserQuestionsGateDetails;
514
+ fallbackMilestoneId?: string | null;
515
+ }): AskUserQuestionsGateResult {
516
+ const { basePath, questions, details, fallbackMilestoneId } = options;
517
+ const currentPendingGate = getPendingGate(basePath);
518
+ if (currentPendingGate) {
519
+ if (details.cancelled || !details.response) {
520
+ return {
521
+ status: "waiting",
522
+ pendingGateId: currentPendingGate,
523
+ interrupted: details.interrupted === true,
524
+ };
525
+ }
526
+
527
+ const pendingQuestion = findGateQuestion(questions, currentPendingGate);
528
+ if (pendingQuestion) {
529
+ const selected = readSelectedGateAnswer(details, currentPendingGate);
530
+ if (isDepthConfirmationAnswer(selected, pendingQuestion.options)) {
531
+ return verifyAnsweredGate(basePath, pendingQuestion, fallbackMilestoneId);
532
+ }
533
+ return { status: "answered", gateId: currentPendingGate };
534
+ }
535
+ }
536
+
537
+ if (details.cancelled || !details.response) return { status: "not-gate" };
538
+
539
+ for (const question of questions) {
540
+ if (typeof question.id !== "string" || !isGateQuestionId(question.id)) continue;
541
+ const selected = readSelectedGateAnswer(details, question.id);
542
+ if (!isDepthConfirmationAnswer(selected, question.options)) {
543
+ return { status: "answered", gateId: question.id };
544
+ }
545
+ if (currentPendingGate && question.id !== currentPendingGate) {
546
+ return { status: "answered", gateId: currentPendingGate };
547
+ }
548
+ return verifyAnsweredGate(basePath, question, fallbackMilestoneId);
549
+ }
550
+
551
+ return { status: "not-gate" };
552
+ }
553
+
554
+ export function formatPendingAskUserQuestionsGateMessage(
555
+ pendingGateId: string,
556
+ interrupted: boolean,
557
+ ): string {
558
+ return [
559
+ `Waiting for depth confirmation on gate "${pendingGateId}".`,
560
+ interrupted
561
+ ? "The confirmation question was interrupted before a response was recorded."
562
+ : "No user response was received for the confirmation question.",
563
+ "Do not infer approval from earlier or prior messages.",
564
+ "Do not proceed, write files, save artifacts, or call other tools.",
565
+ `Re-call ask_user_questions with the same gate question id ("${pendingGateId}") and wait for the user's response.`,
566
+ ].join(" ");
567
+ }
568
+
465
569
  export function shouldBlockContextWrite(
466
570
  toolName: string,
467
571
  inputPath: string,
@@ -1,17 +1,22 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: Shared DB-backed guard for milestone closeout finalization.
3
3
 
4
+ import { dirname } from "node:path";
5
+
4
6
  import {
5
- getDbPath,
6
7
  getLatestAssessmentByScope,
7
8
  getMilestone,
8
9
  getMilestoneSlices,
9
10
  getPendingGates,
10
11
  getSliceTasks,
11
12
  isDbAvailable,
12
- refreshOpenDatabaseFromDisk,
13
13
  } from "./gsd-db.js";
14
+ import {
15
+ getWorkflowDatabasePath,
16
+ refreshWorkflowDatabaseFromDisk,
17
+ } from "./db-workspace.js";
14
18
  import { isClosedStatus } from "./status-guards.js";
19
+ import { closeQualityGatesFromEvidence } from "./quality-gate-closure.js";
15
20
 
16
21
  export const CLOSEOUT_CONSISTENCY_BLOCKED_REASON = "closeout-consistency-blocked";
17
22
 
@@ -37,6 +42,8 @@ export type CloseoutConsistencyResult =
37
42
 
38
43
  export interface CloseoutConsistencyOptions {
39
44
  refreshFromDisk?: boolean;
45
+ allowOpenMilestone?: boolean;
46
+ artifactBasePath?: string;
40
47
  }
41
48
 
42
49
  function blocked(reason: CloseoutConsistencyFailureReason, message: string): CloseoutConsistencyResult {
@@ -52,6 +59,12 @@ function isFileBackedDbPath(path: string | null): boolean {
52
59
  return Boolean(path && path !== ":memory:");
53
60
  }
54
61
 
62
+ function artifactBasePathFromDb(): string | undefined {
63
+ const dbPath = getWorkflowDatabasePath();
64
+ if (!isFileBackedDbPath(dbPath)) return undefined;
65
+ return dirname(dirname(dbPath!));
66
+ }
67
+
55
68
  export function checkCloseoutConsistencyGate(
56
69
  milestoneId: string,
57
70
  options: CloseoutConsistencyOptions = {},
@@ -63,7 +76,7 @@ export function checkCloseoutConsistencyGate(
63
76
  );
64
77
  }
65
78
 
66
- if (options.refreshFromDisk && isFileBackedDbPath(getDbPath()) && !refreshOpenDatabaseFromDisk()) {
79
+ if (options.refreshFromDisk && isFileBackedDbPath(getWorkflowDatabasePath()) && !refreshWorkflowDatabaseFromDisk()) {
67
80
  return blocked(
68
81
  "db-refresh-failed",
69
82
  `Closeout consistency blocked for ${milestoneId}: canonical DB refresh failed.`,
@@ -77,15 +90,17 @@ export function checkCloseoutConsistencyGate(
77
90
  `Closeout consistency blocked for ${milestoneId}: milestone is missing from canonical DB.`,
78
91
  );
79
92
  }
80
- if (!isClosedStatus(milestone.status)) {
93
+ if (!isClosedStatus(milestone.status) && !options.allowOpenMilestone) {
81
94
  return blocked(
82
95
  "milestone-open",
83
96
  `Closeout consistency blocked for ${milestoneId}: canonical DB milestone status is "${milestone.status}".`,
84
97
  );
85
98
  }
86
99
 
100
+ const validation = milestone.status === "skipped"
101
+ ? null
102
+ : getLatestAssessmentByScope(milestoneId, "milestone-validation");
87
103
  if (milestone.status !== "skipped") {
88
- const validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
89
104
  if (validation?.status !== "pass") {
90
105
  return blocked(
91
106
  "validation-not-pass",
@@ -102,6 +117,13 @@ export function checkCloseoutConsistencyGate(
102
117
  );
103
118
  }
104
119
 
120
+ if (milestone.status !== "skipped") {
121
+ closeQualityGatesFromEvidence(milestoneId, {
122
+ artifactBasePath: options.artifactBasePath ?? artifactBasePathFromDb(),
123
+ milestoneValidationPassed: validation?.status === "pass",
124
+ });
125
+ }
126
+
105
127
  for (const slice of slices) {
106
128
  if (!isClosedStatus(slice.status)) {
107
129
  return blocked(
@@ -472,17 +472,21 @@ export function ensureCodebaseMapFresh(
472
472
  const force = ensureOptions?.force === true;
473
473
  const now = Date.now();
474
474
 
475
+ // Enumerate files and compute fingerprint before the TTL check so that
476
+ // file changes are always detected, even within the TTL window.
477
+ const existing = readCodebaseMap(basePath);
478
+ const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
479
+ const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
480
+
481
+ // TTL short-circuit: only bypass regeneration when the fingerprint matches,
482
+ // confirming that no tracked files changed since the last check.
475
483
  if (!force && ttlMs > 0) {
476
484
  const cached = freshnessCache.get(cacheKey);
477
- if (cached && now - cached.checkedAt < ttlMs) {
485
+ if (cached && now - cached.checkedAt < ttlMs && cached.result.fingerprint === fingerprint) {
478
486
  return cached.result;
479
487
  }
480
488
  }
481
489
 
482
- const existing = readCodebaseMap(basePath);
483
- const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
484
- const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
485
-
486
490
  const cacheAndReturn = (result: EnsureCodebaseMapResult): EnsureCodebaseMapResult => {
487
491
  freshnessCache.set(cacheKey, { checkedAt: now, result });
488
492
  return result;
@@ -6,6 +6,7 @@ import { resolve } from "node:path";
6
6
  import { enableDebug } from "../../debug-logger.js";
7
7
  import { getAutoDashboardData, isAutoActive, isAutoPaused, pauseAuto, startAutoDetached, stopAuto, stopAutoRemote } from "../../auto.js";
8
8
  import { handleRate } from "../../commands-rate.js";
9
+ import { notifyPreferenceDiagnostics } from "../../preferences-diagnostics.js";
9
10
  import { setSessionModelOverride } from "../../session-model-override.js";
10
11
  import { guardRemoteSession, projectRoot } from "../context.js";
11
12
  import { findMilestoneIds } from "../../milestone-id-utils.js";
@@ -91,6 +92,7 @@ export async function handleAutoCommand(trimmed: string, ctx: ExtensionCommandCo
91
92
  if (!(await guardRemoteSession(ctx, pi))) return true;
92
93
  const basePath = projectRoot();
93
94
  if (await hasUnresolvedCloseoutBlocker(ctx, basePath)) return true;
95
+ notifyPreferenceDiagnostics(ctx, basePath, { surface: "auto-preflight" });
94
96
 
95
97
  // Validate the milestone target exists and is not already complete.
96
98
  if (milestoneId) {
@@ -118,6 +120,7 @@ export async function handleAutoCommand(trimmed: string, ctx: ExtensionCommandCo
118
120
  if (!(await guardRemoteSession(ctx, pi))) return true;
119
121
  const basePath = projectRoot();
120
122
  if (await hasUnresolvedCloseoutBlocker(ctx, basePath)) return true;
123
+ notifyPreferenceDiagnostics(ctx, basePath, { surface: "auto-preflight" });
121
124
 
122
125
  // Validate the milestone target exists and is not already complete.
123
126
  if (milestoneId) {