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

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 (657) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli-web-branch.d.ts +2 -0
  4. package/dist/cli-web-branch.js +9 -2
  5. package/dist/cli.js +1 -1
  6. package/dist/headless-events.d.ts +4 -2
  7. package/dist/headless-events.js +7 -29
  8. package/dist/help-text.js +5 -0
  9. package/dist/models-resolver.d.ts +3 -13
  10. package/dist/models-resolver.js +3 -22
  11. package/dist/resource-loader.js +2 -14
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/extensions/ask-user-questions.js +78 -23
  14. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  15. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  16. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  17. package/dist/resources/extensions/browser-tools/index.js +69 -12
  18. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  19. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +122 -234
  20. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  21. package/dist/resources/extensions/github-sync/templates.js +3 -3
  22. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  23. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  24. package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
  25. package/dist/resources/extensions/gsd/auto/phases.js +34 -4
  26. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  27. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  28. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  29. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  30. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  31. package/dist/resources/extensions/gsd/auto-post-unit.js +23 -11
  32. package/dist/resources/extensions/gsd/auto-prompts.js +84 -8
  33. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  34. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  35. package/dist/resources/extensions/gsd/auto-start.js +24 -37
  36. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  37. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  38. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +11 -45
  39. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  40. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  41. package/dist/resources/extensions/gsd/auto-worktree.js +53 -368
  42. package/dist/resources/extensions/gsd/auto.js +19 -27
  43. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
  44. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
  46. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  47. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  48. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +209 -149
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +93 -8
  50. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  51. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  52. package/dist/resources/extensions/gsd/captures.js +5 -15
  53. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  54. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  55. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  56. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  57. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  58. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  59. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  60. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  61. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  62. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  63. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  64. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  65. package/dist/resources/extensions/gsd/db/queries.js +372 -0
  66. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  67. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  68. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  69. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  70. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  71. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  72. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  73. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  74. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  75. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  76. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  77. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  78. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
  79. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  80. package/dist/resources/extensions/gsd/doctor.js +16 -9
  81. package/dist/resources/extensions/gsd/error-classifier.js +10 -1
  82. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  83. package/dist/resources/extensions/gsd/git-service.js +1 -0
  84. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  85. package/dist/resources/extensions/gsd/gsd-db.js +183 -2048
  86. package/dist/resources/extensions/gsd/guidance.js +98 -0
  87. package/dist/resources/extensions/gsd/guided-flow.js +83 -471
  88. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  89. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
  90. package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
  91. package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
  92. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  93. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  94. package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
  95. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
  96. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  97. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  98. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  99. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  100. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  101. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  102. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  103. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  104. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  105. package/dist/resources/extensions/gsd/model-router.js +3 -0
  106. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  107. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  108. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  109. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  110. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  111. package/dist/resources/extensions/gsd/paths.js +37 -24
  112. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  113. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  114. package/dist/resources/extensions/gsd/preferences-models.js +12 -46
  115. package/dist/resources/extensions/gsd/preferences.js +161 -29
  116. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  117. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  118. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  119. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  120. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  121. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -1
  122. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  124. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  125. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  126. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  127. package/dist/resources/extensions/gsd/publication.js +87 -0
  128. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  129. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  130. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  131. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  132. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  133. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  134. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  135. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  136. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  137. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  138. package/dist/resources/extensions/gsd/state.js +14 -25
  139. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  140. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  141. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  142. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  143. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  144. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  145. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  146. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  147. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  148. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  149. package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
  150. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -8
  151. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  152. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  153. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  154. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  155. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  156. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  157. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  158. package/dist/resources/extensions/gsd/uat-policy.js +17 -10
  159. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  160. package/dist/resources/extensions/gsd/undo.js +8 -7
  161. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  162. package/dist/resources/extensions/gsd/unit-context-composer.js +49 -21
  163. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  164. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  165. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  166. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
  167. package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
  168. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  169. package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
  170. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  171. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  172. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  173. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  174. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  175. package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
  176. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  177. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  178. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  179. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  180. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  181. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  182. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  183. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  184. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  185. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  186. package/dist/resources/extensions/shared/gsd-browser-cli.js +72 -4
  187. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  188. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  189. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  190. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  191. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  192. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  193. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  194. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  195. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  196. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  197. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  198. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  199. package/dist/update-cmd.js +20 -0
  200. package/dist/web/standalone/.next/BUILD_ID +1 -1
  201. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  202. package/dist/web/standalone/.next/build-manifest.json +3 -3
  203. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  204. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  205. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  206. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  209. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  214. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  253. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  254. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/index.html +1 -1
  256. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  258. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  259. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  260. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  261. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  262. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  263. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  264. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  265. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  266. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  269. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  270. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  271. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  272. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  273. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  274. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  275. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  277. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  279. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  280. package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
  281. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
  282. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  283. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  284. package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
  285. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
  286. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
  287. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
  288. package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
  289. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  290. package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
  291. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  292. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
  293. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  294. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  295. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  296. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
  297. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
  298. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  299. package/dist/web/standalone/package.json +1 -1
  300. package/dist/web-mode.d.ts +2 -0
  301. package/dist/web-mode.js +20 -8
  302. package/dist/worktree-cli.js +3 -6
  303. package/dist/worktree-status-banner.js +7 -11
  304. package/package.json +2 -1
  305. package/packages/cloud-mcp-gateway/package.json +2 -2
  306. package/packages/contracts/dist/workflow.d.ts +4 -0
  307. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  308. package/packages/contracts/dist/workflow.js.map +1 -1
  309. package/packages/contracts/package.json +1 -1
  310. package/packages/daemon/package.json +4 -4
  311. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  312. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  313. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  314. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  315. package/packages/gsd-agent-core/package.json +5 -5
  316. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  317. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  318. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  319. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  320. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  321. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  322. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  323. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  324. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  325. package/packages/gsd-agent-modes/package.json +7 -7
  326. package/packages/mcp-server/dist/cli.js +6 -3
  327. package/packages/mcp-server/dist/cli.js.map +1 -1
  328. package/packages/mcp-server/dist/server.d.ts +10 -0
  329. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  330. package/packages/mcp-server/dist/server.js +8 -0
  331. package/packages/mcp-server/dist/server.js.map +1 -1
  332. package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
  333. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  334. package/packages/mcp-server/dist/workflow-tools.js +48 -22
  335. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  336. package/packages/mcp-server/package.json +3 -3
  337. package/packages/native/package.json +1 -1
  338. package/packages/pi-agent-core/package.json +1 -1
  339. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  340. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  341. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  342. package/packages/pi-ai/dist/models.generated.d.ts +455 -546
  343. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  344. package/packages/pi-ai/dist/models.generated.js +481 -599
  345. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  346. package/packages/pi-ai/package.json +1 -1
  347. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  349. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  350. package/packages/pi-coding-agent/package.json +7 -7
  351. package/packages/pi-tui/dist/components/input.js +1 -1
  352. package/packages/pi-tui/dist/components/input.js.map +1 -1
  353. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  354. package/packages/pi-tui/dist/keys.js +39 -30
  355. package/packages/pi-tui/dist/keys.js.map +1 -1
  356. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  357. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  358. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  359. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/tui.js +9 -0
  361. package/packages/pi-tui/dist/tui.js.map +1 -1
  362. package/packages/pi-tui/package.json +2 -2
  363. package/packages/rpc-client/package.json +2 -2
  364. package/pkg/package.json +1 -1
  365. package/src/resources/extensions/ask-user-questions.ts +87 -24
  366. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  367. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  368. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  369. package/src/resources/extensions/browser-tools/index.ts +71 -13
  370. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  371. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  372. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  373. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +148 -285
  374. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
  375. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  376. package/src/resources/extensions/github-sync/templates.ts +3 -3
  377. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  378. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  379. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  380. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
  381. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  382. package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
  383. package/src/resources/extensions/gsd/auto/phases.ts +45 -4
  384. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  385. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  386. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  387. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  388. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  389. package/src/resources/extensions/gsd/auto-post-unit.ts +29 -10
  390. package/src/resources/extensions/gsd/auto-prompts.ts +110 -9
  391. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  392. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  393. package/src/resources/extensions/gsd/auto-start.ts +29 -35
  394. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  395. package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
  396. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +19 -47
  397. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  398. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  399. package/src/resources/extensions/gsd/auto-worktree.ts +68 -384
  400. package/src/resources/extensions/gsd/auto.ts +35 -32
  401. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
  402. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  403. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
  404. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  405. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  406. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -161
  407. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +136 -6
  408. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  409. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  410. package/src/resources/extensions/gsd/captures.ts +5 -16
  411. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  412. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  413. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  414. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  415. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  416. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  417. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  418. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  419. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  420. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  421. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  422. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  423. package/src/resources/extensions/gsd/db/queries.ts +453 -0
  424. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  425. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  426. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  427. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  428. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  429. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  430. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  431. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  432. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  433. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  434. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  435. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  436. package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
  437. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  438. package/src/resources/extensions/gsd/doctor.ts +15 -5
  439. package/src/resources/extensions/gsd/error-classifier.ts +12 -1
  440. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  441. package/src/resources/extensions/gsd/git-service.ts +1 -0
  442. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  443. package/src/resources/extensions/gsd/gsd-db.ts +185 -2373
  444. package/src/resources/extensions/gsd/guidance.ts +139 -0
  445. package/src/resources/extensions/gsd/guided-flow.ts +95 -561
  446. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  447. package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
  448. package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
  449. package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
  450. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  451. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  452. package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
  453. package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
  454. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  455. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  456. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  457. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  458. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  459. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  460. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  461. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  462. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  463. package/src/resources/extensions/gsd/model-router.ts +3 -0
  464. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  465. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  466. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  467. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  468. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  469. package/src/resources/extensions/gsd/paths.ts +42 -22
  470. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  471. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  472. package/src/resources/extensions/gsd/preferences-models.ts +10 -46
  473. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  474. package/src/resources/extensions/gsd/preferences.ts +191 -28
  475. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  476. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  477. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  478. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  479. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  480. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -1
  481. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  482. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  483. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  484. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  485. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  486. package/src/resources/extensions/gsd/publication.ts +122 -0
  487. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  488. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  489. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  490. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  491. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  492. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  493. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  494. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  495. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  496. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  497. package/src/resources/extensions/gsd/state.ts +19 -26
  498. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  499. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  500. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  501. package/src/resources/extensions/gsd/templates/project.md +1 -0
  502. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  503. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  504. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  505. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  506. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
  507. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  508. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  509. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
  510. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  511. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  512. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  513. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  514. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  515. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  516. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  517. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  518. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  519. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  520. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  521. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  522. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
  523. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  524. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
  525. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  526. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  527. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  528. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  529. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  530. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  531. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  532. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  533. package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
  534. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  535. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  536. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  537. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  538. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  539. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
  540. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  541. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  542. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  543. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  544. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  545. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  546. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  547. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  548. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  549. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  550. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  551. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  552. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  553. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
  554. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  555. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  556. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  557. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  558. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  559. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  560. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
  561. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  562. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -1
  563. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  564. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  565. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  566. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +144 -7
  567. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  568. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
  569. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  570. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  571. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  572. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
  573. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  574. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  575. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  576. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  577. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -6
  578. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  579. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +70 -2
  580. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  581. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
  582. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  583. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
  584. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
  585. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
  586. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  587. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  588. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
  589. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  590. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  591. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  592. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  593. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  594. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  595. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  596. package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -0
  597. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  598. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  599. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  600. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  601. package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
  602. package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -8
  603. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  604. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  605. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  606. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  607. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  608. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  609. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  610. package/src/resources/extensions/gsd/uat-policy.ts +20 -10
  611. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  612. package/src/resources/extensions/gsd/undo.ts +9 -8
  613. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  614. package/src/resources/extensions/gsd/unit-context-composer.ts +97 -21
  615. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  616. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  617. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  618. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
  619. package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
  620. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  621. package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
  622. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  623. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  624. package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
  625. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  626. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  627. package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
  628. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  629. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  630. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  631. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  632. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  633. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  634. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  635. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  636. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  637. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  638. package/src/resources/extensions/shared/gsd-browser-cli.ts +88 -4
  639. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  640. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  641. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  642. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  643. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  644. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  645. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  646. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  647. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  648. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  649. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  650. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  651. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  652. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  653. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  654. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  655. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  656. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_buildManifest.js +0 -0
  657. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_ssgManifest.js +0 -0
