@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
@@ -27,13 +27,43 @@ export interface AutoStatus {
27
27
  transitionCount: number;
28
28
  }
29
29
 
30
+ export type AutoTerminalOutcome =
31
+ | {
32
+ code: "all-complete";
33
+ displayReason: string;
34
+ allMilestonesComplete: true;
35
+ }
36
+ | {
37
+ code: "no-remaining-units";
38
+ displayReason: string;
39
+ allMilestonesComplete: false;
40
+ }
41
+ | {
42
+ code: "settlement-blocked";
43
+ displayReason: string;
44
+ nextAction: string;
45
+ milestoneId: string;
46
+ allMilestonesComplete: false;
47
+ };
48
+
30
49
  export type AutoAdvanceResult =
31
50
  | { kind: "started" }
32
51
  | { kind: "resumed" }
33
52
  | { kind: "advanced"; unit: UnitRef; stateSnapshot: GSDState }
34
53
  | { kind: "skipped"; reason: string; stateSnapshot?: GSDState }
35
- | { kind: "blocked"; reason: string; action: "pause" | "stop"; stateSnapshot?: GSDState }
36
- | { kind: "stopped"; reason: string; stateSnapshot?: GSDState }
54
+ | {
55
+ kind: "blocked";
56
+ reason: string;
57
+ action: "pause" | "stop";
58
+ stateSnapshot?: GSDState;
59
+ terminalOutcome?: AutoTerminalOutcome;
60
+ }
61
+ | {
62
+ kind: "stopped";
63
+ reason: string;
64
+ stateSnapshot?: GSDState;
65
+ terminalOutcome?: AutoTerminalOutcome;
66
+ }
37
67
  | { kind: "paused"; reason: string }
38
68
  | { kind: "error"; reason: string };
39
69
 
@@ -7,6 +7,7 @@
7
7
  import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
8
8
 
9
9
  import type { AutoSession } from "./session.js";
10
+ import type { AutoTerminalOutcome } from "./contracts.js";
10
11
  import type { ErrorContext } from "./types.js";
11
12
  import type { GSDPreferences } from "../preferences.js";
12
13
  import type { GSDState } from "../types.js";
@@ -33,6 +34,7 @@ export interface StopAutoOptions {
33
34
  milestoneTitle?: string | null;
34
35
  allMilestonesComplete?: boolean;
35
36
  };
