@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
@@ -13,7 +13,7 @@ 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, isApprovalGateVerifiedInSnapshot, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, loadWriteGateSnapshot, markApprovalGateVerified, markDepthVerified, refreshWriteGateStateFromDisk, 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";
@@ -25,10 +25,13 @@ import {
25
25
  isAutoActive,
26
26
  isAutoCompletionStopInProgress,
27
27
  isAutoPaused,
28
+ isInteractiveElicitationInFlight,
28
29
  markToolEnd,
29
30
  markToolStart,
31
+ recordAutoToolSurfaceSnapshot,
30
32
  recordToolInvocationError,
31
33
  } from "../auto-runtime-state.js";
34
+ import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
32
35
 
33
36
  import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
34
37
  import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
@@ -37,20 +40,32 @@ import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecor
37
40
  import { parseUnitId } from "../unit-id.js";
38
41
  import { classifyCommand } from "../safety/destructive-guard.js";
39
42
  import { logWarning as safetyLogWarning } from "../workflow-logger.js";
43
+ import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
40
44
  import { installNotifyInterceptor } from "./notify-interceptor.js";
41
45
  import { initNotificationStore } from "../notification-store.js";
42
46
  import { initNotificationWidget } from "../notification-widget.js";
47
+ import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
43
48
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
44
49
  import { extractSubagentAgentClasses } from "./subagent-input.js";
45
- import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
50
+ import {
51
+ approvalGateIdForUnit,
52
+ isExplicitApprovalResponse,
53
+ messageHasPendingAskUserQuestionsTool,
54
+ shouldPauseForUserApprovalQuestion,
55
+ } from "../user-input-boundary.js";
46
56
  import { resolveSkillManifest } from "../skill-manifest.js";
47
57
  import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
48
58
  import { getGuidedUnitContext } from "../guided-unit-context.js";
49
59
  import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
50
- import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
60
+ import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, canonicalWorkflowToolName, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
61
+ import { hasBrowserContractPrefix } from "../../shared/browser-contract.js";
51
62
  import { filterToolsForProvider } from "../model-router.js";
63
+ import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
52
64
  import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
53
- import { injectSourceContextBlockIntoPayload, supportsSourceObservationsForUnit } from "../source-observations.js";
65
+ import { supportsSourceObservationsForUnit } from "../source-observations.js";
66
+ import { clearPendingAutoStart } from "../pending-auto-start.js";
67
+ import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
68
+ import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
54
69
 
55
70
  let approvalQuestionAbortInFlight = false;
56
71
 
