@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
@@ -1,18 +1,23 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: ADR-015 Recovery Classification module for runtime failure taxonomy.
3
3
 
4
+ import { isToolUnavailableError } from "./auto-tool-tracking.js";
4
5
  import { classifyError, isTransient, type ErrorClass } from "./error-classifier.js";
6
+ import { recoveryRemediation } from "./guidance.js";
5
7
  import { ReconciliationFailedError } from "./state-reconciliation.js";
8
+ import { IllegalPhaseTransitionError } from "./state-transition-matrix.js";
6
9
 
7
10
  export type RecoveryFailureKind =
8
11
  | "tool-schema"
9
12
  | "tool-contract"
13
+ | "tool-unavailable"
10
14
  | "deterministic-policy"
11
15
  | "lifecycle-progression"
12
16
  | "stale-worker"
13
17
  | "worktree-invalid"
14
18
  | "verification-drift"
15
19
  | "reconciliation-drift"
20
+ | "illegal-transition"
16
21
  | "provider"
17
22
  | "runtime-unknown";
18
23
 
@@ -43,99 +48,53 @@ export function classifyFailure(input: RecoveryClassificationInput): RecoveryCla
43
48
  const failureKind =
44
49
  input.error instanceof ReconciliationFailedError
45
50
  ? "reconciliation-drift"
46
- : input.failureKind ?? inferFailureKind(message);
51
+ : input.error instanceof IllegalPhaseTransitionError
52
+ ? "illegal-transition"
53
+ : input.failureKind ?? inferFailureKind(message);
47
54
 
48
- switch (failureKind) {
49
- case "tool-schema":
50
- return {
51
- failureKind,
52
- action: "stop",
53
- reason: `Tool schema failure${unitSuffix(input)}: ${message}`,
54
- exitReason: "tool-schema",
55
- remediation: "Fix the Unit Tool Contract or tool schema before retrying.",
56
- };
57
- case "tool-contract":
58
- return {
59
- failureKind,
60
- action: "stop",
61
- reason: `Tool Contract failure${unitSuffix(input)}: ${message}`,
62
- exitReason: "tool-contract",
63
- remediation: "Fix the Unit Tool Contract or prompt so the Unit is only asked to use tools owned by its phase.",
64
- };
65
- case "deterministic-policy":
66
- return {
67
- failureKind,
68
- action: "stop",
69
- reason: `Deterministic policy failure${unitSuffix(input)}: ${message}`,
70
- exitReason: "deterministic-policy",
71
- remediation: "Resolve the policy blocker; retrying the same Unit will repeat the failure.",
72
- };
73
- case "lifecycle-progression":
74
- return {
75
- failureKind,
76
- action: "stop",
77
- reason: `Lifecycle progression failure${unitSuffix(input)}: ${message}`,
78
- exitReason: "lifecycle-progression",
79
- remediation: "Route to the required owning Unit or restore the missing artifact before advancing lifecycle state.",
80
- };
81
- case "stale-worker":
82
- return {
83
- failureKind,
84
- action: "stop",
85
- reason: `Stale worker failure${unitSuffix(input)}: ${message}`,
86
- exitReason: "stale-worker",
87
- remediation: "Clear or reconcile the stale worker before dispatching another Unit.",
88
- };
89
- case "worktree-invalid":
90
- return {
91
- failureKind,
92
- action: "stop",
93
- reason: `Worktree invalid${unitSuffix(input)}: ${message}`,
94
- exitReason: "worktree-invalid",
95
- remediation: "Repair or recreate the milestone worktree before launching source-writing Units.",
96
- };
97
- case "verification-drift":
98
- return {
99
- failureKind,
100
- action: "escalate",
101
- reason: `Verification drift${unitSuffix(input)}: ${message}`,
102
- exitReason: "verification-drift",
103
- remediation: "Inspect the verification artifact and reconcile the state snapshot before resuming.",
104
- };
105
- case "reconciliation-drift":
106
- return {
107
- failureKind,
108
- action: "escalate",
109
- reason: `Reconciliation drift${unitSuffix(input)}: ${message}`,
110
- exitReason: "reconciliation-drift",
111
- remediation:
112
- "Inspect the persistent or repair-failed drift kinds reported by the State Reconciliation Module before resuming.",
113
- };
114
- case "provider": {
115
- const providerClass = classifyError(message, input.retryAfterMs);
116
- return {
117
- failureKind,
118
- action: isTransient(providerClass) ? "retry" : "escalate",
119
- reason: message,
120
- exitReason: `provider-${providerClass.kind}`,
121
- remediation: isTransient(providerClass)
122
- ? "Retry after the provider/network condition clears."
123
- : "Inspect provider credentials, model entitlement, or request shape.",
124
- providerClass: providerClass.kind,
125
- };
126
- }
127
- case "runtime-unknown":
128
- return {
129
- failureKind,
130
- action: "escalate",
131
- reason: message,
132
- exitReason: "runtime-unknown",
133
- remediation: "Inspect the runtime error and add a dedicated classification if it is repeatable.",
134
- };
55
+ if (failureKind === "provider") {
56
+ const providerClass = classifyError(message, input.retryAfterMs);
57
+ const transient = isTransient(providerClass);
58
+ return {
59
+ failureKind,
60
+ action: transient ? "retry" : "escalate",
61
+ reason: message,
62
+ exitReason: `provider-${providerClass.kind}`,
63
+ remediation: recoveryRemediation(transient ? "provider-transient" : "provider-permanent"),
64
+ providerClass: providerClass.kind,
65
+ };
135
66
  }
67
+
68
+ const { action, label } = FAILURE_TAXONOMY[failureKind];
69
+ return {
70
+ failureKind,
71
+ action,
72
+ reason: label ? `${label}${unitSuffix(input)}: ${message}` : message,
73
+ exitReason: failureKind,
74
+ remediation: recoveryRemediation(failureKind),
75
+ };
136
76
  }