37
+ terminalOutcome?: AutoTerminalOutcome;
36
38
  /**
37
39
  * Foreground closeout-boundary stops already have the useful final surface in
38
40
  * the transcript. Preserve it instead of installing a replacement widget.
@@ -141,7 +143,7 @@ export interface LoopDeps {
141
143
  basePath: string,
142
144
  mid: string,
143
145
  ) => void;
144
- getIsolationMode: (basePath?: string) => string;
146
+ getIsolationMode: (basePath?: string) => "none" | "worktree" | "branch";
145
147
  getCurrentBranch: (basePath: string) => string;
146
148
  autoWorktreeBranch: (milestoneId: string) => string;
147
149
  resolveMilestoneFile: (
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * auto/loop.ts — Main auto-mode execution loop.
5
5
  *
6
- * Iterates: derivedispatch → guards → runUnit → finalize → repeat.
6
+ * Iterates: orchestration.advance → guards → runUnit → finalize → repeat.
7
7
  * Exits when s.active becomes false or a terminal condition is reached.
8
8
  *
9
9
  * Imports from: auto/types, auto/resolve, auto/phases
@@ -15,6 +15,7 @@ import { randomUUID } from "node:crypto";
15
15
  import { mkdirSync, writeFileSync } from "node:fs";
16
16
  import { join } from "node:path";
17
17
  import type { AutoSession } from "./session.js";
18
+ import type { AutoTerminalOutcome } from "./contracts.js";
18
19
  import type { LoopDeps, StopAutoOptions } from "./loop-deps.js";
19
20
  import type { GSDState } from "../types.js";
20
21
  import {
@@ -24,13 +25,7 @@ import {
24
25
  type IterationData,
25
26
  } from "./types.js";
26
27
  import { _clearCurrentResolve } from "./resolve.js";
27
- import {
28
- runPreDispatch,
29
- runDispatch,
30
- runGuards,
31
- runFinalize,
32
- STUCK_WINDOW_SIZE,
33
- } from "./phases.js";
28
+ import { runGuards, runFinalize, STUCK_WINDOW_SIZE } from "./phases.js";
34
29
  import { debugLog } from "../debug-logger.js";
35
30
  import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterMs, COOLDOWN_FALLBACK_WAIT_MS, MAX_COOLDOWN_RETRIES } from "./infra-errors.js";
36
31
  import { ModelPolicyDispatchBlockedError } from "../auto-model-selection.js";
@@ -146,6 +141,25 @@ function resolveCompletionStopFromState(
146
141
  };
147
142
  }
148
143
 
144
+ function resolveCompletionStopFromOutcome(
145
+ outcome: AutoTerminalOutcome | undefined,
146
+ stateSnapshot: GSDState | undefined,
147
+ ): { reason: string; options: StopAutoOptions } | null {
148
+ if (outcome?.code !== "all-complete") return null;
149
+ const completedMilestone = stateSnapshot?.lastCompletedMilestone ?? stateSnapshot?.activeMilestone;
150
+ return {
151
+ reason: outcome.displayReason,
152
+ options: {
153
+ completionWidget: {
154
+ milestoneId: completedMilestone?.id ?? null,
155
+ milestoneTitle: completedMilestone?.title ?? null,
156
+ allMilestonesComplete: true,
157
+ },
158
+ terminalOutcome: outcome,
159
+ },
160
+ };
161
+ }
162
+
149
163
  // ── Stuck detection persistence (#3704) ──────────────────────────────────
150
164
  // Phase C migration: stuck-state.json deleted in favor of DB-backed
151
165
  // equivalents. recentUnits is rebuilt from unit_dispatches (Phase B
@@ -158,6 +172,8 @@ function resolveCompletionStopFromState(
158
172
  // tolerates — same behavior as a fresh session.
159
173
  const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
160
174
  const MAX_CONSECUTIVE_ALREADY_ACTIVE_SKIPS = 3;
175
+ const ORCHESTRATION_MISSING_REASON =
176
+ "Auto Orchestration Module is not wired; cannot dispatch built-in GSD Unit.";
161
177
 
162
178
  function stableStuckStateScopeId(s: AutoSession): string {
163
179
  return normalizeRealPath(s.scope?.workspace.projectRoot ?? (s.originalBasePath || s.basePath));
@@ -353,9 +369,9 @@ function closeOutCrashedUnit(s: AutoSession, iterData: IterationData, err: unkno
353
369
  }
354
370
 
355
371
  /**
356
- * Main auto-mode execution loop. Iterates: derivedispatch → guards →
357
- * runUnit → finalize → repeat. Exits when s.active becomes false or a
358
- * terminal condition is reached.
372
+ * Main auto-mode execution loop. Iterates: orchestration.advance → guards →
373
+ * runUnit → finalize → repeat. Exits when s.active becomes false or a terminal
374
+ * condition is reached.
359
375
  *
360
376
  * This is the linear replacement for the recursive
361
377
  * dispatchNextUnit → resolveAgentEnd → dispatchNextUnit chain.
@@ -572,10 +588,9 @@ export async function autoLoop(
572
588
  let iterData: IterationData;
573
589
 
574
590
  // ── Custom engine path ──────────────────────────────────────────────
575
- // When activeEngineId is a non-dev value, bypass runPreDispatch and
576
- // runDispatch entirely the custom engine drives its own state via
577
- // GRAPH.yaml. Shares runGuards and runUnitPhase with the dev path.
578
- // After unit execution, verifies then reconciles via the engine layer.
591
+ // When activeEngineId is a non-dev value, the custom engine drives its own
592
+ // state via GRAPH.yaml. It shares guards and Unit execution with the dev
593
+ // path, then verifies and reconciles via the engine layer.
579
594
  //
580
595
  // GSD_ENGINE_BYPASS=1 skips the engine layer entirely — falls through
581
596
  // to the dev path below.
@@ -656,7 +671,7 @@ export async function autoLoop(
656
671
  observedUnitType = iterData.unitType;
657
672
  observedUnitId = iterData.unitId;
658
673
 
659
- // ── Progress widget (mirrors dev path in runDispatch) ──
674
+ // ── Progress widget (mirrors the dev path) ──
660
675
  deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state);
661
676
 
662
677
  // ── Guards (shared with dev path) ──
@@ -876,14 +891,22 @@ export async function autoLoop(
876
891
 
877
892
  if (orchestrationResult.kind === "blocked") {
878
893
  s.pendingOrchestrationDispatch = null;
894
+ const blockMessage = orchestrationResult.terminalOutcome?.code === "settlement-blocked"
895
+ ? [
896
+ orchestrationResult.terminalOutcome.displayReason,
897
+ `Next: ${orchestrationResult.terminalOutcome.nextAction}`,
898
+ ].join("\n")
899
+ : orchestrationResult.reason;
879
900
  if (orchestrationResult.action === "pause") {
880
901
  await deps.pauseAuto(ctx, pi, {
881
- message: orchestrationResult.reason,
902
+ message: blockMessage,
882
903
  category: "unknown",
904
+ }, {
905
+ expectedCurrentUnit: null,
883
906
  });
884
907
  finishTurn("paused", "manual-attention", "orchestration-blocked");
885
908
  } else {
886
- await deps.stopAuto(ctx, pi, orchestrationResult.reason);
909
+ await deps.stopAuto(ctx, pi, blockMessage);
887
910
  finishTurn("stopped", "manual-attention", "orchestration-blocked");
888
911
  }
889
912
  finishIncompleteIteration({
@@ -894,8 +917,20 @@ export async function autoLoop(
894
917
  break;
895
918
  }
896
919
 
920
+ if (orchestrationResult.kind === "skipped") {
921
+ s.pendingOrchestrationDispatch = null;
922
+ emitIterationEnd({ skipped: true });
923
+ completeIteration();
924
+ finishTurn("skipped");
925
+ continue;
926
+ }
927
+
897
928
  if (orchestrationResult.kind === "paused") {
898
929
  s.pendingOrchestrationDispatch = null;
930
+ finishIncompleteIteration({
931
+ status: "paused",
932
+ reason: orchestrationResult.reason,
933
+ });
899
934
  finishTurn("skipped");
900
935
  continue;
901
936
  }
@@ -917,7 +952,11 @@ export async function autoLoop(
917
952
 
918
953
  if (orchestrationResult.kind === "stopped") {
919
954
  s.pendingOrchestrationDispatch = null;
920
- const completionStop = resolveCompletionStopFromState(orchestrationResult.stateSnapshot);
955
+ let completionStop = resolveCompletionStopFromOutcome(
956
+ orchestrationResult.terminalOutcome,
957
+ orchestrationResult.stateSnapshot,
958
+ );
959
+ completionStop ??= resolveCompletionStopFromState(orchestrationResult.stateSnapshot);
921
960
  if (completionStop) {
922
961
  await deps.stopAuto(ctx, pi, completionStop.reason, completionStop.options);
923
962
  } else {
@@ -998,54 +1037,37 @@ export async function autoLoop(
998
1037
  });
999
1038
  observedUnitType = iterData.unitType;
1000
1039
  observedUnitId = iterData.unitId;
1001
- } else {
1002
- const preDispatchResult = await runPreDispatch(ic, loopState);
1003
- phaseReporter.report("pre-dispatch", preDispatchResult.action);
1004
- if (preDispatchResult.action === "break") {
1005
- finishTurn("stopped", "manual-attention", "pre-dispatch-break");
1040
+
1041
+ const guardMilestoneId = iterData.mid ?? s.currentMilestoneId ?? "workflow";
1042
+ const guardsResult = await runGuards(ic, guardMilestoneId);
1043
+ phaseReporter.report("guard", guardsResult.action, {
1044
+ unitType: iterData.unitType,
1045
+ unitId: iterData.unitId,
1046
+ });
1047
+ if (guardsResult.action === "break") {
1048
+ finishTurn("stopped", "manual-attention", "guard-break");
1006
1049
  finishIncompleteIteration({
1007
1050
  status: "stopped",
1008
- reason: "pre-dispatch-break",
1051
+ reason: "guard-break",
1052
+ unitType: iterData.unitType,
1053
+ unitId: iterData.unitId,
1009
1054
  failureClass: "manual-attention",
1010
1055
  });
1011
1056
  break;
1012
1057
  }
1013
- if (preDispatchResult.action === "continue") {
1014
- emitIterationEnd({ skipped: true });
1015
- completeIteration();
1016
- finishTurn("skipped");
1017
- continue;
1018
- }
1019
- if (preDispatchResult.action === "retry") {
1020
- finishTurn("retry", "execution", preDispatchResult.reason);
1021
- continue;
1022
- }
1023
- const preData = preDispatchResult.data;
1024
- const guardsResult = await runGuards(ic, preData.mid);
1025
- phaseReporter.report("guard", guardsResult.action);
1026
- if (guardsResult.action === "break") {
1027
- finishTurn("stopped", "manual-attention", "guard-break");
1028
- break;
1029
- }
1030
- const dispatchResult = await runDispatch(ic, preData, loopState);
1031
- phaseReporter.report("dispatch", dispatchResult.action);
1032
- if (dispatchResult.action === "break") {
1033
- finishTurn("stopped", "manual-attention", "dispatch-break");
1034
- break;
1035
- }
1036
- if (dispatchResult.action === "continue") {
1037
- emitIterationEnd({ skipped: true });
1038
- completeIteration();
1039
- finishTurn("skipped");
1040
- continue;
1041
- }
1042
- if (dispatchResult.action === "retry") {
1043
- finishTurn("retry", "execution", dispatchResult.reason);
1044
- continue;
1045
- }
1046
- iterData = dispatchResult.data;
1047
- observedUnitType = iterData.unitType;
1048
- observedUnitId = iterData.unitId;
1058
+ } else {
1059
+ s.pendingOrchestrationDispatch = null;
1060
+ await deps.pauseAuto(ctx, pi, {
1061
+ message: ORCHESTRATION_MISSING_REASON,
1062
+ category: "unknown",
1063
+ });
1064
+ finishTurn("paused", "manual-attention", "orchestration-missing");
1065
+ finishIncompleteIteration({
1066
+ status: "paused",
1067
+ reason: ORCHESTRATION_MISSING_REASON,
1068
+ failureClass: "manual-attention",
1069
+ });
1070
+ break;
1049
1071
  }
1050
1072
  } else {
1051
1073
  iterData = await buildSidecarIterationData({
@@ -12,13 +12,16 @@
12
12
 
13
13
  import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
14
14
 
15
- import type { AutoAdvanceResult, AutoOrchestrationModule, AutoSessionContext, AutoStatus } from "./contracts.js";
15
+ import type { AutoAdvanceResult, AutoOrchestrationModule, AutoSessionContext, AutoStatus, AutoTerminalOutcome } from "./contracts.js";
16
16
  import type { AutoSession, PendingOrchestrationDispatch } from "./session.js";
17
- import type { GSDState } from "../types.js";
17
+ import type { GSDState, Phase } from "../types.js";
18
18
  import type { MinimalModelRegistry } from "../context-budget.js";
19
19
 
20
- import { debugCount, debugTime } from "../debug-logger.js";
20
+ type BlockedAdvanceResult = Extract<AutoAdvanceResult, { kind: "blocked" }>;
21
+
22
+ import { debugCount, debugLog, debugTime } from "../debug-logger.js";
21
23
  import { reconcileBeforeDispatch } from "../state-reconciliation.js";
24
+ import { isLegalEdge, IllegalPhaseTransitionError } from "../state-transition-matrix.js";
22
25
  import { resolveDispatch } from "../auto-dispatch.js";
23
26
  import { classifyFailure } from "../recovery-classification.js";
24
27
  import { verifyExpectedArtifact, refreshRecoveryDbForArtifact } from "../auto-recovery.js";
@@ -35,14 +38,21 @@ import { checkResourcesStale, autoWorktreeBranch, mergeMilestoneToMain } from ".
35
38
  import { getSessionLockStatus } from "../session-lock.js";
36
39
  import { resolveUokFlags } from "../uok/flags.js";
37
40
  import { emitJournalEvent as _emitJournalEvent } from "../journal.js";
38
- import { loadEffectiveGSDPreferences, getIsolationMode } from "../preferences.js";
39
- import { detectWorktreeName, resolveProjectRoot } from "../worktree.js";
41
+ import { loadEffectiveGSDPreferences, getIsolationMode, resolveEffectiveUnitIsolationMode } from "../preferences.js";
42
+ import {
43
+ detectWorktreeName,
44
+ getMainBranch,
45
+ resolveProjectRoot,
46
+ resolveWorktreeProjectRoot,
47
+ } from "../worktree.js";
48
+ import { getPriorSliceCompletionBlocker } from "../dispatch-guard.js";
40
49
  import { GitServiceImpl } from "../git-service.js";
41
50
  import { WorktreeStateProjection } from "../worktree-state-projection.js";
42
51
  import { WorktreeLifecycle } from "../worktree-lifecycle.js";
52
+ import { createMilestoneMergeTransaction } from "../milestone-merge-transaction.js";
43
53
  import { createWorkspace, scopeMilestone } from "../workspace.js";
44
54
  import { supportsStructuredQuestions } from "../workflow-mcp.js";
45
- import { getToolBaselineSnapshot } from "../auto-model-selection.js";
55
+ import { getRegisteredToolSnapshot, getToolBaselineSnapshot } from "../auto-model-selection.js";
46
56
  import { deriveState } from "../state.js";
47
57
  import { parseUnitId } from "../unit-id.js";
48
58
  import { isClosedStatus } from "../status-guards.js";
@@ -50,12 +60,13 @@ import {
50
60
  isDbAvailable,
51
61
  getSlice,
52
62
  getTask,
53
- refreshOpenDatabaseFromDisk,
54
63
  } from "../gsd-db.js";
64
+ import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
55
65
  import { getErrorMessage } from "../error-utils.js";
56
66
  import { logWarning } from "../workflow-logger.js";
57
67
  import { existsSync, readFileSync } from "node:fs";
58
68
  import { join } from "node:path";
69
+ import { evaluateAllCompleteSettlement } from "../milestone-settlement.js";
59
70
 
60
71
  function now(): number {
61
72
  return Date.now();
@@ -71,11 +82,19 @@ function now(): number {
71
82
  */
