@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
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Regression tests for ask_user_questions renderResult when Claude Code MCP
3
+ * omits structuredContent and the chat controller passes details as undefined
4
+ * or an empty object.
5
+ */
6
+
7
+ import assert from "node:assert/strict";
8
+ import { test } from "node:test";
9
+ import askUserQuestionsExtension from "../../ask-user-questions.ts";
10
+
11
+ const fakeTheme = {
12
+ fg: (_color: string, text: string) => text,
13
+ bold: (text: string) => text,
14
+ };
15
+
16
+ function getAskUserQuestionsTool() {
17
+ const tools: any[] = [];
18
+ askUserQuestionsExtension({ registerTool: (tool: any) => tools.push(tool) } as any);
19
+ const tool = tools.find((t) => t.name === "ask_user_questions");
20
+ assert.ok(tool, "ask_user_questions should be registered");
21
+ return tool;
22
+ }
23
+
24
+ function renderText(tool: any, result: unknown, args?: unknown): string {
25
+ const rendered = tool.renderResult(result, {}, fakeTheme, { args });
26
+ return String((rendered as any).content ?? (rendered as any).text ?? rendered);
27
+ }
28
+
29
+ const depthQuestion = {
30
+ id: "depth_check",
31
+ header: "Depth Check",
32
+ question: "Did I capture the depth right?",
33
+ options: [
34
+ { label: "Yes, you got it", description: "Proceed" },
35
+ { label: "Not quite - let me clarify", description: "Clarify" },
36
+ ],
37
+ };
38
+
39
+ test("ask_user_questions renderResult shows answers when details is undefined (MCP text-only wire)", () => {
40
+ const tool = getAskUserQuestionsTool();
41
+ const contentText = JSON.stringify({
42
+ answers: { depth_check: { answers: ["Yes, you got it"] } },
43
+ });
44
+ const text = renderText(
45
+ tool,
46
+ {
47
+ content: [{ type: "text", text: contentText }],
48
+ details: undefined,
49
+ isError: false,
50
+ },
51
+ { questions: [depthQuestion] },
52
+ );
53
+
54
+ assert.match(text, /✓/);
55
+ assert.match(text, /Depth Check/);
56
+ assert.match(text, /Yes, you got it/);
57
+ assert.doesNotMatch(text, /Cancelled/i);
58
+ });
59
+
60
+ test("ask_user_questions renderResult shows answers when details is empty object (#cc-elicitation)", () => {
61
+ const tool = getAskUserQuestionsTool();
62
+ const contentText = JSON.stringify({
63
+ answers: { depth_check: { answers: ["Yes, you got it"] } },
64
+ });
65
+ const text = renderText(
66
+ tool,
67
+ {
68
+ content: [{ type: "text", text: contentText }],
69
+ details: {},
70
+ isError: false,
71
+ },
72
+ { questions: [depthQuestion] },
73
+ );
74
+
75
+ assert.match(text, /Yes, you got it/);
76
+ assert.doesNotMatch(text, /Cancelled/i);
77
+ });
78
+
79
+ test("ask_user_questions renderResult still shows Cancelled for explicit cancel payload", () => {
80
+ const tool = getAskUserQuestionsTool();
81
+ const text = renderText(
82
+ tool,
83
+ {
84
+ content: [{ type: "text", text: "ask_user_questions was cancelled before receiving a response" }],
85
+ details: { questions: [depthQuestion], response: null, cancelled: true },
86
+ isError: false,
87
+ },
88
+ { questions: [depthQuestion] },
89
+ );
90
+
91
+ assert.match(text, /Cancelled/i);
92
+ });
@@ -29,11 +29,16 @@ import {
29
29
  _refreshLastCommitForTests,
30
30
  _getLastCommitForTests,
31
31
  _getLastCommitFetchedAtForTests,
32
+ formatToolSurfaceSnapshot,
32
33
  formatRuntimeHealthSignal,
33
34
  shouldRenderRoadmapProgress,
34
35
  } from "../auto-dashboard.ts";