137
77
 
78
+ /** Per-kind action and reason label. Remediation lives in the Guidance module. */
79
+ const FAILURE_TAXONOMY: Record<
80
+ Exclude<RecoveryFailureKind, "provider">,
81
+ { action: RecoveryAction; label: string | null }
82
+ > = {
83
+ "tool-schema": { action: "stop", label: "Tool schema failure" },
84
+ "tool-contract": { action: "stop", label: "Tool Contract failure" },
85
+ "tool-unavailable": { action: "retry", label: "Tool unavailable" },
86
+ "deterministic-policy": { action: "stop", label: "Deterministic policy failure" },
87
+ "lifecycle-progression": { action: "stop", label: "Lifecycle progression failure" },
88
+ "stale-worker": { action: "stop", label: "Stale worker failure" },
89
+ "worktree-invalid": { action: "stop", label: "Worktree invalid" },
90
+ "verification-drift": { action: "escalate", label: "Verification drift" },
91
+ "reconciliation-drift": { action: "escalate", label: "Reconciliation drift" },
92
+ "illegal-transition": { action: "escalate", label: "Illegal phase transition" },
93
+ "runtime-unknown": { action: "escalate", label: null },
94
+ };
95
+
138
96
  function inferFailureKind(message: string): RecoveryFailureKind {
97
+ if (isToolUnavailableError(message)) return "tool-unavailable";
139
98
  if (/tool contract|auto-unit tool scope|phase-boundary gate|not permitted.*own/i.test(message)) return "tool-contract";
140
99
  if (/lifecycle progression|required artifact|missing .*assessment|missing .*closeout|cannot legally (?:advance|progress)/i.test(message)) return "lifecycle-progression";
141
100
  if (/schema|invalid.*tool|tool.*invalid|enum/i.test(message)) return "tool-schema";
@@ -189,9 +189,15 @@ export function parseRoadmapSlices(content: string): RoadmapSliceEntry[] {
189
189
  const risk = (riskMatch ? riskMatch[1] : "low") as RiskLevel;
190
190
 
191
191
  const depsMatch = rest.match(/`depends:\[([^\]]*)\]`/);
192
- const depends = depsMatch && depsMatch[1]!.trim()
193
- ? expandDependencies(depsMatch[1]!.split(",").map(s => s.trim()))
192
+ // Recovery fallback: double-bracket form `[[id]]` from serialized bracket-wrapped IDs
193
+ const fallbackDepsMatch = depsMatch ? null : rest.match(/`depends:\[(\[(?:[^\]]*)\](?:,\[(?:[^\]]*)\])*)\]`/);
194
+ const rawDepContent = (depsMatch ?? fallbackDepsMatch)?.[1] ?? "";
195
+ const SLICE_ID_RE = /^[A-Za-z0-9][A-Za-z0-9-]*$/;
196
+ const RANGE_RE = /^[A-Za-z]+\d+(?:-|\.\.)[A-Za-z]+\d+$/;
197
+ const rawDepParts = rawDepContent.trim()
198
+ ? rawDepContent.replace(/\[|\]/g, "").split(",").map(s => s.trim()).filter(s => SLICE_ID_RE.test(s) || RANGE_RE.test(s))
194
199
  : [];
200
+ const depends = expandDependencies(rawDepParts);
195
201
 
196
202
  // ADR-011: the renderer writes a `[sketch]` badge for sketch slices.
197
203
  // Parse it back so the is_sketch flag survives a markdown → DB re-import
@@ -57,9 +57,10 @@ const EXECUTION_TOOL_NAMES = new Set([
57
57
  "functions.exec_command",
58
58
  "gsd_exec",
59
59
  "gsd_exec_search",
60
+ "gsd_uat_exec",
60
61
  "powershell",
61
62
  ]);
62
- const MCP_EXECUTION_TOOL_RE = /^mcp__.+__gsd_exec(?:_search)?$/;
63
+ const MCP_EXECUTION_TOOL_RE = /^mcp__.+__gsd_(?:uat_)?exec(?:_search)?$/;
63
64
 
64
65
  // ─── Module State ───────────────────────────────────────────────────────────
65
66
 
@@ -206,11 +207,17 @@ export function clearEvidenceFromDisk(
206
207
  * Exit codes and output are filled in by recordToolResult after execution.
207
208
  */
208
209
  export function recordToolCall(toolCallId: string, toolName: string, input: Record<string, unknown>): void {
210
+ // Idempotent by toolCallId: native tools reach this via both
211
+ // tool_execution_start and tool_call; external (pre-executed) tools only
212
+ // via tool_execution_start. First recording wins.
213
+ if (unitEvidence.some(e => e.toolCallId === toolCallId)) return;
209
214
  if (isExecutionToolName(toolName)) {
210
215
  unitEvidence.push({
211
216
  kind: "bash",
212
217
  toolCallId,
213
- command: String(input.command ?? input.cmd ?? input.query ?? ""),
218
+ // gsd_exec / gsd_uat_exec carry the script body in `script` (or `code`);
219
+ // bash-style tools use `command`/`cmd`; gsd_exec_search uses `query`.
220
+ command: String(input.command ?? input.script ?? input.cmd ?? input.code ?? input.query ?? ""),
214
221
  exitCode: -1,
215
222
  outputSnippet: "",
216
223
  timestamp: Date.now(),
@@ -249,11 +256,36 @@ export function recordToolResult(
249
256
  if (entry.kind === "bash") {
250
257
  const text = extractResultText(result);
251
258
  entry.outputSnippet = text.slice(0, 500);
252
- const exitMatch = text.match(/Command exited with code (\d+)/);
253
- entry.exitCode = exitMatch ? Number(exitMatch[1]) : (isError ? 1 : 0);
259
+ entry.exitCode = resolveExitCode(text, isError);
254
260
  }
255
261
  }
256
262
 
263
+ /**
264
+ * Resolve the exit code from a tool result's text. Handles the bash tool's
265
+ * prose marker, the gsd_exec / gsd_uat_exec JSON envelope (`"exit_code": N`),
266
+ * and a last-resort read of the run's persisted `.gsd/exec/<id>.meta.json`
267
+ * (covers truncated result text).
268
+ */
269
+ function resolveExitCode(text: string, isError: boolean): number {
270
+ const proseMatch = text.match(/Command exited with code (\d+)/);
271
+ if (proseMatch) return Number(proseMatch[1]);
272
+
273
+ const jsonMatch = text.match(/"exit_code"\s*:\s*(-?\d+)/);
274
+ if (jsonMatch) return Number(jsonMatch[1]);
275
+
276
+ const metaMatch = text.match(/"meta_path"\s*:\s*"([^"]+)"/);
277
+ if (metaMatch) {
278
+ try {
279
+ const meta = JSON.parse(readFileSync(metaMatch[1], "utf-8")) as Record<string, unknown>;
280
+ if (typeof meta.exit_code === "number") return meta.exit_code;
281
+ } catch {
282
+ // Fall through to the isError heuristic
283
+ }
284
+ }
285
+
286
+ return isError ? 1 : 0;
287
+ }
288
+
257
289
  // ─── Internals ──────────────────────────────────────────────────────────────
258
290
 
259
291
  function extractResultText(result: unknown): string {
@@ -121,9 +121,14 @@ function findMatches(
121
121
  const exact = bashCalls.filter(b => b.command.trim() === normalized);
122
122
  if (exact.length > 0) return exact;
123
123
 
124
- // Substring match: claimed is contained in actual or actual in claimed
124
+ // Substring match: claimed is contained in actual or actual in claimed.
125
+ // A claimed verification command typically appears verbatim inside a
126
+ // larger gsd_exec script body (cd prefix, multi-line scripts), so
127
+ // script-containing-claim is the common direction. Blank-command entries
128
+ // must be excluded — `"x".includes("")` is true, so they'd match anything.
125
129
  const substring = bashCalls.filter(
126
- b => b.command.includes(normalized) || normalized.includes(b.command),
130
+ b => b.command.trim().length > 0 &&
131
+ (b.command.includes(normalized) || normalized.includes(b.command)),
127
132
  );
128
133
  if (substring.length > 0) return substring;
129
134
 
@@ -39,6 +39,20 @@ export interface FileChangeAudit {
39
39
 
40
40
  // ─── Public API ─────────────────────────────────────────────────────────────
41
41
 
42
+ /**
43
+ * Build the effective allowlist for a unit's file-change audit.
44
+ *
45
+ * When GSD manages .gitignore (manage_gitignore unset or true), ensureGitignore()
46
+ * appends baseline patterns at auto-start and the edit rides into the task's
47
+ * auto-commit — so .gitignore changes must not be attributed to the task.
48
+ */
49
+ export function effectiveFileChangeAllowlist(
50
+ baseAllowlist: string[],
51
+ manageGitignore: boolean | undefined,
52
+ ): string[] {
53
+ return manageGitignore === false ? baseAllowlist : [...baseAllowlist, ".gitignore"];
54
+ }
55
+
42
56
  /**
43
57
  * Validate file changes after auto-commit for an execute-task unit.
44
58
  * Returns null if task data is unavailable or DB is not loaded.
@@ -30,7 +30,8 @@ import { isAbsolute, join, dirname, resolve } from "node:path";
30
30
  import { fileURLToPath } from "node:url";
31
31
  import { gsdRoot } from "./paths.js";
32
32
  import { createWorktree, worktreePath, removeWorktree } from "./worktree-manager.js";
33
- import { autoWorktreeBranch, runWorktreePostCreateHook, syncGsdStateToWorktree } from "./auto-worktree.js";
33
+ import { autoWorktreeBranch, runWorktreePostCreateHook, syncGsdStateToWorktreeByScope } from "./auto-worktree.js";
34
+ import { createWorkspace, scopeMilestone } from "./workspace.js";
34
35
  import {
35
36
  writeSessionStatus,
36
37
  removeSessionStatus,
@@ -163,7 +164,10 @@ function createSliceWorktree(basePath: string, milestoneId: string, sliceId: str
163
164
  if (hookError) {
164
165
  throw new Error(`slice worktree post-create hook failed (${wtName}): ${hookError}`);
165
166
  }
166
- syncGsdStateToWorktree(basePath, wtPath);
167
+ syncGsdStateToWorktreeByScope(
168
+ scopeMilestone(createWorkspace(basePath), milestoneId),
169
+ scopeMilestone(createWorkspace(wtPath), milestoneId),
170
+ );
167
171
 
168
172
  if (!existsSync(join(wtPath, ".gsd"))) {
169
173
  throw new Error(`slice worktree preflight failed (${wtName}): missing .gsd in worktree`);
@@ -131,6 +131,48 @@ export function findTransition(
131
131
  );
132
132
  }
133
133
 
134
+ /**
135
+ * Edge-keyed legality check for the Phase Transition Invariant (ADR-030).
136
+ * `advance()` derives the next Phase and asserts the (from → to) edge here.
137
+ *
138
+ * The matrix is an assertion, not a decision-maker — `deriveState` already
139
+ * chose the Phase. A self-edge is trivially legal (no transition to assert). An
140
+ * edge is legal when some matrix entry permits it, honoring the `*` wildcard
141
+ * rows (e.g. any → blocked via manual-block, any → executing via
142
+ * retryable-failure).
143
+ *
144
+ * Note: the matrix is currently a sparse hardening spec, not a complete
145
+ * legal-edge graph, so `advance()` consumes this in advisory mode (telemetry
146
+ * only). It must be expanded to cover every edge `deriveState` emits before
147
+ * enforcement flips on.
148
+ */
149
+ export function isLegalEdge(from: Phase, to: Phase): boolean {
150
+ if (from === to) return true;
151
+ return STATE_TRANSITION_MATRIX.some(
152
+ (entry) => (entry.from === from || entry.from === "*") && entry.to === to,
153
+ );
154
+ }
155
+
156
+ /**
157
+ * Thrown when an illegal derived Phase edge survives reconciliation. Carries
158
+ * both endpoints so Recovery Classification can report them. Recognized by
159
+ * class in `classifyFailure` and mapped to the `illegal-transition` kind.
160
+ */
161
+ export class IllegalPhaseTransitionError extends Error {
162
+ // Explicit fields, not constructor parameter properties — strip-types
163
+ // consumers (workspace-index subprocess, integration tests) reject the
164
+ // parameter-property syntax with ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX.
165
+ readonly from: Phase;
166
+ readonly to: Phase;
167
+
168
+ constructor(from: Phase, to: Phase) {
169
+ super(`Illegal phase transition ${from} -> ${to} survived reconciliation`);
170
+ this.name = "IllegalPhaseTransitionError";
171
+ this.from = from;
172
+ this.to = to;
173
+ }
174
+ }
175
+
134
176
  export function validateTransitionMatrix(requiredEvents: readonly string[]): MatrixValidationResult {
135
177
  const seen = new Set<string>();
136
178
  const duplicateKeys: string[] = [];
@@ -52,7 +52,6 @@ import { isTerminalMilestoneSummaryContent } from './milestone-summary-classifie
52
52
 
53
53
  import {
54
54
  isDbAvailable,
55
- wasDbOpenAttempted,
56
55
  getAllMilestones,
57
56
  getMilestone,
58
57
  getMilestoneSlices,
@@ -63,31 +62,19 @@ import {
63
62
  getLatestAssessmentByScope,
64
63
  getPendingGateCountForTurn,
65
64
  } from './gsd-db.js';
65
+ import { wasWorkflowDatabaseOpenAttempted } from './db-workspace.js';
66
66
  import { formatCompletePhaseNextAction, countUnmappedActiveRequirements } from './requirements-backlog.js';
67
67
  import type { MilestoneRow } from './db-milestone-artifact-rows.js';
68
68
  import type { SliceRow, TaskRow } from './db-task-slice-rows.js';
69
+ import {
70
+ classifyMilestoneReadiness,
71
+ readinessNeedsDiscussion,
72
+ } from './milestone-readiness.js';
69
73
 
70
- function formatNeedsAttentionBlocker(milestoneId: string): string {
71
- return [
72
- `Milestone ${milestoneId} is blocked because milestone validation returned needs-attention.`,
73
- `Fix options:`,
74
- `1. Review the validation details: \`/gsd status\``,
75
- `2. If you fixed the missing evidence or issue, re-run milestone validation: \`/gsd validate-milestone\``,
76
- `3. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
77
- `4. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
78
- `After validation or override passes, run \`/gsd auto\` to complete and merge the milestone.`,
79
- ].join("\n");
80
- }
81
-
82
- function formatNeedsRemediationBlocker(milestoneId: string): string {
83
- return [
84
- `Milestone ${milestoneId} is blocked because milestone validation returned needs-remediation, but all slices are complete.`,
85
- `Fix options:`,
86
- `1. Run \`/gsd dispatch reassess\` to add remediation slices, then run \`/gsd auto\``,
87
- `2. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
88
- `3. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
89
- ].join("\n");
90
- }
74
+ import {
75
+ needsAttentionBlockerGuidance as formatNeedsAttentionBlocker,
76
+ needsRemediationBlockerGuidance as formatNeedsRemediationBlocker,
77
+ } from './guidance.js';
91
78
 
92
79
  /**
93
80
  * A "ghost" milestone directory contains only META.json (and no substantive
@@ -395,7 +382,7 @@ export async function deriveState(
395
382
  stopDbTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
396
383
  _telemetry.dbDeriveCount++;
397
384
  } else {
398
- if (wasDbOpenAttempted()) {
385
+ if (wasWorkflowDatabaseOpenAttempted()) {
399
386
  logWarning("state", "DB unavailable — refusing implicit markdown state derivation");
400
387
  }
401
388
  result = {
@@ -507,6 +494,12 @@ async function buildRegistryAndFindActive(
507
494
  const title = stripMilestonePrefix(m.title) || m.id;
508
495
  const hasContext = !!resolveMilestoneFile(basePath, m.id, "CONTEXT");
509
496
  const hasDraftContext = !hasContext && !!resolveMilestoneFile(basePath, m.id, "CONTEXT-DRAFT");
497
+ const readiness = classifyMilestoneReadiness({
498
+ status: m.status,
499
+ hasContext,
500
+ hasDraftContext,
501
+ sliceCount: slices.length,
502
+ });
510
503
 
511
504
  if (!activeMilestoneFound) {
512
505
  const deps = m.depends_on;
@@ -517,9 +510,9 @@ async function buildRegistryAndFindActive(
517
510
  continue;
518
511
  }
519
512
 
520
- if (m.status === 'queued' && slices.length === 0 && !hasContext) {
513
+ if (readiness.kind === 'queued-shell') {
521
514
  if (!firstDeferredQueuedShell) {
522
- firstDeferredQueuedShell = { id: m.id, title, deps, hasDraftContext };
515
+ firstDeferredQueuedShell = { id: m.id, title, deps, hasDraftContext: readiness.hasDraftContext };
523
516
  }
524
517
  registry.push({ id: m.id, title, status: 'pending', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
525
518
  continue;
@@ -533,7 +526,7 @@ async function buildRegistryAndFindActive(
533
526
  continue;
534
527
  }
535
528
 
536
- if ((m.status === 'needs-discussion' && !hasContext) || hasDraftContext) activeMilestoneHasDraft = true;
529
+ if (readinessNeedsDiscussion(readiness)) activeMilestoneHasDraft = true;
537
530
 
538
531
  activeMilestone = { id: m.id, title };
539
532
  activeMilestoneSlices = slices;
@@ -1,17 +1,68 @@
1
1
  /**
2
- * Status predicates for GSD state-machine guards.
2
+ * Status predicates and the canonical status vocabulary for GSD state-machine
3
+ * guards (ADR-030).
3
4
  *
4
- * The DB stores status as free-form strings. Three values indicate
5
- * "closed": "complete" (canonical), "done" (legacy / alias),
6
- * "closed" (legacy/imported), and
7
- * "skipped" (user-directed skip via rethink or backtrack).
8
- * Every inline `status === "complete" || status === "done"` should
9
- * use isClosedStatus() instead.
5
+ * The DB column is free-form `string` so legacy/imported rows still load. Three
6
+ * raw values besides canonical "complete"/"skipped" indicate "closed": "done"
7
+ * (legacy alias), "closed" (legacy/imported), and "skipped" (user-directed skip
8
+ * via rethink or backtrack). `RAW_CLOSED_STATUSES` is the single source for both
9
+ * `isClosedStatus()` and the SQL terminal-status fragment
10
+ * (`db/sql-constants.ts` derives `TERMINAL_STATUS_SQL` from it), replacing the
11
+ * prior independent definitions.
12
+ *
13
+ * `toStatus()` is the single seam where a free-form string becomes the canonical
14
+ * `Status` vocabulary; the Status Transition Core writes canonical, so the store
15
+ * converges over time without a forced migration.
16
+ */
17
+
18
+ /**
19
+ * Canonical, normalized entity-status vocabulary across milestones, slices, and
20
+ * tasks — the single source for both the `Status` type and the runtime
21
+ * membership set. The in-memory domain speaks `Status`; the DB column stays
22
+ * free-form.
23
+ */
24
+ export const CANONICAL_STATUSES = [
25
+ "pending", "queued", "active", "parked", "in_progress", "blocked", "complete", "skipped", "deferred",
26
+ ] as const;
27
+ export type Status = (typeof CANONICAL_STATUSES)[number];
28
+ const CANONICAL_STATUS_SET: ReadonlySet<string> = new Set(CANONICAL_STATUSES);
29
+
30
+ /**
31
+ * Raw status values that mean a unit is closed — the single source of truth.
32
+ * Includes legacy/imported aliases ("done", "closed") alongside canonical
33
+ * "complete"/"skipped" because the DB column is free-form and older rows /
34
+ * imports still carry them. Order matters: `TERMINAL_STATUS_SQL` is derived
35
+ * from this array verbatim.
36
+ */
37
+ export const RAW_CLOSED_STATUSES = ["complete", "done", "skipped", "closed"] as const;
38
+ const RAW_CLOSED_SET: ReadonlySet<string> = new Set(RAW_CLOSED_STATUSES);
39
+
40
+ /** Free-form aliases mapped to their canonical Status on read. */
41
+ const ALIAS_TO_CANONICAL: Readonly<Record<string, Status>> = {
42
+ done: "complete",
43
+ closed: "complete",
44
+ planned: "pending",
45
+ "in-progress": "in_progress",
46
+ };
47
+
48
+ /**
49
+ * Normalize a free-form DB status string into the canonical `Status`
50
+ * vocabulary. Maps known aliases (done/closed → complete, planned → pending,
51
+ * in-progress → in_progress). An unrecognized/legacy value is **quarantined** —
52
+ * preserved verbatim rather than silently remapped to a wrong canonical state —
53
+ * so reads never fail and reconciliation/telemetry can surface it.
10
54
  */
55
+ export function toStatus(raw: string): Status {
56
+ const value = raw.trim();
57
+ if (CANONICAL_STATUS_SET.has(value)) return value as Status;
58
+ const alias = ALIAS_TO_CANONICAL[value];
59
+ if (alias) return alias;
60
+ return value as Status;
61
+ }
11
62
 
12
63
  /** Returns true when a milestone, slice, or task status indicates closure. */
13
64
  export function isClosedStatus(status: string): boolean {
14
- return status === "complete" || status === "done" || status === "skipped" || status === "closed";
65
+ return RAW_CLOSED_SET.has(status);
15
66
  }
16
67
 
17
68
  /** Returns true when a slice status indicates it was deferred by a decision. */
@@ -0,0 +1,75 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Stop Notice module — single owner of the auto/step-mode
3
+ // stop/pause notice vocabulary. Both sides of the wire live here: the
4
+ // formatters that produce the canonical prefixes (used by stopAuto/pauseAuto)
5
+ // and the classifiers that recognize them (used by the headless host to pick
6
+ // exit codes). Wording changes in this file keep emitter and detector in
7
+ // lockstep; round-trip tests enforce it.
8
+
9
+ export type StopNoticeKind = "stopped" | "blocked";
10
+
11
+ /** A reason string of the form "Blocked: …" marks a blocked stop. */
12
+ export function isBlockedStopReason(reason?: string | null): boolean {
13
+ return /^Blocked:\s*/i.test(reason ?? "");
14
+ }
15
+
16
+ /** Strip the "Blocked: " marker for display. */
17
+ export function stopNoticeDisplayReason(reason?: string | null): string {
18
+ return (reason ?? "").replace(/^Blocked:\s*/i, "").trim();
19
+ }
20
+
21
+ export function stopNoticeKind(reason?: string | null): StopNoticeKind {
22
+ return isBlockedStopReason(reason) ? "blocked" : "stopped";
23
+ }
24
+
25
+ /** Canonical stop-notice prefix: "Auto-mode blocked — reason" / "Auto-mode stopped". */
26
+ export function formatStopNoticePrefix(reason?: string | null): string {
27
+ const displayReason = stopNoticeDisplayReason(reason);
28
+ const prefix = stopNoticeKind(reason) === "blocked" ? "Auto-mode blocked" : "Auto-mode stopped";
29
+ return displayReason ? `${prefix} — ${displayReason}` : prefix;
30
+ }
31
+
32
+ // ─── Classification (headless host side) ────────────────────────────────
33
+ // The canonical lowercase prefixes the headless event loop recognizes in
34
+ // notify messages. Emitters above and ad-hoc emitters elsewhere must start
35
+ // their terminal notices with one of these.
36
+
37
+ export const PAUSED_NOTICE_PREFIXES = ["auto-mode paused", "step-mode paused"] as const;
38
+
39
+ export const TERMINAL_NOTICE_PREFIXES = [
40
+ "auto-mode stopped",
41
+ "step-mode stopped",
42
+ "auto-mode complete",
43
+ "no active milestone",
44
+ "auto-mode idle",
45
+ ] as const;
46
+
47
+ /** Manual-resolution notices emitted before auto-mode can formally pause/stop. */
48
+ export function isManualResolutionNotice(message: string): boolean {
49
+ return (
50
+ message.includes("resolve manually and re-run /gsd auto") ||
51
+ message.includes("resolve conflicts manually and run /gsd auto to resume") ||
52
+ message.includes("resolve and run /gsd auto to resume")
53
+ );
54
+ }
55
+
56
+ export function isPauseNotice(message: string): boolean {
57
+ return PAUSED_NOTICE_PREFIXES.some((prefix) => message.startsWith(prefix));
58
+ }
59
+
60
+ export function isTerminalNotice(message: string): boolean {
61
+ return TERMINAL_NOTICE_PREFIXES.some((prefix) => message.startsWith(prefix));
62
+ }
63
+
64
+ /** Pauses that do not require operator intervention in headless mode. */
65
+ export function isNonBlockingPauseNotice(message: string): boolean {
66
+ return message.includes("idempotent advance: unit already active");
67
+ }
68
+
69
+ export function isBlockedNoticeMessage(message: string): boolean {
70
+ return (
71
+ message.includes("blocked:") ||
72
+ (isPauseNotice(message) && !isNonBlockingPauseNotice(message)) ||
73
+ isManualResolutionNotice(message)
74
+ );
75
+ }
@@ -46,6 +46,13 @@
46
46
  For simple projects or scripts:
47
47
  - Executable verification commands (bash assertions, curl checks, etc.) are sufficient
48
48
 
49
+ For browser-facing web apps (React, Next, Vue, Vite, static HTML, etc.):
50
+ - Prefer `npx playwright test <spec>` in Verification when `@playwright/test` exists
51
+ - If Playwright is not set up yet, the first UI slice should add `playwright.config.ts`,
52
+ a minimal smoke spec (for example `e2e/smoke.spec.ts`), and a safe verify command
53
+ - Slice closeout UAT must declare `browser-executable` or `runtime-executable` — not
54
+ `artifact-driven` — when checks navigate to localhost or exercise the live UI
55
+
49
56
  If the project has no test framework and the work is non-trivial,
50
57
  the first task should set one up. A test runner costs 2 minutes
51
58
  and pays for itself immediately.
@@ -20,6 +20,7 @@
20
20
 
21
21
  - **Complexity:** {{simple | complex}}
22
22
  - **Why:** {{one-line rationale citing the signals that decided it}}
23
+ - **Web stack:** {{browser-facing framework or "not a web UI" — e.g. Next.js + Playwright, static HTML, N/A for CLI/API-only}}
23
24
 
24
25
  ## Current State
25
26
 
@@ -42,7 +42,7 @@
42
42
  - Contract verification: {{tests / shell verifiers / fixtures / artifact checks}}
43
43
  - Integration verification: {{real subsystem interaction that must be exercised, or none}}
44
44
  - Operational verification: {{service lifecycle / restart / reconnect / supervision / deploy-install behavior, or none}}
45
- - UAT / human verification: {{what needs real human judgment, or none}}
45
+ - UAT / human verification: {{what needs real human judgment, or none — for web apps prefer browser-executable / runtime-executable Playwright checks over deferring UI proof to humans}}
46
46
 
47
47
  ## Milestone Definition of Done
48
48
 
@@ -5,9 +5,13 @@
5
5
 
6
6
  ## UAT Type
7
7
 
8
- - UAT mode: {{artifact-driven | live-runtime | human-experience | mixed}}
8
+ - UAT mode: {{artifact-driven | browser-executable | runtime-executable | live-runtime | human-experience | mixed}}
9
9
  - Why this mode is sufficient: {{reason}}
10
10
 
11
+ <!-- Web apps: never use artifact-driven when steps open a browser, navigate to localhost,
12
+ or capture screenshots. Use browser-executable (browser_* tools) or runtime-executable
13
+ (npx playwright test). Name dev-server preconditions below. -->
14
+
11
15
  ## Preconditions
12
16
 
13
17
  {{whatMustBeTrueBeforeTesting — server running, data seeded, etc.}}