gsd-pi 2.82.0 → 3.0.0-dev.8b8d129d7

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 (744) hide show
  1. package/README.md +125 -32
  2. package/dist/cli.js +20 -9
  3. package/dist/headless.js +9 -2
  4. package/dist/resources/.managed-resources-content-hash +1 -1
  5. package/dist/resources/GSD-WORKFLOW.md +10 -1
  6. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  7. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  8. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  10. package/dist/resources/extensions/cmux/index.js +5 -0
  11. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  12. package/dist/resources/extensions/gsd/auto/loop.js +110 -37
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
  14. package/dist/resources/extensions/gsd/auto/phases.js +106 -38
  15. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  18. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  19. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  20. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
  21. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  22. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  23. package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
  24. package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
  25. package/dist/resources/extensions/gsd/auto-start.js +87 -14
  26. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  27. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  28. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  29. package/dist/resources/extensions/gsd/auto.js +216 -81
  30. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  32. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +10 -4
  33. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  34. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  36. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  37. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  38. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  40. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  41. package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
  42. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  43. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
  44. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  45. package/dist/resources/extensions/gsd/context-store.js +112 -0
  46. package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
  47. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  48. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  49. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  50. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  51. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  52. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  53. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  54. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  55. package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
  56. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  57. package/dist/resources/extensions/gsd/doctor.js +2 -28
  58. package/dist/resources/extensions/gsd/export-html.js +27 -425
  59. package/dist/resources/extensions/gsd/forensics.js +8 -3
  60. package/dist/resources/extensions/gsd/git-service.js +138 -10
  61. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  62. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  63. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  64. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  65. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  66. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  67. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  68. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  69. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  70. package/dist/resources/extensions/gsd/markdown-renderer.js +16 -9
  71. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  72. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  73. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  74. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  75. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  76. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  77. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  78. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  79. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  80. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  81. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  82. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  83. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  84. package/dist/resources/extensions/gsd/paths.js +4 -0
  85. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  86. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  87. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  88. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  89. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  90. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  91. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  92. package/dist/resources/extensions/gsd/preferences.js +2 -0
  93. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  94. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  95. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  96. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  97. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  98. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  99. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  100. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  101. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  102. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  103. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  104. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  105. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  107. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  108. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  109. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  110. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  111. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  112. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  113. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  114. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  115. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  116. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  117. package/dist/resources/extensions/gsd/state.js +14 -4
  118. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  119. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  120. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  121. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  122. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  123. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  124. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  125. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  126. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  127. package/dist/resources/extensions/gsd/unit-context-manifest.js +36 -17
  128. package/dist/resources/extensions/gsd/validation.js +23 -1
  129. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  130. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  131. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  132. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  133. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  134. package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
  135. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  136. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  137. package/dist/resources/extensions/shared/html-shell.js +388 -0
  138. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  139. package/dist/resources/extensions/subagent/index.js +448 -78
  140. package/dist/resources/extensions/subagent/launch.js +77 -0
  141. package/dist/resources/extensions/subagent/run-store.js +148 -0
  142. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  143. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  144. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  145. package/dist/resources/extensions/visual-brief/index.js +5 -0
  146. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  147. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  148. package/dist/resources/skills/forensics/SKILL.md +1 -1
  149. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  150. package/dist/web/standalone/.next/BUILD_ID +1 -1
  151. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  152. package/dist/web/standalone/.next/build-manifest.json +4 -4
  153. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  154. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  155. package/dist/web/standalone/.next/required-server-files.json +3 -3
  156. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  157. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  167. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  171. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  172. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  177. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  184. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  196. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  216. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  226. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  232. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  248. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  252. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/index.html +1 -1
  262. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  263. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  264. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  265. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  266. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  267. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  268. package/dist/web/standalone/.next/server/app/page.js +2 -2
  269. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  272. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  273. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  274. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  275. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  276. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  277. package/dist/web/standalone/.next/server/middleware.js +2 -2
  278. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  279. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  280. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  281. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  282. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  283. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  284. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  285. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  286. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  287. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  288. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  289. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  291. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  292. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  293. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  294. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  295. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  296. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  297. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  298. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  299. package/dist/web/standalone/server.js +1 -1
  300. package/package.json +6 -5
  301. package/packages/contracts/dist/rpc.test.js +7 -0
  302. package/packages/contracts/dist/rpc.test.js.map +1 -1
  303. package/packages/contracts/dist/workflow.d.ts +21 -0
  304. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  305. package/packages/contracts/dist/workflow.js +24 -0
  306. package/packages/contracts/dist/workflow.js.map +1 -1
  307. package/packages/contracts/src/rpc.test.ts +8 -0
  308. package/packages/contracts/src/workflow.ts +24 -0
  309. package/packages/daemon/package.json +2 -2
  310. package/packages/mcp-server/README.md +14 -3
  311. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  312. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  313. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  314. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  315. package/packages/mcp-server/package.json +2 -2
  316. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  317. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  318. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  319. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  320. package/packages/native/package.json +1 -1
  321. package/packages/native/tsconfig.json +2 -1
  322. package/packages/native/tsconfig.tsbuildinfo +1 -1
  323. package/packages/pi-agent-core/package.json +1 -1
  324. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  325. package/packages/pi-ai/dist/index.d.ts +2 -2
  326. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  327. package/packages/pi-ai/dist/index.js +1 -1
  328. package/packages/pi-ai/dist/index.js.map +1 -1
  329. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  330. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  331. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  332. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  333. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  334. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  335. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  336. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  337. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  338. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  339. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  340. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  341. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  342. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  343. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  344. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  345. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  346. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  347. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  348. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  350. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  351. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  352. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  354. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  355. package/packages/pi-ai/package.json +1 -1
  356. package/packages/pi-ai/src/index.ts +7 -2
  357. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  358. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  359. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  360. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  361. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  362. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  363. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  364. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  365. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  366. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  367. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  368. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  369. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  370. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  372. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  373. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  374. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  376. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  378. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  380. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  382. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  384. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  385. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  388. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  390. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  394. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  395. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  396. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  397. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  398. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  400. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  401. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  402. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  403. package/packages/pi-coding-agent/package.json +1 -1
  404. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  405. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  406. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  407. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  408. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  409. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  410. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  411. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  412. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  413. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  414. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  415. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  416. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  417. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  418. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  419. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  420. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  421. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  422. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  423. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  424. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  425. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  426. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  427. package/packages/pi-tui/dist/terminal.js +12 -0
  428. package/packages/pi-tui/dist/terminal.js.map +1 -1
  429. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  430. package/packages/pi-tui/dist/tui.js +108 -24
  431. package/packages/pi-tui/dist/tui.js.map +1 -1
  432. package/packages/pi-tui/package.json +1 -1
  433. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  434. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  435. package/packages/pi-tui/src/terminal.ts +11 -0
  436. package/packages/pi-tui/src/tui.ts +111 -24
  437. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  438. package/packages/rpc-client/package.json +1 -1
  439. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  440. package/pkg/package.json +1 -1
  441. package/src/resources/GSD-WORKFLOW.md +10 -1
  442. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  443. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  444. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  445. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  446. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  447. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  448. package/src/resources/extensions/cmux/index.ts +6 -0
  449. package/src/resources/extensions/gsd/auto/contracts.ts +62 -16
  450. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  451. package/src/resources/extensions/gsd/auto/loop.ts +111 -38
  452. package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
  453. package/src/resources/extensions/gsd/auto/phases.ts +129 -49
  454. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  455. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  456. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  457. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  458. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  459. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  460. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
  461. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  462. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  463. package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
  464. package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
  465. package/src/resources/extensions/gsd/auto-start.ts +94 -12
  466. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  467. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  468. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  469. package/src/resources/extensions/gsd/auto.ts +217 -70
  470. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  471. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  472. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -4
  473. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  474. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  475. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  476. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  477. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  478. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  479. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  480. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  481. package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
  482. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  483. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
  484. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  485. package/src/resources/extensions/gsd/context-store.ts +120 -1
  486. package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
  487. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  488. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  489. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  490. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  491. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  492. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  493. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  494. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  495. package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
  496. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  497. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  498. package/src/resources/extensions/gsd/doctor.ts +2 -27
  499. package/src/resources/extensions/gsd/export-html.ts +27 -427
  500. package/src/resources/extensions/gsd/forensics.ts +7 -3
  501. package/src/resources/extensions/gsd/git-service.ts +166 -11
  502. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  503. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  504. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  505. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  506. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  507. package/src/resources/extensions/gsd/journal.ts +8 -1
  508. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  509. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  510. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  511. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  512. package/src/resources/extensions/gsd/markdown-renderer.ts +16 -9
  513. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  514. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  515. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  516. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  517. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  518. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  519. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  520. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  521. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  522. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  523. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  524. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  525. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  526. package/src/resources/extensions/gsd/paths.ts +5 -0
  527. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  528. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  529. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  530. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  531. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  532. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  533. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  534. package/src/resources/extensions/gsd/preferences.ts +5 -0
  535. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  536. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  537. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  538. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  539. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  540. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  541. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  542. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  543. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  544. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  545. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  546. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  547. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  548. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  549. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  550. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  551. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  552. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  553. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  554. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  555. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  556. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  557. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  558. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  559. package/src/resources/extensions/gsd/state.ts +15 -4
  560. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  561. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  562. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  563. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  564. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  565. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  566. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +375 -1
  567. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +578 -8
  568. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  569. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  570. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  571. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
  572. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  573. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  574. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  575. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  576. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  577. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  578. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  579. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  580. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  581. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  582. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  583. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  584. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  585. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  586. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  587. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  588. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  589. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
  590. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  591. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  592. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  593. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  594. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  595. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  596. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  597. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
  598. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  599. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  600. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  601. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  602. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  603. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  604. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  605. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  606. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  607. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  608. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  609. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  610. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  611. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  612. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  613. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  614. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  615. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  616. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  617. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  618. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  619. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  620. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  621. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  622. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  623. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  624. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  625. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  626. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  627. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  628. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  629. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  630. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  631. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  632. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  633. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  634. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  635. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  636. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  637. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  638. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  639. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  640. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  641. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  642. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  643. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  644. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  645. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  646. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  647. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  648. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  649. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  650. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  651. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  652. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  653. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  654. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  655. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  656. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +70 -0
  657. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  658. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  659. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  660. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  661. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  662. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  663. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  664. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  665. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  666. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  667. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
  668. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  669. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  670. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  671. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  672. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  673. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  674. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  675. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  676. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  677. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +128 -9
  678. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  679. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  680. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  681. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  682. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  683. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  684. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  685. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  686. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  687. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  688. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  689. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
  690. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  691. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  692. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  693. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  694. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  695. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  696. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  697. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  698. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  699. package/src/resources/extensions/gsd/types.ts +1 -1
  700. package/src/resources/extensions/gsd/unit-context-manifest.ts +51 -18
  701. package/src/resources/extensions/gsd/validation.ts +23 -1
  702. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  703. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  704. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  705. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  706. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  707. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  708. package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
  709. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  710. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  711. package/src/resources/extensions/shared/html-shell.ts +412 -0
  712. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  713. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  714. package/src/resources/extensions/subagent/index.ts +567 -103
  715. package/src/resources/extensions/subagent/launch.ts +131 -0
  716. package/src/resources/extensions/subagent/run-store.ts +218 -0
  717. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  718. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  719. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  720. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  721. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  722. package/src/resources/extensions/visual-brief/index.ts +8 -0
  723. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  724. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  725. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  726. package/src/resources/skills/forensics/SKILL.md +1 -1
  727. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  728. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  729. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  730. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  731. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  732. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  733. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  734. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  735. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  736. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  737. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  738. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  739. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  740. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  741. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  742. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  743. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → _kljR-_Miq_YV1IW0wpRO}/_buildManifest.js +0 -0
  744. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → _kljR-_Miq_YV1IW0wpRO}/_ssgManifest.js +0 -0