@@ -25,15 +25,13 @@ import {
25
25
  updateSliceStatus,
26
26
  insertSlice,
27
27
  getMilestone,
28
- getMilestoneSlices,
29
- getLatestAssessmentByScope,
30
28
  updateMilestoneStatus,
31
- refreshOpenDatabaseFromDisk,
32
29
  getCompletedMilestoneTaskFileHints,
33
30
  getMilestoneCommitAttributionShas,
34
31
  recordMilestoneCommitAttribution,
35
32
  transaction,
36
33
  } from "./gsd-db.js";
34
+ import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
37
35
  import { isValidationTerminal } from "./state.js";
38
36
  import { getErrorMessage } from "./error-utils.js";
39
37
  import { logWarning, logError } from "./workflow-logger.js";
@@ -72,7 +70,10 @@ import { isGsdWorktreePath } from "./worktree-root.js";
72
70
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
73
71
  import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
74
72
  import { loadAllCaptures, loadPendingCaptures } from "./captures.js";
75
- import { checkCloseoutConsistencyGate } from "./closeout-consistency-gate.js";
73
+ import {
74
+ proveMilestoneCloseout,
75
+ type CloseoutProofFailureReason,
76
+ } from "./milestone-closeout-proof.js";
76
77
 
77
78
  // Re-export so existing consumers of auto-recovery.ts keep working.
