@opengsd/gsd-pi 1.8.1 → 1.9.0-dev.5c1a3ff2

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 (546) 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 +25 -2
  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-artifact-paths.js +16 -10
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +74 -19
  19. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
  20. package/dist/resources/extensions/gsd/auto-prompts.js +125 -18
  21. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  22. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
  23. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
  24. package/dist/resources/extensions/gsd/auto.js +5 -1
  25. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
  26. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -5
  27. package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
  28. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -50
  29. package/dist/resources/extensions/gsd/command-feedback.js +16 -12
  30. package/dist/resources/extensions/gsd/compat/compat-marker.js +19 -2
  31. package/dist/resources/extensions/gsd/constants.js +12 -13
  32. package/dist/resources/extensions/gsd/context-masker.js +97 -21
  33. package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
  34. package/dist/resources/extensions/gsd/db/engine.js +51 -16
  35. package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
  36. package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
  37. package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
  38. package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
  39. package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
  40. package/dist/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  41. package/dist/resources/extensions/gsd/doctor-engine-checks.js +3 -6
  42. package/dist/resources/extensions/gsd/flat-phase-migration.js +156 -21
  43. package/dist/resources/extensions/gsd/git-service.js +19 -7
  44. package/dist/resources/extensions/gsd/gsd-db.js +187 -45
  45. package/dist/resources/extensions/gsd/guided-flow.js +38 -13
  46. package/dist/resources/extensions/gsd/markdown-renderer.js +17 -13
  47. package/dist/resources/extensions/gsd/md-importer.js +107 -20
  48. package/dist/resources/extensions/gsd/migrate/command.js +19 -162
  49. package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
  50. package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
  51. package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
  52. package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
  53. package/dist/resources/extensions/gsd/model-cost-table.js +2 -0
  54. package/dist/resources/extensions/gsd/model-router.js +11 -0
  55. package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
  56. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
  57. package/dist/resources/extensions/gsd/paths.js +55 -11
  58. package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
  59. package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
  60. package/dist/resources/extensions/gsd/planning-subagent-registry.js +25 -0
  61. package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
  62. package/dist/resources/extensions/gsd/preferences-types.js +5 -0
  63. package/dist/resources/extensions/gsd/preferences-validation.js +48 -1
  64. package/dist/resources/extensions/gsd/preferences.js +17 -0
  65. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  66. package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
  67. package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
  68. package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
  69. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
  70. package/dist/resources/extensions/gsd/skill-activation.js +17 -3
  71. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +27 -13
  72. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +13 -3
  73. package/dist/resources/extensions/gsd/stop-notice.js +15 -1
  74. package/dist/resources/extensions/gsd/sync-lock.js +13 -7
  75. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  76. package/dist/resources/extensions/gsd/tools/complete-task.js +94 -6
  77. package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
  78. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
  79. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
  80. package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
  81. package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
  82. package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
  83. package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
  84. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
  85. package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
  86. package/dist/resources/extensions/gsd/unit-registry.js +4 -0
  87. package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
  88. package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
  89. package/dist/resources/extensions/gsd/workspace.js +2 -1
  90. package/dist/resources/extensions/gsd/worktree-state-projection.js +6 -0
  91. package/dist/resources/extensions/mac-tools/index.js +31 -9
  92. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  93. package/dist/web/standalone/.next/BUILD_ID +1 -1
  94. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  95. package/dist/web/standalone/.next/build-manifest.json +3 -3
  96. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  97. package/dist/web/standalone/.next/required-server-files.json +3 -3
  98. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  99. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  109. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  112. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  118. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  125. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  137. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  159. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  169. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  175. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  191. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  195. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/index.html +1 -1
  205. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  206. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  207. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  208. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  209. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  210. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  211. package/dist/web/standalone/.next/server/app/page.js +2 -2
  212. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  214. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  215. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  216. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/middleware.js +3 -3
  218. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  219. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  220. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  221. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  223. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  225. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  226. package/dist/web/standalone/.next/static/css/3b1ceb7abfb9a230.css +1 -0
  227. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  228. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  229. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  230. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  231. package/dist/web/standalone/package.json +0 -1
  232. package/dist/web/standalone/server.js +1 -1
  233. package/dist/web-mode.js +31 -3
  234. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  235. package/integrations/hermes/pyproject.toml +1 -1
  236. package/package.json +12 -10
  237. package/packages/cloud-mcp-gateway/package.json +2 -2
  238. package/packages/contracts/dist/workflow.d.ts +14 -0
  239. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  240. package/packages/contracts/dist/workflow.js +16 -0
  241. package/packages/contracts/dist/workflow.js.map +1 -1
  242. package/packages/contracts/package.json +1 -1
  243. package/packages/daemon/dist/cloud-config.d.ts +1 -1
  244. package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
  245. package/packages/daemon/dist/cloud-config.js +5 -1
  246. package/packages/daemon/dist/cloud-config.js.map +1 -1
  247. package/packages/daemon/dist/cloud-config.test.js +51 -1
  248. package/packages/daemon/dist/cloud-config.test.js.map +1 -1
  249. package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
  250. package/packages/daemon/dist/local-tool-executor.js +2 -0
  251. package/packages/daemon/dist/local-tool-executor.js.map +1 -1
  252. package/packages/daemon/package.json +6 -6
  253. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  254. package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
  255. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  256. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  257. package/packages/gsd-agent-core/dist/sdk.js +1 -0
  258. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  259. package/packages/gsd-agent-core/package.json +5 -5
  260. package/packages/gsd-agent-modes/package.json +7 -7
  261. package/packages/gsd-cloud/dist/cli.d.ts +5 -0
  262. package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
  263. package/packages/gsd-cloud/dist/cli.js +160 -0
  264. package/packages/gsd-cloud/dist/cli.js.map +1 -0
  265. package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
  266. package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
  267. package/packages/gsd-cloud/dist/cloud-config.js +231 -0
  268. package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
  269. package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
  270. package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
  271. package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
  272. package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
  273. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
  274. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
  275. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
  276. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
  277. package/packages/gsd-cloud/dist/cloud-runtime.d.ts +35 -0
  278. package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
  279. package/packages/gsd-cloud/dist/cloud-runtime.js +258 -0
  280. package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
  281. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
  282. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
  283. package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
  284. package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
  285. package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
  286. package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
  287. package/packages/gsd-cloud/dist/cloud-token.js +37 -0
  288. package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
  289. package/packages/gsd-cloud/dist/config.d.ts +17 -0
  290. package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
  291. package/packages/gsd-cloud/dist/config.js +146 -0
  292. package/packages/gsd-cloud/dist/config.js.map +1 -0
  293. package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
  294. package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
  295. package/packages/gsd-cloud/dist/device-flow.js +128 -0
  296. package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
  297. package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
  298. package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
  299. package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
  300. package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
  301. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
  302. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
  303. package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
  304. package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
  305. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
  306. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
  307. package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
  308. package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
  309. package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
  310. package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
  311. package/packages/gsd-cloud/dist/executors/executor.js +11 -0
  312. package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
  313. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
  314. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
  315. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
  316. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
  317. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
  318. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
  319. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
  320. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
  321. package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
  322. package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
  323. package/packages/gsd-cloud/dist/executors/index.js +29 -0
  324. package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
  325. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
  326. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
  327. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
  328. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
  329. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
  330. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
  331. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
  332. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
  333. package/packages/gsd-cloud/dist/index.d.ts +7 -0
  334. package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
  335. package/packages/gsd-cloud/dist/index.js +8 -0
  336. package/packages/gsd-cloud/dist/index.js.map +1 -0
  337. package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
  338. package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
  339. package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
  340. package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
  341. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
  342. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
  343. package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
  344. package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
  345. package/packages/gsd-cloud/dist/logger.d.ts +25 -0
  346. package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
  347. package/packages/gsd-cloud/dist/logger.js +72 -0
  348. package/packages/gsd-cloud/dist/logger.js.map +1 -0
  349. package/packages/gsd-cloud/dist/types.d.ts +51 -0
  350. package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
  351. package/packages/gsd-cloud/dist/types.js +9 -0
  352. package/packages/gsd-cloud/dist/types.js.map +1 -0
  353. package/packages/gsd-cloud/package.json +3 -3
  354. package/packages/mcp-server/README.md +15 -2
  355. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  356. package/packages/mcp-server/dist/server.js +5 -5
  357. package/packages/mcp-server/dist/server.js.map +1 -1
  358. package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
  359. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  360. package/packages/mcp-server/dist/workflow-tools.js +64 -2
  361. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  362. package/packages/mcp-server/package.json +4 -4
  363. package/packages/native/package.json +1 -1
  364. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  365. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  366. package/packages/pi-agent-core/dist/agent.js +2 -0
  367. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  368. package/packages/pi-agent-core/package.json +1 -1
  369. package/packages/pi-ai/dist/models.generated.d.ts +119 -0
  370. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  371. package/packages/pi-ai/dist/models.generated.js +107 -0
  372. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  373. package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
  374. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  375. package/packages/pi-ai/dist/providers/anthropic.js +25 -1
  376. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  377. package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
  378. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  379. package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
  380. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  381. package/packages/pi-ai/package.json +1 -1
  382. package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
  383. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
  385. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  386. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +11 -1
  387. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  388. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  389. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  390. package/packages/pi-coding-agent/package.json +7 -7
  391. package/packages/pi-tui/package.json +2 -2
  392. package/packages/rpc-client/package.json +2 -2
  393. package/pkg/package.json +1 -1
  394. package/src/resources/GSD-WORKFLOW.md +18 -49
  395. package/src/resources/extensions/browser-tools/capture.ts +2 -86
  396. package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
  397. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
  398. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
  399. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
  400. package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
  401. package/src/resources/extensions/gsd/auto-artifact-paths.ts +16 -9
  402. package/src/resources/extensions/gsd/auto-dispatch.ts +86 -19
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
  404. package/src/resources/extensions/gsd/auto-prompts.ts +142 -16
  405. package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
  406. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
  407. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
  408. package/src/resources/extensions/gsd/auto.ts +5 -1
  409. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
  410. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +39 -10
  411. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
  412. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +87 -53
  413. package/src/resources/extensions/gsd/command-feedback.ts +19 -12
  414. package/src/resources/extensions/gsd/compat/compat-marker.ts +21 -4
  415. package/src/resources/extensions/gsd/constants.ts +14 -13
  416. package/src/resources/extensions/gsd/context-masker.ts +98 -2
  417. package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
  418. package/src/resources/extensions/gsd/db/engine.ts +53 -17
  419. package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
  420. package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
  421. package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
  422. package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
  423. package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
  424. package/src/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  425. package/src/resources/extensions/gsd/doctor-engine-checks.ts +3 -5
  426. package/src/resources/extensions/gsd/flat-phase-migration.ts +160 -19
  427. package/src/resources/extensions/gsd/git-service.ts +19 -6
  428. package/src/resources/extensions/gsd/gsd-db.ts +255 -52
  429. package/src/resources/extensions/gsd/guided-flow.ts +48 -12
  430. package/src/resources/extensions/gsd/markdown-renderer.ts +25 -21
  431. package/src/resources/extensions/gsd/md-importer.ts +114 -16
  432. package/src/resources/extensions/gsd/migrate/command.ts +21 -227
  433. package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
  434. package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
  435. package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
  436. package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
  437. package/src/resources/extensions/gsd/model-cost-table.ts +2 -0
  438. package/src/resources/extensions/gsd/model-router.ts +12 -0
  439. package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
  440. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
  441. package/src/resources/extensions/gsd/paths.ts +62 -11
  442. package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
  443. package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
  444. package/src/resources/extensions/gsd/planning-subagent-registry.ts +31 -0
  445. package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
  446. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  447. package/src/resources/extensions/gsd/preferences-validation.ts +62 -0
  448. package/src/resources/extensions/gsd/preferences.ts +25 -0
  449. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  450. package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
  451. package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
  452. package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
  453. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
  454. package/src/resources/extensions/gsd/skill-activation.ts +17 -3
  455. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +30 -13
  456. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +16 -3
  457. package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
  458. package/src/resources/extensions/gsd/stop-notice.ts +18 -1
  459. package/src/resources/extensions/gsd/sync-lock.ts +14 -6
  460. package/src/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  461. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
  462. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
  463. package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
  464. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
  465. package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
  466. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +104 -0
  467. package/src/resources/extensions/gsd/tests/complete-task.test.ts +362 -1
  468. package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
  469. package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
  470. package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
  471. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
  472. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
  473. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
  474. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
  475. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
  476. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
  477. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
  478. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
  479. package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
  480. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +202 -0
  481. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
  482. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +25 -0
  483. package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
  484. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
  485. package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
  486. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
  487. package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
  488. package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
  489. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
  490. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
  491. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  492. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  493. package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
  494. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
  495. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
  496. package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
  497. package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
  498. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
  499. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
  500. package/src/resources/extensions/gsd/tests/preferences.test.ts +84 -0
  501. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +4 -0
  502. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +66 -0
  503. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
  504. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
  505. package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
  506. package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
  507. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  508. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
  509. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
  510. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
  511. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +17 -0
  512. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
  513. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
  514. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
  515. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +73 -0
  516. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
  517. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
  518. package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
  519. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
  520. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
  521. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
  522. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
  523. package/src/resources/extensions/gsd/tools/complete-task.ts +140 -5
  524. package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
  525. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
  526. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
  527. package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
  528. package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
  529. package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
  530. package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
  531. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
  532. package/src/resources/extensions/gsd/types.ts +11 -0
  533. package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
  534. package/src/resources/extensions/gsd/unit-registry.ts +4 -0
  535. package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
  536. package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
  537. package/src/resources/extensions/gsd/workspace.ts +2 -1
  538. package/src/resources/extensions/gsd/worktree-state-projection.ts +12 -0
  539. package/src/resources/extensions/mac-tools/index.ts +52 -9
  540. package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
  541. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  544. package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
  545. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → 6YWV7VAPg-jqjfPswrKZb}/_buildManifest.js +0 -0
  546. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → 6YWV7VAPg-jqjfPswrKZb}/_ssgManifest.js +0 -0