@@ -167,7 +182,7 @@ function withPreservedShimTools(toolNames: readonly string[]): string[] {
167
182
 
168
183
  /** True for the browser automation tools (browser_navigate, browser_click, ...). */
169
184
  function isBrowserTool(toolName: string): boolean {
170
- return canonicalToolName(toolName).startsWith("browser_");
185
+ return hasBrowserContractPrefix(canonicalToolName(toolName));
171
186
  }
172
187
 
173
188
  /**
@@ -210,16 +225,22 @@ function resolveScopedToolNames(
210
225
 
211
226
  for (const requested of requestedToolNames) {
212
227
  const scopedMatches: string[] = [];
228
+ const aliasFallbacks: string[] = [];
213
229
 
214
230
  for (const activeName of activeToolNames) {
215
- if (!activeName.startsWith("mcp__")) continue;
216
- const toolSeparator = activeName.indexOf("__", "mcp__".length);
217
- if (toolSeparator < 0) continue;
218
- if (activeName.slice(toolSeparator + 2) === requested) {
231
+ if (mcpToolMatchesBaseName(activeName, requested)) {
219
232
  scopedMatches.push(activeName);
233
+ } else if (isWorkflowAliasTool(activeName) && canonicalWorkflowToolName(activeName) === requested) {
234
+ aliasFallbacks.push(activeName);
220
235
  }
221
236
  }
222
237
 
238
+ // Only use alias as fallback when canonical is absent — not directly and not via MCP scoping.
239
+ // Prevents the alias from resurfacing alongside the canonical when both are in the active set.
240
+ if (!exact.has(requested) && scopedMatches.length === 0) {
241
+ scopedMatches.push(...aliasFallbacks);
242
+ }
243
+
223
244
  if (requested.startsWith("browser_") && scopedMatches.length > 0) {
224
245
  for (const match of scopedMatches) resolved.add(match);
225
246
  continue;
@@ -242,6 +263,7 @@ export function buildMinimalAutoGsdToolSet(
242
263
  activeToolNames: readonly string[],
243
264
  unitType: string | undefined,
244
265
  registeredToolNames: readonly string[] = activeToolNames,
266
+ warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames,
245
267
  ): string[] {
246
268
  if (unitType === "run-uat") {
247
269
  return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
@@ -257,7 +279,36 @@ export function buildMinimalAutoGsdToolSet(
257
279
  [...activeToolNames, ...registeredToolNames],
258
280
  [...MINIMAL_GSD_TOOL_NAMES, ...unitTools],
259
281
  );
260
- return withPreservedShimTools([...new Set([...preserved, ...scoped])]);
282
+ const result = withPreservedShimTools([...new Set([...preserved, ...scoped])]);
283
+ warnIfRequiredWorkflowToolsUnresolved(unitType, result, warnOnUnresolvedRequiredTools);
284
+ return result;
285
+ }
286
+
287
+ function hasResolvedWorkflowTool(
288
+ resolvedToolNames: readonly string[],
289
+ requiredToolName: string,
290
+ ): boolean {
291
+ return resolvedToolNames.some(
292
+ (name) => name === requiredToolName || mcpToolMatchesBaseName(name, requiredToolName),
293
+ );
294
+ }
295
+
296
+ function warnIfRequiredWorkflowToolsUnresolved(
297
+ unitType: string | undefined,
298
+ scopedToolNames: readonly string[],
299
+ shouldWarn: boolean,
300
+ ): void {
301
+ if (!unitType || !shouldWarn) return;
302
+
303
+ const unresolved = getRequiredWorkflowToolsForUnit(unitType).filter(
304
+ (toolName) => !hasResolvedWorkflowTool(scopedToolNames, toolName),
305
+ );
306
+ if (unresolved.length === 0) return;
307
+
308
+ safetyLogWarning(
309
+ "bootstrap",
310
+ `buildMinimalAutoGsdToolSet(${unitType}): required workflow tool(s) not in active/registered surface after scoping: ${unresolved.join(", ")}. Tool registration may have partially failed, provider filtering may have removed a required tool, or workflow MCP may be disconnected.`,
311
+ );
261
312
  }
262
313
 
263
314
  export function buildRunUatGsdToolSet(
@@ -276,7 +327,7 @@ export function buildRunUatGsdToolSet(
276
327
  const resolved = [...new Set(scoped)];
277
328
 
278
329
  const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter(
279
- (tool) => !resolved.some((name) => name === tool || (name.startsWith("mcp__") && name.endsWith(`__${tool}`))),
330
+ (tool) => !resolved.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)),
280
331
  );
281
332
  if (unresolved.length > 0) {
282
333
  safetyLogWarning(
@@ -310,6 +361,7 @@ export function buildRequestScopedGsdToolSet(
310
361
  requestCustomMessages: readonly { customType?: string }[] | undefined,
311
362
  registeredToolNames: readonly string[] = activeToolNames,
312
363
  guidedUnitType?: string,
364
+ warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames,
313
365
  ): string[] | undefined {
314
366
  for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
315
367
  const currentCustomType = requestCustomMessages?.[index]?.customType;
@@ -320,7 +372,12 @@ export function buildRequestScopedGsdToolSet(
320
372
  currentCustomType === "gsd-triage"
321
373
  ) {
322
374
  if (guidedUnitType) {
323
- return buildMinimalAutoGsdToolSet(activeToolNames, guidedUnitType, registeredToolNames);
375
+ return buildMinimalAutoGsdToolSet(
376
+ activeToolNames,
377
+ guidedUnitType,
378
+ registeredToolNames,
379
+ warnOnUnresolvedRequiredTools,
380
+ );
324
381
  }
325
382
  return buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNames);
326
383
  }
@@ -368,11 +425,23 @@ function applyMinimalGsdToolSurface(pi: ExtensionAPI): void {
368
425
  if (isFullGsdToolSurfaceRequested()) return;
369
426
  const dash = getAutoRuntimeSnapshot();
370
427
  if (dash.active && dash.currentUnit) {
371
- pi.setActiveTools(buildMinimalAutoGsdToolSet(
372
- pi.getActiveTools(),
428
+ const currentToolNames = pi.getActiveTools();
429
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
430
+ const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
431
+ const scopedToolNames = buildMinimalAutoGsdToolSet(
432
+ currentToolNames,
373
433
  dash.currentUnit.type,
374
- resolveRegisteredToolNames(pi, pi.getActiveTools()),
375
- ));
434
+ registeredToolNames,
435
+ hasRegisteredSurface,
436
+ );
437
+ recordAutoToolSurfaceSnapshot({
438
+ source: "runtime-scope",
439
+ unitType: dash.currentUnit.type,
440
+ modelFacingToolNames: scopedToolNames,
441
+ registeredToolNames,
442
+ scopedToolNames,
443
+ });
444
+ pi.setActiveTools(scopedToolNames);
376
445
  return;
377
446
  }
378
447
  if (!isGeneralGsdToolScopingRequested()) return;
@@ -385,10 +454,18 @@ export function scopeGsdWorkflowToolsForDispatch(
385
454
  ): ScopedGsdWorkflowState | null {
386
455
  if (isFullGsdToolSurfaceRequested()) return null;
387
456
  const current = pi.getActiveTools();
457
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
388
458
  const registeredToolNames = resolveRegisteredToolNames(pi, current);
389
459
  const scoped = unitType
390
- ? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
460
+ ? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames, hasRegisteredSurface)
391
461
  : buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
462
+ recordAutoToolSurfaceSnapshot({
463
+ source: "dispatch-scope",
464
+ unitType,
465
+ modelFacingToolNames: scoped,
466
+ registeredToolNames,
467
+ scopedToolNames: scoped,
468
+ });
392
469
  const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
393
470
  const canScopeSkills = unitHasSkillManifest(unitType) && pi.getVisibleSkills && pi.setVisibleSkills;
394
471
  if (!toolsChanged && !canScopeSkills) {
@@ -539,8 +616,13 @@ function isShellExecutionTool(canonicalName: string): boolean {
539
616
 
540
617
  function activateDeferredApprovalGate(basePath: string): void {
541
618
  if (deferredApprovalGate?.basePath !== basePath) return;
542
- setPendingGate(deferredApprovalGate.gateId, basePath);
619
+ const gateId = deferredApprovalGate.gateId;
543
620
  deferredApprovalGate = null;
621
+ const snapshot = refreshWriteGateStateFromDisk(basePath);
622
+ const milestoneId = extractDepthVerificationMilestoneId(gateId);
623
+ if (isApprovalGateVerifiedInSnapshot(snapshot, gateId)) return;
624
+ if (milestoneId && isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId)) return;
625
+ setPendingGate(gateId, basePath);
544
626
  }
545
627
 
546
628
  function extractGateQuestionId(input: unknown): string | undefined {
@@ -560,6 +642,26 @@ function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
560
642
  return (input as { artifact_type?: unknown }).artifact_type === "CONTEXT-DRAFT";
561
643
  }
562
644
 
645
+ /**
646
+ * External engines (claude-code-cli) deliver ask_user_questions results as
647
+ * relayed MCP tool results: the structured round payload arrives in
648
+ * `result.structuredContent`, not in pi-native `event.details`. Without this
649
+ * fallback, applyAskUserQuestionsGateResult sees no response for an answered
650
+ * gate question and lands in the "waiting" branch — leaving a re-armed gate
651
+ * permanently pending and the discuss→auto handoff blocked.
652
+ */
653
+ function resolveAskUserQuestionsGateDetails(event: { details?: unknown; result?: unknown }): any {
654
+ const hasRoundShape = (value: any): boolean =>
655
+ !!value && typeof value === "object" &&
656
+ (value.cancelled !== undefined || value.response !== undefined);
657
+
658
+ const details = event.details as any;
659
+ if (hasRoundShape(details)) return details;
660
+ const structured = (event.result as { structuredContent?: unknown } | undefined)?.structuredContent;
661
+ if (hasRoundShape(structured)) return structured;
662
+ return details ?? {};
663
+ }
664
+
563
665
  type StructuredQuestion = {
564
666
  id?: string;
565
667
  header?: string;
@@ -697,6 +799,7 @@ function initSessionNotifications(ctx: ExtensionContext): void {
697
799
  initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
698
800
  installNotifyInterceptor(ctx);
699
801
  initNotificationWidget(ctx);
802
+ notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
700
803
  }
701
804
 
702
805
  async function prepareWorkflowMcpForHookContext(
@@ -768,7 +871,7 @@ export function registerHooks(
768
871
  }
769
872
  });
770
873
 
771
- pi.on("session_switch", async (_event, ctx) => {
874
+ pi.on("session_switch", async (event, ctx) => {
772
875
  const basePath = contextBasePath(ctx);
773
876
  const preserveCloseoutSurface = isAutoCompletionStopInProgress();
774
877
  initSessionNotifications(ctx);
@@ -777,6 +880,13 @@ export function registerHooks(
777
880
  clearDeferredApprovalGate();
778
881
  await resetAskUserQuestionsTurnCache();
779
882
  clearDiscussionFlowState(basePath);
883
+ // /clear or /new destroys the conversation holding a discuss interview, so
884
+ // its pending discuss→auto handoff can never be answered — clear it. Resume
885
+ // restores the interview transcript, so the entry survives. Auto-mode's own
886
+ // newSession() calls are safe: the handoff consumes the entry on agent_end.
887
+ if (event.reason === "new") {
888
+ clearPendingAutoStart(basePath);
889
+ }
780
890
  await syncServiceTierStatus(ctx);
781
891
  await applyDisabledModelProviderPolicy(ctx);
782
892
  await applyCompactionThresholdOverride(ctx);
@@ -994,6 +1104,18 @@ export function registerHooks(
994
1104
 
995
1105
  pi.on("message_update", async (event, ctx: ExtensionContext) => {
996
1106
  if (approvalQuestionAbortInFlight) return;
1107
+ // If the model asked via ask_user_questions, that in-flight elicitation IS
1108
+ // the human boundary. Arming the pause/gate here (and emitting the "waiting
1109
+ // for your approval - pausing" notice) would tear it down and trigger the
1110
+ // foreground self-cancel/re-ask loop. The marker is set only by the
1111
+ // claude-code-cli SDK elicitation handler and is ungated, so it is true in
1112
+ // foreground; under the native-TUI provider it is always false and this path
1113
+ // runs unchanged (#cc-elicitation-self-cancel).
1114
+ if (isInteractiveElicitationInFlight()) return;
1115
+ // Prose with "?" can stream before the MCP tool/elicitation starts. When the
1116
+ // structured ask_user_questions call is already in the partial message, the
1117
+ // tool IS the human boundary — do not arm the text-based approval pause.
1118
+ if (messageHasPendingAskUserQuestionsTool(event.message)) return;
997
1119
 
998
1120
  const dash = getAutoRuntimeSnapshot();
999
1121
  if (dash.active) return;
@@ -1322,87 +1444,57 @@ export function registerHooks(
1322
1444
  } else if (isAutoActive()) {
1323
1445
  clearToolInvocationError();
1324
1446
  }
1447
+ // Interactive Closeout adapter (ADR-032): auto-mode owns closeout for its
1448
+ // own units; interactive completions get the durable git subset (commit +
1449
+ // Closeout Git Verdict) instead of silently bypassing git.isolation.
1450
+ if (!event.isError && !isAutoActive() && isUnitCloseoutTool(toolName)) {
1451
+ try {
1452
+ runInteractiveUnitCloseout({
1453
+ basePath: resolveWorkflowToolBasePath(ctx, event.input as { milestone_id?: string }),
1454
+ canonicalToolName: toolName,
1455
+ input: event.input,
1456
+ });
1457
+ } catch (err) {
1458
+ safetyLogWarning("engine", `interactive unit closeout failed: ${err instanceof Error ? err.message : String(err)}`);
1459
+ }
1460
+ }
1325
1461
  if (toolName !== "ask_user_questions") return;
1326
1462
  const basePath = contextBasePath(ctx);
1327
1463
  const milestoneId = await getDiscussionMilestoneIdFor(basePath);
1328
1464
 
1329
- const details = event.details as any;
1330
-
1331
- // ── Discussion gate enforcement: handle gate question responses ──
1332
- // If the result is cancelled or has no response, the pending gate stays active
1333
- // so the model is blocked from non-read-only tools until it re-asks.
1334
- // If the user responded at all (even "needs adjustment"), clear the pending gate
1335
- // because the user engaged — the prompt handles the re-ask-after-adjustment flow.
1336
- const questions: any[] = (event.input as any)?.questions ?? [];
1337
- const currentPendingGate = getPendingGate(basePath);
1338
- if (currentPendingGate) {
1339
- if (details?.cancelled || !details?.response) {
1340
- // Gate stays pending. Direct the agent to the most reliable recovery
1341
- // path — re-calling ask_user_questions with the same gate id — without
1342
- // misrepresenting the plain-text path. The plain-text path also works
1343
- // (isExplicitApprovalResponse on the next before_agent_start clears
1344
- // the gate when the user replies with an approval keyword), but the
1345
- // structured re-ask is more deterministic and gives the user a clear UI.
1346
- resetToolCallLoopGuard();
1347
- const interrupted = details?.interrupted === true;
1348
- if (ctx) {
1349
- await maybePauseAutoForApprovalGate(
1350
- ctx,
1351
- pi,
1352
- true,
1353
- interrupted
1354
- ? "Depth confirmation was interrupted — pausing auto-mode until you respond."
1355
- : "Depth confirmation is waiting for your answer — pausing auto-mode.",
1356
- );
1357
- }
1358
- return {
1359
- content: [{
1360
- type: "text" as const,
1361
- text: [
1362
- `Waiting for depth confirmation on gate "${currentPendingGate}".`,
1363
- interrupted
1364
- ? "The confirmation question was interrupted before a response was recorded."
1365
- : "No user response was received for the confirmation question.",
1366
- "Do not infer approval from earlier or prior messages.",
1367
- "Do not proceed, write files, save artifacts, or call other tools.",
1368
- `Re-call ask_user_questions with the same gate question id ("${currentPendingGate}") and wait for the user's response.`,
1369
- ].join(" "),
1370
- }],
1371
- };
1372
- } else {
1373
- const pendingQuestion = questions.find((question) => question?.id === currentPendingGate);
1374
- if (pendingQuestion) {
1375
- const answer = details.response?.answers?.[currentPendingGate];
1376
- if (isDepthConfirmationAnswer(answer?.selected, pendingQuestion.options)) {
1377
- markApprovalGateVerified(currentPendingGate, basePath);
1378
- const milestoneIdFromGate = extractDepthVerificationMilestoneId(currentPendingGate);
1379
- if (milestoneIdFromGate) markDepthVerified(milestoneIdFromGate, basePath);
1380
- clearPendingGate(basePath);
1381
- clearDeferredApprovalGate(basePath);
1382
- }
1383
- }
1384
- }
1385
- }
1386
-
1387
- if (details?.cancelled || !details?.response) return;
1465
+ const details = resolveAskUserQuestionsGateDetails(event);
1388
1466
 
1389
- for (const question of questions) {
1390
- if (typeof question.id === "string" && question.id.includes("depth_verification")) {
1391
- // Only unlock the gate if the user selected the first option (confirmation).
1392
- // Cross-references against the question's defined options to reject free-form "Other" text.
1393
- const answer = details.response?.answers?.[question.id];
1394
- const inferredMilestoneId = extractDepthVerificationMilestoneId(question.id) ?? milestoneId;
1395
- if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
1396
- if (currentPendingGate && question.id !== currentPendingGate) break;
1397
- markApprovalGateVerified(question.id, basePath);
1398
- markDepthVerified(inferredMilestoneId, basePath);
1399
- clearPendingGate(basePath);
1400
- clearDeferredApprovalGate(basePath);
1401
- }
1402
- break;
1467
+ const questions: any[] = (event.input as any)?.questions ?? details?.questions ?? [];
1468
+ const gateResult = applyAskUserQuestionsGateResult({
1469
+ basePath,
1470
+ questions,
1471
+ details,
1472
+ fallbackMilestoneId: milestoneId,
1473
+ });
1474
+ if (gateResult.status === "waiting") {
1475
+ resetToolCallLoopGuard();
1476
+ if (ctx) {
1477
+ await maybePauseAutoForApprovalGate(
1478
+ ctx,
1479
+ pi,
1480
+ true,
1481
+ gateResult.interrupted
1482
+ ? "Depth confirmation was interrupted — pausing auto-mode until you respond."
1483
+ : "Depth confirmation is waiting for your answer — pausing auto-mode.",
1484
+ );
1403
1485
  }
1486
+ return {
1487
+ content: [{
1488
+ type: "text" as const,
1489
+ text: formatPendingAskUserQuestionsGateMessage(gateResult.pendingGateId, gateResult.interrupted),
1490
+ }],
1491
+ };
1492
+ }
1493
+ if (gateResult.status === "verified") {
1494
+ clearDeferredApprovalGate(basePath);
1404
1495
  }
1405
1496
 
1497
+ if (details?.cancelled || !details?.response) return;
1406
1498
  if (!milestoneId) return;
1407
1499
  await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
1408
1500
  });
@@ -1413,10 +1505,42 @@ export function registerHooks(
1413
1505
  if (toolName === "ask_user_questions") {
1414
1506
  const questionId = extractGateQuestionId(event.args);
1415
1507
  if (typeof questionId === "string") {
1416
- setPendingGate(questionId, basePath);
1508
+ // External engines (claude-code-cli) ingest the SDK turn's tool blocks
1509
+ // post-hoc, so this event can fire AFTER the workflow MCP child already
1510
+ // verified this gate and allowed the CONTEXT save. setPendingGate also
1511
+ // revokes verifiedDepthMilestones/verifiedApprovalGates, so an
1512
+ // unconditional re-arm here wipes the child's verification and leaves
1513
+ // the discuss→auto handoff permanently blocked. Skip the re-arm when
1514
+ // the snapshot already records this exact gate as verified — mirrors
1515
+ // activateDeferredApprovalGate's guard. Stale verified state cannot
1516
+ // leak into a later re-discussion: a successful handoff deletes the
1517
+ // snapshot via clearDiscussionFlowState.
1518
+ const snapshot = refreshWriteGateStateFromDisk(basePath);
1519
+ const gateMilestoneId = extractDepthVerificationMilestoneId(questionId);
1520
+ const alreadyVerified =
1521
+ isApprovalGateVerifiedInSnapshot(snapshot, questionId) ||
1522
+ isMilestoneDepthVerifiedInSnapshot(snapshot, gateMilestoneId);
1523
+ if (!alreadyVerified) {
1524
+ setPendingGate(questionId, basePath);
1525
+ }
1417
1526
  clearDeferredApprovalGate(basePath);
1418
1527
  }
1419
1528
  }
1529
+
1530
+ // Safety harness: record evidence here, not only in tool_call. External
1531
+ // engines (claude-code-cli) pre-execute tools, so the agent loop skips
1532
+ // beforeToolCall/tool_call for them — tool_execution_start is the only
1533
+ // event that fires for every tool call. recordToolCall dedupes by
1534
+ // toolCallId, so native tools (which hit both events) record once.
1535
+ safetyRecordToolCall(event.toolCallId, event.toolName, (event.args ?? {}) as Record<string, unknown>);
1536
+ const execDash = getAutoRuntimeSnapshot();
1537
+ if (execDash.basePath && execDash.currentUnit?.type === "execute-task") {
1538
+ const { milestone: xMid, slice: xSid, task: xTid } = parseUnitId(execDash.currentUnit.id);
1539
+ if (xMid && xSid && xTid) {
1540
+ saveEvidenceToDisk(execDash.basePath, xMid, xSid, xTid);
1541
+ }
1542
+ }
1543
+
1420
1544
  if (!isAutoActive()) return;
1421
1545
  markToolStart(event.toolCallId, event.toolName);
1422
1546
  });
@@ -1458,66 +1582,10 @@ export function registerHooks(
1458
1582
  const payload = event.payload as Record<string, unknown> | null;
1459
1583
  if (!payload || typeof payload !== "object") return;
1460
1584
 
1461
- // ── Context Management ──────────────────────────────────────────────
1462
- // Load preferences once for both masking and truncation.
1463
- try {
1464
- const { loadEffectiveGSDPreferences } = await import("../preferences.js");
1465
- const {
1466
- createObservationMask,
1467
- createResponsesInputObservationMask,
1468
- truncateContextResultMessages,
1469
- truncateResponsesInputResultItems,
1470
- } = await import("../context-masker.js");
1471
- const prefs = loadEffectiveGSDPreferences();
1472
- const cmConfig = prefs?.preferences.context_management;
1473
-
1474
- // Observation masking: replace old tool results with placeholders.
1475
- // Only active during auto-mode when context_management.observation_masking is enabled.
1476
- if (isAutoActive() && cmConfig?.observation_masking !== false) {
1477
- const keepTurns = cmConfig?.observation_mask_turns ?? 8;
1478
- const messages = payload.messages;
1479
- if (Array.isArray(messages)) {
1480
- payload.messages = createObservationMask(keepTurns)(messages);
1481
- }
1482
- const input = payload.input;
1483
- if (Array.isArray(input)) {
1484
- payload.input = createResponsesInputObservationMask(keepTurns)(input);
1485
- }
1486
- }
1487
-
1488
- // Tool result truncation: cap individual tool result content length.
1489
- // Applies in ALL modes (auto + interactive) to prevent context bloat.
1490
- // In pi-ai format, toolResult messages have role: "toolResult" and content: TextContent[].
1491
- // Creates new objects to avoid mutating shared conversation state.
1492
- const maxChars = cmConfig?.tool_result_max_chars ?? 800;
1493
- const msgs = payload.messages;
1494
- if (Array.isArray(msgs)) {
1495
- payload.messages = truncateContextResultMessages(msgs as any, maxChars);
1496
- }
1497
- const input = payload.input;
1498
- if (Array.isArray(input)) {
1499
- payload.input = truncateResponsesInputResultItems(input as any, maxChars);
1500
- }
1501
- } catch { /* non-fatal */ }
1502
-
1503
- try {
1504
- if (isAutoActive()) {
1505
- const sourceContextBlock = getSourceObservationStore().renderActiveBlock();
1506
- if (sourceContextBlock) {
1507
- const nextPayload = injectSourceContextBlockIntoPayload(payload, sourceContextBlock);
1508
- Object.assign(payload, nextPayload);
1509
- }
1510
- }
1511
- } catch { /* non-fatal */ }
1512
-
1513
- // ── Service Tier ────────────────────────────────────────────────────
1514
- const modelId = event.model?.id;
1515
- if (!modelId) return payload;
1516
- const { getEffectiveServiceTier, supportsServiceTier } = await import("../service-tier.js");
1517
- const tier = getEffectiveServiceTier();
1518
- if (!tier || !supportsServiceTier(modelId)) return payload;
1519
- payload.service_tier = tier;
1520
- return payload;
1585
+ return applyProviderPayloadPolicy({
1586
+ payload,
1587
+ modelId: event.model?.id,
1588
+ });
1521
1589
  });
1522
1590
 
1523
1591
  // Capability-aware model routing hook (ADR-004)
@@ -1553,31 +1621,53 @@ export function registerHooks(
1553
1621
  return surfaceReduced ? { toolNames: providerCompatible } : undefined;
1554
1622
  }
1555
1623
  const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
1624
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
1556
1625
  const compatibleRegisteredToolNames = filterToolsForProvider(
1557
1626
  registeredToolNames,
1558
1627
  event.selectedModelApi,
1559
1628
  event.selectedModelProvider,
1560
1629
  ).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
1561
1630
  const guidedUnit = getGuidedUnitContext();
1631
+ const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
1632
+ ? compatibleRegisteredToolNames
1633
+ : registeredToolNames;
1562
1634
  const requestScoped = buildRequestScopedGsdToolSet(
1563
1635
  guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1564
1636
  event.requestCustomMessages,
1565
- guidedUnit?.unitType === "run-uat" ? compatibleRegisteredToolNames : registeredToolNames,
1637
+ requestRegisteredToolNames,
1566
1638
  guidedUnit?.unitType,
1639
+ hasRegisteredSurface,
1567
1640
  );
1568
1641
  if (requestScoped) {
1642
+ recordAutoToolSurfaceSnapshot({
1643
+ source: "provider-adjustment",
1644
+ unitType: guidedUnit?.unitType,
1645
+ modelFacingToolNames: requestScoped,
1646
+ registeredToolNames: requestRegisteredToolNames,
1647
+ scopedToolNames: requestScoped,
1648
+ });
1569
1649
  return { toolNames: requestScoped };
1570
1650
  }
1571
1651
  const dash = getAutoRuntimeSnapshot();
1572
1652
  if (dash.active && dash.currentUnit) {
1653
+ const registeredForUnit = dash.currentUnit.type === "run-uat"
1654
+ ? compatibleRegisteredToolNames
1655
+ : resolveRegisteredToolNames(pi, event.activeToolNames);
1656
+ const scopedToolNames = buildMinimalAutoGsdToolSet(
1657
+ dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1658
+ dash.currentUnit.type,
1659
+ registeredForUnit,
1660
+ hasRegisteredSurface,
1661
+ );
1662
+ recordAutoToolSurfaceSnapshot({
1663
+ source: "provider-adjustment",
1664
+ unitType: dash.currentUnit.type,
1665
+ modelFacingToolNames: scopedToolNames,
1666
+ registeredToolNames: registeredForUnit,
1667
+ scopedToolNames,
1668
+ });
1573
1669
  return {
1574
- toolNames: buildMinimalAutoGsdToolSet(
1575
- dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1576
- dash.currentUnit.type,
1577
- dash.currentUnit.type === "run-uat"
1578
- ? compatibleRegisteredToolNames
1579
- : resolveRegisteredToolNames(pi, event.activeToolNames),
1580
- ),
1670
+ toolNames: scopedToolNames,
1581
1671
  };
1582
1672
  }
1583
1673
  if (isGeneralGsdToolScopingRequested()) {