@opengsd/gsd-pi 1.8.1 → 1.9.0-dev.97ef11e3

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 (613) hide show
  1. package/README.md +10 -8
  2. package/dist/cli.js +5 -1
  3. package/dist/headless-events.d.ts +2 -1
  4. package/dist/headless-events.js +11 -3
  5. package/dist/headless-milestone-readiness.d.ts +29 -0
  6. package/dist/headless-milestone-readiness.js +161 -0
  7. package/dist/headless.js +27 -3
  8. package/dist/print-mode-exit.d.ts +12 -0
  9. package/dist/print-mode-exit.js +14 -0
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +18 -49
  12. package/dist/resources/extensions/browser-tools/capture.js +2 -77
  13. package/dist/resources/extensions/browser-tools/screenshot-constraints.js +83 -0
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +17 -2
  15. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +30 -2
  16. package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
  17. package/dist/resources/extensions/gsd/auto/loop.js +24 -4
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
  19. package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
  20. package/dist/resources/extensions/gsd/auto-artifact-paths.js +16 -10
  21. package/dist/resources/extensions/gsd/auto-dispatch.js +76 -19
  22. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
  23. package/dist/resources/extensions/gsd/auto-prompts.js +137 -22
  24. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  25. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
  26. package/dist/resources/extensions/gsd/auto-start.js +29 -9
  27. package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
  28. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
  29. package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
  30. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
  31. package/dist/resources/extensions/gsd/auto.js +20 -6
  32. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
  33. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
  34. package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -50
  36. package/dist/resources/extensions/gsd/command-feedback.js +16 -12
  37. package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
  38. package/dist/resources/extensions/gsd/compat/compat-marker.js +98 -6
  39. package/dist/resources/extensions/gsd/constants.js +12 -13
  40. package/dist/resources/extensions/gsd/context-masker.js +97 -21
  41. package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
  42. package/dist/resources/extensions/gsd/db/engine.js +56 -18
  43. package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
  44. package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
  45. package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
  46. package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
  47. package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
  48. package/dist/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  49. package/dist/resources/extensions/gsd/doctor-engine-checks.js +24 -8
  50. package/dist/resources/extensions/gsd/error-classifier.js +12 -2
  51. package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
  52. package/dist/resources/extensions/gsd/flat-phase-migration.js +168 -21
  53. package/dist/resources/extensions/gsd/git-service.js +19 -7
  54. package/dist/resources/extensions/gsd/gsd-db.js +262 -76
  55. package/dist/resources/extensions/gsd/guided-flow.js +40 -15
  56. package/dist/resources/extensions/gsd/markdown-renderer.js +20 -22
  57. package/dist/resources/extensions/gsd/md-importer.js +107 -20
  58. package/dist/resources/extensions/gsd/migrate/command.js +19 -162
  59. package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
  60. package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
  61. package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
  62. package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
  63. package/dist/resources/extensions/gsd/model-cost-table.js +2 -0
  64. package/dist/resources/extensions/gsd/model-router.js +11 -0
  65. package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
  66. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
  67. package/dist/resources/extensions/gsd/paths.js +70 -16
  68. package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
  69. package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
  70. package/dist/resources/extensions/gsd/planning-subagent-registry.js +25 -0
  71. package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
  72. package/dist/resources/extensions/gsd/preferences-types.js +5 -0
  73. package/dist/resources/extensions/gsd/preferences-validation.js +48 -1
  74. package/dist/resources/extensions/gsd/preferences.js +17 -0
  75. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  76. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
  77. package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
  78. package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
  79. package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
  80. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
  81. package/dist/resources/extensions/gsd/skill-activation.js +17 -3
  82. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +125 -15
  83. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +17 -4
  84. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
  85. package/dist/resources/extensions/gsd/stop-notice.js +24 -1
  86. package/dist/resources/extensions/gsd/sync-lock.js +13 -7
  87. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  88. package/dist/resources/extensions/gsd/tools/complete-task.js +94 -6
  89. package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
  90. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
  91. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
  92. package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
  93. package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
  94. package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
  95. package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
  96. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
  97. package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
  98. package/dist/resources/extensions/gsd/unit-registry.js +4 -0
  99. package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
  100. package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
  101. package/dist/resources/extensions/gsd/workspace.js +2 -1
  102. package/dist/resources/extensions/gsd/worktree-state-projection.js +26 -18
  103. package/dist/resources/extensions/mac-tools/index.js +31 -9
  104. package/dist/resources/extensions/shared/interview-ui.js +43 -6
  105. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  106. package/dist/web/standalone/.next/BUILD_ID +1 -1
  107. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  108. package/dist/web/standalone/.next/build-manifest.json +3 -3
  109. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  110. package/dist/web/standalone/.next/required-server-files.json +3 -3
  111. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  112. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  122. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  131. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  138. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  150. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  188. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  204. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  208. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/index.html +1 -1
  218. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  219. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  220. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  221. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  223. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  224. package/dist/web/standalone/.next/server/app/page.js +2 -2
  225. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  227. package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
  228. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  229. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  230. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  231. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/middleware.js +3 -3
  233. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  234. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  235. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  236. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  238. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  240. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  241. package/dist/web/standalone/.next/static/css/3b1ceb7abfb9a230.css +1 -0
  242. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  243. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  244. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  245. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  246. package/dist/web/standalone/package.json +0 -1
  247. package/dist/web/standalone/server.js +1 -1
  248. package/dist/web-mode.js +31 -3
  249. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  250. package/integrations/hermes/pyproject.toml +1 -1
  251. package/package.json +13 -10
  252. package/packages/cloud-mcp-gateway/package.json +2 -2
  253. package/packages/contracts/dist/workflow.d.ts +14 -0
  254. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  255. package/packages/contracts/dist/workflow.js +16 -0
  256. package/packages/contracts/dist/workflow.js.map +1 -1
  257. package/packages/contracts/package.json +1 -1
  258. package/packages/daemon/dist/cloud-config.d.ts +1 -1
  259. package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
  260. package/packages/daemon/dist/cloud-config.js +5 -1
  261. package/packages/daemon/dist/cloud-config.js.map +1 -1
  262. package/packages/daemon/dist/cloud-config.test.js +51 -1
  263. package/packages/daemon/dist/cloud-config.test.js.map +1 -1
  264. package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
  265. package/packages/daemon/dist/local-tool-executor.js +2 -0
  266. package/packages/daemon/dist/local-tool-executor.js.map +1 -1
  267. package/packages/daemon/package.json +6 -6
  268. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  269. package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
  270. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  271. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  272. package/packages/gsd-agent-core/dist/sdk.js +1 -0
  273. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  274. package/packages/gsd-agent-core/package.json +5 -5
  275. package/packages/gsd-agent-modes/package.json +7 -7
  276. package/packages/gsd-cloud/README.md +9 -3
  277. package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
  278. package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
  279. package/packages/gsd-cloud/dist/background-cli.test.js +248 -0
  280. package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
  281. package/packages/gsd-cloud/dist/cli.d.ts +5 -0
  282. package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
  283. package/packages/gsd-cloud/dist/cli.js +266 -0
  284. package/packages/gsd-cloud/dist/cli.js.map +1 -0
  285. package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
  286. package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
  287. package/packages/gsd-cloud/dist/cloud-config.js +237 -0
  288. package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
  289. package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
  290. package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
  291. package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
  292. package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
  293. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
  294. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
  295. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
  296. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
  297. package/packages/gsd-cloud/dist/cloud-runtime.d.ts +33 -0
  298. package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
  299. package/packages/gsd-cloud/dist/cloud-runtime.js +260 -0
  300. package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
  301. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
  302. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
  303. package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
  304. package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
  305. package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
  306. package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
  307. package/packages/gsd-cloud/dist/cloud-token.js +37 -0
  308. package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
  309. package/packages/gsd-cloud/dist/config.d.ts +17 -0
  310. package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
  311. package/packages/gsd-cloud/dist/config.js +146 -0
  312. package/packages/gsd-cloud/dist/config.js.map +1 -0
  313. package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
  314. package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
  315. package/packages/gsd-cloud/dist/device-flow.js +128 -0
  316. package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
  317. package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
  318. package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
  319. package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
  320. package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
  321. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
  322. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
  323. package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
  324. package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
  325. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
  326. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
  327. package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
  328. package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
  329. package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
  330. package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
  331. package/packages/gsd-cloud/dist/executors/executor.js +11 -0
  332. package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
  333. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
  334. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
  335. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
  336. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
  337. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
  338. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
  339. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
  340. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
  341. package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
  342. package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
  343. package/packages/gsd-cloud/dist/executors/index.js +29 -0
  344. package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
  345. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
  346. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
  347. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
  348. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
  349. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
  350. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
  351. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
  352. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
  353. package/packages/gsd-cloud/dist/index.d.ts +7 -0
  354. package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
  355. package/packages/gsd-cloud/dist/index.js +8 -0
  356. package/packages/gsd-cloud/dist/index.js.map +1 -0
  357. package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
  358. package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
  359. package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
  360. package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
  361. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
  362. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
  363. package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
  364. package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
  365. package/packages/gsd-cloud/dist/logger.d.ts +25 -0
  366. package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
  367. package/packages/gsd-cloud/dist/logger.js +72 -0
  368. package/packages/gsd-cloud/dist/logger.js.map +1 -0
  369. package/packages/gsd-cloud/dist/runtime-process.d.ts +27 -0
  370. package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
  371. package/packages/gsd-cloud/dist/runtime-process.js +272 -0
  372. package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
  373. package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
  374. package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
  375. package/packages/gsd-cloud/dist/runtime-process.test.js +97 -0
  376. package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
  377. package/packages/gsd-cloud/dist/types.d.ts +51 -0
  378. package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
  379. package/packages/gsd-cloud/dist/types.js +9 -0
  380. package/packages/gsd-cloud/dist/types.js.map +1 -0
  381. package/packages/gsd-cloud/package.json +3 -3
  382. package/packages/mcp-server/README.md +15 -2
  383. package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
  384. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
  385. package/packages/mcp-server/dist/cli-runner.js +119 -33
  386. package/packages/mcp-server/dist/cli-runner.js.map +1 -1
  387. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  388. package/packages/mcp-server/dist/server.js +5 -5
  389. package/packages/mcp-server/dist/server.js.map +1 -1
  390. package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
  391. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  392. package/packages/mcp-server/dist/workflow-tools.js +64 -2
  393. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  394. package/packages/mcp-server/package.json +4 -4
  395. package/packages/native/package.json +1 -1
  396. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  397. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  398. package/packages/pi-agent-core/dist/agent.js +2 -0
  399. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  400. package/packages/pi-agent-core/package.json +1 -1
  401. package/packages/pi-ai/dist/models.generated.d.ts +136 -0
  402. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  403. package/packages/pi-ai/dist/models.generated.js +124 -0
  404. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  405. package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
  406. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  407. package/packages/pi-ai/dist/providers/anthropic.js +25 -1
  408. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  409. package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
  410. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  411. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  412. package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
  413. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  414. package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
  415. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  416. package/packages/pi-ai/package.json +1 -1
  417. package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
  418. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  419. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
  420. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  421. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +11 -1
  422. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  424. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  425. package/packages/pi-coding-agent/package.json +7 -7
  426. package/packages/pi-tui/package.json +2 -2
  427. package/packages/rpc-client/package.json +2 -2
  428. package/pkg/package.json +1 -1
  429. package/src/resources/GSD-WORKFLOW.md +18 -49
  430. package/src/resources/extensions/browser-tools/capture.ts +2 -86
  431. package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
  432. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
  433. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
  434. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
  435. package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
  436. package/src/resources/extensions/gsd/auto/loop.ts +48 -4
  437. package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
  438. package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
  439. package/src/resources/extensions/gsd/auto-artifact-paths.ts +16 -9
  440. package/src/resources/extensions/gsd/auto-dispatch.ts +87 -19
  441. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
  442. package/src/resources/extensions/gsd/auto-prompts.ts +156 -20
  443. package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
  444. package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
  445. package/src/resources/extensions/gsd/auto-start.ts +31 -8
  446. package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
  447. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
  448. package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
  449. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
  450. package/src/resources/extensions/gsd/auto.ts +25 -8
  451. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
  452. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
  453. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
  454. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +87 -53
  455. package/src/resources/extensions/gsd/command-feedback.ts +19 -12
  456. package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
  457. package/src/resources/extensions/gsd/compat/compat-marker.ts +119 -8
  458. package/src/resources/extensions/gsd/constants.ts +14 -13
  459. package/src/resources/extensions/gsd/context-masker.ts +98 -2
  460. package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
  461. package/src/resources/extensions/gsd/db/engine.ts +58 -19
  462. package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
  463. package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
  464. package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
  465. package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
  466. package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
  467. package/src/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  468. package/src/resources/extensions/gsd/doctor-engine-checks.ts +30 -7
  469. package/src/resources/extensions/gsd/error-classifier.ts +13 -2
  470. package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
  471. package/src/resources/extensions/gsd/flat-phase-migration.ts +174 -19
  472. package/src/resources/extensions/gsd/git-service.ts +19 -6
  473. package/src/resources/extensions/gsd/gsd-db.ts +340 -85
  474. package/src/resources/extensions/gsd/guided-flow.ts +50 -14
  475. package/src/resources/extensions/gsd/markdown-renderer.ts +28 -30
  476. package/src/resources/extensions/gsd/md-importer.ts +114 -16
  477. package/src/resources/extensions/gsd/migrate/command.ts +21 -227
  478. package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
  479. package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
  480. package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
  481. package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
  482. package/src/resources/extensions/gsd/model-cost-table.ts +2 -0
  483. package/src/resources/extensions/gsd/model-router.ts +12 -0
  484. package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
  485. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
  486. package/src/resources/extensions/gsd/paths.ts +77 -16
  487. package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
  488. package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
  489. package/src/resources/extensions/gsd/planning-subagent-registry.ts +31 -0
  490. package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
  491. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  492. package/src/resources/extensions/gsd/preferences-validation.ts +62 -0
  493. package/src/resources/extensions/gsd/preferences.ts +25 -0
  494. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  495. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
  496. package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
  497. package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
  498. package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
  499. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
  500. package/src/resources/extensions/gsd/skill-activation.ts +17 -3
  501. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +162 -15
  502. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +20 -4
  503. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
  504. package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
  505. package/src/resources/extensions/gsd/stop-notice.ts +29 -1
  506. package/src/resources/extensions/gsd/sync-lock.ts +14 -6
  507. package/src/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  508. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
  509. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
  510. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
  511. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
  512. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
  513. package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
  514. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
  515. package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
  516. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
  517. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +129 -0
  518. package/src/resources/extensions/gsd/tests/complete-task.test.ts +362 -1
  519. package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
  520. package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
  521. package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
  522. package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
  523. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
  524. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
  525. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
  526. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
  527. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
  528. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
  529. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +83 -0
  530. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
  531. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
  532. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
  533. package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
  534. package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
  535. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +201 -0
  536. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
  537. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
  538. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +57 -0
  539. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
  540. package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
  541. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
  542. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
  543. package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
  544. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
  545. package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
  546. package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
  547. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
  548. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
  549. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  550. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  551. package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
  552. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
  553. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
  554. package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
  555. package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
  556. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
  557. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
  558. package/src/resources/extensions/gsd/tests/preferences.test.ts +84 -0
  559. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +4 -0
  560. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
  561. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
  562. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
  563. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
  564. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
  565. package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
  566. package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
  567. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  568. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
  569. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
  570. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
  571. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
  572. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +38 -1
  573. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
  574. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
  575. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
  576. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
  577. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
  578. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +73 -0
  579. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
  580. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
  581. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
  582. package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
  583. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
  584. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
  585. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
  586. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
  587. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
  588. package/src/resources/extensions/gsd/tools/complete-task.ts +140 -5
  589. package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
  590. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
  591. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
  592. package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
  593. package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
  594. package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
  595. package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
  596. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
  597. package/src/resources/extensions/gsd/types.ts +11 -0
  598. package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
  599. package/src/resources/extensions/gsd/unit-registry.ts +4 -0
  600. package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
  601. package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
  602. package/src/resources/extensions/gsd/workspace.ts +2 -1
  603. package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -24
  604. package/src/resources/extensions/mac-tools/index.ts +52 -9
  605. package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
  606. package/src/resources/extensions/shared/interview-ui.ts +47 -8
  607. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -0
  608. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  609. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  610. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  611. package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
  612. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → DXD9fZPnqtjZSlT5xdC3v}/_buildManifest.js +0 -0
  613. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → DXD9fZPnqtjZSlT5xdC3v}/_ssgManifest.js +0 -0
