gsd-pi 2.82.0 → 3.0.0-dev.1b44e695b

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 (799) 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/detect-stuck.js +1 -1
  13. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  14. package/dist/resources/extensions/gsd/auto/loop.js +122 -40
  15. package/dist/resources/extensions/gsd/auto/orchestrator.js +126 -8
  16. package/dist/resources/extensions/gsd/auto/phases.js +143 -49
  17. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  18. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  19. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  21. package/dist/resources/extensions/gsd/auto-budget.js +9 -0
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  23. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  24. package/dist/resources/extensions/gsd/auto-dispatch.js +144 -30
  25. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
  27. package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
  28. package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
  29. package/dist/resources/extensions/gsd/auto-start.js +99 -16
  30. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  31. package/dist/resources/extensions/gsd/auto-verification.js +146 -34
  32. package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
  33. package/dist/resources/extensions/gsd/auto.js +251 -99
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
  36. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +19 -4
  37. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  38. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  39. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  40. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  41. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  42. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  43. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  44. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  45. package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
  46. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  47. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  48. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  49. package/dist/resources/extensions/gsd/context-store.js +112 -0
  50. package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
  51. package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
  52. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  53. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  54. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  55. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  56. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  57. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  58. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  59. package/dist/resources/extensions/gsd/docs/preferences-reference.md +11 -1
  60. package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
  61. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  62. package/dist/resources/extensions/gsd/doctor.js +2 -28
  63. package/dist/resources/extensions/gsd/export-html.js +27 -425
  64. package/dist/resources/extensions/gsd/forensics.js +10 -3
  65. package/dist/resources/extensions/gsd/git-service.js +152 -15
  66. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  67. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  68. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  69. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  70. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  71. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  72. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  73. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  74. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  75. package/dist/resources/extensions/gsd/markdown-renderer.js +20 -12
  76. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  77. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  78. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  79. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  80. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  81. package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
  82. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  83. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  84. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  85. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  86. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  87. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  88. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  89. package/dist/resources/extensions/gsd/paths.js +4 -0
  90. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  91. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  92. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  93. package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
  94. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  95. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  96. package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
  97. package/dist/resources/extensions/gsd/preferences.js +6 -0
  98. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  99. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  100. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  102. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  103. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  104. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  105. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  106. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  107. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  108. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  110. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  111. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  112. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  113. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  114. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  115. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  116. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  117. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  118. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  119. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
  120. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
  121. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  122. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  123. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  124. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  125. package/dist/resources/extensions/gsd/state.js +28 -7
  126. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  127. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  128. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  129. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  130. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  131. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  132. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  133. package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
  134. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  135. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  136. package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
  137. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  138. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  139. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  140. package/dist/resources/extensions/gsd/validation.js +23 -1
  141. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  142. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  143. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  144. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  145. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  146. package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
  147. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  148. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  149. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  150. package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
  151. package/dist/resources/extensions/shared/html-shell.js +388 -0
  152. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  153. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  154. package/dist/resources/extensions/subagent/index.js +448 -78
  155. package/dist/resources/extensions/subagent/launch.js +77 -0
  156. package/dist/resources/extensions/subagent/run-store.js +148 -0
  157. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  158. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  159. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  160. package/dist/resources/extensions/visual-brief/index.js +5 -0
  161. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  162. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  163. package/dist/resources/skills/forensics/SKILL.md +1 -1
  164. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  165. package/dist/web/standalone/.next/BUILD_ID +1 -1
  166. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  167. package/dist/web/standalone/.next/build-manifest.json +4 -4
  168. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  169. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  170. package/dist/web/standalone/.next/required-server-files.json +4 -4
  171. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  172. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  174. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  182. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  185. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  186. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  187. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  189. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  192. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  199. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  211. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  231. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  241. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  247. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  252. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  263. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  267. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  270. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  273. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  274. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  275. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  276. package/dist/web/standalone/.next/server/app/index.html +1 -1
  277. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  278. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  279. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  280. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  281. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  282. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  283. package/dist/web/standalone/.next/server/app/page.js +2 -2
  284. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  285. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  286. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  287. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  288. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  289. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  290. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  291. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  292. package/dist/web/standalone/.next/server/middleware.js +2 -2
  293. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  294. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  295. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  296. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  297. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  298. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  299. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  300. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  301. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  302. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  303. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  304. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  305. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  306. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  307. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  308. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  309. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  310. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  311. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  312. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  313. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  314. package/dist/web/standalone/server.js +1 -1
  315. package/package.json +6 -5
  316. package/packages/contracts/dist/rpc.test.js +7 -0
  317. package/packages/contracts/dist/rpc.test.js.map +1 -1
  318. package/packages/contracts/dist/workflow.d.ts +21 -0
  319. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  320. package/packages/contracts/dist/workflow.js +24 -0
  321. package/packages/contracts/dist/workflow.js.map +1 -1
  322. package/packages/contracts/src/rpc.test.ts +8 -0
  323. package/packages/contracts/src/workflow.ts +24 -0
  324. package/packages/daemon/package.json +2 -2
  325. package/packages/mcp-server/README.md +14 -3
  326. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  327. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  328. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  329. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  330. package/packages/mcp-server/package.json +2 -2
  331. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  332. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  333. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  334. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  335. package/packages/native/package.json +1 -1
  336. package/packages/native/tsconfig.json +2 -1
  337. package/packages/native/tsconfig.tsbuildinfo +1 -1
  338. package/packages/pi-agent-core/package.json +1 -1
  339. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  340. package/packages/pi-ai/dist/index.d.ts +2 -2
  341. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  342. package/packages/pi-ai/dist/index.js +1 -1
  343. package/packages/pi-ai/dist/index.js.map +1 -1
  344. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  345. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  346. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  347. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  348. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  350. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  351. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  352. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  353. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  354. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  355. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  356. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  357. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  358. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  359. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  360. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  361. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  362. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  363. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  364. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  365. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  366. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  367. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  368. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  369. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  370. package/packages/pi-ai/package.json +1 -1
  371. package/packages/pi-ai/src/index.ts +7 -2
  372. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  373. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  374. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  375. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  376. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  377. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  378. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  379. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  380. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  381. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  382. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  383. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  384. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  385. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  386. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  387. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  389. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  390. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  391. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  392. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  393. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  395. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  396. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  397. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  398. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  399. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  400. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  401. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  402. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  404. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  406. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
  407. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  409. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  411. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  412. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  413. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  414. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  415. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  416. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  417. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  419. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  420. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  421. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  422. package/packages/pi-coding-agent/package.json +1 -1
  423. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  424. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  425. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  426. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  427. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  428. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  429. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  430. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  431. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  432. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  433. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
  434. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  435. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  436. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  437. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  438. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  439. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  440. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  441. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  442. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  443. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  444. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  445. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  446. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  447. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  448. package/packages/pi-tui/dist/terminal.js +12 -0
  449. package/packages/pi-tui/dist/terminal.js.map +1 -1
  450. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  451. package/packages/pi-tui/dist/tui.js +108 -24
  452. package/packages/pi-tui/dist/tui.js.map +1 -1
  453. package/packages/pi-tui/package.json +1 -1
  454. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  455. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  456. package/packages/pi-tui/src/terminal.ts +11 -0
  457. package/packages/pi-tui/src/tui.ts +111 -24
  458. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  459. package/packages/rpc-client/package.json +1 -1
  460. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  461. package/pkg/package.json +1 -1
  462. package/src/resources/GSD-WORKFLOW.md +10 -1
  463. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  464. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  465. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  466. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  467. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  468. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  469. package/src/resources/extensions/cmux/index.ts +6 -0
  470. package/src/resources/extensions/gsd/auto/contracts.ts +64 -16
  471. package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
  472. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  473. package/src/resources/extensions/gsd/auto/loop.ts +123 -40
  474. package/src/resources/extensions/gsd/auto/orchestrator.ts +131 -8
  475. package/src/resources/extensions/gsd/auto/phases.ts +174 -60
  476. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  477. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  478. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  479. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  480. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  481. package/src/resources/extensions/gsd/auto-budget.ts +11 -0
  482. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  483. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  484. package/src/resources/extensions/gsd/auto-dispatch.ts +164 -29
  485. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  486. package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
  487. package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
  488. package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
  489. package/src/resources/extensions/gsd/auto-start.ts +109 -14
  490. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  491. package/src/resources/extensions/gsd/auto-verification.ts +174 -42
  492. package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
  493. package/src/resources/extensions/gsd/auto.ts +296 -107
  494. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  495. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
  496. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -4
  497. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  498. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  499. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  500. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  501. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  502. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  503. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  504. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  505. package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
  506. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  507. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  508. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  509. package/src/resources/extensions/gsd/context-store.ts +120 -1
  510. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  511. package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
  512. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  513. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  514. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  515. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  516. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  517. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  518. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  519. package/src/resources/extensions/gsd/docs/preferences-reference.md +11 -1
  520. package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
  521. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  522. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  523. package/src/resources/extensions/gsd/doctor.ts +2 -27
  524. package/src/resources/extensions/gsd/export-html.ts +27 -427
  525. package/src/resources/extensions/gsd/forensics.ts +9 -3
  526. package/src/resources/extensions/gsd/git-service.ts +182 -16
  527. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  528. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  529. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  530. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  531. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  532. package/src/resources/extensions/gsd/journal.ts +8 -1
  533. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  534. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  535. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  536. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  537. package/src/resources/extensions/gsd/markdown-renderer.ts +20 -12
  538. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  539. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  540. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  541. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  542. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  543. package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
  544. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  545. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  546. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  547. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  548. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  549. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  550. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  551. package/src/resources/extensions/gsd/paths.ts +5 -0
  552. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  553. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  554. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  555. package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
  556. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  557. package/src/resources/extensions/gsd/preferences-types.ts +35 -0
  558. package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
  559. package/src/resources/extensions/gsd/preferences.ts +9 -0
  560. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  561. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  562. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  563. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  564. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  565. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  566. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  567. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  568. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  569. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  570. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  571. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  572. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  573. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  574. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  575. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  576. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  577. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  578. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  579. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  580. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  581. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
  582. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
  583. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  584. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  585. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  586. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  587. package/src/resources/extensions/gsd/state.ts +33 -7
  588. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  589. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  590. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  591. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  592. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  593. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  594. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  595. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  596. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  597. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +875 -59
  598. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +637 -16
  599. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  600. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  601. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  602. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
  603. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  604. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  605. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  606. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  607. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  608. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
  609. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  610. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  611. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  612. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  613. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  614. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  615. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  616. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  617. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  618. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  619. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  620. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  621. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  622. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  623. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  624. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  625. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  626. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  627. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  628. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  629. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  630. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  631. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  632. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
  633. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  634. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  635. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  636. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
  637. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
  638. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  639. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  640. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  641. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  642. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  643. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  644. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  645. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  646. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  647. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  648. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  649. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  650. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  651. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  652. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  653. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  654. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  655. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
  656. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  657. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  658. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
  659. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  660. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  661. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
  662. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  663. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  664. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  665. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  666. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  667. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  668. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  669. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  670. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  671. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  672. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
  673. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  674. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
  675. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  676. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  677. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  678. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  679. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  680. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  681. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  682. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  683. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  684. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  685. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  686. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  687. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  688. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  689. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  690. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
  691. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  692. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
  693. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  694. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  695. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  696. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
  697. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
  698. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  699. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  700. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  701. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  702. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  703. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  704. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  705. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  706. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  707. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  708. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  709. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  710. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  711. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
  712. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
  713. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  714. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
  715. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  716. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  717. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  718. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  719. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  720. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  721. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  722. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  723. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  724. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  725. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
  726. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  727. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
  728. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  729. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  730. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  731. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  732. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
  733. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  734. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  735. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
  736. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  737. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  738. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  739. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
  740. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  741. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  742. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  743. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  744. package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
  745. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  746. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  747. package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
  748. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  749. package/src/resources/extensions/gsd/types.ts +1 -1
  750. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  751. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  752. package/src/resources/extensions/gsd/validation.ts +23 -1
  753. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  754. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  755. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  756. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  757. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  758. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  759. package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
  760. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  761. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  762. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  763. package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
  764. package/src/resources/extensions/shared/html-shell.ts +412 -0
  765. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  766. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  767. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  768. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  769. package/src/resources/extensions/subagent/index.ts +567 -103
  770. package/src/resources/extensions/subagent/launch.ts +131 -0
  771. package/src/resources/extensions/subagent/run-store.ts +218 -0
  772. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  773. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  774. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  775. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  776. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  777. package/src/resources/extensions/visual-brief/index.ts +8 -0
  778. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  779. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  780. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  781. package/src/resources/skills/forensics/SKILL.md +1 -1
  782. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  783. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  784. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  785. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  786. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  787. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  788. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  789. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  790. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  791. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  792. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  793. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  794. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  795. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  796. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  797. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  798. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → Z8H5evS-hDo0qdP22XJPA}/_buildManifest.js +0 -0
  799. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → Z8H5evS-hDo0qdP22XJPA}/_ssgManifest.js +0 -0
