gsd-pi 2.82.0 → 3.0.0-dev.6c9a50fd0

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 (775) hide show
  1. package/README.md +125 -32
  2. package/dist/cli.js +20 -9
  3. package/dist/headless-ui.js +13 -6
  4. package/dist/headless.js +9 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/GSD-WORKFLOW.md +10 -1
  7. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  8. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  9. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  10. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  11. package/dist/resources/extensions/cmux/index.js +5 -0
  12. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  13. package/dist/resources/extensions/gsd/auto/loop.js +112 -40
  14. package/dist/resources/extensions/gsd/auto/orchestrator.js +126 -8
  15. package/dist/resources/extensions/gsd/auto/phases.js +125 -42
  16. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  17. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  18. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +105 -24
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  25. package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
  26. package/dist/resources/extensions/gsd/auto-recovery.js +80 -14
  27. package/dist/resources/extensions/gsd/auto-start.js +90 -14
  28. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  30. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  31. package/dist/resources/extensions/gsd/auto.js +251 -91
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +10 -4
  35. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  36. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  37. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  38. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  39. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  40. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  41. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  42. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  43. package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
  44. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  45. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  46. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  47. package/dist/resources/extensions/gsd/context-store.js +112 -0
  48. package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
  49. package/dist/resources/extensions/gsd/db/auto-workers.js +21 -0
  50. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  51. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  52. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  53. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  54. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  55. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  56. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  57. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  58. package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
  59. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  60. package/dist/resources/extensions/gsd/doctor.js +2 -28
  61. package/dist/resources/extensions/gsd/export-html.js +27 -425
  62. package/dist/resources/extensions/gsd/forensics.js +10 -3
  63. package/dist/resources/extensions/gsd/git-service.js +138 -10
  64. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  65. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  66. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  67. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  68. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  69. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  70. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  71. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  72. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  73. package/dist/resources/extensions/gsd/markdown-renderer.js +20 -12
  74. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  75. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  76. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  77. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  78. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  79. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  80. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  81. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  82. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  83. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  84. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  85. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  86. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  87. package/dist/resources/extensions/gsd/paths.js +4 -0
  88. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  89. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  90. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  91. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  92. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  93. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  94. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  95. package/dist/resources/extensions/gsd/preferences.js +6 -0
  96. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  97. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  99. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  100. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  101. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  102. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  103. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  104. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  105. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  106. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  108. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  110. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  111. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  112. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  113. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  114. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  115. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  116. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  117. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  118. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  119. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  120. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  121. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  122. package/dist/resources/extensions/gsd/state.js +14 -4
  123. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  124. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  125. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  126. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  127. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  128. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  129. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  130. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  131. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  132. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  133. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  134. package/dist/resources/extensions/gsd/validation.js +23 -1
  135. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  136. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  137. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  138. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  139. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  140. package/dist/resources/extensions/gsd/worktree-lifecycle.js +83 -19
  141. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  142. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  143. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  144. package/dist/resources/extensions/shared/html-shell.js +388 -0
  145. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  146. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  147. package/dist/resources/extensions/subagent/index.js +448 -78
  148. package/dist/resources/extensions/subagent/launch.js +77 -0
  149. package/dist/resources/extensions/subagent/run-store.js +148 -0
  150. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  151. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  152. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  153. package/dist/resources/extensions/visual-brief/index.js +5 -0
  154. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  155. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  156. package/dist/resources/skills/forensics/SKILL.md +1 -1
  157. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  158. package/dist/web/standalone/.next/BUILD_ID +1 -1
  159. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  160. package/dist/web/standalone/.next/build-manifest.json +4 -4
  161. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  162. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  163. package/dist/web/standalone/.next/required-server-files.json +4 -4
  164. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  165. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  175. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  179. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  180. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  182. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  185. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  192. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  204. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  224. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  234. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  240. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  252. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  256. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  260. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  269. package/dist/web/standalone/.next/server/app/index.html +1 -1
  270. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  271. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  272. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  273. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  274. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  275. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  276. package/dist/web/standalone/.next/server/app/page.js +2 -2
  277. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  278. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  279. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  280. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  281. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  282. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  283. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  284. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  285. package/dist/web/standalone/.next/server/middleware.js +2 -2
  286. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  287. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  288. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  289. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  290. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  291. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  292. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  293. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  294. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  295. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  296. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  297. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  298. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  299. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  300. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  301. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  302. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  303. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  304. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  305. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  306. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  307. package/dist/web/standalone/server.js +1 -1
  308. package/package.json +6 -5
  309. package/packages/contracts/dist/rpc.test.js +7 -0
  310. package/packages/contracts/dist/rpc.test.js.map +1 -1
  311. package/packages/contracts/dist/workflow.d.ts +21 -0
  312. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  313. package/packages/contracts/dist/workflow.js +24 -0
  314. package/packages/contracts/dist/workflow.js.map +1 -1
  315. package/packages/contracts/src/rpc.test.ts +8 -0
  316. package/packages/contracts/src/workflow.ts +24 -0
  317. package/packages/daemon/package.json +2 -2
  318. package/packages/mcp-server/README.md +14 -3
  319. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  320. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  321. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  322. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  323. package/packages/mcp-server/package.json +2 -2
  324. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  325. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  326. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  327. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  328. package/packages/native/package.json +1 -1
  329. package/packages/native/tsconfig.json +2 -1
  330. package/packages/native/tsconfig.tsbuildinfo +1 -1
  331. package/packages/pi-agent-core/package.json +1 -1
  332. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  333. package/packages/pi-ai/dist/index.d.ts +2 -2
  334. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  335. package/packages/pi-ai/dist/index.js +1 -1
  336. package/packages/pi-ai/dist/index.js.map +1 -1
  337. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  338. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  339. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  340. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  341. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  342. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  343. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  344. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  345. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  346. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  347. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  348. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  350. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  351. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  352. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  354. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  355. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  356. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  357. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  358. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  359. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  360. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  361. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  362. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  363. package/packages/pi-ai/package.json +1 -1
  364. package/packages/pi-ai/src/index.ts +7 -2
  365. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  366. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  367. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  368. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  369. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  370. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  371. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  372. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  373. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  374. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  375. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  376. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  377. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  378. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  380. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  382. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  384. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  386. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  388. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  390. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  392. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  394. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  395. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  396. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  397. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  398. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  399. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  400. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  402. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  404. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  406. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  408. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  409. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  410. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  411. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  412. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  413. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  414. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  415. package/packages/pi-coding-agent/package.json +1 -1
  416. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  417. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  418. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  419. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  420. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  421. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  422. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  423. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  424. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  425. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  426. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  427. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  428. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  429. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  430. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  431. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  432. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  433. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  434. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  435. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  436. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  437. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  438. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  439. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  440. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  441. package/packages/pi-tui/dist/terminal.js +12 -0
  442. package/packages/pi-tui/dist/terminal.js.map +1 -1
  443. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  444. package/packages/pi-tui/dist/tui.js +108 -24
  445. package/packages/pi-tui/dist/tui.js.map +1 -1
  446. package/packages/pi-tui/package.json +1 -1
  447. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  448. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  449. package/packages/pi-tui/src/terminal.ts +11 -0
  450. package/packages/pi-tui/src/tui.ts +111 -24
  451. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  452. package/packages/rpc-client/package.json +1 -1
  453. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  454. package/pkg/package.json +1 -1
  455. package/src/resources/GSD-WORKFLOW.md +10 -1
  456. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  457. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  458. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  459. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  460. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  461. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  462. package/src/resources/extensions/cmux/index.ts +6 -0
  463. package/src/resources/extensions/gsd/auto/contracts.ts +64 -16
  464. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  465. package/src/resources/extensions/gsd/auto/loop.ts +113 -40
  466. package/src/resources/extensions/gsd/auto/orchestrator.ts +131 -8
  467. package/src/resources/extensions/gsd/auto/phases.ts +155 -53
  468. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  469. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  470. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  471. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  472. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  473. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  474. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  475. package/src/resources/extensions/gsd/auto-dispatch.ts +126 -23
  476. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  477. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  478. package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
  479. package/src/resources/extensions/gsd/auto-recovery.ts +84 -11
  480. package/src/resources/extensions/gsd/auto-start.ts +99 -12
  481. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  482. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  483. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  484. package/src/resources/extensions/gsd/auto.ts +288 -87
  485. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  486. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  487. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -4
  488. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  489. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  490. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  491. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  492. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  493. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  494. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  495. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  496. package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
  497. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  498. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  499. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  500. package/src/resources/extensions/gsd/context-store.ts +120 -1
  501. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  502. package/src/resources/extensions/gsd/db/auto-workers.ts +25 -0
  503. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  504. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  505. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  506. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  507. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  508. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  509. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  510. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  511. package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
  512. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  513. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  514. package/src/resources/extensions/gsd/doctor.ts +2 -27
  515. package/src/resources/extensions/gsd/export-html.ts +27 -427
  516. package/src/resources/extensions/gsd/forensics.ts +9 -3
  517. package/src/resources/extensions/gsd/git-service.ts +166 -11
  518. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  519. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  520. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  521. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  522. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  523. package/src/resources/extensions/gsd/journal.ts +8 -1
  524. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  525. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  526. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  527. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  528. package/src/resources/extensions/gsd/markdown-renderer.ts +20 -12
  529. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  530. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  531. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  532. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  533. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  534. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  535. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  536. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  537. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  538. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  539. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  540. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  541. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  542. package/src/resources/extensions/gsd/paths.ts +5 -0
  543. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  544. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  545. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  546. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  547. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  548. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  549. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  550. package/src/resources/extensions/gsd/preferences.ts +9 -0
  551. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  552. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  553. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  554. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  555. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  556. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  557. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  558. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  559. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  560. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  561. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  562. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  563. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  564. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  565. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  566. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  567. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  568. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  569. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  570. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  571. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  572. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  573. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  574. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  575. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  576. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  577. package/src/resources/extensions/gsd/state.ts +15 -4
  578. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  579. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  580. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  581. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  582. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  583. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  584. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  585. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +510 -1
  586. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +635 -16
  587. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  588. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  589. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  590. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +134 -9
  591. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  592. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  593. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  594. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  595. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +13 -0
  596. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  597. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  598. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  599. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  600. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  601. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  602. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  603. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  604. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  605. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  606. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  607. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  608. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  609. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  610. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  611. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  612. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  613. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  614. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  615. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  616. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  617. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  618. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  619. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +111 -1
  620. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  621. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  622. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  623. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  624. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  625. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  626. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  627. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  628. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  629. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  630. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  631. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  632. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  633. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  634. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  635. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  636. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  637. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  638. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  639. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  640. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  641. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  642. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  643. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  644. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  645. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +38 -0
  646. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  647. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  648. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  649. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  650. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  651. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  652. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  653. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  654. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  655. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  656. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  657. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  658. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  659. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  660. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  661. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  662. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  663. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  664. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  665. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  666. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  667. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  668. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  669. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  670. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  671. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  672. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  673. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  674. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  675. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  676. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  677. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  678. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  679. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +78 -0
  680. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  681. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  682. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  683. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  684. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  685. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  686. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  687. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  688. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  689. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  690. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  691. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  692. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  693. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  694. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  695. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +86 -2
  696. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  697. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  698. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  699. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  700. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  701. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  702. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  703. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  704. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  705. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  706. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  707. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  708. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  709. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  710. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  711. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  712. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +121 -1
  713. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  714. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  715. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +57 -2
  716. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  717. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  718. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  719. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  720. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  721. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  722. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  723. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  724. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  725. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  726. package/src/resources/extensions/gsd/types.ts +1 -1
  727. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  728. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  729. package/src/resources/extensions/gsd/validation.ts +23 -1
  730. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  731. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  732. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  733. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  734. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  735. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  736. package/src/resources/extensions/gsd/worktree-lifecycle.ts +93 -20
  737. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  738. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  739. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  740. package/src/resources/extensions/shared/html-shell.ts +412 -0
  741. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  742. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  743. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  744. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  745. package/src/resources/extensions/subagent/index.ts +567 -103
  746. package/src/resources/extensions/subagent/launch.ts +131 -0
  747. package/src/resources/extensions/subagent/run-store.ts +218 -0
  748. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  749. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  750. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  751. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  752. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  753. package/src/resources/extensions/visual-brief/index.ts +8 -0
  754. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  755. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  756. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  757. package/src/resources/skills/forensics/SKILL.md +1 -1
  758. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  759. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  760. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  761. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  762. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  763. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  764. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  765. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  766. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  767. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  768. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  769. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  770. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  771. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  772. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  773. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  774. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → 8wipfz6TDZ6YWoaQjgqYD}/_buildManifest.js +0 -0
  775. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → 8wipfz6TDZ6YWoaQjgqYD}/_ssgManifest.js +0 -0