78
79
  export { resolveExpectedArtifactPath, diagnoseExpectedArtifact };
@@ -117,6 +118,19 @@ export type ArtifactRecoveryDbRefreshResult =
117
118
  | { ok: true }
118
119
  | { ok: false; fatal: boolean; message: string; reason: string };
119
120
 
121
+ function closeoutProofRecoveryReason(reason: CloseoutProofFailureReason): string {
122
+ switch (reason) {
123
+ case "slice-missing":
124
+ return "complete-milestone-slices-missing";
125
+ case "summary-artifact-missing":
126
+ return "complete-milestone-summary-missing";
127
+ case "summary-artifact-failed":
128
+ return "complete-milestone-summary-failed";
129
+ default:
130
+ return `complete-milestone-${reason}`;
131
+ }
132
+ }
133
+
120
134
  export function refreshRecoveryDbForArtifact(
121
135
  unitType: string,
122
136
  unitId: string,
@@ -125,7 +139,7 @@ export function refreshRecoveryDbForArtifact(
125
139
  if (unitType !== "plan-slice" && unitType !== "execute-task" && unitType !== "complete-milestone") return { ok: true };
126
140
  if (!isDbAvailable()) return { ok: true };
127
141
 
128
- if (!refreshOpenDatabaseFromDisk()) {
142
+ if (!refreshWorkflowDatabaseFromDisk()) {
129
143
  return {
130
144
  ok: false,
131
145
  fatal: unitType === "execute-task" || unitType === "complete-milestone",
@@ -156,52 +170,29 @@ export function refreshRecoveryDbForArtifact(
156
170
  }
157
171
  if (isClosedStatus(milestone.status)) return { ok: true };
158
172
 
159
- const validation = getLatestAssessmentByScope(mid, "milestone-validation");
160
- if (validation?.status !== "pass") {
161
- return {
162
- ok: false,
163
- fatal: true,
164
- reason: "complete-milestone-validation-not-pass",
165
- message: `Stuck recovery found complete-milestone ${unitId} artifacts, but milestone-validation is "${validation?.status ?? "absent"}" in the DB.`,
166
- };
167
- }
168
-
169
- const slices = getMilestoneSlices(mid);
170
- if (slices.length === 0) {
171
- return {
172
- ok: false,
173
- fatal: true,
174
- reason: "complete-milestone-slices-missing",
175
- message: `Stuck recovery found complete-milestone ${unitId} artifacts, but no slices exist in the DB.`,
176
- };
177
- }
178
- const openSlice = slices.find((slice) => !isClosedStatus(slice.status));
179
- if (openSlice) {
180
- return {
181
- ok: false,
182
- fatal: true,
183
- reason: "complete-milestone-slice-open",
184
- message: `Stuck recovery found complete-milestone ${unitId} artifacts, but slice ${openSlice.id} is still "${openSlice.status}" in the DB.`,
185
- };
186
- }
187
- for (const slice of slices) {
188
- const openTask = getSliceTasks(mid, slice.id).find((task) => !isClosedStatus(task.status));
189
- if (openTask) {
173
+ const artifactBasePath = resolveArtifactVerificationBase(unitId, basePath);
174
+ const closeoutProof = proveMilestoneCloseout(mid, {
175
+ allowOpenMilestone: true,
176
+ summaryArtifactBasePath: artifactBasePath,
177
+ implementationEvidence: {
178
+ basePath,
179
+ requirement: "present",
180
+ },
181
+ });
182
+ if (!closeoutProof.ok) {
183
+ if (closeoutProof.reason === "implementation-evidence-missing") {
190
184
  return {
191
185
  ok: false,
192
186
  fatal: true,
193
- reason: "complete-milestone-task-open",
194
- message: `Stuck recovery found complete-milestone ${unitId} artifacts, but task ${slice.id}/${openTask.id} is still "${openTask.status}" in the DB.`,
187
+ reason: "complete-milestone-implementation-missing",
188
+ message: `Stuck recovery found complete-milestone ${unitId} artifacts, but implementation evidence is not present.`,
195
189
  };
196
190
  }
197
- }
198
-
199
- if (hasImplementationArtifacts(basePath, mid) !== "present") {
200
191
  return {
201
192
  ok: false,
202
193
  fatal: true,
203
- reason: "complete-milestone-implementation-missing",
204
- message: `Stuck recovery found complete-milestone ${unitId} artifacts, but implementation evidence is not present.`,
194
+ reason: closeoutProofRecoveryReason(closeoutProof.reason),
195
+ message: `Stuck recovery found complete-milestone ${unitId} artifacts, but ${closeoutProof.message}`,
205
196
  };
206
197
  }
207
198
 
@@ -535,7 +526,7 @@ export function verifyExpectedArtifact(
535
526
  try {
536
527
  let taskIds: string[] | null = null;
537
528
  if (isDbAvailable()) {
538
- const refreshed = refreshOpenDatabaseFromDisk();
529
+ const refreshed = refreshWorkflowDatabaseFromDisk();
539
530
  if (refreshed) {
540
531
  const tasks = getSliceTasks(mid, sid);
541
532
  if (tasks.length > 0) taskIds = tasks.map(t => t.id);
@@ -642,14 +633,23 @@ export function verifyExpectedArtifact(
642
633
  // A milestone with only .gsd/ plan files and zero implementation code is
643
634
  // not genuinely complete — the LLM wrote plan files but skipped actual work.
644
635
  if (unitType === "complete-milestone") {
645
- const summaryOutcome = classifyMilestoneSummaryContent(readFileSync(absPath, "utf-8"));
646
- if (summaryOutcome === "failure") return false;
647
636
  const { milestone: mid } = parseUnitId(unitId);
648
- if (mid && isDbAvailable()) {
649
- const closeoutGate = checkCloseoutConsistencyGate(mid, { refreshFromDisk: true });
650
- if (!closeoutGate.ok) return false;
637
+ if (!mid) return false;
638
+ const closeoutProof = proveMilestoneCloseout(mid, {
639
+ refreshFromDisk: true,
640
+ summaryArtifactBasePath: artifactBase,
641
+ implementationEvidence: {
642
+ basePath: base,
643
+ requirement: "not-absent",
644
+ },
645
+ });
646
+ if (!closeoutProof.ok) {
647
+ if (!isDbAvailable() && closeoutProof.reason === "db-unavailable") {
648
+ const summaryOutcome = classifyMilestoneSummaryContent(readFileSync(absPath, "utf-8"));
649
+ return summaryOutcome !== "failure" && hasImplementationArtifacts(base, mid) !== "absent";
650
+ }
651
+ return false;
651
652
  }
652
- if (hasImplementationArtifacts(base, mid) === "absent") return false;
653
653
  }
654
654
 
655
655
  return true;
@@ -9,8 +9,23 @@ import {
9
9
  markToolEnd as markTrackedToolEnd,
10
10
  markToolStart as markTrackedToolStart,
11
11
  } from "./auto-tool-tracking.js";
12
+ // Re-exported as a pure pass-through. Must stay UNGATED (no autoSession.active
13
+ // argument, unlike markToolStart at the bottom of this file) so it is true in
14
+ // foreground where the foreground approval-gate pause consults it.
15
+ export { isInteractiveElicitationInFlight } from "./auto-tool-tracking.js";
16
+ import {
17
+ createToolSurfaceSnapshot,
18
+ type ToolSurfaceSnapshot,
19
+ type ToolSurfaceSnapshotInput,
20
+ } from "./tool-surface-snapshot.js";
21
+
22
+ export type {
23
+ ToolSurfaceSnapshot,
24
+ ToolSurfaceSnapshotInput,
25
+ } from "./tool-surface-snapshot.js";
12
26
 
13
27
  export const autoSession = new AutoSession();
28
+ let currentToolSurfaceSnapshot: ToolSurfaceSnapshot | null = null;
14
29
 
15
30
  export type AutoRuntimeSnapshot = {
16
31
  active: boolean;
@@ -20,6 +35,7 @@ export type AutoRuntimeSnapshot = {
20
35
  orchestrationPhase?: "idle" | "running" | "paused" | "stopped" | "error";
21
36
  orchestrationTransitionCount?: number;
22
37
  orchestrationLastTransitionAt?: number;
38
+ toolSurface: ToolSurfaceSnapshot | null;
23
39
  };
24
40
 
25
41
  export function getAutoRuntimeSnapshot(): AutoRuntimeSnapshot {
@@ -32,9 +48,19 @@ export function getAutoRuntimeSnapshot(): AutoRuntimeSnapshot {
32
48
  orchestrationPhase: orchestrationStatus?.phase,
33
49
  orchestrationTransitionCount: orchestrationStatus?.transitionCount,
34
50
  orchestrationLastTransitionAt: orchestrationStatus?.lastTransitionAt,
51
+ toolSurface: autoSession.active || autoSession.paused ? currentToolSurfaceSnapshot : null,
35
52
  };
36
53
  }
37
54
 
55
+ export function recordAutoToolSurfaceSnapshot(input: ToolSurfaceSnapshotInput): ToolSurfaceSnapshot {
56
+ currentToolSurfaceSnapshot = createToolSurfaceSnapshot(input);
57
+ return currentToolSurfaceSnapshot;
58
+ }
59
+
60
+ export function clearAutoToolSurfaceSnapshot(): void {
61
+ currentToolSurfaceSnapshot = null;
62
+ }
63
+
38
64
  export function isAutoActive(): boolean {
39
65
  return autoSession.active;
40
66
  }
@@ -16,6 +16,7 @@ import type {
16
16
  ExtensionCommandContext,
17
17
  } from "@gsd/pi-coding-agent";
18
18
  import { deriveState } from "./state.js";
19
+ import { findWorktreeSegment, isGsdWorktreePath } from "./worktree-root.js";
19
20
  import { loadFile, getManifestStatus } from "./files.js";
20
21
  import type { InterruptedSessionAssessment } from "./interrupted-session.js";
21
22
  import {
@@ -56,7 +57,8 @@ import {
56
57
  detectWorktreeName,
57
58
  setActiveMilestoneId,
58
59
  } from "./worktree.js";
59
- import { getAutoWorktreePath, isInAutoWorktree, checkoutBranchWithStashGuard } from "./auto-worktree.js";
60
+ import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
61
+ import { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
60
62
  import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
61
63
  import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
62
64
  import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
@@ -66,7 +68,13 @@ import { initRoutingHistory } from "./routing-history.js";
66
68
  import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
67
69
  import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
68
70
  import { snapshotSkills } from "./skill-discovery.js";
69
- import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, openDatabase, getDbStatus, updateMilestoneStatus } from "./gsd-db.js";
71
+ import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, updateMilestoneStatus } from "./gsd-db.js";
72
+ import {
73
+ getWorkflowDatabaseStatus,
74
+ openExistingWorkflowDatabase,
75
+ openWorkflowDatabase,
76
+ resolveProjectRootDbPath,
77
+ } from "./db-workspace.js";
70
78
  import { isClosedStatus } from "./status-guards.js";
71
79
  import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
72
80
  import { extractVerdict } from "./verdict-parser.js";
@@ -90,9 +98,7 @@ import {
90
98
  rmSync,
91
99
  } from "node:fs";
92
100
  import { join } from "node:path";
93
- import { sep as pathSep } from "node:path";
94
101
 
95
- import { resolveProjectRootDbPath } from "./bootstrap/dynamic-tools.js";
96
102
  import { validateDirectory } from "./validate-directory.js";
97
103
  import {
98
104
  isCustomProvider,
@@ -150,10 +156,9 @@ export async function openProjectDbIfPresent(basePath: string): Promise<void> {
150
156
  const gsdDbPath = resolveProjectRootDbPath(basePath);
151
157
  if (!existsSync(gsdDbPath) || isDbAvailable()) return;
152
158
 
153
- try {
154
- openDatabase(gsdDbPath);
155
- } catch (err) {
156
- logWarning("engine", `gsd-db: failed to open existing database: ${err instanceof Error ? err.message : String(err)}`);
159
+ const result = openExistingWorkflowDatabase(basePath);
160
+ if (!result.ok && result.reason === "open-failed") {
161
+ logWarning("engine", `gsd-db: failed to open existing database: ${result.error?.message ?? "open failed"}`);
157
162
  }
158
163
  }
159
164
 
@@ -597,7 +602,7 @@ export function auditOrphanedMilestoneBranches(
597
602
  warnings.push(`Failed to remove worktree directory for ${milestoneId}: ${err2 instanceof Error ? err2.message : String(err2)}`);
598
603
  }
599
604
  } else {
600
- warnings.push(`Orphaned worktree directory for ${milestoneId} is outside .gsd/worktrees/ — skipping removal for safety.`);
605
+ warnings.push(`Orphaned worktree directory for ${milestoneId} is outside the GSD worktrees containers — skipping removal for safety.`);
601
606
  }
602
607
  } else {
603
608
  pushAction({
@@ -713,7 +718,7 @@ export function auditOrphanedMilestoneBranches(
713
718
  if (!existsSync(wtDir)) continue;
714
719
  if (!isInsideWorktreesDir(basePath, wtDir)) {
715
720
  warnings.push(
716
- `Orphaned worktree directory for ${m.id} is outside .gsd/worktrees/ — skipping removal for safety.`,
721
+ `Orphaned worktree directory for ${m.id} is outside the GSD worktrees containers — skipping removal for safety.`,
717
722
  );
718
723
  continue;
719
724
  }
@@ -1321,7 +1326,7 @@ export async function bootstrapAutoSession(
1321
1326
  (state.phase === "pre-planning" || state.phase === "complete") &&
1322
1327
  survivorIsolationMode !== "none" &&
1323
1328
  !detectWorktreeName(base) &&
1324
- !base.includes(`${pathSep}.gsd${pathSep}worktrees${pathSep}`)
1329
+ !isGsdWorktreePath(base)
1325
1330
  ) {
1326
1331
  const milestoneBranch = `milestone/${survivorMilestoneId}`;
1327
1332
  const { nativeBranchExists } = await import("./native-git-bridge.js");
@@ -1606,16 +1611,12 @@ export async function bootstrapAutoSession(
1606
1611
  // live here is gone.
1607
1612
 
1608
1613
  const isUnderGsdWorktrees = (p: string): boolean => {
1609
- // Direct layout: /.gsd/worktrees/
1610
- const marker = `${pathSep}.gsd${pathSep}worktrees${pathSep}`;
1611
- if (p.includes(marker)) return true;
1612
- const worktreesSuffix = `${pathSep}.gsd${pathSep}worktrees`;
1613
- if (p.endsWith(worktreesSuffix)) return true;
1614
- // Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/
1615
- const symlinkRe = new RegExp(
1616
- `\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees(?:\\${pathSep}|$)`,
1617
- );
1618
- return symlinkRe.test(p);
1614
+ const normalized = p.replaceAll("\\", "/");
1615
+ if (findWorktreeSegment(normalized) !== null) return true;
1616
+ // The container directory itself (no trailing worktree name), in any layout.
1617
+ return normalized.endsWith("/.gsd/worktrees")
1618
+ || normalized.endsWith("/.gsd-worktrees")
1619
+ || /\/\.gsd\/projects\/[^/]+\/worktrees$/.test(normalized);
1619
1620
  };
1620
1621
 
1621
1622
  if (
@@ -1673,21 +1674,14 @@ export async function bootstrapAutoSession(
1673
1674
 
1674
1675
  // ── DB lifecycle ──
1675
1676
  const gsdDbPath = resolveProjectRootDbPath(s.basePath);
1676
- const gsdDirPath = join(s.basePath, ".gsd");
1677
- if (existsSync(gsdDirPath) && !existsSync(gsdDbPath)) {
1678
- try {
1679
- const { openDatabase: openDb } = await import("./gsd-db.js");
1680
- openDb(gsdDbPath);
1681
- } catch (err) {
1682
- logError("engine", `failed to initialize project database: ${(err as Error).message}`);
1683
- }
1677
+ const initialDbOpen = openWorkflowDatabase(s.basePath);
1678
+ if (!initialDbOpen.ok && initialDbOpen.reason === "open-failed") {
1679
+ logError("engine", `failed to initialize project database: ${initialDbOpen.error?.message ?? "open failed"}`);
1684
1680
  }
1685
1681
  if (_shouldAbortBootstrapForUnavailableDbForTest(gsdDbPath, isDbAvailable())) {
1686
- try {
1687
- const { openDatabase: openDb } = await import("./gsd-db.js");
1688
- openDb(gsdDbPath);
1689
- } catch (err) {
1690
- logError("engine", `failed to open existing database: ${(err as Error).message}`);
1682
+ const retryDbOpen = openWorkflowDatabase(s.basePath);
1683
+ if (!retryDbOpen.ok && retryDbOpen.reason === "open-failed") {
1684
+ logError("engine", `failed to open existing database: ${retryDbOpen.error?.message ?? "open failed"}`);
1691
1685
  }
1692
1686
  }
1693
1687
 
@@ -1697,7 +1691,7 @@ export async function bootstrapAutoSession(
1697
1691
  // call returns "db_unavailable", triggering artifact-retry which
1698
1692
  // re-dispatches the same task — producing an infinite loop (#2419).
1699
1693
  if (existsSync(gsdDbPath) && !isDbAvailable()) {
1700
- const dbStatus = getDbStatus();
1694
+ const dbStatus = getWorkflowDatabaseStatus();
1701
1695
  const phaseHint = dbStatus.lastPhase === "open"
1702
1696
  ? "The database file could not be opened"
1703
1697
  : dbStatus.lastPhase === "initSchema"
@@ -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) {
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import { stripMcpToolPrefix } from "@gsd/pi-ai";
8
+ import { TOOL_SURFACE_NOT_READY } from "./tool-surface-readiness.js";
8
9
 
9
10
  interface InFlightTool {
10
11
  startedAt: number;
@@ -19,6 +20,17 @@ const inFlightTools = new Map<string, InFlightTool>();
19
20
  */
20
21
  const INTERACTIVE_TOOLS = new Set(["ask_user_questions", "secure_env_collect"]);
21
22
 
23
+ /**
24
+ * Mode-agnostic refcount of in-flight interactive elicitations that are an
25
+ * active human boundary (the model ASKED via ask_user_questions). Unlike the
26
+ * `inFlightTools` Map, this is NOT gated by auto-session.active, so it is true
27
+ * in FOREGROUND (where s.active is false). Kept SEPARATE from inFlightTools so
28
+ * getInFlightToolCount()/getOldestInFlightToolAgeMs()/hasInteractiveToolInFlight()
29
+ * and the auto-watchdog accounting are byte-for-byte unchanged. A refcount (not
30
+ * a boolean) handles nested/back-to-back elicitations in a single turn.
31
+ */
32
+ let interactiveElicitationDepth = 0;
33
+
22
34
  /**
23
35
  * Mark a tool execution as in-flight.
24
36
  * Records start time and tool name so the idle watchdog can detect tools
@@ -36,6 +48,29 @@ export function markToolEnd(toolCallId: string): void {
36
48
  inFlightTools.delete(toolCallId);
37
49
  }
38
50
 
51
+ /**
52
+ * Mark an interactive elicitation (the model asking via ask_user_questions) as
53
+ * in flight. Ungated by auto-session.active so it is observable in foreground.
54
+ */
55
+ export function markInteractiveElicitationStart(): void {
56
+ interactiveElicitationDepth++;
57
+ }
58
+
59
+ /**
60
+ * Mark an interactive elicitation as completed. Idempotent below zero.
61
+ */
62
+ export function markInteractiveElicitationEnd(): void {
63
+ if (interactiveElicitationDepth > 0) interactiveElicitationDepth--;
64
+ }
65
+
66
+ /**
67
+ * Returns true if any interactive elicitation is currently the active human
68
+ * boundary. True in ALL modes (foreground and auto) while one is in flight.
69
+ */
70
+ export function isInteractiveElicitationInFlight(): boolean {
71
+ return interactiveElicitationDepth > 0;
72
+ }
73
+
39
74
  /**
40
75
  * Returns the age (ms) of the oldest currently in-flight tool, or 0 if none.
41
76
  */
@@ -84,6 +119,7 @@ export function hasInteractiveToolInFlight(): boolean {
84
119
  */
85
120
  export function clearInFlightTools(): void {
86
121
  inFlightTools.clear();
122
+ interactiveElicitationDepth = 0;
87
123
  }
88
124
 
89
125
  // ─── Tool invocation error classification (#2883) ────────────────────────
@@ -97,6 +133,15 @@ export function clearInFlightTools(): void {
97
133
  const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
98
134
  const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
99
135
 
136
+ /**
137
+ * Matches the runtime's "tool not registered" error. Unlike the deterministic
138
+ * invocation failures above, this one is usually transient: the workflow MCP
139
+ * server registers its tool surface asynchronously after session start, so a
140
+ * Unit's first tool call can race the registration. Callers should retry
141
+ * (bounded) instead of breaking the loop.
142
+ */
143
+ const TOOL_UNAVAILABLE_ERROR_RE = new RegExp(`No such tool available|${TOOL_SURFACE_NOT_READY}`, "i");
144
+
100
145
  /**
101
146
  * Returns true if the error message indicates a deterministic invocation or
102
147
  * policy failure (as opposed to a normal tool execution error).
@@ -106,6 +151,15 @@ export function isToolInvocationError(errorMsg: string): boolean {
106
151
  return TOOL_INVOCATION_ERROR_RE.test(errorMsg) || isDeterministicPolicyError(errorMsg);
107
152
  }
108
153
 
154
+ /**
155
+ * Returns true if the error message indicates the called tool was not on the
156
+ * session's tool surface (MCP startup race — see TOOL_UNAVAILABLE_ERROR_RE).
157
+ */
158
+ export function isToolUnavailableError(errorMsg: string): boolean {
159
+ if (!errorMsg) return false;
160
+ return TOOL_UNAVAILABLE_ERROR_RE.test(errorMsg);
161
+ }
162
+
109
163
  /**
110
164
  * Returns true if the error message indicates the tool was skipped because
111
165
  * a queued user message interrupted the turn (#3595). Retrying will produce
@@ -3,48 +3,27 @@ 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
- const EXECUTE_TASK_UNIT_TYPES = new Set([
33
- "execute-task",
34
- "execute-task-simple",
35
- "reactive-execute",
36
- ]);
37
-
38
- // These units own quality gates, but their completion handlers persist verdicts
39
- // from artifact sections. gsd_save_gate_result belongs to gate-evaluate, so keep
40
- // blocking it here with a calm redirect to the section-write path.
41
- const SECTION_CLOSE_GATE_UNIT_TYPES = new Set([
42
- "execute-task",
43
- "execute-task-simple",
44
- "reactive-execute",
45
- "complete-slice",
46
- "validate-milestone",
47
- ]);
18
+ // Scope-class membership is declared per unit in the Unit Registry (ADR-033).
19
+ // EXECUTE_TASK_UNIT_TYPES = scopeClass "execute-task"; the section-close gate
20
+ // Set additionally includes scopeClass "section-close" — units whose completion
21
+ // handlers persist gate verdicts from artifact sections (gsd_save_gate_result
22
+ // belongs to gate-evaluate, so it is soft-blocked with a redirect below).
23
+ import {
24
+ EXECUTE_TASK_UNIT_TYPES,
25
+ SECTION_CLOSE_GATE_UNIT_TYPES,
26
+ } from "./unit-registry.js";
48
27
 
49
28
  const EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS = [
50
29
  "gsd_skip_slice",
@@ -55,7 +34,7 @@ const EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS = [
55
34
  const SCOPED_GSD_LIFECYCLE_TOOLS = new Set(
56
35
  [
57
36
  ...Object.values(AUTO_UNIT_SCOPED_TOOLS).flat(),
58
- ...Object.values(WORKFLOW_TOOL_ALIASES),
37
+ ...WORKFLOW_TOOL_ALIAS_PAIRS.map(({ canonical }) => canonical),
59
38
  ...EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS,
60
39
  ]
61
40
  .filter((tool) => tool.startsWith("gsd_"))
@@ -72,19 +51,12 @@ type AutoUnitToolScopeResult = {
72
51
  displayReason?: string;
73
52
  };
74
53
 
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
54
  export function canonicalWorkflowToolName(toolName: string): string {
82
- const base = stripMcpToolPrefix(toolName);
83
- return WORKFLOW_TOOL_ALIASES[base] ?? base;
55
+ return canonicalWorkflowSurfaceToolName(toolName);
84
56
  }
85
57
 
86
58
  export function isWorkflowAliasTool(toolName: string): boolean {
87
- return Object.prototype.hasOwnProperty.call(WORKFLOW_TOOL_ALIASES, stripMcpToolPrefix(toolName));
59
+ return isWorkflowSurfaceAliasTool(toolName);
88
60
  }
89
61
 
90
62
  function hardBlockReason(unitType: string, what: string): string {
@@ -131,7 +103,7 @@ function isNativeWorkflowTool(toolName: string): boolean {
131
103
  return stripMcpToolPrefix(toolName) === "Workflow";
132
104
  }
133
105
 
134
- function readStringField(input: unknown, camel: string, snake: string): string | undefined {
106
+ export function readStringField(input: unknown, camel: string, snake: string): string | undefined {
135
107
  if (!input || typeof input !== "object") return undefined;
136
108
  const record = input as Record<string, unknown>;
137
109
  const value = record[camel] ?? record[snake];
@@ -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.`,