@@ -56,7 +56,7 @@ import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationS
56
56
  import { writeUnitRuntimeRecord } from "../unit-runtime.js";
57
57
  import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
58
58
  import { getEligibleSlices } from "../slice-parallel-eligibility.js";
59
- import { startSliceParallel } from "../slice-parallel-orchestrator.js";
59
+ import { isSliceParallelActive, startSliceParallel } from "../slice-parallel-orchestrator.js";
60
60
  import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
61
61
  import { reconcileBeforeSpawn } from "../state-reconciliation.js";
62
62
  import type { MinimalModelRegistry } from "../context-budget.js";
@@ -77,6 +77,10 @@ import { resolveManifest } from "../unit-context-manifest.js";
77
77
  import { createWorktreeSafetyModule, type WorktreeSafetyResult } from "../worktree-safety.js";
78
78
  import { isSuspiciousGhostCompletion } from "../auto-unit-closeout.js";
79
79
  import { decideVerificationRetry, verificationRetryKey } from "./verification-retry-policy.js";
80
+ import { buildPhaseHandoffOutcome, setAutoOutcomeWidget } from "../auto-dashboard.js";
81
+ import { getConsecutiveDispatchBlocker } from "../dispatch-guard.js";
82
+
83
+ export const STUCK_WINDOW_SIZE = 6;
80
84
 