72
83
  export const STUCK_WINDOW_SIZE = 6;
73
84
 
74
- function noRemainingUnitsReason(stateSnapshot: GSDState): string {
85
+ function noRemainingUnitsOutcome(stateSnapshot: GSDState): AutoTerminalOutcome {
75
86
  if (stateSnapshot.phase === "complete") {
76
- return "all milestones complete";
87
+ return {
88
+ code: "all-complete",
89
+ displayReason: "All milestones complete",
90
+ allMilestonesComplete: true,
91
+ };
77
92
  }
78
- return "no remaining units";
93
+ return {
94
+ code: "no-remaining-units",
95
+ displayReason: "No remaining units",
96
+ allMilestonesComplete: false,
97
+ };
79
98
  }
80
99
 
81
100
  /**
@@ -118,7 +137,7 @@ export interface DispatchDecisionInput {
118
137
 
119
138
  function getAlreadyClosedDispatchReason(unitType: string, unitId: string): string | null {
120
139
  if (!isDbAvailable()) return null;
121
- refreshOpenDatabaseFromDisk();
140
+ refreshWorkflowDatabaseFromDisk();
122
141
  const { milestone, slice, task } = parseUnitId(unitId);
123
142
  if (unitType === "execute-task" && milestone && slice && task) {
124
143
  const row = getTask(milestone, slice, task);
@@ -201,6 +220,7 @@ export async function decideOrchestratorDispatch(
201
220
  // active set may be narrowed by the prior unit before selectAndApplyModel
202
221
  // restores it, causing false transport-preflight failures (#477 follow-up).
203
222
  const activeTools = getToolBaselineSnapshot(pi);
223
+ const registeredTools = getRegisteredToolSnapshot(pi);
204
224
  // Mirrors runDispatch: deep-planning keeps approval gates in plain chat
205
225
  // because structured questions can be cancelled outside the chat turn on
206
226
  // some transports.
@@ -248,6 +268,7 @@ export async function decideOrchestratorDispatch(
248
268
  sessionProvider,
249
269
  modelRegistry,
250
270
  activeTools,
271
+ registeredTools,
251
272
  sessionAuthMode: authMode,
252
273
  sessionBaseUrl: ctx.model?.baseUrl,
253
274
  });
@@ -310,6 +331,10 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
310
331
  private lastAdvanceKey: string | null = null;
311
332
  private lastFinalizedUnitKey: string | null = null;
312
333
  private dispatchKeyWindow: string[] = [];
334
+ // ADR-030 Phase Transition Invariant: the prior advance's reconciled Phase,
335
+ // the "from" endpoint of the edge check. In-memory; reset on start/resume/stop
336
+ // so the first advance of a session has no edge to assert.
337
+ private lastDerivedPhase: Phase | null = null;
313
338
  // #442: the unit key we last attempted graduated stuck-recovery for. Bounds
314
339
  // recovery to one attempt per stuck episode per run (reset on start/resume/
315
340
  // stop), mirroring the legacy Level-1-then-Level-2 escalation in phases.ts.
@@ -532,6 +557,55 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
532
557
  return decideOrchestratorDispatch(this.ctx, this.pi, this.dispatchBasePath, this.s, input);
533
558
  }
534
559
 
560
+ private evaluateNoRemainingUnitsSettlement(stateSnapshot: GSDState): BlockedAdvanceResult | null {
561
+ const settlement = evaluateAllCompleteSettlement({
562
+ milestoneId: this.s.currentMilestoneId ?? stateSnapshot.activeMilestone?.id,
563
+ statePhase: stateSnapshot.phase,
564
+ basePath: this.s.basePath || this.getLiveDispatchBasePath(),
565
+ originalBasePath: this.s.originalBasePath || this.runtimeBasePath,
566
+ milestoneMerged: this.s.milestoneMergedInPhases,
567
+ });
568
+ this.s.milestoneSettlement = settlement;
569
+ if (settlement.ok) return null;
570
+ return {
571
+ kind: "blocked",
572
+ reason: settlement.message,
573
+ action: settlement.action,
574
+ stateSnapshot,
575
+ terminalOutcome: {
576
+ code: "settlement-blocked",
577
+ displayReason: settlement.message,
578
+ nextAction: settlement.nextAction,
579
+ milestoneId: settlement.milestoneId,
580
+ allMilestonesComplete: false,
581
+ },
582
+ };
583
+ }
584
+
585
+ private clearPendingDispatch(): void {
586
+ this.s.pendingOrchestrationDispatch = null;
587
+ }
588
+
589
+ private findPriorSliceCompletionBlocker(unitType: string, unitId: string): string | null {
590
+ const guardBasePath = resolveWorktreeProjectRoot(
591
+ this.getLiveDispatchBasePath(),
592
+ this.s.originalBasePath,
593
+ );
594
+ let mainBranch = "main";
595
+ try {
596
+ mainBranch = getMainBranch(guardBasePath);
597
+ } catch (err) {
598
+ // Preserve legacy dispatch behavior: fall back to main when branch
599
+ // discovery fails, then let the guard make the progression decision.
600
+ logWarning(
601
+ "engine",
602
+ `branch discovery failed, falling back to main: ${getErrorMessage(err)}`,
603
+ { file: "orchestrator.ts" },
604
+ );
605
+ }
606
+ return getPriorSliceCompletionBlocker(guardBasePath, mainBranch, unitType, unitId);
607
+ }
608
+
535
609
  // ── ToolContractAdapter (folded) ─────────────────────────────────────────
536
610
 
537
611
  private compileUnitToolContract(unitType: string): { ok: true; reason: string } | { ok: false; reason: string } {
@@ -543,8 +617,11 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
543
617
  // ── WorktreeAdapter (folded) ─────────────────────────────────────────────
544
618
 
545
619
  private getEffectiveUnitIsolationMode(basePath: string): ReturnType<typeof getIsolationMode> {
546
- const configuredMode = getIsolationMode(basePath);
547
- return configuredMode === "worktree" && this.s.isolationDegraded ? "branch" : configuredMode;
620
+ return resolveEffectiveUnitIsolationMode(
621
+ getIsolationMode(basePath),
622
+ this.s.isolationDegraded,
623
+ this.s.strandedRecoveryIsolationMode,
624
+ );
548
625
  }
549
626
 
550
627
  private buildLifecycle(): WorktreeLifecycle {
@@ -554,7 +631,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
554
631
  return new GitServiceImpl(basePath, gitConfig);
555
632
  },
556
633
  worktreeProjection: new WorktreeStateProjection(),
557
- mergeMilestoneToMain,
634
+ mergeMilestoneToMain: createMilestoneMergeTransaction(mergeMilestoneToMain),
558
635
  });
559
636
  }
560
637
 
@@ -655,6 +732,21 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
655
732
  return { action: recovery.action, reason: recovery.reason };
656
733
  }
657
734
 
735
+ /**
736
+ * ADR-030 Phase Transition Invariant (advisory mode). The matrix is an
737
+ * assertion, not a decision-maker — deriveState already chose the phase; we
738
+ * only observe illegal *derived* edges that survived reconciliation. The
739
+ * matrix is still a sparse hardening spec, so this is telemetry-only (no
740
+ * block) until it is expanded into a validated legal-edge graph. To enforce:
741
+ * `throw violation;` instead of logging — recovery-classification maps
742
+ * IllegalPhaseTransitionError to kind "illegal-transition" (escalate).
743
+ */
744
+ private observePhaseTransition(from: Phase, to: Phase): void {
745
+ if (isLegalEdge(from, to)) return;
746
+ const violation = new IllegalPhaseTransitionError(from, to);
747
+ debugLog("phase-transition-advisory", { from, to, message: violation.message });
748
+ }
749
+
658
750
  // ── Lifecycle verbs ──────────────────────────────────────────────────────
659
751
 
660
752
  /**
@@ -718,6 +810,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
718
810
  this.lastFinalizedUnitKey = null;
719
811
  this.dispatchKeyWindow = [];
720
812
  this.lastStuckRecoveryKey = null;
813
+ this.lastDerivedPhase = null;
721
814
  this.status.phase = "running";
722
815
  this.bumpTransition();
723
816
  this.journalTransition({ name: "start" });
@@ -807,12 +900,31 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
807
900
  return blocked;
808
901
  }
809
902
 
903
+ const reconciledPhase = reconciliation.stateSnapshot.phase;
904
+ if (this.lastDerivedPhase !== null) {
905
+ this.observePhaseTransition(this.lastDerivedPhase, reconciledPhase);
906
+ }
907
+ this.lastDerivedPhase = reconciledPhase;
908
+
810
909
  const decision = await this.decideNextUnit({ stateSnapshot: reconciliation.stateSnapshot });
811
910
  if (!decision) {
911
+ const settlementBlock = this.evaluateNoRemainingUnitsSettlement(reconciliation.stateSnapshot);
912
+ if (settlementBlock) {
913
+ this.status.phase = "paused";
914
+ this.status.activeUnit = undefined;
915
+ this.lastAdvanceKey = null;
916
+ this.dispatchKeyWindow = [];
917
+ this.bumpTransition();
918
+ this.journalTransition({ name: "advance-blocked", reason: settlementBlock.reason });
919
+ this.postAdvanceRecord(settlementBlock);
920
+ return settlementBlock;
921
+ }
922
+ const terminalOutcome = noRemainingUnitsOutcome(reconciliation.stateSnapshot);
812
923
  const stopped: AutoAdvanceResult = {
813
924
  kind: "stopped",
814
- reason: noRemainingUnitsReason(reconciliation.stateSnapshot),
925
+ reason: terminalOutcome.displayReason,
815
926
  stateSnapshot: reconciliation.stateSnapshot,
927
+ terminalOutcome,
816
928
  };
817
929
  this.status.phase = "stopped";
818
930
  this.status.activeUnit = undefined;
@@ -848,6 +960,25 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
848
960
  return blocked;
849
961
  }
850
962
 
963
+ const priorSliceBlocker = this.findPriorSliceCompletionBlocker(decision.unitType, decision.unitId);
964
+ if (priorSliceBlocker) {
965
+ this.clearPendingDispatch();
966
+ const blocked: AutoAdvanceResult = {
967
+ kind: "blocked",
968
+ reason: priorSliceBlocker,
969
+ action: "stop",
970
+ stateSnapshot: reconciliation.stateSnapshot,
971
+ };
972
+ this.journalTransition({
973
+ name: "advance-blocked",
974
+ reason: blocked.reason,
975
+ unitType: decision.unitType,
976
+ unitId: decision.unitId,
977
+ });
978
+ this.postAdvanceRecord(blocked);
979
+ return blocked;
980
+ }
981
+
851
982
  const nextKey = `${decision.unitType}:${decision.unitId}`;
852
983
 
853
984
  // Record every dispatch decision in the ring buffer before pre-flight
@@ -865,8 +996,10 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
865
996
  // actually completed on disk with a stale DB. Verify + recover before
866
997
  // hard-stopping (legacy graduated stuck-recovery parity).
867
998
  if (this.tryStuckArtifactRecovery(decision.unitType, decision.unitId)) {
999
+ this.clearPendingDispatch();
868
1000
  return this.stuckRecovered(decision, reconciliation.stateSnapshot);
869
1001
  }
1002
+ this.clearPendingDispatch();
870
1003
  const blocked: AutoAdvanceResult = {
871
1004
  kind: "blocked",
872
1005
  reason: `state did not advance after finalized ${decision.unitType} ${decision.unitId}`,
@@ -890,6 +1023,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
890
1023
  // checks coexist: idempotency for the common immediate-repeat case,
891
1024
  // stuck-loop for the saturated-window case.
892
1025
  if (this.lastAdvanceKey === nextKey && matchingCount < STUCK_WINDOW_SIZE) {
1026
+ this.clearPendingDispatch();
893
1027
  const blocked: AutoAdvanceResult = { kind: "blocked", reason: "idempotent advance: unit already active", action: "pause" };
894
1028
  this.journalTransition({
895
1029
  name: "advance-blocked",
@@ -910,8 +1044,10 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
910
1044
  // complete on disk (stale DB) and recover if so — legacy graduated
911
1045
  // stuck-recovery parity. Otherwise hard-stop with a diagnosable reason.
912
1046
  if (this.tryStuckArtifactRecovery(decision.unitType, decision.unitId)) {
1047
+ this.clearPendingDispatch();
913
1048
  return this.stuckRecovered(decision, reconciliation.stateSnapshot);
914
1049
  }
1050
+ this.clearPendingDispatch();
915
1051
  const blocked: AutoAdvanceResult = {
916
1052
  kind: "blocked",
917
1053
  reason: `stuck-loop: ${nextKey} picked ${matchingCount} times`,
@@ -929,6 +1065,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
929
1065
 
930
1066
  const contract = this.compileUnitToolContract(decision.unitType);
931
1067
  if (!contract.ok) {
1068
+ this.clearPendingDispatch();
932
1069
  const blocked: AutoAdvanceResult = {
933
1070
  kind: "blocked",
934
1071
  reason: contract.reason,
@@ -947,6 +1084,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
947
1084
 
948
1085
  const worktree = await this.prepareWorktreeForUnit(decision.unitType, decision.unitId);
949
1086
  if (!worktree.ok) {
1087
+ this.clearPendingDispatch();
950
1088
  const blocked: AutoAdvanceResult = {
951
1089
  kind: "blocked",
952
1090
  reason: worktree.reason,
@@ -1035,8 +1173,12 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
1035
1173
  public async resume(): Promise<AutoAdvanceResult> {
1036
1174
  this.lastAdvanceKey = null;
1037
1175
  this.lastFinalizedUnitKey = null;
1038
- this.dispatchKeyWindow = [];
1176
+ // Preserve dispatchKeyWindow across resume so stuck-loop detection
1177
+ // accumulates across pause/resume cycles rather than resetting each time.
1039
1178
  this.lastStuckRecoveryKey = null;
1179
+ // ADR-030: drop the prior "from" — the first advance after resume has no
1180
+ // edge to assert (avoids a false illegal-edge across the pause boundary).
1181
+ this.lastDerivedPhase = null;
1040
1182
  this.status.phase = "running";
1041
1183
  this.bumpTransition();
1042
1184
  this.journalTransition({ name: "resume" });
@@ -1053,7 +1195,12 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
1053
1195
  this.status.activeUnit = undefined;
1054
1196
  this.lastAdvanceKey = null;
1055
1197
  this.lastFinalizedUnitKey = null;
1056
- this.dispatchKeyWindow = [];
1198
+ this.lastDerivedPhase = null;
1199
+ // Preserve dispatchKeyWindow on pause so stuck-loop detection accumulates
1200
+ // across pause/resume cycles. Only clear on a hard stop.
1201
+ if (reason !== "pause") {
1202
+ this.dispatchKeyWindow = [];
1203
+ }
1057
1204
  this.lastStuckRecoveryKey = null;
1058
1205
  this.bumpTransition();
1059
1206
  this.journalTransition({ name: "stop", reason });