35
36
  import { getAutoDashboardData } from "../auto.ts";
36
- import { autoSession } from "../auto-runtime-state.ts";
37
+ import {
38
+ autoSession,
39
+ clearAutoToolSurfaceSnapshot,
40
+ recordAutoToolSurfaceSnapshot,
41
+ } from "../auto-runtime-state.ts";
37
42
  import { formatRtkSavingsLabel } from "../../shared/rtk-session-stats.ts";
38
43
  import {
39
44
  openDatabase,
@@ -530,6 +535,29 @@ test("getAutoDashboardData returns RTK savings in the dashboard payload", () =>
530
535
  }
531
536
  });
532
537
 
538
+ test("getAutoDashboardData exposes typed tool-surface snapshots", () => {
539
+ autoSession.reset();
540
+ clearAutoToolSurfaceSnapshot();
541
+ autoSession.active = true;
542
+ recordAutoToolSurfaceSnapshot({
543
+ source: "provider-adjustment",
544
+ unitType: "run-uat",
545
+ modelFacingToolNames: ["read"],
546
+ registeredToolNames: ["read", "browser_navigate"],
547
+ scopedToolNames: ["read", "browser_navigate"],
548
+ presentedToolNames: ["browser_navigate"],
549
+ capturedAt: 456,
550
+ });
551
+
552
+ const data = getAutoDashboardData();
553
+
554
+ assert.equal(data.toolSurface?.source, "provider-adjustment");
555
+ assert.equal(formatToolSurfaceSnapshot(data.toolSurface), "run-uat: model 1 / registered 2 / scoped 2 / presented 1");
556
+
557
+ autoSession.reset();
558
+ clearAutoToolSurfaceSnapshot();
559
+ });
560
+
533
561
  test("RTK savings label formats the dashboard footer text", () => {
534
562
  assert.equal(formatRtkSavingsLabel(null), null);
535
563
  assert.equal(
@@ -23,11 +23,12 @@ import {
23
23
  import { runUnit, shouldDeferUnitFailsafeTimeout } from "../auto/run-unit.js";
24
24
  import { scheduleAutoWakeup, _resetAutoWakeupsForTest } from "../auto/schedule-wakeup.js";
25
25
  import { writeUnitRuntimeRecord, readUnitRuntimeRecord } from "../unit-runtime.js";
26
- import { autoLoop } from "../auto/loop.js";
27
- import { runDispatch, runUnitPhase } from "../auto/phases.js";
26
+ import { autoLoop as rawAutoLoop } from "../auto/loop.js";
27
+ import { runPreDispatch, runDispatch, runUnitPhase } from "../auto/phases.js";
28
28
  import { detectStuck } from "../auto/detect-stuck.js";
29
- import type { UnitResult, AgentEndEvent } from "../auto/types.js";
29
+ import type { UnitResult, AgentEndEvent, LoopState } from "../auto/types.js";
30
30
  import type { LoopDeps } from "../auto/loop-deps.js";
31
+ import type { AutoAdvanceResult, AutoOrchestrationModule, AutoStatus, UnitRef } from "../auto/contracts.js";
31
32
  import { WorktreeStateProjection } from "../worktree-state-projection.js";
32
33
  import { ModelPolicyDispatchBlockedError } from "../auto-model-selection.js";
33
34
  import type { SessionLockStatus } from "../session-lock.js";
@@ -40,6 +41,17 @@ import { SourceObservationStore } from "../source-observations.js";
40
41
 
41
42
  // ─── Helpers ─────────────────────────────────────────────────────────────────
42
43
 
44
+ const ORCHESTRATION_MISSING_REASON =
45
+ "Auto Orchestration Module is not wired; cannot dispatch built-in GSD Unit.";
46
+
47
+ type CapturedAutoSideEffects<T> = {
48
+ result: T;
49
+ stopped: boolean;
50
+ stoppedReason?: string;
51
+ paused: boolean;
52
+ pausedReason?: string;
53
+ };
54
+
43
55
  function makeEvent(
44
56
  messages: unknown[] = [{ role: "assistant" }],
45
57
  ): AgentEndEvent {
@@ -67,12 +79,203 @@ async function waitForMicrotasks(
67
79
  assert.fail(`Timed out waiting for ${label}`);
68
80
  }
69
81
 
82
+ function makeLoopState(): LoopState {
83
+ return {
84
+ recentUnits: [],
85
+ stuckRecoveryAttempts: 0,
86
+ consecutiveFinalizeTimeouts: 0,
87
+ consecutiveDispatchCount: new Map<string, number>(),
88
+ lastDispatchedKey: null,
89
+ lastDispatchPhase: null,
90
+ };
91
+ }
92
+
93
+ function createLoopTestOrchestration(
94
+ ctx: any,
95
+ pi: any,
96
+ s: any,
97
+ deps: LoopDeps,
98
+ ): AutoOrchestrationModule {
99
+ // Production auto.ts wires the real Auto Orchestration Module before entering
100
+ // autoLoop. These loop-mechanics tests keep their LoopDeps fixtures by
101
+ // adapting the old phase helpers to the public orchestration Interface.
102
+ const loopState = makeLoopState();
103
+ const status: AutoStatus = { phase: "running", transitionCount: 0 };
104
+ let iteration = 0;
105
+ let seq = 0;
106
+
107
+ function nextSeq(): number {
108
+ return ++seq;
109
+ }
110
+
111
+ function clearActiveUnit(): void {
112
+ status.activeUnit = undefined;
113
+ }
114
+
115
+ async function captureAutoSideEffects<T>(
116
+ run: () => Promise<T>,
117
+ ): Promise<CapturedAutoSideEffects<T>> {
118
+ const originalStopAuto = deps.stopAuto;
119
+ const originalPauseAuto = deps.pauseAuto;
120
+ let stoppedReason: string | undefined;
121
+ let pausedReason: string | undefined;
122
+ let stopped = false;
123
+ let paused = false;
124
+
125
+ (deps as any).stopAuto = async (...args: Parameters<LoopDeps["stopAuto"]>) => {
126
+ stopped = true;
127
+ stoppedReason = args[2];
128
+ return originalStopAuto(...args);
129
+ };
130
+ (deps as any).pauseAuto = async (...args: Parameters<LoopDeps["pauseAuto"]>) => {
131
+ paused = true;
132
+ const context = args[2] as { message?: string } | undefined;
133
+ pausedReason = context?.message;
134
+ return originalPauseAuto(...args);
135
+ };
136
+
137
+ try {
138
+ const result = await run();
139
+ return { result, stopped, stoppedReason, paused, pausedReason };
140
+ } finally {
141
+ (deps as any).stopAuto = originalStopAuto;
142
+ (deps as any).pauseAuto = originalPauseAuto;
143
+ }
144
+ }
145
+
146
+ function resultForBreak(
147
+ reason: string,
148
+ sideEffects: CapturedAutoSideEffects<unknown>,
149
+ ): AutoAdvanceResult {
150
+ clearActiveUnit();
151
+ status.phase = sideEffects.paused && !sideEffects.stopped ? "paused" : "stopped";
152
+ status.transitionCount += 1;
153
+ if (sideEffects.paused && !sideEffects.stopped) {
154
+ return {
155
+ kind: "blocked",
156
+ reason: sideEffects.pausedReason ?? reason,
157
+ action: "pause",
158
+ };
159
+ }
160
+ return {
161
+ kind: "stopped",
162
+ reason: sideEffects.stoppedReason ?? reason,
163
+ };
164
+ }
165
+
166
+ return {
167
+ async start() {
168
+ status.phase = "running";
169
+ status.transitionCount += 1;
170
+ return { kind: "started" };
171
+ },
172
+ async advance() {
173
+ iteration += 1;
174
+ seq = 0;
175
+ const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
176
+ const ic = {
177
+ ctx,
178
+ pi,
179
+ s,
180
+ deps,
181
+ prefs,
182
+ iteration,
183
+ flowId: `loop-test-orchestration-${iteration}`,
184
+ nextSeq,
185
+ };
186
+
187
+ const preDispatch = await captureAutoSideEffects(() => runPreDispatch(ic, loopState));
188
+ const preDispatchResult = preDispatch.result;
189
+ if (preDispatchResult.action === "break") {
190
+ return resultForBreak(preDispatchResult.reason, preDispatch);
191
+ }
192
+ if (preDispatchResult.action === "continue") {
193
+ return { kind: "skipped", reason: "pre-dispatch-skip" };
194
+ }
195
+ if (preDispatchResult.action === "retry") {
196
+ return { kind: "paused", reason: preDispatchResult.reason };
197
+ }
198
+
199
+ const dispatch = await captureAutoSideEffects(() =>
200
+ runDispatch(ic, preDispatchResult.data, loopState),
201
+ );
202
+ if (dispatch.result.action === "break") {
203
+ return resultForBreak(dispatch.result.reason, dispatch);
204
+ }
205
+ if (dispatch.result.action === "continue") {
206
+ return {
207
+ kind: "skipped",
208
+ reason: "dispatch-skip",
209
+ stateSnapshot: preDispatchResult.data.state,
210
+ };
211
+ }
212
+ if (dispatch.result.action === "retry") {
213
+ return { kind: "paused", reason: dispatch.result.reason };
214
+ }
215
+
216
+ const data = dispatch.result.data;
217
+ const unit: UnitRef = { unitType: data.unitType, unitId: data.unitId };
218
+ s.pendingOrchestrationDispatch = {
219
+ unitType: data.unitType,
220
+ unitId: data.unitId,
221
+ prompt: data.prompt,
222
+ pauseAfterUatDispatch: data.pauseAfterUatDispatch,
223
+ state: data.state,
224
+ mid: data.mid,
225
+ midTitle: data.midTitle,
226
+ };
227
+ status.phase = "running";
228
+ status.activeUnit = unit;
229
+ status.transitionCount += 1;
230
+ return { kind: "advanced", unit, stateSnapshot: data.state };
231
+ },
232
+ async completeActiveUnit() {
233
+ clearActiveUnit();
234
+ },
235
+ async retryActiveUnit() {
236
+ clearActiveUnit();
237
+ },
238
+ async resume() {
239
+ status.phase = "running";
240
+ status.transitionCount += 1;
241
+ return { kind: "resumed" };
242
+ },
243
+ async stop(reason: string) {
244
+ status.phase = "stopped";
245
+ clearActiveUnit();
246
+ status.transitionCount += 1;
247
+ return { kind: "stopped", reason };
248
+ },
249
+ getStatus() {
250
+ return {
251
+ ...status,
252
+ activeUnit: status.activeUnit ? { ...status.activeUnit } : undefined,
253
+ };
254
+ },
255
+ };
256
+ }
257
+
258
+ async function autoLoop(
259
+ ctx: any,
260
+ pi: any,
261
+ s: any,
262
+ deps: LoopDeps,
263
+ options?: Parameters<typeof rawAutoLoop>[4],
264
+ ): Promise<void> {
265
+ if (!s.orchestration) {
266
+ s.orchestration = createLoopTestOrchestration(ctx, pi, s, deps);
267
+ }
268
+ await rawAutoLoop(ctx, pi, s, deps, options);
269
+ }
270
+
70
271
  /**
71
272
  * Build a minimal mock AutoSession with controllable newSession behavior.
72
273
  */
73
274
  function makeMockSession(opts?: {
74
275
  newSessionResult?: { cancelled: boolean };
75
276
  newSessionThrows?: string;
277
+ /** Reject newSession() with a specific Error instance (e.g. TypeError). */
278
+ newSessionThrowsError?: Error;
76
279
  newSessionDelayMs?: number;
77
280
  onNewSessionStart?: (session: any) => void;
78
281
  onNewSessionSettle?: (session: any) => void;
@@ -87,6 +290,9 @@ function makeMockSession(opts?: {
87
290
  cmdCtx: {
88
291
  newSession: (options?: { abortSignal?: AbortSignal; workspaceRoot?: string }) => {
89
292
  opts?.onNewSessionStart?.(session);
293
+ if (opts?.newSessionThrowsError) {
294
+ return Promise.reject(opts.newSessionThrowsError);
295
+ }
90
296
  if (opts?.newSessionThrows) {
91
297
  return Promise.reject(new Error(opts.newSessionThrows));
92
298
  }
@@ -497,6 +703,73 @@ test("runUnit returns cancelled when session creation fails", async () => {
497
703
  assert.equal(pi.calls.length, 0);
498
704
  });
499
705
 
706
+ test("runUnit: TypeError from newSession is classified as structural (isTransient: false)", async () => {
707
+ // Regression for #572: a TypeError thrown from newSession (e.g. "something is
708
+ // not a function") indicates a programming error, not a transient provider
709
+ // blip. Before the fix it was always classified isTransient: true, causing
710
+ // auto-mode to retry indefinitely instead of surfacing the real problem.
711
+ _resetPendingResolve();
712
+
713
+ const baseCtx = {
714
+ ...makeMockCtx(),
715
+ ui: { notify: () => {}, setStatus: () => {}, setWorkingMessage: () => {} },
716
+ sessionManager: { getEntries: () => [] },
717
+ modelRegistry: { getProviderAuthMode: () => undefined, isProviderRequestReady: () => true },
718
+ } as any;
719
+ const pi = makeMockPi();
720
+ const s = makeMockSession({
721
+ newSessionThrowsError: new TypeError("pi.sendMessage is not a function"),
722
+ });
723
+
724
+ const result = await runUnit(baseCtx, pi, s, "task", "T01", "prompt");
725
+
726
+ assert.equal(result.status, "cancelled");
727
+ assert.equal(result.errorContext?.category, "session-failed");
728
+ assert.equal(result.errorContext?.isTransient, false, "TypeError must be non-transient");
729
+ });
730
+
731
+ test("runUnit: 'is not a function' message from newSession is classified as structural", async () => {
732
+ // Regression for #572: the pattern also catches errors where the thrown
733
+ // object is not a TypeError instance but the message contains "is not a function".
734
+ _resetPendingResolve();
735
+
736
+ const baseCtx = {
737
+ ...makeMockCtx(),
738
+ ui: { notify: () => {}, setStatus: () => {}, setWorkingMessage: () => {} },
739
+ sessionManager: { getEntries: () => [] },
740
+ modelRegistry: { getProviderAuthMode: () => undefined, isProviderRequestReady: () => true },
741
+ } as any;
742
+ const pi = makeMockPi();
743
+ const s = makeMockSession({ newSessionThrows: "pi.sendMessage is not a function" });
744
+
745
+ const result = await runUnit(baseCtx, pi, s, "task", "T01", "prompt");
746
+
747
+ assert.equal(result.status, "cancelled");
748
+ assert.equal(result.errorContext?.category, "session-failed");
749
+ assert.equal(result.errorContext?.isTransient, false, "'is not a function' errors must be non-transient");
750
+ });
751
+
752
+ test("runUnit: generic network error from newSession remains transient", async () => {
753
+ // Confirm that non-structural session errors (e.g. 429, ECONNREFUSED) are
754
+ // still classified as transient so auto-mode can retry them.
755
+ _resetPendingResolve();
756
+
757
+ const baseCtx = {
758
+ ...makeMockCtx(),
759
+ ui: { notify: () => {}, setStatus: () => {}, setWorkingMessage: () => {} },
760
+ sessionManager: { getEntries: () => [] },
761
+ modelRegistry: { getProviderAuthMode: () => undefined, isProviderRequestReady: () => true },
762
+ } as any;
763
+ const pi = makeMockPi();
764
+ const s = makeMockSession({ newSessionThrows: "connection refused" });
765
+
766
+ const result = await runUnit(baseCtx, pi, s, "task", "T01", "prompt");
767
+
768
+ assert.equal(result.status, "cancelled");
769
+ assert.equal(result.errorContext?.category, "session-failed");
770
+ assert.equal(result.errorContext?.isTransient, true, "network errors must remain transient");
771
+ });
772
+
500
773
  test("runUnit clears queued switch cancellation when session creation fails", async () => {
501
774
  _resetPendingResolve();
502
775
 
@@ -1164,6 +1437,34 @@ test("autoLoop exits when s.active is set to false", async (t) => {
1164
1437
  );
1165
1438
  });
1166
1439
 
1440
+ test("autoLoop pauses visibly when Auto Orchestration Module is not wired", async () => {
1441
+ _resetPendingResolve();
1442
+
1443
+ const ctx = makeMockCtx();
1444
+ ctx.ui.setStatus = () => {};
1445
+ const pi = makeMockPi();
1446
+ const s = makeLoopSession();
1447
+ let pauseContext: unknown;
1448
+
1449
+ const deps = makeMockDeps({
1450
+ pauseAuto: async (_ctx, _pi, errorContext) => {
1451
+ pauseContext = errorContext;
1452
+ deps.callLog.push("pauseAuto");
1453
+ },
1454
+ });
1455
+
1456
+ await rawAutoLoop(ctx, pi, s, deps);
1457
+
1458
+ assert.ok(deps.callLog.includes("pauseAuto"), "missing orchestration should pause auto-mode");
1459
+ assert.equal(
1460
+ (pauseContext as { message?: string } | undefined)?.message,
1461
+ ORCHESTRATION_MISSING_REASON,
1462
+ );
1463
+ assert.equal(deps.callLog.includes("deriveState"), false);
1464
+ assert.equal(deps.callLog.includes("resolveDispatch"), false);
1465
+ assert.equal(s.pendingOrchestrationDispatch, null);
1466
+ });
1467
+
1167
1468
  test("autoLoop exits on terminal complete state", async (t) => {
1168
1469
  _resetPendingResolve();
1169
1470
 
@@ -1990,11 +2291,15 @@ test("autoLoop retries next iteration when orchestration reports paused", async
1990
2291
  },
1991
2292
  });
1992
2293
 
2294
+ const journalEvents: Array<{ eventType: string; data?: any }> = [];
1993
2295
  const deps = makeMockDeps({
1994
2296
  resolveDispatch: async () => {
1995
2297
  deps.callLog.push("resolveDispatch");
1996
2298
  throw new Error("legacy resolveDispatch must not run after orchestration paused");
1997
2299
  },
2300
+ emitJournalEvent: (entry: any) => {
2301
+ journalEvents.push(entry);
2302
+ },
1998
2303
  });
1999
2304
 
2000
2305
  await autoLoop(ctx, pi, s, deps);
@@ -2007,6 +2312,11 @@ test("autoLoop retries next iteration when orchestration reports paused", async
2007
2312
  "orchestration paused must not fall back to legacy dispatch",
2008
2313
  );
2009
2314
  assert.equal(s.pendingOrchestrationDispatch, null, "no orchestration dispatch should remain pending");
2315
+
2316
+ const pausedIterationEnd = journalEvents.find(
2317
+ (e) => e.eventType === "iteration-end" && e.data?.status === "paused",
2318
+ );
2319
+ assert.ok(pausedIterationEnd, "orchestration paused must emit iteration-end to close the iteration journal");
2010
2320
  });
2011
2321
 
2012
2322
  test("autoLoop consumes pending orchestration dispatch without advancing twice", async () => {
@@ -2094,8 +2404,13 @@ test("autoLoop stops orchestrator complete state through completion surface", as
2094
2404
  start: async () => ({ kind: "stopped" as const, reason: "unused" }),
2095
2405
  advance: async () => ({
2096
2406
  kind: "stopped" as const,
2097
- reason: "all milestones complete",
2407
+ reason: "legacy text not used",
2098
2408
  stateSnapshot,
2409
+ terminalOutcome: {
2410
+ code: "all-complete" as const,
2411
+ displayReason: "All milestones complete",
2412
+ allMilestonesComplete: true as const,
2413
+ },
2099
2414
  }),
2100
2415
  completeActiveUnit: async () => {},
2101
2416
  retryActiveUnit: async () => {},
@@ -2121,6 +2436,7 @@ test("autoLoop stops orchestrator complete state through completion surface", as
2121
2436
  milestoneTitle: "Priority Levels",
2122
2437
  allMilestonesComplete: true,
2123
2438
  });
2439
+ assert.equal((stopCalls[0]?.options as any)?.terminalOutcome?.code, "all-complete");
2124
2440
  assert.equal(
2125
2441
  deps.callLog.includes("resolveDispatch"),
2126
2442
  false,
@@ -2960,7 +3276,7 @@ test("autoLoop closes journal iteration on pre-dispatch health-gate break", asyn
2960
3276
  assert.equal(deps.callLog.includes("pauseAuto"), true);
2961
3277
  assert.deepEqual(pauseOptions, { expectedCurrentUnit: null });
2962
3278
  assert.ok(
2963
- journalEvents.some((event) => event.eventType === "iteration-end" && event.data?.reason === "pre-dispatch-break"),
3279
+ journalEvents.some((event) => event.eventType === "iteration-end" && event.data?.reason === "health-gate-failed"),
2964
3280
  "pre-dispatch break must close the started iteration",
2965
3281
  );
2966
3282
  });
@@ -5201,6 +5517,129 @@ test("dispatch Worktree Safety wins before stuck detection for execute-task with
5201
5517
  );
5202
5518
  });
5203
5519
 
5520
+ test("dispatch Worktree Safety honors degraded branch fallback instead of demanding the canonical worktree root", async (t) => {
5521
+ _resetPendingResolve();
5522
+
5523
+ const ctx = makeMockCtx();
5524
+ const pi = makeMockPi();
5525
+ const notifications: string[] = [];
5526
+ ctx.ui.notify = (msg: string) => { notifications.push(msg); };
5527
+
5528
+ // Worktree creation failed and the lifecycle fell back to the milestone
5529
+ // branch in the project root. The safety gate must validate against that
5530
+ // effective branch mode, not the configured worktree mode.
5531
+ const projectRoot = mkdtempSync(join(tmpdir(), "gsd-wt-safety-degraded-"));
5532
+ t.after(() => rmSync(projectRoot, { recursive: true, force: true }));
5533
+
5534
+ const s = makeLoopSession({
5535
+ basePath: projectRoot,
5536
+ originalBasePath: projectRoot,
5537
+ canonicalProjectRoot: projectRoot,
5538
+ isolationDegraded: true,
5539
+ });
5540
+ const deps = makeMockDeps({
5541
+ getIsolationMode: () => "worktree",
5542
+ });
5543
+ const result = await runDispatch(
5544
+ {
5545
+ ctx,
5546
+ pi,
5547
+ s,
5548
+ deps,
5549
+ prefs: undefined,
5550
+ iteration: 1,
5551
+ flowId: "test-flow",
5552
+ nextSeq: () => 1,
5553
+ },
5554
+ {
5555
+ state: {
5556
+ phase: "executing",
5557
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
5558
+ activeSlice: { id: "S01", title: "Slice 1" },
5559
+ activeTask: { id: "T01" },
5560
+ registry: [{ id: "M001", status: "active" }],
5561
+ blockers: [],
5562
+ } as any,
5563
+ mid: "M001",
5564
+ midTitle: "Test",
5565
+ },
5566
+ {
5567
+ recentUnits: [],
5568
+ stuckRecoveryAttempts: 0,
5569
+ consecutiveFinalizeTimeouts: 0,
5570
+ },
5571
+ );
5572
+
5573
+ assert.equal(result.action, "next", "dispatch must proceed under degraded branch isolation");
5574
+ assert.ok(
5575
+ !notifications.some((n) => n.includes("Worktree Safety failed")),
5576
+ "degraded branch fallback must not trip a false invalid-root",
5577
+ );
5578
+ assert.ok(!deps.callLog.includes("stopAuto"), "auto-mode must not stop on the degraded fallback");
5579
+ });
5580
+
5581
+ test("dispatch Worktree Safety honors stranded branch recovery instead of demanding the canonical worktree root", async (t) => {
5582
+ _resetPendingResolve();
5583
+
5584
+ const ctx = makeMockCtx();
5585
+ const pi = makeMockPi();
5586
+ const notifications: string[] = [];
5587
+ ctx.ui.notify = (msg: string) => { notifications.push(msg); };
5588
+
5589
+ // Bootstrap adopted stranded work by checking out the milestone branch in
5590
+ // the project root (strandedRecoveryIsolationMode = "branch"). Isolation is
5591
+ // NOT degraded — the adoption is intentional. The safety gate must validate
5592
+ // against the effective branch mode, not the configured worktree mode.
5593
+ const projectRoot = mkdtempSync(join(tmpdir(), "gsd-wt-safety-stranded-"));
5594
+ t.after(() => rmSync(projectRoot, { recursive: true, force: true }));
5595
+
5596
+ const s = makeLoopSession({
5597
+ basePath: projectRoot,
5598
+ originalBasePath: projectRoot,
5599
+ canonicalProjectRoot: projectRoot,
5600
+ strandedRecoveryIsolationMode: "branch",
5601
+ });
5602
+ const deps = makeMockDeps({
5603
+ getIsolationMode: () => "worktree",
5604
+ });
5605
+ const result = await runDispatch(
5606
+ {
5607
+ ctx,
5608
+ pi,
5609
+ s,
5610
+ deps,
5611
+ prefs: undefined,
5612
+ iteration: 1,
5613
+ flowId: "test-flow",
5614
+ nextSeq: () => 1,
5615
+ },
5616
+ {
5617
+ state: {
5618
+ phase: "executing",
5619
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
5620
+ activeSlice: { id: "S01", title: "Slice 1" },
5621
+ activeTask: { id: "T01" },
5622
+ registry: [{ id: "M001", status: "active" }],
5623
+ blockers: [],
5624
+ } as any,
5625
+ mid: "M001",
5626
+ midTitle: "Test",
5627
+ },
5628
+ {
5629
+ recentUnits: [],
5630
+ stuckRecoveryAttempts: 0,
5631
+ consecutiveFinalizeTimeouts: 0,
5632
+ },
5633
+ );
5634
+
5635
+ assert.equal(result.action, "next", "dispatch must proceed under stranded branch recovery");
5636
+ assert.ok(
5637
+ !notifications.some((n) => n.includes("Worktree Safety failed")),
5638
+ "stranded branch recovery must not trip a false invalid-root",
5639
+ );
5640
+ assert.ok(!deps.callLog.includes("stopAuto"), "auto-mode must not stop on stranded branch recovery");
5641
+ });
5642
+
5204
5643
  test("runDispatch runs stuck detection while artifact verification retry is pending (#5719)", async (t) => {
5205
5644
  _resetPendingResolve();
5206
5645