81
85
  // ─── Path Comparison Helper ───────────────────────────────────────────────
82
86
  /** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
@@ -146,7 +150,12 @@ export function shouldDegradeEmptyWorktreeToProjectRoot(
146
150
  }
147
151
 
148
152
  function unitWritesSource(unitType: string): boolean | null {
149
- const manifest = resolveManifest(unitType);
153
+ // Backward compatibility: sidecar queues from older builds may persist
154
+ // prefixed unit types (e.g. "sidecar/quick-task").
155
+ const normalizedUnitType = unitType.startsWith("sidecar/")
156
+ ? unitType.slice("sidecar/".length)
157
+ : unitType;
158
+ const manifest = resolveManifest(normalizedUnitType);
150
159
  if (!manifest) return null;
151
160
  return manifest.tools.mode === "all" || manifest.tools.mode === "docs";
152
161
  }
@@ -155,6 +164,13 @@ function formatWorktreeSafetyFailure(result: Extract<WorktreeSafetyResult, { ok:
155
164
  return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
156
165
  }
157
166
 
167
+ function formatWorktreeSafetyStopReason(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
168
+ if (result.kind === "empty-worktree-with-project-content") {
169
+ return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
170
+ }
171
+ return `Worktree Safety failed (${result.kind}).`;
172
+ }
173
+
158
174
  function resolveEmptyWorktreeWithProjectContent(
159
175
  unitRoot: string,
160
176
  projectRoot: string,
@@ -203,7 +219,8 @@ async function validateSourceWriteWorktreeSafety(
203
219
  if (!writesSource) return null;
204
220
 
205
221
  const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
206
- if (deps.getIsolationMode(projectRoot) !== "worktree") return null;
222
+ const isolationMode = deps.getIsolationMode(projectRoot);
223
+ if (isolationMode !== "worktree") return null;
207
224
 
208
225
  const safety = createWorktreeSafetyModule();
209
226
  const result = safety.validateUnitRoot({
@@ -213,6 +230,7 @@ async function validateSourceWriteWorktreeSafety(
213
230
  projectRoot,
214
231
  unitRoot: s.basePath,
215
232
  milestoneId,
233
+ isolationMode,
216
234
  expectedBranch: milestoneId ? deps.autoWorktreeBranch(milestoneId) : null,
217
235
  emptyWorktreeWithProjectContent: resolveEmptyWorktreeWithProjectContent(s.basePath, projectRoot),
218
236
  lease: s.workerId
@@ -237,7 +255,7 @@ async function validateSourceWriteWorktreeSafety(
237
255
  projectRoot,
238
256
  });
239
257
  ctx.ui.notify(msg, "error");
240
- await deps.stopAuto(ctx, pi, msg);
258
+ await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
241
259
  return { action: "break", reason: result.kind };
242
260
  }
243
261
 
@@ -567,6 +585,13 @@ export function _buildCancelledUnitStopReason(
567
585
  };
568
586
  }
569
587
 
588
+ export function _isPauseOriginCancelledResult(
589
+ isPaused: boolean,
590
+ errorContext?: { message: string; category: string },
591
+ ): boolean {
592
+ return isPaused && !errorContext;
593
+ }
594
+
570
595
  async function failClosedOnFinalizeTimeout(
571
596
  ic: IterationContext,
572
597
  iterData: IterationData,
@@ -859,6 +884,12 @@ export async function runPreDispatch(
859
884
  isDbAvailable()
860
885
  ) {
861
886
  try {
887
+ const projectRoot = _resolveDispatchGuardBasePath(s);
888
+ if (isSliceParallelActive(projectRoot)) {
889
+ ctx.ui.notify("Slice-parallel: workers are still running; waiting for completion before next dispatch.", "info");
890
+ await new Promise<void>((resolve) => setTimeout(resolve, 1000));
891
+ return { action: "continue" };
892
+ }
862
893
  const dbSlices = getMilestoneSlices(mid);
863
894
  if (dbSlices.length > 0) {
864
895
  const doneIds = new Set(dbSlices.filter(sl => sl.status === "complete" || sl.status === "done").map(sl => sl.id));
@@ -881,7 +912,7 @@ export async function runPreDispatch(
881
912
  );
882
913
  // ADR-017 #5707: reconcile before spawning so each worker doesn't
883
914
  // independently race on the same drift. Failure aborts the spawn.
884
- const spawnGate = await reconcileBeforeSpawn(s.basePath);
915
+ const spawnGate = await reconcileBeforeSpawn(projectRoot);
885
916
  if (!spawnGate.ok) {
886
917
  ctx.ui.notify(
887
918
  `Slice-parallel: aborting spawn — ${spawnGate.reason}`,
@@ -890,7 +921,7 @@ export async function runPreDispatch(
890
921
  return { action: "break", reason: `slice-parallel-reconciliation-failed: ${spawnGate.reason}` };
891
922
  }
892
923
  const result = await startSliceParallel(
893
- s.basePath,
924
+ projectRoot,
894
925
  mid,
895
926
  eligible,
896
927
  {
@@ -903,8 +934,7 @@ export async function runPreDispatch(
903
934
  `Slice-parallel: started ${result.started.length} worker(s): ${result.started.join(", ")}.`,
904
935
  "info",
905
936
  );
906
- await deps.stopAuto(ctx, pi, `Slice-parallel dispatched for ${mid}`);
907
- return { action: "break", reason: "slice-parallel-dispatched" };
937
+ return { action: "continue" };
908
938
  }
909
939
  // Fall through to sequential if no workers started
910
940
  }
@@ -1232,7 +1262,6 @@ export async function runDispatch(
1232
1262
  ): Promise<PhaseResult<IterationData>> {
1233
1263
  const { ctx, pi, s, deps, prefs } = ic;
1234
1264
  const { state, mid, midTitle } = preData;
1235
- const STUCK_WINDOW_SIZE = 6;
1236
1265
  const provider = ctx.model?.provider;
1237
1266
  const authMode = provider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
1238
1267
  ? ctx.modelRegistry.getProviderAuthMode(provider)
@@ -1327,9 +1356,15 @@ export async function runDispatch(
1327
1356
  }
1328
1357
 
1329
1358
  const guardBasePath = _resolveDispatchGuardBasePath(s);
1359
+ let mainBranch = "main";
1360
+ try {
1361
+ mainBranch = deps.getMainBranch(guardBasePath);
1362
+ } catch (err) {
1363
+ debugLog("autoLoop", { phase: "getMainBranch-failed", error: String(err) });
1364
+ }
1330
1365
  const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
1331
1366
  guardBasePath,
1332
- deps.getMainBranch(guardBasePath),
1367
+ mainBranch,
1333
1368
  unitType,
1334
1369
  unitId,
1335
1370
  );
@@ -1339,6 +1374,18 @@ export async function runDispatch(
1339
1374
  return { action: "break", reason: "prior-slice-blocker" };
1340
1375
  }
1341
1376
 
1377
+ const consecutiveDispatchBlocker = getConsecutiveDispatchBlocker(
1378
+ loopState,
1379
+ state.phase,
1380
+ unitType,
1381
+ unitId,
1382
+ );
1383
+ if (consecutiveDispatchBlocker) {
1384
+ await deps.stopAuto(ctx, pi, consecutiveDispatchBlocker);
1385
+ debugLog("autoLoop", { phase: "exit", reason: "consecutive-dispatch-blocker" });
1386
+ return { action: "break", reason: "consecutive-dispatch-blocker" };
1387
+ }
1388
+
1342
1389
  const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
1343
1390
  ic,
1344
1391
  unitType,
@@ -1355,9 +1402,14 @@ export async function runDispatch(
1355
1402
  // Rules 1/3/4 can catch retry loops with repeated failure content (#5719).
1356
1403
  // Rules 2/2b suppress legitimate retry backoff through the dispatch ledger.
1357
1404
  loopState.recentUnits.push({ key: derivedKey });
1358
- if (loopState.recentUnits.length > STUCK_WINDOW_SIZE) loopState.recentUnits.shift();
1405
+ while (loopState.recentUnits.length > STUCK_WINDOW_SIZE) {
1406
+ loopState.recentUnits.shift();
1407
+ }
1359
1408
 
1360
- const stuckSignal = detectStuck(loopState.recentUnits);
1409
+ const stuckSignal = detectStuck(loopState.recentUnits, {
1410
+ pendingRetry: !!s.pendingVerificationRetry,
1411
+ retryAttempt: s.pendingVerificationRetry?.attempt,
1412
+ });
1361
1413
  if (stuckSignal) {
1362
1414
  debugLog("autoLoop", {
1363
1415
  phase: "stuck-check",
@@ -1412,7 +1464,6 @@ export async function runDispatch(
1412
1464
  );
1413
1465
  deps.invalidateAllCaches();
1414
1466
  loopState.recentUnits.length = 0;
1415
- loopState.stuckRecoveryAttempts = 0;
1416
1467
  return { action: "continue" };
1417
1468
  }
1418
1469
  ctx.ui.notify(
@@ -1796,42 +1847,8 @@ export async function runUnitPhase(
1796
1847
  s.currentUnit.id === unitId
1797
1848
  );
1798
1849
  const previousTier = s.currentUnitRouting?.tier;
1799
-
1800
- // Scope workflow-logger buffer to this unit so post-finalize drains are
1801
- // per-unit. Without this, the module-level _buffer accumulates across every
1802
- // unit in the same Node process (see workflow-logger.ts module header).
1803
- _resetLogs();
1804
1850
  const dispatchKey = `${unitType}/${unitId}`;
1805
- s.unitDispatchCount.set(dispatchKey, (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1);
1806
- s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
1807
- s.lastGitActionFailure = null;
1808
- s.lastGitActionStatus = null;
1809
- s.lastUnitAgentEndMessages = null;
1810
- setCurrentPhase(unitType, {
1811
- basePath: s.basePath,
1812
- traceId: ic.flowId,
1813
- turnId: `iter-${ic.iteration}`,
1814
- causedBy: "unit-start",
1815
- });
1816
- s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
1817
- const unitStartSeq = ic.nextSeq();
1818
- deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
1819
- deps.captureAvailableSkills();
1820
- writeUnitRuntimeRecord(
1821
- s.basePath,
1822
- unitType,
1823
- unitId,
1824
- s.currentUnit.startedAt,
1825
- {
1826
- phase: "dispatched",
1827
- wrapupWarningSent: false,
1828
- timeoutAt: null,
1829
- lastProgressAt: s.currentUnit.startedAt,
1830
- progressCount: 0,
1831
- lastProgressKind: "dispatch",
1832
- recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
1833
- },
1834
- );
1851
+ const nextDispatchCount = (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1;
1835
1852
 
1836
1853
  // Status bar (widget + preconditions deferred until after model selection — see #2899)
1837
1854
  ctx.ui.setStatus("gsd-auto", "auto");
@@ -1894,7 +1911,7 @@ export async function runUnitPhase(
1894
1911
  : s.pendingCrashRecovery;
1895
1912
  finalPrompt = `${capped}\n\n---\n\n${finalPrompt}`;
1896
1913
  s.pendingCrashRecovery = null;
1897
- } else if ((s.unitDispatchCount.get(dispatchKey) ?? 0) > 1) {
1914
+ } else if (nextDispatchCount > 1) {
1898
1915
  const diagnostic = deps.getDeepDiagnostic(s.basePath);
1899
1916
  if (diagnostic) {
1900
1917
  const cappedDiag =
@@ -1902,7 +1919,11 @@ export async function runUnitPhase(
1902
1919
  ? diagnostic.slice(0, MAX_RECOVERY_CHARS) +
1903
1920
  "\n\n[...diagnostic truncated to prevent memory exhaustion]"
1904
1921
  : diagnostic;
1905
- finalPrompt = `**RETRY — your previous attempt did not produce the required artifact.**\n\nDiagnostic from previous attempt:\n${cappedDiag}\n\nFix whatever went wrong and make sure you write the required file this time.\n\n---\n\n${finalPrompt}`;
1922
+ const retryInstruction =
1923
+ unitType === "execute-task"
1924
+ ? "The required artifact is `T##-SUMMARY.md`. Do NOT manually write this file. Call `gsd_task_complete` with `milestoneId`, `sliceId`, `taskId`, and the required completion fields. Do not re-run implementation work — call the tool."
1925
+ : "Fix whatever went wrong and make sure you write the required file this time.";
1926
+ finalPrompt = `**RETRY — your previous attempt did not produce the required artifact.**\n\nDiagnostic from previous attempt:\n${cappedDiag}\n\n${retryInstruction}\n\n---\n\n${finalPrompt}`;
1906
1927
  }
1907
1928
  }
1908
1929
 
@@ -1937,6 +1958,11 @@ export async function runUnitPhase(
1937
1958
  }
1938
1959
 
1939
1960
  // Select and apply model (with tier escalation on retry — normal units only)
1961
+ const prevUnitRouting = s.currentUnitRouting;
1962
+ const prevUnitModel = s.currentUnitModel;
1963
+ const prevDispatchedModelId = s.currentDispatchedModelId;
1964
+ const prevSessionModel = ctx.model;
1965
+ const prevSessionThinkingLevel = pi.getThinkingLevel();
1940
1966
  const modelResult = await deps.selectAndApplyModel(
1941
1967
  ctx,
1942
1968
  pi,
@@ -2003,14 +2029,67 @@ export async function runUnitPhase(
2003
2029
  ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
2004
2030
  : undefined,
2005
2031
  baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
2032
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
2006
2033
  },
2007
2034
  );
2008
2035
  if (compatibilityError) {
2036
+ s.currentUnitRouting = prevUnitRouting;
2037
+ s.currentUnitModel = prevUnitModel;
2038
+ s.currentDispatchedModelId = prevDispatchedModelId;
2039
+ if (s.checkpointSha) {
2040
+ cleanupCheckpoint(s.basePath, unitId);
2041
+ s.checkpointSha = null;
2042
+ }
2043
+ if (prevSessionModel) {
2044
+ const ok = await pi.setModel(prevSessionModel, { persist: false });
2045
+ if (!ok) {
2046
+ ctx.ui.notify("Failed to restore previous session model after compatibility check failure.", "warning");
2047
+ }
2048
+ if (prevSessionThinkingLevel) {
2049
+ pi.setThinkingLevel(prevSessionThinkingLevel);
2050
+ }
2051
+ }
2009
2052
  ctx.ui.notify(compatibilityError, "error");
2010
2053
  await deps.stopAuto(ctx, pi, compatibilityError);
2011
2054
  return { action: "break", reason: "workflow-capability" };
2012
2055
  }
2013
2056
 
2057
+ // Scope workflow-logger buffer to this unit so post-finalize drains are
2058
+ // per-unit. Without this, the module-level _buffer accumulates across every
2059
+ // unit in the same Node process (see workflow-logger.ts module header).
2060
+ _resetLogs();
2061
+ const unitStartedAt = Date.now();
2062
+ s.unitDispatchCount.set(dispatchKey, nextDispatchCount);
2063
+ s.currentUnit = { type: unitType, id: unitId, startedAt: unitStartedAt };
2064
+ s.lastGitActionFailure = null;
2065
+ s.lastGitActionStatus = null;
2066
+ s.lastUnitAgentEndMessages = null;
2067
+ setCurrentPhase(unitType, {
2068
+ basePath: s.basePath,
2069
+ traceId: ic.flowId,
2070
+ turnId: `iter-${ic.iteration}`,
2071
+ causedBy: "unit-start",
2072
+ });
2073
+ s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
2074
+ const unitStartSeq = ic.nextSeq();
2075
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
2076
+ deps.captureAvailableSkills();
2077
+ writeUnitRuntimeRecord(
2078
+ s.basePath,
2079
+ unitType,
2080
+ unitId,
2081
+ unitStartedAt,
2082
+ {
2083
+ phase: "dispatched",
2084
+ wrapupWarningSent: false,
2085
+ timeoutAt: null,
2086
+ lastProgressAt: unitStartedAt,
2087
+ progressCount: 0,
2088
+ lastProgressKind: "dispatch",
2089
+ recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
2090
+ },
2091
+ );
2092
+
2014
2093
  // Progress widget + preconditions — deferred to after model selection so the
2015
2094
  // widget's first render tick shows the correct model (#2899).
2016
2095
  deps.updateProgressWidget(ctx, unitType, unitId, state);
@@ -2125,6 +2204,11 @@ export async function runUnitPhase(
2125
2204
  }
2126
2205
 
2127
2206
  if (unitResult.status === "cancelled") {
2207
+ if (_isPauseOriginCancelledResult(s.paused, unitResult.errorContext)) {
2208
+ debugLog("autoLoop", { phase: "cancelled-after-pause", unitType, unitId });
2209
+ return { action: "break", reason: "paused" };
2210
+ }
2211
+
2128
2212
  const errorCategory = unitResult.errorContext?.category;
2129
2213
  // Provider-error pause: agent_end recovery normally pauses before this
2130
2214
  // branch. Provider readiness failures happen before dispatch, so pause here
@@ -2233,6 +2317,20 @@ export async function runUnitPhase(
2233
2317
  await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
2234
2318
  return { action: "break", reason: "session-timeout" };
2235
2319
  }
2320
+ if (
2321
+ unitResult.errorContext?.isTransient &&
2322
+ errorCategory === "aborted"
2323
+ ) {
2324
+ ctx.ui.notify(
2325
+ `Unit ${unitType} ${unitId} was aborted by the user. Pausing auto-mode (recoverable).`,
2326
+ "warning",
2327
+ );
2328
+ debugLog("autoLoop", { phase: "unit-aborted-transient-pause", unitType, unitId, category: errorCategory });
2329
+ await deps.pauseAuto(ctx, pi);
2330
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
2331
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
2332
+ return { action: "break", reason: "unit-aborted-pause" };
2333
+ }
2236
2334
  // All other cancelled states (structural errors, non-transient failures): hard stop
2237
2335
  if (s.currentUnit) {
2238
2336
  await deps.closeoutUnit(
@@ -2314,18 +2412,17 @@ export async function runUnitPhase(
2314
2412
  }
2315
2413
  }
2316
2414
 
2415
+ const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
2416
+ const artifactVerified =
2417
+ skipArtifactVerification ||
2418
+ verifyExpectedArtifact(unitType, unitId, s.basePath);
2317
2419
  if (s.currentUnitRouting) {
2318
2420
  deps.recordOutcome(
2319
2421
  unitType,
2320
2422
  s.currentUnitRouting.tier as "light" | "standard" | "heavy",
2321
- true, // success assumed; dispatch will re-dispatch if artifact missing
2423
+ artifactVerified,
2322
2424
  );
2323
2425
  }
2324
-
2325
- const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
2326
- const artifactVerified =
2327
- skipArtifactVerification ||
2328
- verifyExpectedArtifact(unitType, unitId, s.basePath);
2329
2426
  if (artifactVerified) {
2330
2427
  s.unitDispatchCount.delete(dispatchKey);
2331
2428
  s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
@@ -2350,7 +2447,11 @@ export async function runUnitPhase(
2350
2447
  }
2351
2448
  }
2352
2449
 
2353
- 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 } });
2450
+ const unitEndStatus =
2451
+ !artifactVerified && unitResult.status === "completed"
2452
+ ? "no-artifact"
2453
+ : unitResult.status;
2454
+ 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 } });
2354
2455
 
2355
2456
  // ── Safety harness: checkpoint cleanup or rollback ──
2356
2457
  if (s.checkpointSha) {
@@ -2425,6 +2526,8 @@ export async function runFinalize(
2425
2526
  const preUnitSnapshot = s.currentUnit
2426
2527
  ? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
2427
2528
  : null;
2529
+ s.currentUnit = null;
2530
+ clearCurrentPhase();
2428
2531
  const preResultGuard = await withTimeout(
2429
2532
  deps.postUnitPreVerification(postUnitCtx, preVerificationOpts),
2430
2533
  FINALIZE_PRE_TIMEOUT_MS,
@@ -2582,10 +2685,21 @@ export async function runFinalize(
2582
2685
  lastProgressAt: Date.now(),
2583
2686
  lastProgressKind: "finalize-success",
2584
2687
  });
2688
+ if (
2689
+ !preUnitSnapshot.type.startsWith("hook/") &&
2690
+ preUnitSnapshot.type !== "custom-step" &&
2691
+ preUnitSnapshot.type !== "complete-milestone"
2692
+ ) {
2693
+ setAutoOutcomeWidget(ctx, {
2694
+ ...buildPhaseHandoffOutcome({
2695
+ unitType: preUnitSnapshot.type,
2696
+ unitId: preUnitSnapshot.id,
2697
+ agentEndMessages: s.lastUnitAgentEndMessages,
2698
+ }),
2699
+ startedAt: s.autoStartTime,
2700
+ });
2701
+ }
2585
2702
  }
2586
- s.currentUnit = null;
2587
- clearCurrentPhase();
2588
-
2589
2703
  // Surface accumulated workflow-logger issues for this unit to the user.
2590
2704
  // Warnings/errors logged during the unit are buffered in the logger and
2591
2705
  // 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
  *
@@ -52,6 +54,16 @@ export interface PendingVerificationRetry {
52
54
  attempt: number;
53
55
  }
54
56
 
57
+ export interface PendingOrchestrationDispatch {
58
+ unitType: string;
59
+ unitId: string;
60
+ prompt: string;
61
+ pauseAfterUatDispatch: boolean;
62
+ state: import("../types.js").GSDState;
63
+ mid: string | undefined;
64
+ midTitle: string | undefined;
65
+ }
66
+
55
67
  /**
56
68
  * A typed item enqueued by postUnitPostVerification for the main loop to
57
69
  * drain via the standard runUnit path. Replaces inline dispatch
@@ -89,6 +101,7 @@ export class AutoSession {
89
101
  active = false;
90
102
  paused = false;
91
103
  completionStopInProgress = false;
104
+ preserveStepSurfaceAfterLoopExit = false;
92
105
  stepMode = false;
93
106
  verbose = false;
94
107
  activeEngineId: string | null = null;
@@ -241,6 +254,7 @@ export class AutoSession {
241
254
 
242
255
  // ── Orchestration seam ───────────────────────────────────────────────────
243
256
  orchestration: AutoOrchestrationModule | null = null;
257
+ pendingOrchestrationDispatch: PendingOrchestrationDispatch | null = null;
244
258
 
245
259
  // ── Loop promise state ──────────────────────────────────────────────────
246
260
  // Per-unit resolve function and session-switch guard live at module level
@@ -289,6 +303,7 @@ export class AutoSession {
289
303
  this.active = false;
290
304
  this.paused = false;
291
305
  this.completionStopInProgress = false;
306
+ this.preserveStepSurfaceAfterLoopExit = false;
292
307
  this.stepMode = false;
293
308
  this.verbose = false;
294
309
  this.activeEngineId = null;
@@ -372,6 +387,7 @@ export class AutoSession {
372
387
 
373
388
  // Orchestration seam
374
389
  this.orchestration = null;
390
+ this.pendingOrchestrationDispatch = null;
375
391
 
376
392
  // Loop promise state lives in auto-loop.ts module scope
377
393
  }
@@ -97,6 +97,9 @@ export interface LoopState {
97
97
  stuckRecoveryAttempts: number;
98
98
  /** Consecutive finalize timeout count — stops auto-mode after threshold. */