@@ -209,7 +209,8 @@ export function shouldRunDeepProjectSetup(state, prefs, basePath, options = {})
209
209
  }
210
210
  function resolveArtifactBasePath(basePath, mid, session) {
211
211
  if (session?.basePath &&
212
- session.currentMilestoneId === mid &&
212
+ session.currentMilestoneId &&
213
+ milestoneIdsDispatchCompatible(session.currentMilestoneId, mid) &&
213
214
  existsSync(session.basePath)) {
214
215
  return session.basePath;
215
216
  }
@@ -231,6 +232,24 @@ function normalizeMilestoneScope(value) {
231
232
  return null;
232
233
  return trimmed;
233
234
  }
235
+ function dispatchMilestoneIdentity(value) {
236
+ const normalized = normalizeMilestoneScope(value);
237
+ const match = normalized?.match(/^(M\d{3})(?:-[a-z0-9]{6})?$/);
238
+ if (!match)
239
+ return null;
240
+ return { baseId: match[1], hasSuffix: normalized !== match[1] };
241
+ }
242
+ function isBareSuffixedMilestoneAlias(left, right) {
243
+ const leftId = dispatchMilestoneIdentity(left);
244
+ const rightId = dispatchMilestoneIdentity(right);
245
+ return Boolean(leftId &&
246
+ rightId &&
247
+ leftId.baseId === rightId.baseId &&
248
+ leftId.hasSuffix !== rightId.hasSuffix);
249
+ }
250
+ function milestoneIdsDispatchCompatible(left, right) {
251
+ return left === right || isBareSuffixedMilestoneAlias(left, right);
252
+ }
234
253
  function resolveDispatchMilestoneScope(ctx) {
235
254
  const sessionMilestone = normalizeMilestoneScope(ctx.session?.currentMilestoneId);
236
255
  if (sessionMilestone)
@@ -243,6 +262,31 @@ function resolveDispatchMilestoneScope(ctx) {
243
262
  return { id: baseWorktree, source: "basePath worktree" };
244
263
  return null;
245
264
  }
265
+ function resolveEffectiveDispatchMilestoneId(ctx, scopedMilestone) {
266
+ if (scopedMilestone && isBareSuffixedMilestoneAlias(ctx.mid, scopedMilestone.id)) {
267
+ return dispatchMilestoneIdentity(scopedMilestone.id)?.hasSuffix ? scopedMilestone.id : ctx.mid;
268
+ }
269
+ const activeMid = ctx.state.activeMilestone?.id;
270
+ if (activeMid && isBareSuffixedMilestoneAlias(ctx.mid, activeMid)) {
271
+ return dispatchMilestoneIdentity(activeMid)?.hasSuffix ? activeMid : ctx.mid;
272
+ }
273
+ return ctx.mid;
274
+ }
275
+ function withEffectiveDispatchMilestone(ctx, effectiveMid) {
276
+ if (effectiveMid === ctx.mid)
277
+ return ctx;
278
+ const activeMilestone = ctx.state.activeMilestone;
279
+ const state = activeMilestone && milestoneIdsDispatchCompatible(activeMilestone.id, effectiveMid)
280
+ ? {
281
+ ...ctx.state,
282
+ activeMilestone: {
283
+ ...activeMilestone,
284
+ id: effectiveMid,
285
+ },
286
+ }
287
+ : ctx.state;
288
+ return { ...ctx, mid: effectiveMid, state };
289
+ }
246
290
  function hasMilestonePassedDiscuss(basePath, mid) {
247
291
  if (isDbAvailable()) {
248
292
  try {
@@ -510,18 +554,25 @@ export const DISPATCH_RULES = [
510
554
  // Fire BEFORE the execution-entry phase rules so we redispatch to
511
555
  // `discuss-milestone` instead of hitting the plan-v2 gate.
512
556
  name: "execution-entry phase (no context) → discuss-milestone",
513
- match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
557
+ match: async ({ state, mid, midTitle, basePath, session, prefs, structuredQuestionsAvailable }) => {
514
558
  if (!EXECUTION_ENTRY_PHASES.has(state.phase))
515
559
  return null;
516
560
  if (!MILESTONE_ID_RE.test(mid))
517
561
  return null;
518
562
  if (isRegistryMilestoneComplete(state, mid))
519
563
  return null;
520
- if (hasMilestonePassedDiscuss(basePath, mid))
564
+ // Resolve discuss/context artifacts against the active session worktree,
565
+ // mirroring the executing rules below. For a suffixed-worktree milestone
566
+ // the CONTEXT and slice plans live under the worktree, not the project
567
+ // root; checking the raw project-root basePath misreads the milestone as
568
+ // "never discussed" and re-dispatches discuss-milestone after task
569
+ // closeout instead of continuing execution (#1317).
570
+ const artifactBasePath = resolveArtifactBasePath(basePath, mid, session);
571
+ if (hasMilestonePassedDiscuss(artifactBasePath, mid))
521
572
  return null;
522
573
  // Align with the plan-v2 gate's lookup semantics: whitespace-only counts
523
574
  // as missing, and an auto worktree may fall back to GSD_PROJECT_ROOT.
524
- if (hasFinalizedMilestoneContext(basePath, mid))
575
+ if (hasFinalizedMilestoneContext(artifactBasePath, mid))
525
576
  return null;
526
577
  // H6 fix (#4973): non-deep auto-mode has no human to answer the
527
578
  // depth-verification question, so pre-marking avoids a write-gate
@@ -854,12 +905,14 @@ export const DISPATCH_RULES = [
854
905
  },
855
906
  {
856
907
  name: "pre-planning (no context) → discuss-milestone",
857
- match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
908
+ match: async ({ state, mid, midTitle, basePath, prefs, session, structuredQuestionsAvailable }) => {
858
909
  if (state.phase !== "pre-planning")
859
910
  return null;
860
911
  if (isRegistryMilestoneComplete(state, mid))
861
912
  return null;
862
- const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
913
+ const contextBasePath = resolveWorktreeProjectRoot(basePath, session?.originalBasePath);
914
+ const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT") ??
915
+ (contextBasePath !== basePath ? resolveMilestoneFile(contextBasePath, mid, "CONTEXT") : null);
863
916
  const hasContext = !!(contextFile && (await loadFile(contextFile)));
864
917
  if (hasContext)
865
918
  return null; // fall through to next rule
@@ -1550,6 +1603,8 @@ function applyLanguageDirectiveToDispatch(action, prefs) {
1550
1603
  const directive = renderLanguageDirectiveForPrompt(prefs);
1551
1604
  if (!directive)
1552
1605
  return action;
1606
+ if (action.prompt.startsWith(directive))
1607
+ return action;
1553
1608
  return { ...action, prompt: `${directive}\n\n${action.prompt}` };
1554
1609
  }
1555
1610
  // ─── Resolver ─────────────────────────────────────────────────────────────
@@ -1562,31 +1617,33 @@ function applyLanguageDirectiveToDispatch(action, prefs) {
1562
1617
  * resolveDispatch directly without registry initialization).
1563
1618
  */
1564
1619
  export async function resolveDispatch(ctx) {
1565
- if (ctx.mid && isDbAvailable()) {
1566
- const milestone = getMilestone(ctx.mid);
1620
+ const scopedMilestone = resolveDispatchMilestoneScope(ctx);
1621
+ const effectiveMid = resolveEffectiveDispatchMilestoneId(ctx, scopedMilestone);
1622
+ const dispatchCtx = withEffectiveDispatchMilestone(ctx, effectiveMid);
1623
+ if (dispatchCtx.mid && isDbAvailable()) {
1624
+ const milestone = getMilestone(dispatchCtx.mid);
1567
1625
  if (milestone && isClosedStatus(milestone.status)) {
1568
1626
  return {
1569
1627
  action: "stop",
1570
- reason: `Milestone ${ctx.mid} is closed (status: ${milestone.status}); auto-mode will not reopen or recover it implicitly. ` +
1628
+ reason: `Milestone ${dispatchCtx.mid} is closed (status: ${milestone.status}); auto-mode will not reopen or recover it implicitly. ` +
1571
1629
  "Use an explicit reopen command before planning or executing more work for this milestone.",
1572
1630
  level: "warning",
1573
1631
  };
1574
1632
  }
1575
1633
  }
1576
- const activeMid = ctx.state.activeMilestone?.id;
1577
- if (activeMid && ctx.mid !== activeMid) {
1634
+ const activeMid = dispatchCtx.state.activeMilestone?.id;
1635
+ if (activeMid && !milestoneIdsDispatchCompatible(dispatchCtx.mid, activeMid)) {
1578
1636
  return {
1579
1637
  action: "stop",
1580
- reason: `Dispatch milestone mismatch: context mid "${ctx.mid}" does not match active milestone "${activeMid}". ` +
1638
+ reason: `Dispatch milestone mismatch: context mid "${dispatchCtx.mid}" does not match active milestone "${activeMid}". ` +
1581
1639
  "This usually means a project-level deep setup pseudo-id leaked into milestone dispatch; rerun /gsd auto after setup state is reconciled.",
1582
1640
  level: "warning",
1583
1641
  };
1584
1642
  }
1585
- const scopedMilestone = resolveDispatchMilestoneScope(ctx);
1586
- if (scopedMilestone && ctx.mid !== scopedMilestone.id) {
1643
+ if (scopedMilestone && !milestoneIdsDispatchCompatible(dispatchCtx.mid, scopedMilestone.id)) {
1587
1644
  return {
1588
1645
  action: "stop",
1589
- reason: `Dispatch milestone mismatch: context mid "${ctx.mid}" does not match ${scopedMilestone.source} "${scopedMilestone.id}". ` +
1646
+ reason: `Dispatch milestone mismatch: context mid "${dispatchCtx.mid}" does not match ${scopedMilestone.source} "${scopedMilestone.id}". ` +
1590
1647
  "The active worktree/session and derived project state disagree; recover, park, or discard the stranded milestone before continuing.",
1591
1648
  level: "warning",
1592
1649
  };
@@ -1594,9 +1651,9 @@ export async function resolveDispatch(ctx) {
1594
1651
  // Delegate to registry when available
1595
1652
  try {
1596
1653
  const registry = getRegistry();
1597
- const action = annotateBackgroundable(await registry.evaluateDispatch(ctx));
1654
+ const action = annotateBackgroundable(await registry.evaluateDispatch(dispatchCtx));
1598
1655
  if (action.action === "dispatch" &&
1599
- ctx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)) {
1656
+ dispatchCtx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)) {
1600
1657
  return {
1601
1658
  action: "stop",
1602
1659
  reason: `Unit ${action.unitId} exhausted verification retries this session.`,
@@ -1610,13 +1667,13 @@ export async function resolveDispatch(ctx) {
1610
1667
  logWarning("dispatch", `registry dispatch failed, falling back to inline rules: ${err instanceof Error ? err.message : String(err)}`);
1611
1668
  }
1612
1669
  for (const rule of DISPATCH_RULES) {
1613
- const result = await rule.match(ctx);
1670
+ const result = await rule.match(dispatchCtx);
1614
1671
  if (result) {
1615
1672
  if (result.action !== "skip")
1616
1673
  result.matchedRule = rule.name;
1617
1674
  const action = annotateBackgroundable(result);
1618
1675
  if (action.action === "dispatch" &&
1619
- ctx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)) {
1676
+ dispatchCtx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)) {
1620
1677
  return {
1621
1678
  action: "stop",
1622
1679
  reason: `Unit ${action.unitId} exhausted verification retries this session.`,
@@ -1411,6 +1411,10 @@ export async function postUnitPreVerification(pctx, opts) {
1411
1411
  const blockingMismatch = mismatches.find((mismatch) => mismatch.severity === "error");
1412
1412
  if (blockingMismatch) {
1413
1413
  ctx.ui.notify(`Safety: task ${sTid} claimed passing verification that failed in recorded execution`, "error");
1414
+ const gitActionResult = await runCloseoutGitAction(pctx, s.currentUnit);
1415
+ if (gitActionResult === "dispatched") {
1416
+ return "dispatched";
1417
+ }
1414
1418
  await pauseAuto(ctx, pi);
1415
1419
  return "dispatched";
1416
1420
  }
@@ -10,15 +10,15 @@
10
10
  import { loadFile, parseContinue, parseSummary, loadActiveOverrides, formatOverridesSection } from "./files.js";
11
11
  import { extractVerdict } from "./verdict-parser.js";
12
12
  import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
13
- import { resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveTasksDir, resolveTaskFiles, resolveTaskFile, relMilestoneFile, relSliceFile, relSlicePath, relMilestonePath, relTaskFile, resolveGsdRootFile, relGsdRootFile, resolveRuntimeFile, } from "./paths.js";
14
- import { resolveInlineLevel, loadEffectiveGSDPreferences } from "./preferences.js";
13
+ import { resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveTasksDir, resolveTaskFiles, resolveTaskFile, taskIdFromTaskFileName, relMilestoneFile, relSliceFile, relSlicePath, relMilestonePath, relTaskFile, resolveGsdRootFile, relGsdRootFile, resolveRuntimeFile, } from "./paths.js";
14
+ import { resolveInlineLevel, loadEffectiveGSDPreferences, renderLanguageDirectiveForPrompt } from "./preferences.js";
15
15
  import { createRepositoryRegistryFromPreferences } from "./repository-registry.js";
16
16
  import { isContextModeEnabled } from "./preferences-types.js";
17
17
  import { parseRoadmap } from "./parsers-legacy.js";
18
- import { join, relative, sep } from "node:path";
18
+ import { join, basename, relative, sep } from "node:path";
19
19
  import { existsSync } from "node:fs";
20
20
  import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary } from "./context-budget.js";
21
- import { getGateResults, getPendingGatesForTurn } from "./gsd-db.js";
21
+ import { getBlockingReworkFindingsForTask, getGateResults, getPendingGatesForTurn } from "./gsd-db.js";
22
22
  import { assertGateCoverage, getGatesForTurn, } from "./gate-registry.js";
23
23
  import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
24
24
  import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
@@ -47,6 +47,12 @@ export { buildSkillActivationBlock, buildSkillDiscoveryVars };
47
47
  * from their configured executor window.
48
48
  */
49
49
  const MAX_PREAMBLE_CHARS = 20_000;
50
+ function prependLanguageDirectiveForBase(base, prompt) {
51
+ const directive = renderLanguageDirectiveForPrompt(loadEffectiveGSDPreferences(base)?.preferences);
52
+ if (!directive || prompt.startsWith(directive))
53
+ return prompt;
54
+ return `${directive}\n\n${prompt}`;
55
+ }
50
56
  /**
51
57
  * Resolve prompt budgets from the configured executor context window.
52
58
  *
@@ -62,13 +68,29 @@ function resolvePromptBudgets() {
62
68
  const prefs = loadEffectiveGSDPreferences();
63
69
  const sessionWindow = prefs?.preferences.context_window_override;
64
70
  const windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences, sessionWindow);
65
- return computeBudgets(windowTokens);
71
+ return computeBudgets(windowTokens, resolveExecutionProvider(prefs?.preferences));
66
72
  }
67
73
  catch (e) {
68
74
  logWarning("prompt", `resolvePromptBudgets failed: ${e.message}`);
69
75
  return computeBudgets(200_000);
70
76
  }
71
77
  }
78
+ /**
79
+ * Best-effort provider for the chars/token ratio: the executor's configured
80
+ * model profile is the only provider source reachable here (the runtime
81
+ * `sessionProvider` that reaches `formatExecutorConstraints` isn't threaded to
82
+ * `capPreamble`/summary callers). Undefined when no explicit provider is set —
83
+ * `computeBudgets` then uses the 4.0 default, i.e. today's behavior.
84
+ */
85
+ function resolveExecutionProvider(prefs) {
86
+ const exec = prefs?.models?.execution;
87
+ if (exec && typeof exec === "object" && "provider" in exec) {
88
+ const provider = exec.provider;
89
+ if (typeof provider === "string" && provider)
90
+ return provider;
91
+ }
92
+ return undefined;
93
+ }
72
94
  /**
73
95
  * Character budget for dependency/prior slice summaries injected into dispatch
74
96
  * prompts. Scales with the executor's configured context window (issue #4435).
@@ -76,6 +98,32 @@ function resolvePromptBudgets() {
76
98
  function resolveSummaryBudgetChars() {
77
99
  return resolvePromptBudgets().summaryBudgetChars;
78
100
  }
101
+ function renderBlockingReworkFindingsBlock(mid, sid, tid) {
102
+ const findings = getBlockingReworkFindingsForTask(mid, sid, tid)
103
+ .filter((finding) => finding.status === "pending");
104
+ if (findings.length === 0)
105
+ return "";
106
+ const lines = [
107
+ "## Blocking Rework Findings (non-optional)",
108
+ "",
109
+ "This task has structured blocking rework findings. Address every finding before calling `gsd_task_complete`. Include `reworkResolution` entries with each `findingId`, `status: \"resolved\"`, and concrete evidence. If deferring a finding, use `status: \"deferred-with-override\"` with concrete evidence and `decisionRef`.",
110
+ "",
111
+ ];
112
+ for (const finding of findings) {
113
+ lines.push(`### ${finding.finding_id} (${finding.severity})`);
114
+ lines.push(`- Status: ${finding.status}`);
115
+ lines.push(`- Finding: ${finding.description}`);
116
+ lines.push(`- Required fix: ${finding.required_fix}`);
117
+ if (finding.verification_commands.length > 0) {
118
+ lines.push("- Required verification:");
119
+ for (const command of finding.verification_commands) {
120
+ lines.push(` - \`${command}\``);
121
+ }
122
+ }
123
+ lines.push("");
124
+ }
125
+ return lines.join("\n").trim();
126
+ }
79
127
  function formatProjectClassificationForPlanning(classification) {
80
128
  const sampleFiles = classification.contentFiles.slice(0, 8);
81
129
  const sample = sampleFiles.length > 0 ? sampleFiles.map((file) => `\`${file}\``).join(", ") : "(none)";
@@ -174,7 +222,7 @@ function formatCloseoutReviewInstructions(validationContent, validationRel, curr
174
222
  `No passing validation artifact was found at \`${validationRel}\`. Use the full closeout review path before completion.`,
175
223
  ].join("\n");
176
224
  }
177
- function capPreamble(preamble) {
225
+ export function capPreamble(preamble) {
178
226
  // Cap inlined context at min(static ceiling, scaled inline budget).
179
227
  // The ceiling bounds repeated auto prompt payloads; the scaled
180
228
  // budget tightens the cap for small-window users whose true safe limit is
@@ -184,6 +232,35 @@ function capPreamble(preamble) {
184
232
  return preamble;
185
233
  return truncateAtSectionBoundary(preamble, budget).content;
186
234
  }
235
+ /**
236
+ * Cap the execute-task inline blocks against one shared budget in priority
237
+ * order. Unlike `capPreamble` (single concatenated preamble), execute-task
238
+ * feeds these blocks into separate, non-contiguous template placeholders, so
239
+ * they can't be joined and re-split — the budget is spent block-by-block.
240
+ *
241
+ * The task plan is the authoritative execution contract: it is never truncated
242
+ * here (it consumes budget first, whole). Remaining budget flows to the slice
243
+ * excerpt, then templates, each truncated at section boundaries so the lowest-
244
+ * priority context drops whole trailing sections first. When the task plan
245
+ * alone meets or exceeds the budget, the trailing blocks are dropped rather
246
+ * than the task plan being cut.
247
+ */
248
+ function capExecuteTaskInlineBlocks(taskPlan, slicePlan, templates, budgetChars) {
249
+ let remaining = budgetChars - taskPlan.length;
250
+ if (remaining <= 0) {
251
+ return { taskPlan, slicePlan: "", templates: "" };
252
+ }
253
+ const cappedSlice = slicePlan.length <= remaining
254
+ ? slicePlan
255
+ : truncateAtSectionBoundary(slicePlan, remaining).content;
256
+ remaining -= cappedSlice.length;
257
+ const cappedTemplates = remaining <= 0
258
+ ? ""
259
+ : templates.length <= remaining
260
+ ? templates
261
+ : truncateAtSectionBoundary(templates, remaining).content;
262
+ return { taskPlan, slicePlan: cappedSlice, templates: cappedTemplates };
263
+ }
187
264
  function trackPromptContext(entries, key, mode, body, reason) {
188
265
  entries.push({
189
266
  key,
@@ -227,7 +304,7 @@ function renderContextModeBlockForPrompt(unitType, base, renderMode = "standalon
227
304
  return `${contextMode}\n\n## Context Snapshot\nSource: \`.gsd/last-snapshot.md\`\n\n${snapshot.trimEnd()}`;
228
305
  }
229
306
  function prependContextModeToBlock(unitType, base, block, renderMode = "standalone") {
230
- const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
307
+ const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode, basePath: base });
231
308
  const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
232
309
  const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
233
310
  if (!guidance)
@@ -284,7 +361,7 @@ function formatExecutorConstraints(sessionContextWindow, modelRegistry, sessionP
284
361
  // so DEFAULT_CONTEXT_WINDOW stays the single source of truth.
285
362
  windowTokens = resolveExecutorContextWindow(undefined, undefined, sessionContextWindow, sessionProvider);
286
363
  }
287
- const budgets = computeBudgets(windowTokens);
364
+ const budgets = computeBudgets(windowTokens, sessionProvider);
288
365
  const { min, max } = budgets.taskCountRange;
289
366
  const execWindowK = Math.round(windowTokens / 1000);
290
367
  const perTaskBudgetK = Math.round(budgets.inlineContextBudgetChars / 1000);
@@ -1219,6 +1296,13 @@ function resolveTaskSummariesLocation(base, mid, sid) {
1219
1296
  return { dir: tDir, relPrefix: `${sRel}/tasks` };
1220
1297
  return { dir: slicePath, relPrefix: sRel };
1221
1298
  }
1299
+ function summaryFileBelongsToSlice(fileName, base, mid, sid) {
1300
+ const tid = taskIdFromTaskFileName(fileName, "SUMMARY");
1301
+ if (!tid)
1302
+ return false;
1303
+ const resolved = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
1304
+ return resolved !== null && basename(resolved) === fileName;
1305
+ }
1222
1306
  export async function getPriorTaskSummaryPaths(mid, sid, currentTid, base) {
1223
1307
  const loc = resolveTaskSummariesLocation(base, mid, sid);
1224
1308
  if (!loc)
@@ -1227,7 +1311,12 @@ export async function getPriorTaskSummaryPaths(mid, sid, currentTid, base) {
1227
1311
  const currentNum = parseInt(currentTid.replace(/^T/, ""), 10);
1228
1312
  return summaryFiles
1229
1313
  .filter(f => {
1230
- const num = parseInt(f.replace(/^T/, ""), 10);
1314
+ if (!summaryFileBelongsToSlice(f, base, mid, sid))
1315
+ return false;
1316
+ const tid = taskIdFromTaskFileName(f, "SUMMARY");
1317
+ if (!tid)
1318
+ return false;
1319
+ const num = parseInt(tid.replace(/^T/, ""), 10);
1231
1320
  return num < currentNum;
1232
1321
  })
1233
1322
  .map(f => `${loc.relPrefix}/${f}`);
@@ -1254,8 +1343,11 @@ export async function getDependencyTaskSummaryPaths(mid, sid, currentTid, depend
1254
1343
  const depSet = new Set(dependsOn.map((d) => d.toUpperCase()));
1255
1344
  return summaryFiles
1256
1345
  .filter((f) => {
1257
- // Extract task ID from filename: "T02-SUMMARY.md" → "T02"
1258
- const tid = f.replace(/-SUMMARY\.md$/i, "").toUpperCase();
1346
+ if (!summaryFileBelongsToSlice(f, base, mid, sid))
1347
+ return false;
1348
+ const tid = taskIdFromTaskFileName(f, "SUMMARY");
1349
+ if (!tid)
1350
+ return false;
1259
1351
  return depSet.has(tid);
1260
1352
  })
1261
1353
  .map((f) => `${loc.relPrefix}/${f}`);
@@ -1377,7 +1469,7 @@ export async function buildDiscussMilestonePrompt(mid, midTitle, base, structure
1377
1469
  if (headless) {
1378
1470
  const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
1379
1471
  const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
1380
- return loadPrompt("discuss-headless", {
1472
+ const prompt = loadPrompt("discuss-headless", {
1381
1473
  seedContext: roadmapContent ?? "",
1382
1474
  inlinedTemplates: contextTemplate,
1383
1475
  workingDirectory: base,
@@ -1386,6 +1478,7 @@ export async function buildDiscussMilestonePrompt(mid, midTitle, base, structure
1386
1478
  commitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
1387
1479
  multiMilestoneCommitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
1388
1480
  });
1481
+ return prependLanguageDirectiveForBase(base, prompt);
1389
1482
  }
1390
1483
  const rawInlinedContext = await buildDiscussMilestoneInlinedContext(mid, base);
1391
1484
  const cappedInlinedContext = capPreamble(rawInlinedContext);
@@ -1412,9 +1505,10 @@ export async function buildDiscussMilestonePrompt(mid, midTitle, base, structure
1412
1505
  const truncationNote = cappedDraftSeed !== draftSeed
1413
1506
  ? `\n\n_(Draft seed truncated; read the full draft at \`${draftRelPath}\` if needed.)_`
1414
1507
  : "";
1415
- return `${promptWithContextMode}\n\n## Prior Discussion (Draft Seed)\n\nThe following draft was captured from a prior multi-milestone discussion. Use it as seed material — the user has already provided this context. Start with a brief reflection on what the draft covers, then probe for any gaps or open questions before writing the full CONTEXT.md.\n\n${cappedDraftSeed}${truncationNote}`;
1508
+ const promptWithDraftSeed = `${promptWithContextMode}\n\n## Prior Discussion (Draft Seed)\n\nThe following draft was captured from a prior multi-milestone discussion. Use it as seed material — the user has already provided this context. Start with a brief reflection on what the draft covers, then probe for any gaps or open questions before writing the full CONTEXT.md.\n\n${cappedDraftSeed}${truncationNote}`;
1509
+ return prependLanguageDirectiveForBase(base, promptWithDraftSeed);
1416
1510
  }
1417
- return promptWithContextMode;
1511
+ return prependLanguageDirectiveForBase(base, promptWithContextMode);
1418
1512
  }
1419
1513
  /**
1420
1514
  * Build a prompt for the workflow-preferences unit type (deep mode).
@@ -2281,7 +2375,7 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
2281
2375
  // Compute verification budget for the executor's context window (issue #707)
2282
2376
  const prefs = loadEffectiveGSDPreferences();
2283
2377
  const contextWindow = resolveExecutorContextWindow(opts.modelRegistry, prefs?.preferences, opts.sessionContextWindow, opts.sessionProvider);
2284
- const budgets = computeBudgets(contextWindow);
2378
+ const budgets = computeBudgets(contextWindow, opts.sessionProvider);
2285
2379
  const verificationBudget = `~${Math.round(budgets.verificationBudgetChars / 1000)}K chars`;
2286
2380
  // Truncate carry-forward section when it exceeds 40% of inline context budget.
2287
2381
  const carryForwardBudget = Math.floor(budgets.inlineContextBudgetChars * 0.4);
@@ -2319,6 +2413,14 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
2319
2413
  catch (reopenErr) {
2320
2414
  logWarning("prompt", `reopen reason injection failed: ${reopenErr.message}`);
2321
2415
  }
2416
+ const reworkFindingsBlock = renderBlockingReworkFindingsBlock(mid, sid, tid);
2417
+ if (reworkFindingsBlock) {
2418
+ const block = reworkFindingsBlock + "\n\n---\n\n";
2419
+ phaseAnchorSection = phaseAnchorSection
2420
+ ? `${block}${phaseAnchorSection}`
2421
+ : block;
2422
+ trackPromptContext(contextTelemetry, "rework-findings", "inline", reworkFindingsBlock);
2423
+ }
2322
2424
  // ADR-011 Phase 2: inject any resolved-but-unapplied escalation override
2323
2425
  // into this task's prompt. Claim is atomic via DB UPDATE WHERE IS NULL, so
2324
2426
  // if a parallel build already injected it, we skip. Feature-gated by
@@ -2375,10 +2477,19 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
2375
2477
  }
2376
2478
  },
2377
2479
  });
2378
- const taskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
2379
- const slicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
2480
+ const rawTaskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
2481
+ const rawSlicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
2380
2482
  const contractedCarryForward = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "prior-task-summaries");
2381
- const contractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
2483
+ const rawContractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
2484
+ // Cap the static inline blocks against one shared budget so a small-window
2485
+ // executor can't overflow (the sibling builders cap via `capPreamble`;
2486
+ // execute-task's blocks feed separate template slots, so they share a budget
2487
+ // block-by-block). Carry-forward already has its own truncation above.
2488
+ const inlineBudget = Math.min(MAX_PREAMBLE_CHARS, budgets.inlineContextBudgetChars);
2489
+ const { taskPlan: taskPlanInline, slicePlan: slicePlanExcerpt, templates: contractedTemplates } = capExecuteTaskInlineBlocks(rawTaskPlanInline, rawSlicePlanExcerpt, rawContractedTemplates, inlineBudget);
2490
+ const inlineDropped = (rawTaskPlanInline.length + rawSlicePlanExcerpt.length + rawContractedTemplates.length)
2491
+ - (taskPlanInline.length + slicePlanExcerpt.length + contractedTemplates.length);
2492
+ trackPromptContext(contextTelemetry, "inline-cap", inlineDropped > 0 ? "excerpt" : "skipped", null, inlineDropped > 0 ? `dropped ${inlineDropped} chars (budget ${inlineBudget})` : "within budget");
2382
2493
  const onDemandResult = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
2383
2494
  const onDemandContext = onDemandResult.text;
2384
2495
  trackPromptContext(contextTelemetry, "slice-research", onDemandContext ? "on-demand" : "skipped", onDemandContext, onDemandContext ? undefined : onDemandResult.skipReason ?? undefined);
@@ -2463,12 +2574,14 @@ export async function buildCompleteSlicePrompt(mid, midTitle, sid, sTitle, base,
2463
2574
  trackPromptContext(contextTelemetry, "prior-task-summaries", "skipped", null, "missing tasks dir");
2464
2575
  return null;
2465
2576
  }
2466
- const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY").sort();
2577
+ const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY")
2578
+ .filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
2579
+ .sort();
2467
2580
  const blocks = [];
2468
2581
  for (const file of summaryFiles) {
2469
2582
  const absPath = join(loc.dir, file);
2470
2583
  const relPath = `${loc.relPrefix}/${file}`;
2471
- const taskId = file.replace(/-SUMMARY\.md$/i, "");
2584
+ const taskId = taskIdFromTaskFileName(file, "SUMMARY") ?? file.replace(/-SUMMARY\.md$/i, "");
2472
2585
  blocks.push(await buildTaskSummaryExcerpt(absPath, relPath, taskId));
2473
2586
  }
2474
2587
  const body = blocks.length > 0 ? blocks.join("\n\n---\n\n") : null;
@@ -3038,7 +3151,9 @@ export async function buildReplanSlicePrompt(mid, midTitle, sid, sTitle, base) {
3038
3151
  let blockerTaskId = "";
3039
3152
  const summaryLoc = resolveTaskSummariesLocation(base, mid, sid);
3040
3153
  if (summaryLoc) {
3041
- const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY").sort();
3154
+ const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY")
3155
+ .filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
3156
+ .sort();
3042
3157
  for (const file of summaryFiles) {
3043
3158
  const absPath = join(summaryLoc.dir, file);
3044
3159
  const content = await loadFile(absPath);
@@ -3047,7 +3162,7 @@ export async function buildReplanSlicePrompt(mid, midTitle, sid, sTitle, base) {
3047
3162
  const summary = parseSummary(content);
3048
3163
  const relPath = `${summaryLoc.relPrefix}/${file}`;
3049
3164
  if (summary.frontmatter.blocker_discovered) {
3050
- blockerTaskId = summary.frontmatter.id || file.replace(/-SUMMARY\.md$/i, "");
3165
+ blockerTaskId = summary.frontmatter.id || taskIdFromTaskFileName(file, "SUMMARY") || file.replace(/-SUMMARY\.md$/i, "");
3051
3166
  inlined.push(await buildTaskSummaryExcerpt(absPath, relPath, blockerTaskId, { blocker: true }));
3052
3167
  }
3053
3168
  }
@@ -17,7 +17,7 @@ import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
17
17
  import { getErrorMessage } from "./error-utils.js";
18
18
  import { logWarning } from "./workflow-logger.js";
19
19
  import { isClosedStatus, isInactiveStatus } from "./status-guards.js";
20
- import { resolveSlicePath, resolveTasksDir, resolveTaskFiles, relMilestoneFile, relSliceFile, clearPathCache, } from "./paths.js";
20
+ import { resolveSlicePath, resolveTaskFile, relMilestoneFile, relSliceFile, clearPathCache, } from "./paths.js";
21
21
  import { existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
22
22
  import { dirname } from "node:path";
23
23
  import { resolveExpectedArtifactPath, diagnoseExpectedArtifact, } from "./auto-artifact-paths.js";
@@ -227,10 +227,15 @@ export function writeReactiveExecuteBlocker(unitId, base, reason) {
227
227
  const slicePath = resolveSlicePath(base, mid, sid);
228
228
  if (!slicePath)
229
229
  return null;
230
- const tasksDir = resolveTasksDir(base, mid, sid) ?? slicePath;
231
- const existingSummaries = new Set(resolveTaskFiles(tasksDir, "SUMMARY").map((f) => f.replace(/-SUMMARY\.md$/i, "").toUpperCase()));
232
- const summaryPresent = batchIds.filter((tid) => existingSummaries.has(tid.toUpperCase()));
233
- const summaryMissing = batchIds.filter((tid) => !existingSummaries.has(tid.toUpperCase()));
230
+ // Resolve each batch task's SUMMARY with slice-qualified paths so flat-phase
231
+ // slices that reuse a task id (e.g. two T03s in one phase) don't collide: a
232
+ // sibling slice's summary must never make this slice's task look complete.
233
+ const hasSummary = (tid) => {
234
+ const summaryPath = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
235
+ return summaryPath !== null && existsSync(summaryPath);
236
+ };
237
+ const summaryPresent = batchIds.filter((tid) => hasSummary(tid));
238
+ const summaryMissing = batchIds.filter((tid) => !hasSummary(tid));
234
239
  const completedTaskIds = [];
235
240
  const skippedTaskIds = [];
236
241
  const unchangedTaskIds = [];
@@ -1,6 +1,6 @@
1
1
  // GSD auto-mode runtime state
2
2
  import { AutoSession } from "./auto/session.js";
3
- import { isDeterministicPolicyError, isQueuedUserMessageSkip, isToolInvocationError, markToolEnd as markTrackedToolEnd, markToolStart as markTrackedToolStart, } from "./auto-tool-tracking.js";
3
+ import { markToolEnd as markTrackedToolEnd, markToolStart as markTrackedToolStart, shouldClearToolInvocationErrorAfterSuccess, updateToolInvocationError, } from "./auto-tool-tracking.js";
4
4
  // Re-exported as a pure pass-through. Must stay UNGATED (no autoSession.active
5
5
  // argument, unlike markToolStart at the bottom of this file) so it is true in
6
6
  // foreground where the foreground approval-gate pause consults it.
@@ -61,13 +61,13 @@ export function markToolEnd(toolCallId) {
61
61
  export function recordToolInvocationError(toolName, errorMsg) {
62
62
  if (!autoSession.active)
63
63
  return;
64
- if (isToolInvocationError(errorMsg) || isQueuedUserMessageSkip(errorMsg) || isDeterministicPolicyError(errorMsg)) {
65
- autoSession.lastToolInvocationError = `${toolName}: ${errorMsg}`;
66
- }
64
+ autoSession.lastToolInvocationError = updateToolInvocationError(autoSession.lastToolInvocationError, toolName, errorMsg);
67
65
  }
68
- export function clearToolInvocationError() {
66
+ export function clearToolInvocationError(successfulToolName) {
69
67
  if (!autoSession.active)
70
68
  return;
69
+ if (!shouldClearToolInvocationErrorAfterSuccess(autoSession.lastToolInvocationError, successfulToolName))
70
+ return;
71
71
  autoSession.lastToolInvocationError = null;
72
72
  }
73
73
  export function getSourceObservationStore() {
@@ -46,9 +46,10 @@ import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.
46
46
  import { extractVerdict } from "./verdict-parser.js";
47
47
  import { auditOrphanedPreflightStashes } from "./orphan-stash-audit.js";
48
48
  import { parseProject } from "./schemas/parsers.js";
49
+ import { LAYOUT_SEGMENTS } from "./layout-policy.js";
49
50
  import { debugLog, enableDebug, isDebugEnabled, getDebugLogPath, } from "./debug-logger.js";
50
51
  import { logWarning, logError } from "./workflow-logger.js";
51
- import { existsSync, mkdirSync, readFileSync, rmSync, } from "node:fs";
52
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, } from "node:fs";
52
53
  import { join } from "node:path";
53
54
  import { validateDirectory } from "./validate-directory.js";
54
55
  import { isCustomProvider, resolveDefaultSessionModel, resolveDynamicRoutingConfig, } from "./preferences-models.js";
@@ -73,6 +74,30 @@ const MAX_CONSECUTIVE_COMPLETE_BOOTSTRAPS = 2;
73
74
  export function hasGitIndexLockForTest(basePath) {
74
75
  return existsSync(join(basePath, ".git", "index.lock"));
75
76
  }
77
+ function isEmptyDirectory(dirPath) {
78
+ try {
79
+ return existsSync(dirPath) && readdirSync(dirPath).length === 0;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ export function reconcileFlatPhaseBootstrapLayout(basePath) {
86
+ const gsdDir = join(basePath, ".gsd");
87
+ const phasesPath = join(gsdDir, LAYOUT_SEGMENTS.level1);
88
+ const milestonesPath = join(gsdDir, "milestones");
89
+ if (isEmptyDirectory(milestonesPath)) {
90
+ if (!existsSync(phasesPath))
91
+ mkdirSync(phasesPath, { recursive: true });
92
+ rmSync(milestonesPath, { recursive: true, force: true });
93
+ return true;
94
+ }
95
+ if (!existsSync(phasesPath) && !existsSync(milestonesPath)) {
96
+ mkdirSync(phasesPath, { recursive: true });
97
+ return true;
98
+ }
99
+ return false;
100
+ }
76
101
  export function _shouldAbortBootstrapForUnavailableDbForTest(gsdDbPath, dbAvailable, pathExists = existsSync) {
77
102
  return pathExists(gsdDbPath) && !dbAvailable;
78
103
  }
@@ -868,20 +893,15 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
868
893
  ensureGitignore(base, { manageGitignore });
869
894
  if (manageGitignore !== false)
870
895
  untrackRuntimeFiles(base);
871
- // Bootstrap milestones/ if it doesn't exist.
872
- // Check milestones/ directly — ensureGsdSymlink above already created .gsd/,
873
- // so checking .gsd/ existence would be dead code (#2942).
874
- const gsdDir = join(base, ".gsd");
875
- const milestonesPath = join(gsdDir, "milestones");
876
- if (!existsSync(milestonesPath)) {
877
- mkdirSync(milestonesPath, { recursive: true });
896
+ // Bootstrap the flat-phase projection root and clean empty legacy scaffolds.
897
+ if (reconcileFlatPhaseBootstrapLayout(base)) {
878
898
  try {
879
899
  nativeAddAll(base);
880
900
  nativeCommit(base, "chore: init gsd");
881
901
  }
882
902
  catch (err) {
883
903
  /* nothing to commit */
884
- logWarning("engine", `mkdir failed: ${err instanceof Error ? err.message : String(err)}`);
904
+ logWarning("engine", `layout bootstrap commit failed: ${err instanceof Error ? err.message : String(err)}`);
885
905
  }
886
906
  }
887
907
  {