@@ -19,7 +19,8 @@ import { createHash } from "node:crypto";
19
19
  import { GSDError, GSD_STALE_STATE } from "./errors.js";
20
20
  import { getGateIdsForTurn } from "./gate-registry.js";
21
21
  import { logWarning } from "./workflow-logger.js";
22
- import { isClosedStatus } from "./status-guards.js";
22
+ import { rowToArtifact } from "./db-milestone-artifact-rows.js";
23
+ import { isClosedStatus, toStatus } from "./status-guards.js";
23
24
  // Connection ownership, lifecycle, schema/migrations and transaction
24
25
  // primitives now live in the engine; re-export the full public surface so
25
26
  // existing `from "./gsd-db.js"` imports keep working.
@@ -336,6 +337,11 @@ export function upsertSlicePlanning(milestoneId, sliceId, planning) {
336
337
  export function insertTask(t) {
337
338
  if (!getDbOrNull())
338
339
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
340
+ // Stamp completed_at for every terminal-complete alias (complete/done/closed),
341
+ // not just two literals — a task imported as "closed" is completed and must
342
+ // carry a timestamp. NOT for "skipped": a skipped task was never completed
343
+ // (cascade writers set its completed_at = NULL).
344
+ const isCompleteAlias = t.status != null && toStatus(t.status) === "complete";
339
345
  getDbOrNull().prepare(`INSERT INTO tasks (
340
346
  milestone_id, slice_id, id, title, status, one_liner, narrative,
341
347
  verification_result, duration, completed_at, blocker_discovered,
@@ -385,7 +391,7 @@ export function insertTask(t) {
385
391
  ":narrative": t.narrative ?? "",
386
392
  ":verification_result": t.verificationResult ?? "",
387
393
  ":duration": t.duration ?? "",
388
- ":completed_at": t.status === "done" || t.status === "complete" ? new Date().toISOString() : null,
394
+ ":completed_at": isCompleteAlias ? new Date().toISOString() : null,
389
395
  ":blocker_discovered": t.blockerDiscovered ? 1 : 0,
390
396
  ":deviations": t.deviations ?? "",
391
397
  ":known_issues": t.knownIssues ?? "",
@@ -401,7 +407,7 @@ export function insertTask(t) {
401
407
  ":observability_impact": t.planning?.observabilityImpact ?? "",
402
408
  ":full_plan_md": t.planning?.fullPlanMd ?? "",
403
409
  ":sequence": t.sequence ?? 0,
404
- ":preserve_completion": t.preserveCompletionMetadata && (t.status === "complete" || t.status === "done") ? 1 : 0,
410
+ ":preserve_completion": t.preserveCompletionMetadata && isCompleteAlias ? 1 : 0,
405
411
  ":target_repositories": JSON.stringify(t.planning?.targetRepositories ?? []),
406
412
  ":raw_target_repositories": t.planning && "targetRepositories" in t.planning
407
413
  ? JSON.stringify(t.planning.targetRepositories ?? [])
@@ -498,8 +504,8 @@ export function upsertTaskPlanning(milestoneId, sliceId, taskId, planning) {
498
504
  ":target_repositories": planning.targetRepositories ? JSON.stringify(planning.targetRepositories) : null,
499
505
  });
500
506
  }
501
- export function updateSliceStatus(milestoneId, sliceId, status, completedAt) {
502
- applyStatusTransition({ entity: "slice", milestoneId, sliceId, status, completedAt });
507
+ export function updateSliceStatus(milestoneId, sliceId, status, completedAt, preserveCompletion) {
508
+ applyStatusTransition({ entity: "slice", milestoneId, sliceId, status, completedAt, preserveCompletion });
503
509
  }
504
510
  export function setTaskSummaryMd(milestoneId, sliceId, taskId, md) {
505
511
  if (!getDbOrNull())
@@ -611,8 +617,8 @@ function writeMilestoneStatus(milestoneId, status, completedAt) {
611
617
  * advance planned milestones. They may not reopen a closed milestone; callers
612
618
  * must use reopenMilestoneStatus(), which is reserved for gsd_milestone_reopen.
613
619
  */
614
- export function updateMilestoneStatus(milestoneId, status, completedAt) {
615
- applyStatusTransition({ entity: "milestone", milestoneId, status, completedAt });
620
+ export function updateMilestoneStatus(milestoneId, status, completedAt, preserveCompletion) {
621
+ applyStatusTransition({ entity: "milestone", milestoneId, status, completedAt, preserveCompletion });
616
622
  }
617
623
  /**
618
624
  * Explicit closed -> active transition for gsd_milestone_reopen only.
@@ -657,6 +663,128 @@ export function insertReplanHistory(entry) {
657
663
  ":created_at": new Date().toISOString(),
658
664
  });
659
665
  }
666
+ function reworkBriefIdFromTask(milestoneId, sliceId, taskId) {
667
+ return `RB-${milestoneId}-${sliceId}-${taskId}`;
668
+ }
669
+ function normalizeReworkStatus(status) {
670
+ const normalized = String(status ?? "pending");
671
+ if (normalized === "resolved" || normalized === "deferred-with-override") {
672
+ return normalized;
673
+ }
674
+ return "pending";
675
+ }
676
+ function rowToReworkFinding(row) {
677
+ let verificationCommands = [];
678
+ try {
679
+ const parsed = JSON.parse(String(row["verification_commands"] ?? "[]"));
680
+ verificationCommands = Array.isArray(parsed) ? parsed.map(String) : [];
681
+ }
682
+ catch {
683
+ verificationCommands = [];
684
+ }
685
+ return {
686
+ brief_id: String(row["brief_id"] ?? ""),
687
+ finding_id: String(row["finding_id"] ?? ""),
688
+ severity: String(row["severity"] ?? "blocking") === "advisory" ? "advisory" : "blocking",
689
+ description: String(row["description"] ?? ""),
690
+ required_fix: String(row["required_fix"] ?? ""),
691
+ verification_commands: verificationCommands,
692
+ status: normalizeReworkStatus(row["status"]),
693
+ evidence: String(row["evidence"] ?? ""),
694
+ decision_ref: String(row["decision_ref"] ?? ""),
695
+ };
696
+ }
697
+ export function saveReworkBrief(entry) {
698
+ if (!getDbOrNull())
699
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
700
+ const briefId = entry.briefId?.trim() || reworkBriefIdFromTask(entry.milestoneId, entry.sliceId, entry.taskId);
701
+ const now = new Date().toISOString();
702
+ transaction(() => {
703
+ getDbOrNull().prepare(`INSERT INTO rework_briefs (id, milestone_id, slice_id, task_id, created_at, updated_at)
704
+ VALUES (:id, :mid, :sid, :tid, :created_at, :updated_at)
705
+ ON CONFLICT(id) DO UPDATE SET
706
+ milestone_id = :mid,
707
+ slice_id = :sid,
708
+ task_id = :tid,
709
+ updated_at = :updated_at`).run({
710
+ ":id": briefId,
711
+ ":mid": entry.milestoneId,
712
+ ":sid": entry.sliceId,
713
+ ":tid": entry.taskId,
714
+ ":created_at": now,
715
+ ":updated_at": now,
716
+ });
717
+ getDbOrNull().prepare("DELETE FROM rework_brief_findings WHERE brief_id = :id").run({ ":id": briefId });
718
+ const stmt = getDbOrNull().prepare(`INSERT INTO rework_brief_findings (
719
+ brief_id, finding_id, severity, description, required_fix, verification_commands,
720
+ status, evidence, decision_ref, updated_at
721
+ ) VALUES (
722
+ :brief_id, :finding_id, :severity, :description, :required_fix, :verification_commands,
723
+ :status, :evidence, :decision_ref, :updated_at
724
+ )`);
725
+ for (const finding of entry.findings) {
726
+ stmt.run({
727
+ ":brief_id": briefId,
728
+ ":finding_id": finding.findingId,
729
+ ":severity": finding.severity,
730
+ ":description": finding.description,
731
+ ":required_fix": finding.requiredFix,
732
+ ":verification_commands": JSON.stringify(finding.verificationCommands),
733
+ ":status": finding.status ?? "pending",
734
+ ":evidence": finding.evidence ?? "",
735
+ ":decision_ref": finding.decisionRef ?? "",
736
+ ":updated_at": now,
737
+ });
738
+ }
739
+ });
740
+ return { briefId };
741
+ }
742
+ export function getBlockingReworkFindingsForTask(milestoneId, sliceId, taskId) {
743
+ if (!getDbOrNull())
744
+ return [];
745
+ const rows = getDbOrNull().prepare(`SELECT f.*
746
+ FROM rework_brief_findings f
747
+ JOIN rework_briefs b ON b.id = f.brief_id
748
+ WHERE b.milestone_id = :mid
749
+ AND b.slice_id = :sid
750
+ AND b.task_id = :tid
751
+ AND f.severity = 'blocking'
752
+ ORDER BY b.created_at, f.finding_id`).all({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
753
+ return rows.map(rowToReworkFinding);
754
+ }
755
+ export function getUnresolvedBlockingReworkFindingsForTask(milestoneId, sliceId, taskId) {
756
+ return getBlockingReworkFindingsForTask(milestoneId, sliceId, taskId)
757
+ .filter((finding) => finding.status === "pending");
758
+ }
759
+ export function applyReworkResolutions(resolutions) {
760
+ if (!getDbOrNull())
761
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
762
+ const now = new Date().toISOString();
763
+ const stmt = getDbOrNull().prepare(`UPDATE rework_brief_findings
764
+ SET status = :status,
765
+ evidence = :evidence,
766
+ decision_ref = :decision_ref,
767
+ updated_at = :updated_at
768
+ WHERE finding_id = :finding_id
769
+ AND brief_id IN (
770
+ SELECT id FROM rework_briefs
771
+ WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid
772
+ )`);
773
+ transaction(() => {
774
+ for (const resolution of resolutions) {
775
+ stmt.run({
776
+ ":status": resolution.status,
777
+ ":evidence": resolution.evidence,
778
+ ":decision_ref": resolution.decisionRef ?? "",
779
+ ":updated_at": now,
780
+ ":finding_id": resolution.findingId,
781
+ ":mid": resolution.milestoneId,
782
+ ":sid": resolution.sliceId,
783
+ ":tid": resolution.taskId,
784
+ });
785
+ }
786
+ });
787
+ }
660
788
  export function insertAssessment(entry) {
661
789
  if (!getDbOrNull())
662
790
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
@@ -767,44 +895,51 @@ export function saveGateResult(g) {
767
895
  if (!getDbOrNull())
768
896
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
769
897
  const evaluatedAt = new Date().toISOString();
770
- const result = getDbOrNull().prepare(`UPDATE quality_gates
771
- SET status = 'complete', verdict = :verdict, rationale = :rationale,
772
- findings = :findings, evaluated_at = :evaluated_at
773
- WHERE milestone_id = :mid AND slice_id = :sid AND gate_id = :gid
774
- AND (task_id = :tid OR (:tid = '' AND task_id IS NULL))`).run({
775
- ":mid": g.milestoneId,
776
- ":sid": g.sliceId,
777
- ":gid": g.gateId,
778
- ":tid": g.taskId ?? "",
779
- ":verdict": g.verdict,
780
- ":rationale": g.rationale,
781
- ":findings": g.findings,
782
- ":evaluated_at": evaluatedAt,
783
- });
784
- if ((result.changes ?? 0) === 0) {
785
- throw new GSDError(GSD_STALE_STATE, `quality gate row not found for ${g.milestoneId}/${g.sliceId}/${g.gateId}${g.taskId ? `/${g.taskId}` : ""}`);
786
- }
787
- const outcome = g.verdict === "pass"
788
- ? "pass"
789
- : g.verdict === "omitted"
790
- ? "manual-attention"
791
- : "fail";
792
- insertGateRun({
793
- traceId: `quality-gate:${g.milestoneId}:${g.sliceId}`,
794
- turnId: `gate:${g.gateId}:${g.taskId ?? "slice"}`,
795
- gateId: g.gateId,
796
- gateType: "quality-gate",
797
- milestoneId: g.milestoneId,
798
- sliceId: g.sliceId,
799
- taskId: g.taskId ?? undefined,
800
- outcome,
801
- failureClass: outcome === "fail" ? "verification" : outcome === "manual-attention" ? "manual-attention" : "none",
802
- rationale: g.rationale,
803
- findings: g.findings,
804
- attempt: 1,
805
- maxAttempts: 1,
806
- retryable: false,
807
- evaluatedAt,
898
+ // Atomic: the gate verdict UPDATE and the gate_runs ledger INSERT must commit
899
+ // together. As two autocommits, a crash between them records a completed gate
900
+ // with no ledger row (the row Recovery Classification reads). transaction()
901
+ // is re-entrant, so callers already inside a transaction are safe. The
902
+ // throw-on-zero-changes stays inside so a missing gate row rolls back cleanly.
903
+ transaction(() => {
904
+ const result = getDbOrNull().prepare(`UPDATE quality_gates
905
+ SET status = 'complete', verdict = :verdict, rationale = :rationale,
906
+ findings = :findings, evaluated_at = :evaluated_at
907
+ WHERE milestone_id = :mid AND slice_id = :sid AND gate_id = :gid
908
+ AND (task_id = :tid OR (:tid = '' AND task_id IS NULL))`).run({
909
+ ":mid": g.milestoneId,
910
+ ":sid": g.sliceId,
911
+ ":gid": g.gateId,
912
+ ":tid": g.taskId ?? "",
913
+ ":verdict": g.verdict,
914
+ ":rationale": g.rationale,
915
+ ":findings": g.findings,
916
+ ":evaluated_at": evaluatedAt,
917
+ });
918
+ if ((result.changes ?? 0) === 0) {
919
+ throw new GSDError(GSD_STALE_STATE, `quality gate row not found for ${g.milestoneId}/${g.sliceId}/${g.gateId}${g.taskId ? `/${g.taskId}` : ""}`);
920
+ }
921
+ const outcome = g.verdict === "pass"
922
+ ? "pass"
923
+ : g.verdict === "omitted"
924
+ ? "manual-attention"
925
+ : "fail";
926
+ insertGateRun({
927
+ traceId: `quality-gate:${g.milestoneId}:${g.sliceId}`,
928
+ turnId: `gate:${g.gateId}:${g.taskId ?? "slice"}`,
929
+ gateId: g.gateId,
930
+ gateType: "quality-gate",
931
+ milestoneId: g.milestoneId,
932
+ sliceId: g.sliceId,
933
+ taskId: g.taskId ?? undefined,
934
+ outcome,
935
+ failureClass: outcome === "fail" ? "verification" : outcome === "manual-attention" ? "manual-attention" : "none",
936
+ rationale: g.rationale,
937
+ findings: g.findings,
938
+ attempt: 1,
939
+ maxAttempts: 1,
940
+ retryable: false,
941
+ evaluatedAt,
942
+ });
808
943
  });
809
944
  }
810
945
  export function markAllGatesOmitted(milestoneId, sliceId) {
@@ -1012,6 +1147,13 @@ export function deleteArtifactsByPathPrefix(prefix) {
1012
1147
  return Number(countRow?.["count"] ?? 0);
1013
1148
  });
1014
1149
  }
1150
+ /** List artifact rows whose paths share a DB-relative prefix. */
1151
+ export function getArtifactsByPathPrefix(prefix) {
1152
+ if (!getDbOrNull())
1153
+ return [];
1154
+ const rows = getDbOrNull().prepare("SELECT * FROM artifacts WHERE path LIKE :prefix ORDER BY path").all({ ":prefix": `${prefix}%` });
1155
+ return rows.map(rowToArtifact);
1156
+ }
1015
1157
  /**
1016
1158
  * Drop hierarchy rows in dependency order inside a transaction. Used by
1017
1159
  * `gsd recover --confirm` to rebuild engine state from markdown.
@@ -11,7 +11,7 @@ import { loadFile, saveFile } from "./files.js";
11
11
  import { isDbAvailable, getMilestone, getMilestoneSlices } from "./gsd-db.js";
12
12
  import { parseRoadmapSlices } from "./roadmap-slices.js";
13
13
  import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
14
- import { buildCompleteSlicePrompt, buildDiscussMilestonePrompt, buildExecuteTaskPrompt, buildPlanMilestonePrompt, buildPlanSlicePrompt, buildSkillActivationBlock, } from "./auto-prompts.js";
14
+ import { buildCompleteSlicePrompt, buildDiscussMilestonePrompt, buildExecuteTaskPrompt, buildPlanMilestonePrompt, buildPlanSlicePrompt, buildSkillActivationBlock, capPreamble, } from "./auto-prompts.js";
15
15
  import { deriveState, isGhostMilestone } from "./state.js";
16
16
  import { invalidateAllCaches } from "./cache.js";
17
17
  import { startAutoDetached } from "./auto.js";
@@ -603,6 +603,9 @@ export const _dispatchWorkflowForTest = dispatchWorkflow;
603
603
  export function getDiscussableFutureMilestones(registry, activeMilestoneId) {
604
604
  return registry.filter((m) => m.id !== activeMilestoneId && m.status !== "complete" && m.status !== "parked");
605
605
  }
606
+ function findDiscussTargetMilestone(registry, milestoneId) {
607
+ return registry.find((m) => m.id === milestoneId || m.id.startsWith(`${milestoneId}-`));
608
+ }
606
609
  function getStructuredQuestionsAvailability(pi, ctx) {
607
610
  if (!ctx)
608
611
  return "false";
@@ -852,7 +855,9 @@ function resolveDiscussSliceBasePath(basePath, milestoneId) {
852
855
  * slice summaries so the agent can ask grounded UX/behaviour questions
853
856
  * without wasting a turn reading files.
854
857
  */
855
- async function buildDiscussSlicePrompt(mid, sid, sTitle, base, options) {
858
+ // Exported for tests (`prompt-budget-enforcement.test.ts`) verifies the
859
+ // inlined-context cap. Not part of the public flow surface otherwise.
860
+ export async function buildDiscussSlicePrompt(mid, sid, sTitle, base, options) {
856
861
  const inlined = [];
857
862
  // Roadmap — always included so the agent sees surrounding slices
858
863
  const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
@@ -903,8 +908,12 @@ async function buildDiscussSlicePrompt(mid, sid, sTitle, base, options) {
903
908
  }
904
909
  }
905
910
  }
911
+ // Cap the inlined block: it grows unbounded with each completed slice's full
912
+ // SUMMARY. `capPreamble` truncates at `### ` section boundaries — roadmap and
913
+ // milestone context come first (survive), completed-slice summaries come last
914
+ // (dropped first) when the executor's window can't hold everything.
906
915
  const inlinedContext = inlined.length > 0
907
- ? `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`
916
+ ? capPreamble(`## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`)
908
917
  : `## Inlined Context\n\n_(no context files found yet — go in blind and ask broad questions)_`;
909
918
  const sliceDirPath = `.gsd/milestones/${mid}/slices/${sid}`;
910
919
  const sliceContextPath = `${sliceDirPath}/${sid}-CONTEXT.md`;
@@ -964,12 +973,20 @@ export async function showDiscuss(ctx, pi, basePath, options) {
964
973
  if (slash > 0) {
965
974
  const mid = target.slice(0, slash);
966
975
  const sid = target.slice(slash + 1);
967
- const targetMilestone = state.registry.find((m) => m.id === mid);
968
- if (!targetMilestone || targetMilestone.status === "complete" || targetMilestone.status === "parked") {
969
- ctx.ui.notify(`Milestone ${mid} is not discussable.`, "warning");
976
+ const targetMilestone = findDiscussTargetMilestone(state.registry, mid);
977
+ if (!targetMilestone) {
978
+ ctx.ui.notify(`Milestone ${mid} was not found in the roadmap. Use /gsd new-milestone to add it, or /gsd status to see available milestones.`, "warning");
979
+ return;
980
+ }
981
+ if (targetMilestone.status === "complete") {
982
+ ctx.ui.notify(`Milestone ${targetMilestone.id} is already complete.`, "info");
983
+ return;
984
+ }
985
+ if (targetMilestone.status === "parked") {
986
+ ctx.ui.notify(`Milestone ${targetMilestone.id} is parked. Run /gsd unpark ${targetMilestone.id} to reactivate.`, "warning");
970
987
  return;
971
988
  }
972
- const slices = await loadDiscussNormSlices(basePath, mid);
989
+ const slices = await loadDiscussNormSlices(basePath, targetMilestone.id);
973
990
  const chosen = slices.find((s) => s.id.toUpperCase() === sid.toUpperCase());
974
991
  if (!chosen) {
975
992
  ctx.ui.notify(`Slice ${target} was not found in discussable slices.`, "warning");
@@ -979,19 +996,27 @@ export async function showDiscuss(ctx, pi, basePath, options) {
979
996
  ctx.ui.notify(`Slice ${target} is already complete; nothing to discuss.`, "info");
980
997
  return;
981
998
  }
982
- const discussBasePath = resolveDiscussSliceBasePath(basePath, mid);
983
- const contextFile = resolveSliceFile(discussBasePath, mid, sid, "CONTEXT");
999
+ const discussBasePath = resolveDiscussSliceBasePath(basePath, targetMilestone.id);
1000
+ const contextFile = resolveSliceFile(discussBasePath, targetMilestone.id, sid, "CONTEXT");
984
1001
  const sqAvail = getStructuredQuestionsAvailability(pi, ctx);
985
- const prompt = await buildDiscussSlicePrompt(mid, sid, chosen.title, discussBasePath, {
1002
+ const prompt = await buildDiscussSlicePrompt(targetMilestone.id, sid, chosen.title, discussBasePath, {
986
1003
  rediscuss: !!contextFile,
987
1004
  structuredQuestionsAvailable: sqAvail,
988
1005
  });
989
1006
  await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-slice", { basePath: discussBasePath });
990
1007
  return;
991
1008
  }
992
- const targetMilestone = state.registry.find((m) => m.id === target);
993
- if (!targetMilestone || targetMilestone.status === "complete" || targetMilestone.status === "parked") {
994
- ctx.ui.notify(`Milestone ${target} is not discussable.`, "warning");
1009
+ const targetMilestone = findDiscussTargetMilestone(state.registry, target);
1010
+ if (!targetMilestone) {
1011
+ ctx.ui.notify(`Milestone ${target} was not found in the roadmap. Use /gsd new-milestone to add it, or /gsd status to see available milestones.`, "warning");
1012
+ return;
1013
+ }
1014
+ if (targetMilestone.status === "complete") {
1015
+ ctx.ui.notify(`Milestone ${targetMilestone.id} is already complete.`, "info");
1016
+ return;
1017
+ }
1018
+ if (targetMilestone.status === "parked") {
1019
+ ctx.ui.notify(`Milestone ${targetMilestone.id} is parked. Run /gsd unpark ${targetMilestone.id} to reactivate.`, "warning");
995
1020
  return;
996
1021
  }
997
1022
  await dispatchDiscussForMilestone(ctx, pi, basePath, targetMilestone.id, targetMilestone.title, {});
@@ -13,7 +13,7 @@ import { logWarning } from "./workflow-logger.js";
13
13
  import { isClosedStatus } from "./status-guards.js";
14
14
  import { dirname, join, relative } from "node:path";
15
15
  import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTasksBySliceIds, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, isDbAvailable, } from "./gsd-db.js";
16
- import { resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, targetMilestoneFile, targetSliceFile, gsdProjectionRoot, gsdRoot, buildTaskFileName, } from "./paths.js";
16
+ import { resolveDir, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, targetMilestoneFile, targetSliceFile, targetTaskFile, gsdProjectionRoot, gsdRoot, buildTaskFileName, } from "./paths.js";
17
17
  import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
18
18
  import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
19
19
  import { invalidateStateCache } from "./state.js";
@@ -612,17 +612,7 @@ export async function renderTaskSummary(basePath, milestoneId, sliceId, taskId)
612
612
  if (!task || !task.full_summary_md) {
613
613
  return false; // No summary to render — skip silently
614
614
  }
615
- // Resolve the tasks directory, creating path if needed
616
- const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
617
- if (!slicePath) {
618
- process.stderr.write(`markdown-renderer: cannot resolve slice path for ${milestoneId}/${sliceId}\n`);
619
- return false;
620
- }
621
- // Use the tasks/ subdir when it exists (legacy layout), otherwise use the
622
- // slice path directly (flat-phase: task summaries live alongside plan files).
623
- const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
624
- const fileName = buildTaskFileName(taskId, "SUMMARY");
625
- const absPath = join(tasksDir, fileName);
615
+ const absPath = targetTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY", getMilestone(milestoneId)?.title);
626
616
  const artifactPath = toArtifactPath(absPath, basePath);
627
617
  await writeAndStore(absPath, artifactPath, task.full_summary_md, {
628
618
  artifact_type: "SUMMARY",
@@ -975,6 +965,19 @@ function detectStaleRendersImpl(basePath) {
975
965
  export function roadmapRenderMarksSliceDone(roadmapContent, sliceId) {
976
966
  return parseRoadmap(roadmapContent).slices.some((slice) => slice.id === sliceId && slice.done);
977
967
  }
968
+ function existingLegacySliceAssessmentPath(basePath, milestoneId, sliceId) {
969
+ if (!isLegacyMilestonesLayout(basePath))
970
+ return null;
971
+ const legacyBase = legacyMilestonesDir(basePath);
972
+ const milestoneDirName = resolveDir(legacyBase, milestoneId);
973
+ if (!milestoneDirName)
974
+ return null;
975
+ const slicesDir = join(legacyBase, milestoneDirName, "slices");
976
+ const sliceDirName = resolveDir(slicesDir, sliceId);
977
+ if (!sliceDirName)
978
+ return null;
979
+ return join(slicesDir, sliceDirName, `${sliceId}-ASSESSMENT.md`);
980
+ }
978
981
  export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanData) {
979
982
  const absPath = targetSliceFile(basePath, milestoneId, sliceId, "REPLAN", getMilestone(milestoneId)?.title);
980
983
  mkdirSync(dirname(absPath), { recursive: true });
@@ -1004,7 +1007,8 @@ export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanD
1004
1007
  return { replanPath: absPath, content };
1005
1008
  }
1006
1009
  export async function renderAssessmentFromDb(basePath, milestoneId, sliceId, assessmentData) {
1007
- const absPath = targetSliceFile(basePath, milestoneId, sliceId, "ASSESSMENT", getMilestone(milestoneId)?.title);
1010
+ const absPath = existingLegacySliceAssessmentPath(basePath, milestoneId, sliceId)
1011
+ ?? targetSliceFile(basePath, milestoneId, sliceId, "ASSESSMENT", getMilestone(milestoneId)?.title);
1008
1012
  mkdirSync(dirname(absPath), { recursive: true });
1009
1013
  const artifactPath = toArtifactPath(absPath, basePath);
1010
1014
  const lines = [];