99
99
  consecutiveFinalizeTimeouts: number;
100
+ consecutiveDispatchCount?: Map<string, number>;
101
+ lastDispatchedKey?: string | null;
102
+ lastDispatchPhase?: string | null;
100
103
  }
101
104
 
102
105
  /** Max consecutive finalize timeouts before hard-stopping auto-mode. */
@@ -9,7 +9,11 @@ export function isInternalSessionTransitionAbortEvent(
9
9
  }
10
10
 
11
11
  export function shouldIgnoreAgentEndForActiveUnit(
12
- event: Pick<AgentEndEvent, "abortOrigin">,
12
+ event: Pick<AgentEndEvent, "abortOrigin" | "messages">,
13
13
  ): boolean {
14
- return isInternalSessionTransitionAbortEvent(event);
14
+ if (!isInternalSessionTransitionAbortEvent(event)) return false;
15
+ const lastMsg = event.messages[event.messages.length - 1];
16
+ if (!lastMsg || typeof lastMsg !== "object") return true;
17
+ const stopReason = (lastMsg as { stopReason?: unknown }).stopReason;
18
+ return stopReason === "aborted" || stopReason === "error";
15
19
  }
@@ -48,7 +48,8 @@ export type FinalizeDecision =
48
48
  action: "retry";