@@ -14,8 +14,8 @@
14
14
  */
15
15
  import { execFileSync, spawn } from "node:child_process";
16
16
  import { randomUUID } from "node:crypto";
17
- import { appendFileSync, existsSync, writeFileSync, readFileSync, mkdirSync, renameSync, unlinkSync, } from "node:fs";
18
- import { join, dirname } from "node:path";
17
+ import { appendFileSync, existsSync, lstatSync, rmSync, writeFileSync, readFileSync, mkdirSync, renameSync, unlinkSync, } from "node:fs";
18
+ import { isAbsolute, join, dirname, resolve } from "node:path";
19
19
  import { fileURLToPath } from "node:url";
20
20
  import { gsdRoot } from "./paths.js";
21
21
  import { createWorktree, worktreePath, removeWorktree } from "./worktree-manager.js";
@@ -46,6 +46,44 @@ export function _buildSliceWorkerEnvForTest(basePath, milestoneId, sliceId, work
46
46
  GSD_SLICE_WORKER_TOKEN: workerToken,
47
47
  };
48
48
  }
49
+ function isValidSliceWorktreePath(basePath, wtPath) {
50
+ if (!existsSync(wtPath))
51
+ return false;
52
+ const gitPath = join(wtPath, ".git");
53
+ if (!existsSync(gitPath))
54
+ return false;
55
+ try {
56
+ if (!lstatSync(gitPath).isFile())
57
+ return false;
58
+ const content = readFileSync(gitPath, "utf8").trim();
59
+ if (!content.startsWith("gitdir: "))
60
+ return false;
61
+ const rawGitdir = content.slice("gitdir: ".length).trim();
62
+ if (!rawGitdir)
63
+ return false;
64
+ const resolvedGitdir = isAbsolute(rawGitdir) ? rawGitdir : resolve(wtPath, rawGitdir);
65
+ const expectedPrefix = join(basePath, ".git", "worktrees").replaceAll("\\", "/");
66
+ const normalized = resolvedGitdir.replaceAll("\\", "/");
67
+ return normalized === expectedPrefix || normalized.startsWith(`${expectedPrefix}/`);
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ function isWorkerPidAlive(pid) {
74
+ if (!Number.isFinite(pid) || pid <= 0)
75
+ return false;
76
+ try {
77
+ process.kill(pid, 0);
78
+ return true;
79
+ }
80
+ catch (err) {
81
+ const code = err?.code;
82
+ if (code === "ESRCH")
83
+ return false;
84
+ return true;
85
+ }
86
+ }
49
87
  function sliceStateFilePath(basePath) {
50
88
  return join(gsdRoot(basePath), SLICE_ORCHESTRATOR_STATE_FILE);
51
89
  }
@@ -318,6 +356,9 @@ export async function startSliceParallel(basePath, milestoneId, eligibleSlices,
318
356
  const wtBranch = `slice/${milestoneId}/${slice.id}`;
319
357
  const wtName = `${milestoneId}-${slice.id}`;
320
358
  const wtPath = worktreePath(basePath, wtName);
359
+ if (existsSync(wtPath) && !isValidSliceWorktreePath(basePath, wtPath)) {
360
+ rmSync(wtPath, { recursive: true, force: true });
361
+ }
321
362
  if (!existsSync(wtPath)) {
322
363
  createWorktree(basePath, wtName, { branch: wtBranch });
323
364
  }
@@ -361,6 +402,22 @@ export async function startSliceParallel(basePath, milestoneId, eligibleSlices,
361
402
  catch { /* ignore cleanup failures */ }
362
403
  }
363
404
  }
405
+ // Guard: if workers died immediately, treat as failed start so callers
406
+ // don't exit auto-mode and re-dispatch in a rapid loop.
407
+ for (let i = started.length - 1; i >= 0; i--) {
408
+ const sid = started[i];
409
+ const worker = sliceState.workers.get(sid);
410
+ if (worker && isWorkerPidAlive(worker.pid))
411
+ continue;
412
+ started.splice(i, 1);
413
+ errors.push({ sid, error: "Worker exited immediately after spawn" });
414
+ sliceState.workers.delete(sid);
415
+ const wtName = `${milestoneId}-${sid}`;
416
+ try {
417
+ removeWorktree(basePath, wtName, { deleteBranch: true, force: true });
418
+ }
419
+ catch { /* ignore cleanup failures */ }
420
+ }
364
421
  // If nothing started, deactivate
365
422
  if (started.length === 0) {
366
423
  sliceState.active = false;
@@ -0,0 +1,36 @@
1
+ // GSD-2 — Smart entry routing decisions.
2
+ // Pure route selection for /gsd guided wizard choices.
3
+ export function resolveGuidedExecuteLaunchMode(isolationMode) {
4
+ return isolationMode === "worktree" ? "auto-step" : "guided-dispatch";
5
+ }
6
+ export function resolveActiveTaskChoiceRoute(input) {
7
+ if (input.choice === "auto") {
8
+ return {
9
+ kind: "auto-bootstrap",
10
+ verboseMode: false,
11
+ };
12
+ }
13
+ if (input.choice === "execute") {
14
+ if (resolveGuidedExecuteLaunchMode(input.isolationMode) === "auto-step") {
15
+ return {
16
+ kind: "auto-bootstrap",
17
+ verboseMode: false,
18
+ options: {
19
+ step: true,
20
+ milestoneLock: input.milestoneId,
21
+ },
22
+ };
23
+ }
24
+ return {
25
+ kind: "guided-dispatch",
26
+ unitType: "execute-task",
27
+ };
28
+ }
29
+ if (input.choice === "status") {
30
+ return { kind: "status" };
31
+ }
32
+ if (input.choice === "milestone_actions") {
33
+ return { kind: "milestone-actions" };
34
+ }
35
+ throw new Error(`Invalid ActiveTaskChoice: ${input.choice}`);
36
+ }
@@ -10,6 +10,7 @@ import { isAbsolute, join, resolve } from "node:path";
10
10
  import { getErrorMessage } from "../../error-utils.js";
11
11
  import { nativeAddPaths, nativeCheckoutTheirs, nativeCommit, nativeConflictFiles, nativeMergeAbort, nativeRebaseAbort, nativeResetHard, } from "../../native-git-bridge.js";
12
12
  import { logError, logWarning } from "../../workflow-logger.js";
13
+ import { isGsdWorktreePath } from "../../worktree-root.js";
13
14
  const SILENT_NOTIFY = () => { };
14
15
  function resolveGitDir(basePath) {
15
16
  try {
@@ -23,7 +24,11 @@ function resolveGitDir(basePath) {
23
24
  }
24
25
  }
25
26
  catch (err) {
26
- logWarning("recovery", `gitdir resolution failed: ${getErrorMessage(err)}`);
27
+ const message = getErrorMessage(err);
28
+ logWarning("recovery", `gitdir resolution failed: ${message}`);
29
+ if (isGsdWorktreePath(basePath)) {
30
+ throw new Error(`Worktree integrity failure: ${basePath} is not a valid git worktree (git rev-parse failed: ${message.split("\n")[0]}). Repair or recreate the worktree before retrying.`);
31
+ }
27
32
  }
28
33
  return join(basePath, ".git");
29
34
  }
@@ -1,12 +1,11 @@
1
1
  // Project/App: GSD-2
2
2
  // File Purpose: ADR-017 unregistered-milestone drift handler. Detects
3
3
  // milestones whose on-disk directory has meaningful content (ROADMAP/
4
- // CONTEXT/SUMMARY) but no DB row, then runs the markdown importer to
5
- // reconcile. PROJECT.md is the human-facing index the importer's source
6
- // of truth is the .gsd/milestones/ directory tree.
4
+ // CONTEXT/SUMMARY) but no DB row, then fails closed with an explicit recovery
5
+ // instruction. Markdown hierarchy import is reserved for operator-controlled
6
+ // migration/recovery commands, not automatic runtime reconciliation.
7
7
  import { existsSync } from "node:fs";
8
8
  import { getMilestone, isDbAvailable } from "../../gsd-db.js";
9
- import { migrateHierarchyToDb } from "../../md-importer.js";
10
9
  import { findMilestoneIds } from "../../milestone-ids.js";
11
10
  import { resolveMilestoneFile } from "../../paths.js";
12
11
  function milestoneHasContent(basePath, milestoneId) {
@@ -31,17 +30,13 @@ export function detectUnregisteredMilestoneDrift(_state, ctx) {
31
30
  return drifts;
32
31
  }
33
32
  /**
34
- * Repair: invoke the markdown importer. migrateHierarchyToDb walks the same
35
- * findMilestoneIds list the detector uses and INSERTs OR IGNOREs every
36
- * missing milestone (and its slices/tasks) idempotent under cap=2 retry.
37
- *
38
- * Note: even though we receive one record at a time, the importer is a
39
- * project-wide operation. Repeated invocation across multiple drift records
40
- * in the same pass is wasteful but safe; a future optimization could
41
- * coalesce by checking whether the importer has already run this pass.
33
+ * Repair intentionally fails closed. The project-root DB is authoritative at
34
+ * runtime; markdown-only milestones must be imported through an explicit
35
+ * migration/recovery command so operators opt into changing canonical state.
42
36
  */
43
- export function repairUnregisteredMilestone(_record, ctx) {
44
- migrateHierarchyToDb(ctx.basePath);
37
+ export function repairUnregisteredMilestone(record, _ctx) {
38
+ throw new Error(`Milestone ${record.milestoneId} exists only as markdown projection. ` +
39
+ "Runtime reconciliation will not import markdown into the authoritative DB; run explicit GSD recovery/migration if this markdown should repopulate the database.");
45
40
  }
46
41
  export const unregisteredMilestoneHandler = {
47
42
  kind: "unregistered-milestone",
@@ -1,14 +1,15 @@
1
1
  // Project/App: GSD-2
2
2
  // File Purpose: ADR-017 roadmap-divergence drift handler. Detects mismatches
3
- // between ROADMAP.md (parsed slice sequence + depends declarations) and the
4
- // DB slice rows for that milestone, then reconciles via the markdown
5
- // importer plus an explicit junction-table sync.
3
+ // between ROADMAP.md (parsed slice sequence, depends declarations, and
4
+ // checkboxes) and the DB slice rows for that milestone, then re-renders the
5
+ // ROADMAP projection from the authoritative DB rows.
6
6
  import { existsSync, readFileSync } from "node:fs";
7
- import { getMilestone, getMilestoneSlices, isDbAvailable, syncSliceDependencies, } from "../../gsd-db.js";
8
- import { migrateHierarchyToDb } from "../../md-importer.js";
7
+ import { getMilestone, getMilestoneSlices, isDbAvailable, } from "../../gsd-db.js";
8
+ import { renderRoadmapFromDb } from "../../markdown-renderer.js";
9
9
  import { findMilestoneIds } from "../../milestone-ids.js";
10
10
  import { parseRoadmap } from "../../parsers-legacy.js";
11
11
  import { resolveMilestoneFile } from "../../paths.js";
12
+ import { isClosedStatus } from "../../status-guards.js";
12
13
  function arraysEqual(a, b) {
13
14
  if (a.length !== b.length)
14
15
  return false;
@@ -30,8 +31,10 @@ function milestoneHasDivergence(basePath, milestoneId) {
30
31
  }
31
32
  const dbSlices = getMilestoneSlices(milestoneId);
32
33
  const dbSliceMap = new Map(dbSlices.map((s) => [s.id, s]));
34
+ const roadmapSliceIds = new Set();
33
35
  for (let i = 0; i < roadmap.slices.length; i++) {
34
36
  const roadmapSlice = roadmap.slices[i];
37
+ roadmapSliceIds.add(roadmapSlice.id);
35
38
  const expectedSequence = i + 1;
36
39
  const dbSlice = dbSliceMap.get(roadmapSlice.id);
37
40
  if (!dbSlice)
@@ -40,6 +43,12 @@ function milestoneHasDivergence(basePath, milestoneId) {
40
43
  return true;
41
44
  if (!arraysEqual(dbSlice.depends, roadmapSlice.depends))
42
45
  return true;
46
+ if (isClosedStatus(dbSlice.status) !== roadmapSlice.done)
47
+ return true;
48
+ }
49
+ for (const dbSlice of dbSlices) {
50
+ if (!roadmapSliceIds.has(dbSlice.id))
51
+ return true;
43
52
  }
44
53
  return false;
45
54
  }
@@ -59,26 +68,12 @@ export function detectRoadmapDivergenceDrift(_state, ctx) {
59
68
  return drifts;
60
69
  }
61
70
  /**
62
- * Repair a milestone's roadmap divergence:
63
- * 1. migrateHierarchyToDb upserts slice rows (sequence + depends JSON
64
- * update via ON CONFLICT DO UPDATE).
65
- * 2. syncSliceDependencies updates the junction table per slice — the
66
- * importer only writes the JSON column, not the relational view.
71
+ * Repair a milestone's roadmap divergence by regenerating the projection from
72
+ * DB rows. ROADMAP.md is a projection; runtime reconciliation must not import
73
+ * slice presence, sequence, dependencies, or checkbox state from markdown.
67
74
  */
68
- export function repairRoadmapDivergence(record, ctx) {
69
- migrateHierarchyToDb(ctx.basePath);
70
- const roadmapPath = resolveMilestoneFile(ctx.basePath, record.milestoneId, "ROADMAP");
71
- if (!roadmapPath || !existsSync(roadmapPath))
72
- return;
73
- try {
74
- const roadmap = parseRoadmap(readFileSync(roadmapPath, "utf-8"));
75
- for (const slice of roadmap.slices) {
76
- syncSliceDependencies(record.milestoneId, slice.id, slice.depends);
77
- }
78
- }
79
- catch {
80
- /* parse failure: detector will fire again next pass */
81
- }
75
+ export async function repairRoadmapDivergence(record, ctx) {
76
+ await renderRoadmapFromDb(ctx.basePath, record.milestoneId);
82
77
  }
83
78
  export const roadmapDivergenceHandler = {
84
79
  kind: "roadmap-divergence",
@@ -352,6 +352,12 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
352
352
  continue;
353
353
  }
354
354
  if (allSlicesDone) {
355
+ const validation = getLatestAssessmentByScope(m.id, "milestone-validation");
356
+ const verdict = typeof validation?.status === "string" ? validation.status : undefined;
357
+ if (verdict === "needs-attention") {
358
+ registry.push({ id: m.id, title, status: "parked", ...(deps.length > 0 ? { dependsOn: deps } : {}) });
359
+ continue;
360
+ }
355
361
  activeMilestone = { id: m.id, title };
356
362
  activeMilestoneSlices = slices;
357
363
  activeMilestoneFound = true;
@@ -460,7 +466,7 @@ async function handleAllSlicesDone(basePath, activeMilestone, registry, requirem
460
466
  recentDecisions: [],
461
467
  blockers: [
462
468
  `Milestone ${activeMilestone.id} validation verdict is needs-remediation but all slices are complete. ` +
463
- `Add remediation slices via gsd_reassess_roadmap or override the verdict manually.`,
469
+ `Add remediation slices via gsd_reassess_roadmap, or run \`/gsd verdict pass --rationale "..."\` to override.`,
464
470
  ],
465
471
  nextAction: `Resolve ${activeMilestone.id} remediation before proceeding.`,
466
472
  registry, requirements,
@@ -892,6 +898,10 @@ export async function _deriveStateImpl(basePath, opts) {
892
898
  const validationContent = validationFile ? await cachedLoadFile(validationFile) : null;
893
899
  const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
894
900
  const verdict = validationContent ? extractVerdict(validationContent) : undefined;
901
+ if (verdict === "needs-attention") {
902
+ registry.push({ id: mid, title, status: "parked" });
903
+ continue;
904
+ }
895
905
  // needs-remediation is terminal but requires re-validation (#3596)
896
906
  const needsRevalidation = !validationTerminal || verdict === 'needs-remediation';
897
907
  if (summaryFile && await isTerminalMilestoneSummaryFile(summaryFile, cachedLoadFile)) {
@@ -911,7 +921,7 @@ export async function _deriveStateImpl(basePath, opts) {
911
921
  registry.push({ id: mid, title, status: 'pending' });
912
922
  }
913
923
  else if (!activeMilestoneFound) {
914
- // Terminal validation (pass/needs-attention) but no summary → completing-milestone
924
+ // Terminal passing validation but no summary → completing-milestone
915
925
  activeMilestone = { id: mid, title };
916
926
  activeRoadmap = roadmap;
917
927
  activeMilestoneFound = true;
@@ -1132,7 +1142,7 @@ export async function _deriveStateImpl(basePath, opts) {
1132
1142
  recentDecisions: [],
1133
1143
  blockers: [
1134
1144
  `Milestone ${activeMilestone.id} validation verdict is needs-remediation but all slices are complete. ` +
1135
- `Add remediation slices via gsd_reassess_roadmap or override the verdict manually.`,
1145
+ `Add remediation slices via gsd_reassess_roadmap, or run \`/gsd verdict pass --rationale "..."\` to override.`,
1136
1146
  ],
1137
1147
  nextAction: `Resolve ${activeMilestone.id} remediation before proceeding.`,
1138
1148
  registry,
@@ -1253,7 +1263,7 @@ export async function _deriveStateImpl(basePath, opts) {
1253
1263
  const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
1254
1264
  if (summaryPath && existsSync(summaryPath)) {
1255
1265
  t.done = true;
1256
- logWarning("reconcile", `task ${activeMilestone.id}/${activeSlice.id}/${t.id} reconciled via SUMMARY on disk (#2514)`, { mid: activeMilestone.id, sid: activeSlice.id, tid: t.id });
1266
+ logWarning("reconcile", `task ${activeMilestone.id}/${activeSlice.id}/${t.id} reconciled via SUMMARY on disk`, { mid: activeMilestone.id, sid: activeSlice.id, tid: t.id });
1257
1267
  }
1258
1268
  }
1259
1269
  const taskProgress = {
@@ -2,14 +2,15 @@
2
2
  * Status predicates for GSD state-machine guards.
3
3
  *
4
4
  * The DB stores status as free-form strings. Three values indicate
5
- * "closed": "complete" (canonical), "done" (legacy / alias), and
5
+ * "closed": "complete" (canonical), "done" (legacy / alias),
6
+ * "closed" (legacy/imported), and
6
7
  * "skipped" (user-directed skip via rethink or backtrack).
7
8
  * Every inline `status === "complete" || status === "done"` should
8
9
  * use isClosedStatus() instead.
9
10
  */
10
11
  /** Returns true when a milestone, slice, or task status indicates closure. */
11
12
  export function isClosedStatus(status) {
12
- return status === "complete" || status === "done" || status === "skipped";
13
+ return status === "complete" || status === "done" || status === "skipped" || status === "closed";
13
14
  }
14
15
  /** Returns true when a slice status indicates it was deferred by a decision. */
15
16
  export function isDeferredStatus(status) {
@@ -22,3 +23,14 @@ export function isDeferredStatus(status) {
22
23
  export function isInactiveStatus(status) {
23
24
  return isClosedStatus(status) || isDeferredStatus(status);
24
25
  }
26
+ /** Returns true when a prior milestone should not block dispatch ordering. */
27
+ export function isSkippedForDispatch(status) {
28
+ return isClosedStatus(status) || status === "parked" || isDeferredStatus(status);
29
+ }
30
+ /**
31
+ * Returns true when a milestone is future/backlog work (not currently executing).
32
+ * Includes legacy/project-specific alias "planned" for compatibility.
33
+ */
34
+ export function isFutureMilestoneStatus(status) {
35
+ return status === "pending" || status === "queued" || status === "planned";
36
+ }
@@ -1,7 +1,7 @@
1
1
  # Project Knowledge
2
2
 
3
- Append-only register of project-specific rules, patterns, and lessons learned.
4
- Agents read this before every unit. Add entries when you discover something worth remembering.
3
+ Project-specific rules plus projected patterns and lessons learned.
4
+ Rules are maintained in this file. Patterns and lessons are persisted to the memories table and rendered here on the next session-start projection.
5
5
 
6
6
  ## Rules
7
7
 
@@ -99,11 +99,11 @@
99
99
  - "Improve UI"
100
100
 
101
101
  Each task should usually include:
102
- - Why: why this task exists / what part of the slice it closes
103
- - Files: the main files likely touched
104
- - Do: concrete implementation steps and important constraints
105
- - Verify: the command, test, or runtime check that proves it worked
106
- - Done when: a measurable acceptance condition
102
+ - description: why this task exists, concrete steps, and done-when acceptance
103
+ - files: JSON array of likely touched paths
104
+ - verify: the command, test, or runtime check that proves it worked
105
+ - inputs: JSON array of existing paths or prior task outputs this task consumes
106
+ - expectedOutput: JSON array of paths this task creates or overwrites
107
107
 
108
108
  Keep the checkbox line format exactly:
109
109
  - [ ] **T01: Title** `est:30m`
@@ -131,10 +131,14 @@
131
131
 
132
132
  Verify field rules:
133
133
  - MUST be a mechanically executable command: `npm test`, `grep -q "pattern" file`, `test -f path`
134
+ - MUST NOT use shell pipes, redirects, semicolons, backticks, command substitution, or output trimming
135
+ - MUST NOT use inline `node -e` assertions for verification; put assertions in a real test file and run it with `node --test` or a package test script
134
136
  - For content/document tasks: verify file existence, section count, YAML validity, or word count
135
137
  NOT exact phrasing, specific formulas, or "zero TBD" aspirational criteria
136
138
  - If no command can verify the output, write: "Manual review — file exists and is non-empty"
139
+ - BAD: `python3 -m pytest tests/ -q --tb=short 2>&1 | tail -5`
137
140
  - BAD: "Sections 3.1 and 3.2 exist with exact formulas. Zero TBD/TODO."
141
+ - GOOD: `python3 -m pytest tests/ -q --tb=short`
138
142
  - GOOD: `grep -c "^## " doc.md` returns >= 4 (4+ sections), `! grep -q "TBD\|TODO" doc.md`
139
143
 
140
144
  Integration closure rule:
@@ -57,6 +57,12 @@ skills_used:
57
57
  - {{howToVerifyThisTaskIsActuallyDone}}
58
58
  - {{commandToRun_OR_behaviorToCheck}}
59
59
 
60
+ ## Verify Rules
61
+
62
+ - Use a real executable check, not prose.
63
+ - If the check needs file-content assertions, write a `node:test` file and run it with `node --test` or a package test script.
64
+ - Do not use inline `node -e` assertions for verification.
65
+
60
66
  ## Observability Impact
61
67
 
62
68
  <!-- OMIT THIS SECTION ENTIRELY for simple tasks that don't touch runtime boundaries,
@@ -72,7 +78,8 @@ skills_used:
72
78
  <!-- Every input MUST be a backtick-wrapped file path. These paths are machine-parsed to
73
79
  derive task dependencies — vague descriptions without paths break dependency detection.
74
80
  For the first task in a slice with no prior task outputs, list the existing source files
75
- this task reads or modifies. -->
81
+ this task reads or modifies.
82
+ Tool field: inputs must be an array of strings, e.g. ["src/index.ts"], never a single string. -->
76
83
 
77
84
  - `{{filePath}}` — {{whatThisTaskNeedsFromPriorWork}}
78
85
 
@@ -82,6 +89,7 @@ skills_used:
82
89
  or modifies. These paths are machine-parsed to derive task dependencies.
83
90
  This task should produce a real increment toward making the slice goal/demo true. A full
84
91
  slice plan should not be able to mark every task complete while the claimed slice behavior
85
- still does not work at the stated proof level. -->
92
+ still does not work at the stated proof level.
93
+ Tool field: expectedOutput must be an array of strings, e.g. ["src/index.ts"], never a single string. -->
86
94
 
87
95
  - `{{filePath}}` — {{whatThisTaskCreatesOrModifies}}
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import { join } from "node:path";
10
10
  import { mkdirSync, existsSync } from "node:fs";
11
- import { transaction, getMilestone, getMilestoneSlices, getSliceTasks, updateMilestoneStatus, } from "../gsd-db.js";
11
+ import { transaction, getMilestone, getMilestoneSlices, getSliceTasks, getLatestAssessmentByScope, updateMilestoneStatus, } from "../gsd-db.js";
12
12
  import { resolveMilestonePath, clearPathCache } from "../paths.js";
13
13
  import { isClosedStatus } from "../status-guards.js";
14
14
  import { saveFile, clearParseCache } from "../files.js";
@@ -24,11 +24,11 @@ function renderMilestoneSummaryMarkdown(params, completedAt) {
24
24
  const keyFiles = params.keyFiles ?? [];
25
25
  const lessonsLearned = params.lessonsLearned ?? [];
26
26
  const keyDecisionsYaml = keyDecisions.length > 0
27
- ? keyDecisions.map(d => ` - ${d}`).join("\n")
28
- : " - (none)";
27
+ ? `\n${keyDecisions.map(d => ` - ${d}`).join("\n")}`
28
+ : " []";
29
29
  const keyFilesYaml = keyFiles.length > 0
30
- ? keyFiles.map(f => ` - ${f}`).join("\n")
31
- : " - (none)";
30
+ ? `\n${keyFiles.map(f => ` - ${f}`).join("\n")}`
31
+ : " []";
32
32
  const lessonsYaml = lessonsLearned.length > 0
33
33
  ? lessonsLearned.map(l => ` - ${l}`).join("\n")
34
34
  : " - (none)";
@@ -37,10 +37,8 @@ id: ${params.milestoneId}
37
37
  title: "${displayTitle}"
38
38
  status: complete
39
39
  completed_at: ${completedAt}
40
- key_decisions:
41
- ${keyDecisionsYaml}
42
- key_files:
43
- ${keyFilesYaml}
40
+ key_decisions:${keyDecisionsYaml}
41
+ key_files:${keyFilesYaml}
44
42
  lessons_learned:
45
43
  ${lessonsYaml}
46
44
  ---
@@ -101,6 +99,14 @@ export async function handleCompleteMilestone(params, basePath) {
101
99
  alreadyComplete = true;
102
100
  return;
103
101
  }
102
+ // Defense-in-depth: only a passing milestone validation permits closeout.
103
+ const validation = getLatestAssessmentByScope(params.milestoneId, "milestone-validation");
104
+ if (validation?.status !== "pass") {
105
+ guardError =
106
+ `Refusing to complete ${params.milestoneId}: latest milestone-validation verdict is ` +
107
+ `"${validation?.status ?? "absent"}". Only verdict=pass permits closeout.`;
108
+ return;
109
+ }
104
110
  // Verify all slices are complete
105
111
  const slices = getMilestoneSlices(params.milestoneId);
106
112
  if (slices.length === 0) {
@@ -65,11 +65,11 @@ function renderSliceSummaryMarkdown(params) {
65
65
  ? affects.map(a => ` - ${a}`).join("\n")
66
66
  : " []";
67
67
  const keyFilesYaml = keyFiles.length > 0
68
- ? keyFiles.map(f => ` - ${f}`).join("\n")
69
- : " - (none)";
68
+ ? `\n${keyFiles.map(f => ` - ${f}`).join("\n")}`
69
+ : " []";
70
70
  const keyDecisionsYaml = keyDecisions.length > 0
71
- ? keyDecisions.map(d => ` - ${d}`).join("\n")
72
- : " - (none)";
71
+ ? `\n${keyDecisions.map(d => ` - ${d}`).join("\n")}`
72
+ : " []";
73
73
  const patternsYaml = patternsEstablished.length > 0
74
74
  ? patternsEstablished.map(p => ` - ${p}`).join("\n")
75
75
  : " - (none)";
@@ -106,10 +106,8 @@ requires:
106
106
  ${requiresYaml}
107
107
  affects:
108
108
  ${affectsYaml}
109
- key_files:
110
- ${keyFilesYaml}
111
- key_decisions:
112
- ${keyDecisionsYaml}
109
+ key_files:${keyFilesYaml}
110
+ key_decisions:${keyDecisionsYaml}
113
111
  patterns_established:
114
112
  ${patternsYaml}
115
113
  observability_surfaces:
@@ -183,6 +181,31 @@ function renderUatMarkdown(params) {
183
181
  ${params.uatContent}
184
182
  `;
185
183
  }
184
+ function parseRequirementSection(summaryMd, heading, field) {
185
+ const headingLine = `## ${heading}\n\n`;
186
+ const start = summaryMd.indexOf(headingLine);
187
+ if (start === -1)
188
+ return [];
189
+ const contentStart = start + headingLine.length;
190
+ const nextHeading = summaryMd.indexOf("\n\n## ", contentStart);
191
+ const content = nextHeading === -1
192
+ ? summaryMd.slice(contentStart)
193
+ : summaryMd.slice(contentStart, nextHeading);
194
+ return content
195
+ .split("\n")
196
+ .map((line) => line.trim())
197
+ .filter((line) => line.startsWith("- "))
198
+ .map((line) => line.slice(2).trim())
199
+ .map((line) => {
200
+ const pair = line.match(/^(.+?)\s*(?:—|-)\s+(.+)$/);
201
+ const id = pair ? pair[1].trim() : line.trim();
202
+ const detail = pair ? pair[2].trim() : "";
203
+ if (!id || !detail)
204
+ return null;
205
+ return { id, [field]: detail };
206
+ })
207
+ .filter((entry) => entry !== null);
208
+ }
186
209
  /**
187
210
  * Handle the complete_slice operation end-to-end.
188
211
  *
@@ -218,6 +241,7 @@ export async function handleCompleteSlice(params, basePath) {
218
241
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
219
242
  const completedAt = new Date().toISOString();
220
243
  let guardError = null;
244
+ let existingSummaryMd = "";
221
245
  transaction(() => {
222
246
  // State machine preconditions (inside txn for atomicity).
223
247
  // Milestone/slice not existing is OK — insertMilestone/insertSlice below will auto-create.
@@ -228,6 +252,7 @@ export async function handleCompleteSlice(params, basePath) {
228
252
  return;
229
253
  }
230
254
  const slice = getSlice(params.milestoneId, params.sliceId);
255
+ existingSummaryMd = slice?.full_summary_md?.trim() ?? "";
231
256
  if (slice && isClosedStatus(slice.status)) {
232
257
  if (isStaleWrite("complete-slice")) {
233
258
  guardError = "__stale_duplicate__";
@@ -272,8 +297,29 @@ export async function handleCompleteSlice(params, basePath) {
272
297
  if (guardError) {
273
298
  return { error: guardError };
274
299
  }
300
+ const effectiveParams = { ...params };
301
+ if (existingSummaryMd) {
302
+ // Keep these heading names in lock-step with renderSliceSummaryMarkdown's
303
+ // section titles so omitted CompleteSliceParams requirement fields can be
304
+ // backfilled from previously rendered summary markdown.
305
+ if (effectiveParams.requirementsAdvanced === undefined) {
306
+ const parsed = parseRequirementSection(existingSummaryMd, "Requirements Advanced", "how");
307
+ if (parsed.length > 0)
308
+ effectiveParams.requirementsAdvanced = parsed;
309
+ }
310
+ if (effectiveParams.requirementsValidated === undefined) {
311
+ const parsed = parseRequirementSection(existingSummaryMd, "Requirements Validated", "proof");
312
+ if (parsed.length > 0)
313
+ effectiveParams.requirementsValidated = parsed;
314
+ }
315
+ if (effectiveParams.requirementsInvalidated === undefined) {
316
+ const parsed = parseRequirementSection(existingSummaryMd, "Requirements Invalidated or Re-scoped", "what");
317
+ if (parsed.length > 0)
318
+ effectiveParams.requirementsInvalidated = parsed;
319
+ }
320
+ }
275
321
  // Render summary markdown
276
- const summaryMd = renderSliceSummaryMarkdown(params);
322
+ const summaryMd = renderSliceSummaryMarkdown(effectiveParams);
277
323
  // Resolve and write summary to disk
278
324
  let summaryPath;
279
325
  const sliceDir = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
@@ -287,7 +333,7 @@ export async function handleCompleteSlice(params, basePath) {
287
333
  mkdirSync(manualSliceDir, { recursive: true });
288
334
  summaryPath = join(manualSliceDir, `${params.sliceId}-SUMMARY.md`);
289
335
  }
290
- const uatMd = renderUatMarkdown(params);
336
+ const uatMd = renderUatMarkdown(effectiveParams);
291
337
  const uatPath = summaryPath.replace(/-SUMMARY\.md$/, "-UAT.md");
292
338
  setSliceSummaryMd(params.milestoneId, params.sliceId, summaryMd, uatMd);
293
339
  let projectionStale = false;
@@ -1,6 +1,6 @@
1
1
  import { clearParseCache } from "../files.js";
2
2
  import { isClosedStatus } from "../status-guards.js";
3
- import { isNonEmptyString, validateStringArray } from "../validation.js";
3
+ import { isNonEmptyString, validateStringArray, validateTitle } from "../validation.js";
4
4
  import { transaction, getMilestone, getMilestoneSlices, getSlice, insertMilestone, insertSlice, upsertMilestonePlanning, upsertSlicePlanning, } from "../gsd-db.js";
5
5
  import { invalidateStateCache } from "../state.js";
6
6
  import { renderRoadmapFromDb } from "../markdown-renderer.js";
@@ -77,6 +77,9 @@ function validateSlices(value) {
77
77
  seen.add(sliceId);
78
78
  if (!isNonEmptyString(title))
79
79
  throw new Error(`slices[${index}].title must be a non-empty string`);
80
+ const titleIssue = validateTitle(title);
81
+ if (titleIssue)
82
+ throw new Error(`slices[${index}].title is invalid: ${titleIssue}`);
80
83
  if (!isNonEmptyString(risk))
81
84
  throw new Error(`slices[${index}].risk must be a non-empty string`);
82
85
  if (!Array.isArray(depends) || depends.some((item) => !isNonEmptyString(item))) {
@@ -127,6 +130,9 @@ function validateParams(params) {
127
130
  throw new Error("title is required");
128
131
  if (!isNonEmptyString(params?.vision))
129
132
  throw new Error("vision is required");
133
+ const milestoneTitleIssue = validateTitle(params.title);
134
+ if (milestoneTitleIssue)
135
+ throw new Error(`title is invalid: ${milestoneTitleIssue}`);
130
136
  return {
131
137
  ...params,
132
138
  dependsOn: params.dependsOn ? validateStringArray(params.dependsOn, "dependsOn") : [],