@@ -44,6 +44,8 @@ import { resolveManifest } from "../unit-context-manifest.js";
44
44
  import { createWorktreeSafetyModule } from "../worktree-safety.js";
45
45
  import { isSuspiciousGhostCompletion } from "../auto-unit-closeout.js";
46
46
  import { decideVerificationRetry, verificationRetryKey } from "./verification-retry-policy.js";
47
+ import { buildPhaseHandoffOutcome, setAutoOutcomeWidget } from "../auto-dashboard.js";
48
+ import { getConsecutiveDispatchBlocker } from "../dispatch-guard.js";
47
49
  // ─── Path Comparison Helper ───────────────────────────────────────────────
48
50
  /** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
49
51
  function isSamePathLocal(a, b) {
@@ -103,6 +105,12 @@ function unitWritesSource(unitType) {
103
105
  function formatWorktreeSafetyFailure(result) {
104
106
  return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
105
107
  }
108
+ function formatWorktreeSafetyStopReason(result) {
109
+ if (result.kind === "empty-worktree-with-project-content") {
110
+ return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
111
+ }
112
+ return `Worktree Safety failed (${result.kind}).`;
113
+ }
106
114
  function resolveEmptyWorktreeWithProjectContent(unitRoot, projectRoot) {
107
115
  if (isSamePathLocal(unitRoot, projectRoot))
108
116
  return false;
@@ -176,7 +184,7 @@ async function validateSourceWriteWorktreeSafety(ic, unitType, unitId, milestone
176
184
  projectRoot,
177
185
  });
178
186
  ctx.ui.notify(msg, "error");
179
- await deps.stopAuto(ctx, pi, msg);
187
+ await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
180
188
  return { action: "break", reason: result.kind };
181
189
  }
182
190
  // ─── Session timeout auto-resume state ────────────────────────────────────────
@@ -968,12 +976,25 @@ export async function runDispatch(ic, preData, loopState) {
968
976
  prompt = preDispatchResult.prompt;
969
977
  }
970
978
  const guardBasePath = _resolveDispatchGuardBasePath(s);
971
- const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(guardBasePath, deps.getMainBranch(guardBasePath), unitType, unitId);
979
+ let mainBranch = "main";
980
+ try {
981
+ mainBranch = deps.getMainBranch(guardBasePath);
982
+ }
983
+ catch (err) {
984
+ debugLog("autoLoop", { phase: "getMainBranch-failed", error: String(err) });
985
+ }
986
+ const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(guardBasePath, mainBranch, unitType, unitId);
972
987
  if (priorSliceBlocker) {
973
988
  await deps.stopAuto(ctx, pi, priorSliceBlocker);
974
989
  debugLog("autoLoop", { phase: "exit", reason: "prior-slice-blocker" });
975
990
  return { action: "break", reason: "prior-slice-blocker" };
976
991
  }
992
+ const consecutiveDispatchBlocker = getConsecutiveDispatchBlocker(loopState, state.phase, unitType, unitId);
993
+ if (consecutiveDispatchBlocker) {
994
+ await deps.stopAuto(ctx, pi, consecutiveDispatchBlocker);
995
+ debugLog("autoLoop", { phase: "exit", reason: "consecutive-dispatch-blocker" });
996
+ return { action: "break", reason: "consecutive-dispatch-blocker" };
997
+ }
977
998
  const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(ic, unitType, unitId, mid, "pre-dispatch");
978
999
  if (worktreeSafetyBlock)
979
1000
  return worktreeSafetyBlock;
@@ -1030,7 +1051,6 @@ export async function runDispatch(ic, preData, loopState) {
1030
1051
  ctx.ui.notify(`Stuck recovery: artifact for ${unitType} ${unitId} found on disk. Invalidating caches.`, "info");
1031
1052
  deps.invalidateAllCaches();
1032
1053
  loopState.recentUnits.length = 0;
1033
- loopState.stuckRecoveryAttempts = 0;
1034
1054
  return { action: "continue" };
1035
1055
  }
1036
1056
  ctx.ui.notify(`Stuck on ${unitType} ${unitId} (${stuckSignal.reason}). Invalidating caches and retrying.`, "warning");
@@ -1324,35 +1344,8 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1324
1344
  s.currentUnit.type === unitType &&
1325
1345
  s.currentUnit.id === unitId);
1326
1346
  const previousTier = s.currentUnitRouting?.tier;
1327
- // Scope workflow-logger buffer to this unit so post-finalize drains are
1328
- // per-unit. Without this, the module-level _buffer accumulates across every
1329
- // unit in the same Node process (see workflow-logger.ts module header).
1330
- _resetLogs();
1331
1347
  const dispatchKey = `${unitType}/${unitId}`;
1332
- s.unitDispatchCount.set(dispatchKey, (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1);
1333
- s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
1334
- s.lastGitActionFailure = null;
1335
- s.lastGitActionStatus = null;
1336
- s.lastUnitAgentEndMessages = null;
1337
- setCurrentPhase(unitType, {
1338
- basePath: s.basePath,
1339
- traceId: ic.flowId,
1340
- turnId: `iter-${ic.iteration}`,
1341
- causedBy: "unit-start",
1342
- });
1343
- s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
1344
- const unitStartSeq = ic.nextSeq();
1345
- deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
1346
- deps.captureAvailableSkills();
1347
- writeUnitRuntimeRecord(s.basePath, unitType, unitId, s.currentUnit.startedAt, {
1348
- phase: "dispatched",
1349
- wrapupWarningSent: false,
1350
- timeoutAt: null,
1351
- lastProgressAt: s.currentUnit.startedAt,
1352
- progressCount: 0,
1353
- lastProgressKind: "dispatch",
1354
- recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
1355
- });
1348
+ const nextDispatchCount = (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1;
1356
1349
  // Status bar (widget + preconditions deferred until after model selection — see #2899)
1357
1350
  ctx.ui.setStatus("gsd-auto", "auto");
1358
1351
  if (mid)
@@ -1406,7 +1399,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1406
1399
  finalPrompt = `${capped}\n\n---\n\n${finalPrompt}`;
1407
1400
  s.pendingCrashRecovery = null;
1408
1401
  }
1409
- else if ((s.unitDispatchCount.get(dispatchKey) ?? 0) > 1) {
1402
+ else if (nextDispatchCount > 1) {
1410
1403
  const diagnostic = deps.getDeepDiagnostic(s.basePath);
1411
1404
  if (diagnostic) {
1412
1405
  const cappedDiag = diagnostic.length > MAX_RECOVERY_CHARS
@@ -1445,6 +1438,11 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1445
1438
  logWarning("engine", "Prompt reorder failed", { error: msg });
1446
1439
  }
1447
1440
  // Select and apply model (with tier escalation on retry — normal units only)
1441
+ const prevUnitRouting = s.currentUnitRouting;
1442
+ const prevUnitModel = s.currentUnitModel;
1443
+ const prevDispatchedModelId = s.currentDispatchedModelId;
1444
+ const prevSessionModel = ctx.model;
1445
+ const prevSessionThinkingLevel = pi.getThinkingLevel();
1448
1446
  const modelResult = await deps.selectAndApplyModel(ctx, pi, unitType, unitId, s.basePath, prefs, s.verbose, s.autoModeStartModel, sidecarItem ? undefined : { isRetry, previousTier }, undefined, s.manualSessionModelOverride, s.autoModeStartThinkingLevel);
1449
1447
  s.currentUnitRouting =
1450
1448
  modelResult.routing;
@@ -1488,12 +1486,58 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1488
1486
  ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
1489
1487
  : undefined,
1490
1488
  baseUrl: s.currentUnitModel?.baseUrl ?? ctx.model?.baseUrl,
1489
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
1491
1490
  });
1492
1491
  if (compatibilityError) {
1492
+ s.currentUnitRouting = prevUnitRouting;
1493
+ s.currentUnitModel = prevUnitModel;
1494
+ s.currentDispatchedModelId = prevDispatchedModelId;
1495
+ if (s.checkpointSha) {
1496
+ cleanupCheckpoint(s.basePath, unitId);
1497
+ s.checkpointSha = null;
1498
+ }
1499
+ if (prevSessionModel) {
1500
+ const ok = await pi.setModel(prevSessionModel, { persist: false });
1501
+ if (!ok) {
1502
+ ctx.ui.notify("Failed to restore previous session model after compatibility check failure.", "warning");
1503
+ }
1504
+ if (prevSessionThinkingLevel) {
1505
+ pi.setThinkingLevel(prevSessionThinkingLevel);
1506
+ }
1507
+ }
1493
1508
  ctx.ui.notify(compatibilityError, "error");
1494
1509
  await deps.stopAuto(ctx, pi, compatibilityError);
1495
1510
  return { action: "break", reason: "workflow-capability" };
1496
1511
  }
1512
+ // Scope workflow-logger buffer to this unit so post-finalize drains are
1513
+ // per-unit. Without this, the module-level _buffer accumulates across every
1514
+ // unit in the same Node process (see workflow-logger.ts module header).
1515
+ _resetLogs();
1516
+ const unitStartedAt = Date.now();
1517
+ s.unitDispatchCount.set(dispatchKey, nextDispatchCount);
1518
+ s.currentUnit = { type: unitType, id: unitId, startedAt: unitStartedAt };
1519
+ s.lastGitActionFailure = null;
1520
+ s.lastGitActionStatus = null;
1521
+ s.lastUnitAgentEndMessages = null;
1522
+ setCurrentPhase(unitType, {
1523
+ basePath: s.basePath,
1524
+ traceId: ic.flowId,
1525
+ turnId: `iter-${ic.iteration}`,
1526
+ causedBy: "unit-start",
1527
+ });
1528
+ s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
1529
+ const unitStartSeq = ic.nextSeq();
1530
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
1531
+ deps.captureAvailableSkills();
1532
+ writeUnitRuntimeRecord(s.basePath, unitType, unitId, unitStartedAt, {
1533
+ phase: "dispatched",
1534
+ wrapupWarningSent: false,
1535
+ timeoutAt: null,
1536
+ lastProgressAt: unitStartedAt,
1537
+ progressCount: 0,
1538
+ lastProgressKind: "dispatch",
1539
+ recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
1540
+ });
1497
1541
  // Progress widget + preconditions — deferred to after model selection so the
1498
1542
  // widget's first render tick shows the correct model (#2899).
1499
1543
  deps.updateProgressWidget(ctx, unitType, unitId, state);
@@ -1656,6 +1700,15 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1656
1700
  await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1657
1701
  return { action: "break", reason: "session-timeout" };
1658
1702
  }
1703
+ if (unitResult.errorContext?.isTransient &&
1704
+ errorCategory === "aborted") {
1705
+ ctx.ui.notify(`Unit ${unitType} ${unitId} was aborted by the user. Pausing auto-mode (recoverable).`, "warning");
1706
+ debugLog("autoLoop", { phase: "unit-aborted-transient-pause", unitType, unitId, category: errorCategory });
1707
+ await deps.pauseAuto(ctx, pi);
1708
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1709
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1710
+ return { action: "break", reason: "unit-aborted-pause" };
1711
+ }
1659
1712
  // All other cancelled states (structural errors, non-transient failures): hard stop
1660
1713
  if (s.currentUnit) {
1661
1714
  await deps.closeoutUnit(ctx, s.basePath, unitType, unitId, s.currentUnit.startedAt, deps.buildSnapshotOpts(unitType, unitId));
@@ -1711,12 +1764,12 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1711
1764
  }
1712
1765
  }
1713
1766
  }
1714
- if (s.currentUnitRouting) {
1715
- deps.recordOutcome(unitType, s.currentUnitRouting.tier, true);
1716
- }
1717
1767
  const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
1718
1768
  const artifactVerified = skipArtifactVerification ||
1719
1769
  verifyExpectedArtifact(unitType, unitId, s.basePath);
1770
+ if (s.currentUnitRouting) {
1771
+ deps.recordOutcome(unitType, s.currentUnitRouting.tier, artifactVerified);
1772
+ }
1720
1773
  if (artifactVerified) {
1721
1774
  s.unitDispatchCount.delete(dispatchKey);
1722
1775
  s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
@@ -1740,7 +1793,10 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1740
1793
  logWarning("engine", `phase anchor failed: ${err instanceof Error ? err.message : String(err)}`);
1741
1794
  }
1742
1795
  }
1743
- deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitResult.status, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
1796
+ const unitEndStatus = !artifactVerified && unitResult.status === "completed"
1797
+ ? "no-artifact"
1798
+ : unitResult.status;
1799
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitEndStatus, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
1744
1800
  // ── Safety harness: checkpoint cleanup or rollback ──
1745
1801
  if (s.checkpointSha) {
1746
1802
  if (unitResult.status === "error" && safetyConfig.auto_rollback) {
@@ -1801,6 +1857,8 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
1801
1857
  const preUnitSnapshot = s.currentUnit
1802
1858
  ? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
1803
1859
  : null;
1860
+ s.currentUnit = null;
1861
+ clearCurrentPhase();
1804
1862
  const preResultGuard = await withTimeout(deps.postUnitPreVerification(postUnitCtx, preVerificationOpts), FINALIZE_PRE_TIMEOUT_MS, "postUnitPreVerification");
1805
1863
  if (preResultGuard.timedOut) {
1806
1864
  return failClosedOnFinalizeTimeout(ic, iterData, loopState, "pre", preUnitSnapshot?.startedAt ?? Date.now());
@@ -1914,9 +1972,19 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
1914
1972
  lastProgressAt: Date.now(),
1915
1973
  lastProgressKind: "finalize-success",
1916
1974
  });
1975
+ if (!preUnitSnapshot.type.startsWith("hook/") &&
1976
+ preUnitSnapshot.type !== "custom-step" &&
1977
+ preUnitSnapshot.type !== "complete-milestone") {
1978
+ setAutoOutcomeWidget(ctx, {
1979
+ ...buildPhaseHandoffOutcome({
1980
+ unitType: preUnitSnapshot.type,
1981
+ unitId: preUnitSnapshot.id,
1982
+ agentEndMessages: s.lastUnitAgentEndMessages,
1983
+ }),
1984
+ startedAt: s.autoStartTime,
1985
+ });
1986
+ }
1917
1987
  }
1918
- s.currentUnit = null;
1919
- clearCurrentPhase();
1920
1988
  // Surface accumulated workflow-logger issues for this unit to the user.
1921
1989
  // Warnings/errors logged during the unit are buffered in the logger and
1922
1990
  // drained here so the user sees a single consolidated post-unit alert.
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Mutable auto-mode session state container.
1
3
  /**
2
4
  * AutoSession — encapsulates all mutable auto-mode state into a single instance.
3
5
  *
@@ -26,6 +28,7 @@ export class AutoSession {
26
28
  active = false;
27
29
  paused = false;
28
30
  completionStopInProgress = false;
31
+ preserveStepSurfaceAfterLoopExit = false;
29
32
  stepMode = false;
30
33
  verbose = false;
31
34
  activeEngineId = null;
@@ -159,6 +162,7 @@ export class AutoSession {
159
162
  commandPollingCleanup = null;
160
163
  // ── Orchestration seam ───────────────────────────────────────────────────
161
164
  orchestration = null;
165
+ pendingOrchestrationDispatch = null;
162
166
  // ── Loop promise state ──────────────────────────────────────────────────
163
167
  // Per-unit resolve function and session-switch guard live at module level
164
168
  // in auto-loop.ts (_currentResolve, _sessionSwitchInFlight).
@@ -210,6 +214,7 @@ export class AutoSession {
210
214
  this.active = false;
211
215
  this.paused = false;
212
216
  this.completionStopInProgress = false;
217
+ this.preserveStepSurfaceAfterLoopExit = false;
213
218
  this.stepMode = false;
214
219
  this.verbose = false;
215
220
  this.activeEngineId = null;
@@ -284,6 +289,7 @@ export class AutoSession {
284
289
  this.commandPollingCleanup = null;
285
290
  // Orchestration seam
286
291
  this.orchestration = null;
292
+ this.pendingOrchestrationDispatch = null;
287
293
  // Loop promise state lives in auto-loop.ts module scope
288
294
  }
289
295
  resetAfterStop(options = {}) {
@@ -66,6 +66,9 @@ export function decideEngineDispatch(input) {
66
66
  export function decideFinalizeResult(input) {
67
67
  if (input.action === "break") {
68
68
  const reason = input.reason ?? "unknown";
69
+ if (reason === "step-wizard") {
70
+ return { action: "complete-and-break" };
71
+ }
69
72
  return {
70
73
  action: "stop",
71
74
  failureClass: reason === "git-closeout-failure" ? "git" : "closeout",
@@ -4,6 +4,18 @@ import { createRequire } from "node:module";
4
4
  const require = createRequire(import.meta.url);
5
5
  const DEFAULT_MEMORY_PRESSURE_THRESHOLD = 0.85;
6
6
  const DEFAULT_HEAP_LIMIT_MB = 4096;
7
+ /**
8
+ * Returns true on auto-mode startup, then every configured interval.
9
+ *
10
+ * Iteration 1 is checked explicitly so early session memory pressure cannot
11
+ * bypass the periodic interval guard.
12
+ */
13
+ export function shouldCheckMemoryPressure(iteration, interval) {
14
+ if (!Number.isInteger(interval) || interval <= 0) {
15
+ throw new Error("Memory pressure check interval must be a positive integer");
16
+ }
17
+ return iteration === 1 || iteration % interval === 0;
18
+ }
7
19
  function defaultHeapLimitBytes() {
8
20
  const v8 = require("node:v8");
9
21
  const limit = v8.getHeapStatistics?.().heap_size_limit;
@@ -27,6 +27,19 @@ export function extractUatSliceId(unitId) {
27
27
  return slice;
28
28
  return null;
29
29
  }
30
+ export function buildPhaseHandoffOutcome(input) {
31
+ const phase = unitPhaseLabel(input.unitType);
32
+ const detail = extractLastAssistantSummary(input.agentEndMessages) ??
33
+ `Completed ${unitVerb(input.unitType)} ${input.unitId}.`;
34
+ return {
35
+ status: "complete",
36
+ title: `${phase} complete`,
37
+ detail,
38
+ unitLabel: `${unitVerb(input.unitType)} ${input.unitId}`,
39
+ nextAction: "Preparing the next phase. Review this handoff while the next session starts.",
40
+ commands: ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history"],
41
+ };
42
+ }
30
43
  // ─── Unit Description Helpers ─────────────────────────────────────────────────
31
44
  export function unitVerb(unitType) {
32
45
  if (unitType.startsWith("hook/"))
@@ -464,7 +477,6 @@ export function _resetWidgetModeForTests() {
464
477
  export function updateProgressWidget(ctx, unitType, unitId, state, accessors, tierBadge) {
465
478
  if (!ctx.hasUI)
466
479
  return;
467
- ctx.ui.setWidget("gsd-outcome", undefined);
468
480
  // Welcome header is a startup-only banner — permanently suppress it once
469
481
  // auto-mode activates. The dashboard widget owns all status from here.
470
482
  // Note: setHeader(undefined) restores the built-in header (logo +
@@ -927,3 +939,56 @@ function normalizeRollupText(value) {
927
939
  return null;
928
940
  return clean;
929
941
  }
942
+ function isAssistantMessage(value) {
943
+ if (!value || typeof value !== "object")
944
+ return false;
945
+ const record = value;
946
+ if (record.role === "assistant")
947
+ return true;
948
+ const message = record.message;
949
+ if (message && typeof message === "object") {
950
+ return message.role === "assistant";
951
+ }
952
+ return false;
953
+ }
954
+ function extractLastAssistantSummary(messages) {
955
+ if (!messages || messages.length === 0)
956
+ return null;
957
+ for (let i = messages.length - 1; i >= 0; i--) {
958
+ if (!isAssistantMessage(messages[i]))
959
+ continue;
960
+ const text = extractMessageText(messages[i]);
961
+ const clean = normalizeRollupText(text);
962
+ if (clean)
963
+ return truncateToWidth(clean, 220, "…");
964
+ }
965
+ return null;
966
+ }
967
+ function extractMessageText(value) {
968
+ if (typeof value === "string")
969
+ return value;
970
+ if (!value || typeof value !== "object")
971
+ return null;
972
+ const record = value;
973
+ if (typeof record.content === "string")
974
+ return record.content;
975
+ const message = record.message;
976
+ if (message && typeof message === "object") {
977
+ return extractMessageText(message);
978
+ }
979
+ const content = record.content;
980
+ if (Array.isArray(content)) {
981
+ const parts = content
982
+ .map((part) => {
983
+ if (typeof part === "string")
984
+ return part;
985
+ if (!part || typeof part !== "object")
986
+ return "";
987
+ const partRecord = part;
988
+ return typeof partRecord.text === "string" ? partRecord.text : "";
989
+ })
990
+ .filter(Boolean);
991
+ return parts.length > 0 ? parts.join(" ") : null;
992
+ }
993
+ return null;
994
+ }
@@ -224,6 +224,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
224
224
  unitType,
225
225
  authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
226
226
  baseUrl: ctx.model?.baseUrl,
227
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
227
228
  });
228
229
  if (compatibilityError) {
229
230
  ctx.ui.notify(compatibilityError, "error");
@@ -102,6 +102,9 @@ function missingSliceStop(mid, phase) {
102
102
  level: "error",
103
103
  };
104
104
  }
105
+ function isRegistryMilestoneComplete(state, mid) {
106
+ return state.registry.some((milestone) => milestone.id === mid && milestone.status === "complete");
107
+ }
105
108
  /**
106
109
  * Check for milestone slices missing SUMMARY files.
107
110
  * Returns array of missing slice IDs, or empty array if all present or DB unavailable.
@@ -247,6 +250,8 @@ export const DISPATCH_RULES = [
247
250
  return null;
248
251
  if (!MILESTONE_ID_RE.test(mid))
249
252
  return null;
253
+ if (isRegistryMilestoneComplete(state, mid))
254
+ return null;
250
255
  // Align with the plan-v2 gate's lookup semantics: whitespace-only counts
251
256
  // as missing, and an auto worktree may fall back to GSD_PROJECT_ROOT.
252
257
  if (hasFinalizedMilestoneContext(basePath, mid))
@@ -294,9 +299,7 @@ export const DISPATCH_RULES = [
294
299
  const attempts = incrementUatCount(basePath, mid, sliceId);
295
300
  if (attempts > MAX_UAT_ATTEMPTS) {
296
301
  return {
297
- action: "stop",
298
- reason: `run-uat for ${mid}/${sliceId} has been dispatched ${attempts - 1} times without producing a verdict. Verification commands may be broken — fix the UAT spec or manually write an ASSESSMENT verdict.`,
299
- level: "warning",
302
+ action: "skip",
300
303
  };
301
304
  }
302
305
  const uatFile = resolveSliceFile(basePath, mid, sliceId, "UAT");
@@ -557,6 +560,8 @@ export const DISPATCH_RULES = [
557
560
  match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
558
561
  if (state.phase !== "pre-planning")
559
562
  return null;
563
+ if (isRegistryMilestoneComplete(state, mid))
564
+ return null;
560
565
  const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
561
566
  const hasContext = !!(contextFile && (await loadFile(contextFile)));
562
567
  if (hasContext)
@@ -609,7 +614,7 @@ export const DISPATCH_RULES = [
609
614
  },
610
615
  },
611
616
  {
612
- name: "planning (require_slice_discussion) → pause for discussion (#3454)",
617
+ name: "planning (require_slice_discussion) → pause for discussion",
613
618
  match: async ({ state, mid, basePath, prefs }) => {
614
619
  if (state.phase !== "planning")
615
620
  return null;
@@ -1016,7 +1021,7 @@ export const DISPATCH_RULES = [
1016
1021
  mkdirSync(mDir, { recursive: true });
1017
1022
  const validationPath = join(mDir, buildMilestoneFileName(mid, "VALIDATION"));
1018
1023
  const skipSource = trivialVariant
1019
- ? "trivial-scope pipeline variant (#4781)"
1024
+ ? "trivial-scope pipeline variant"
1020
1025
  : "`skip_milestone_validation` preference";
1021
1026
  const skipValidationReason = trivialVariant ? "trivial-scope" : "preference";
1022
1027
  const content = [
@@ -1091,19 +1096,19 @@ export const DISPATCH_RULES = [
1091
1096
  return { action: "skip" };
1092
1097
  }
1093
1098
  }
1094
- // Safety guard (#2675): block completion when VALIDATION verdict is
1095
- // needs-remediation. The state machine treats needs-remediation as
1096
- // terminal (to prevent validate-milestone loops per #832), but
1097
- // completing-milestone should NOT proceed — remediation work is needed.
1099
+ // Safety guard (#2675, #5747, #5920): block completion when VALIDATION
1100
+ // verdict is anything other than pass. The state machine treats these
1101
+ // verdicts as terminal, but completing-milestone should NOT proceed
1102
+ // remediation or human attention is needed.
1098
1103
  const validationFile = resolveMilestoneFile(basePath, mid, "VALIDATION");
1099
1104
  if (validationFile) {
1100
1105
  const validationContent = await loadFile(validationFile);
1101
1106
  if (validationContent) {
1102
1107
  const verdict = extractVerdict(validationContent);
1103
- if (verdict === "needs-remediation") {
1108
+ if (verdict !== "pass") {
1104
1109
  return {
1105
1110
  action: "stop",
1106
- reason: `Cannot complete milestone ${mid}: VALIDATION verdict is "needs-remediation". Address the remediation findings and re-run validation, or update the verdict manually.`,
1111
+ reason: `Cannot complete milestone ${mid}: VALIDATION verdict is "${verdict}". Address the validation findings and re-run validation, or run \`/gsd verdict pass --rationale "..."\` to override.`,
1107
1112
  level: "warning",
1108
1113
  };
1109
1114
  }
@@ -1118,16 +1123,12 @@ export const DISPATCH_RULES = [
1118
1123
  level: "error",
1119
1124
  };
1120
1125
  }
1121
- // Safety guard (#1703): verify the milestone produced implementation
1122
- // artifacts (non-.gsd/ files). A milestone with only plan files and
1123
- // zero implementation code should not be marked complete.
1126
+ // Safety signal (#1703, #5097): detect milestones with only .gsd/
1127
+ // artifacts. This no longer hard-blocks completion because some
1128
+ // milestones are intentionally planning/documentation-only.
1124
1129
  const artifactCheck = hasImplementationArtifacts(basePath, mid);
1125
1130
  if (artifactCheck === "absent") {
1126
- return {
1127
- action: "stop",
1128
- reason: `Cannot complete milestone ${mid}: no implementation files found outside .gsd/. The milestone has only plan files — actual code changes are required.`,
1129
- level: "error",
1130
- };
1131
+ logWarning("dispatch", `Milestone ${mid} has no implementation files outside .gsd/ — continuing complete-milestone dispatch (planning-only/documentation-only milestone).`);
1131
1132
  }
1132
1133
  if (artifactCheck === "unknown") {
1133
1134
  logWarning("dispatch", `Implementation artifact check inconclusive for ${mid} — proceeding (git context unavailable)`);
@@ -494,6 +494,8 @@ autoModeStartThinkingLevel) {
494
494
  * Handles formats: "provider/model", "bare-id", "org/model-name" (OpenRouter).
495
495
  */
496
496
  export function resolveModelId(modelId, availableModels, currentProvider) {
497
+ if (!modelId)
498
+ return undefined;
497
499
  const slashIdx = modelId.indexOf("/");
498
500
  if (slashIdx !== -1) {
499
501
  const maybeProvider = modelId.substring(0, slashIdx);