49
49
  ledgerErrorSummary: "finalize-retry";
50
50
  }
51
- | { action: "complete" };
51
+ | { action: "complete" }
52
+ | { action: "complete-and-break" };
52
53
 
53
54
  export type EngineReconcileInput =
54
55
  | { outcome: "milestone-complete" }
@@ -278,6 +279,9 @@ export function decideEngineDispatch(input: EngineDispatchInput): EngineDispatch
278
279
  export function decideFinalizeResult(input: FinalizeInput): FinalizeDecision {
279
280
  if (input.action === "break") {
280
281
  const reason = input.reason ?? "unknown";
282
+ if (reason === "step-wizard") {
283
+ return { action: "complete-and-break" };
284
+ }
281
285
  return {
282
286
  action: "stop",
283
287
  failureClass: reason === "git-closeout-failure" ? "git" : "closeout",
@@ -19,6 +19,19 @@ export interface MeasureMemoryPressureDeps {
19
19
  heapLimitBytes: () => number;
20
20
  }
21
21
 
22
+ /**
23
+ * Returns true on auto-mode startup, then every configured interval.
24
+ *
25
+ * Iteration 1 is checked explicitly so early session memory pressure cannot
26
+ * bypass the periodic interval guard.
27
+ */
28
+ export function shouldCheckMemoryPressure(iteration: number, interval: number): boolean {
29
+ if (!Number.isInteger(interval) || interval <= 0) {
30
+ throw new Error("Memory pressure check interval must be a positive integer");
31
+ }
32
+ return iteration === 1 || iteration % interval === 0;
33
+ }
34
+
22
35
  function defaultHeapLimitBytes(): number {
23
36
  const v8 = require("node:v8") as {
24
37
  getHeapStatistics?: () => { heap_size_limit?: number };
@@ -30,3 +30,14 @@ export function getBudgetEnforcementAction(
30
30
  if (enforcement === "pause") return "pause";
31
31
  return "warn";
32
32
  }
33
+
34
+ export function getUnitCostSpikeAction(
35
+ unitCostUsd: number,
36
+ rollingAvgUsd: number,
37
+ multiplier = 3.0,
38
+ ): "none" | "pause" {
39
+ if (!Number.isFinite(unitCostUsd) || unitCostUsd < 0) return "none";
40
+ if (!Number.isFinite(rollingAvgUsd) || rollingAvgUsd <= 0) return "none";
41
+ if (!Number.isFinite(multiplier) || multiplier <= 0) return "none";
42
+ return unitCostUsd >= (rollingAvgUsd * multiplier) ? "pause" : "none";
43
+ }
@@ -120,6 +120,26 @@ export interface AutoOutcomeSurfaceSnapshot {
120
120
  startedAt?: number;
121
121
  }
122
122
 
123
+ export function buildPhaseHandoffOutcome(input: {
124
+ unitType: string;
125
+ unitId: string;
126
+ agentEndMessages?: unknown[] | null;
127
+ }): AutoOutcomeSurfaceSnapshot {
128
+ const phase = unitPhaseLabel(input.unitType);
129
+ const detail =
130
+ extractLastAssistantSummary(input.agentEndMessages) ??
131
+ `Completed ${unitVerb(input.unitType)} ${input.unitId}.`;
132
+
133
+ return {
134
+ status: "complete",
135
+ title: `${phase} complete`,
136
+ detail,
137
+ unitLabel: `${unitVerb(input.unitType)} ${input.unitId}`,
138
+ nextAction: "Preparing the next phase. Review this handoff while the next session starts.",
139
+ commands: ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history"],
140
+ };
141
+ }
142
+
123
143
  // ─── Unit Description Helpers ─────────────────────────────────────────────────
124
144
 
125
145
  export function unitVerb(unitType: string): string {
@@ -631,7 +651,6 @@ export function updateProgressWidget(
631
651
  tierBadge?: string,
632
652
  ): void {
633
653
  if (!ctx.hasUI) return;
634
- ctx.ui.setWidget("gsd-outcome", undefined);
635
654
 
636
655
  // Welcome header is a startup-only banner — permanently suppress it once
637
656
  // auto-mode activates. The dashboard widget owns all status from here.
@@ -1145,3 +1164,55 @@ function normalizeRollupText(value: string | null | undefined): string | null {
1145
1164
  if (!clean || clean === "(none)" || clean === "None." || clean === "Not provided.") return null;
1146
1165
  return clean;
1147
1166
  }
1167
+
1168
+ function isAssistantMessage(value: unknown): boolean {
1169
+ if (!value || typeof value !== "object") return false;
1170
+ const record = value as Record<string, unknown>;
1171
+ if (record.role === "assistant") return true;
1172
+
1173
+ const message = record.message;
1174
+ if (message && typeof message === "object") {
1175
+ return (message as Record<string, unknown>).role === "assistant";
1176
+ }
1177
+
1178
+ return false;
1179
+ }
1180
+
1181
+ function extractLastAssistantSummary(messages: unknown[] | null | undefined): string | null {
1182
+ if (!messages || messages.length === 0) return null;
1183
+ for (let i = messages.length - 1; i >= 0; i--) {
1184
+ if (!isAssistantMessage(messages[i])) continue;
1185
+ const text = extractMessageText(messages[i]);
1186
+ const clean = normalizeRollupText(text);
1187
+ if (clean) return truncateToWidth(clean, 220, "…");
1188
+ }
1189
+ return null;
1190
+ }
1191
+
1192
+ function extractMessageText(value: unknown): string | null {
1193
+ if (typeof value === "string") return value;
1194
+ if (!value || typeof value !== "object") return null;
1195
+
1196
+ const record = value as Record<string, unknown>;
1197
+ if (typeof record.content === "string") return record.content;
1198
+
1199
+ const message = record.message;
1200
+ if (message && typeof message === "object") {
1201
+ return extractMessageText(message);
1202
+ }
1203
+
1204
+ const content = record.content;
1205
+ if (Array.isArray(content)) {
1206
+ const parts = content
1207
+ .map((part) => {
1208
+ if (typeof part === "string") return part;
1209
+ if (!part || typeof part !== "object") return "";
1210
+ const partRecord = part as Record<string, unknown>;
1211
+ return typeof partRecord.text === "string" ? partRecord.text : "";
1212
+ })
1213
+ .filter(Boolean);
1214
+ return parts.length > 0 ? parts.join(" ") : null;
1215
+ }
1216
+
1217
+ return null;
1218
+ }
@@ -280,6 +280,7 @@ export async function dispatchDirectPhase(
280
280
  unitType,
281
281
  authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
282
282
  baseUrl: ctx.model?.baseUrl,
283
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
283
284
  },
284
285
  );
285
286
  if (compatibilityError) {