@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
@@ -393,7 +393,8 @@ function resolveArtifactBasePath(
393
393
  ): string {
394
394
  if (
395
395
  session?.basePath &&
396
- session.currentMilestoneId === mid &&
396
+ session.currentMilestoneId &&
397
+ milestoneIdsDispatchCompatible(session.currentMilestoneId, mid) &&
397
398
  existsSync(session.basePath)
398
399
  ) {
399
400
  return session.basePath;
@@ -422,6 +423,28 @@ function normalizeMilestoneScope(value: string | null | undefined): string | nul
422
423
  return trimmed;
423
424
  }
424
425
 
426
+ function dispatchMilestoneIdentity(value: string | null | undefined): { baseId: string; hasSuffix: boolean } | null {
427
+ const normalized = normalizeMilestoneScope(value);
428
+ const match = normalized?.match(/^(M\d{3})(?:-[a-z0-9]{6})?$/);
429
+ if (!match) return null;
430
+ return { baseId: match[1]!, hasSuffix: normalized !== match[1] };
431
+ }
432
+
433
+ function isBareSuffixedMilestoneAlias(left: string, right: string): boolean {
434
+ const leftId = dispatchMilestoneIdentity(left);
435
+ const rightId = dispatchMilestoneIdentity(right);
436
+ return Boolean(
437
+ leftId &&
438
+ rightId &&
439
+ leftId.baseId === rightId.baseId &&
440
+ leftId.hasSuffix !== rightId.hasSuffix,
441
+ );
442
+ }
443
+
444
+ function milestoneIdsDispatchCompatible(left: string, right: string): boolean {
445
+ return left === right || isBareSuffixedMilestoneAlias(left, right);
446
+ }
447
+
425
448
  function resolveDispatchMilestoneScope(
426
449
  ctx: DispatchContext,
427
450
  ): { id: string; source: string } | null {
@@ -439,6 +462,37 @@ function resolveDispatchMilestoneScope(
439
462
  return null;
440
463
  }
441
464
 
465
+ function resolveEffectiveDispatchMilestoneId(
466
+ ctx: DispatchContext,
467
+ scopedMilestone: { id: string; source: string } | null,
468
+ ): string {
469
+ if (scopedMilestone && isBareSuffixedMilestoneAlias(ctx.mid, scopedMilestone.id)) {
470
+ return dispatchMilestoneIdentity(scopedMilestone.id)?.hasSuffix ? scopedMilestone.id : ctx.mid;
471
+ }
472
+
473
+ const activeMid = ctx.state.activeMilestone?.id;
474
+ if (activeMid && isBareSuffixedMilestoneAlias(ctx.mid, activeMid)) {
475
+ return dispatchMilestoneIdentity(activeMid)?.hasSuffix ? activeMid : ctx.mid;
476
+ }
477
+
478
+ return ctx.mid;
479
+ }
480
+
481
+ function withEffectiveDispatchMilestone(ctx: DispatchContext, effectiveMid: string): DispatchContext {
482
+ if (effectiveMid === ctx.mid) return ctx;
483
+ const activeMilestone = ctx.state.activeMilestone;
484
+ const state = activeMilestone && milestoneIdsDispatchCompatible(activeMilestone.id, effectiveMid)
485
+ ? {
486
+ ...ctx.state,
487
+ activeMilestone: {
488
+ ...activeMilestone,
489
+ id: effectiveMid,
490
+ },
491
+ }
492
+ : ctx.state;
493
+ return { ...ctx, mid: effectiveMid, state };
494
+ }
495
+
442
496
  function hasMilestonePassedDiscuss(basePath: string, mid: string): boolean {
443
497
  if (isDbAvailable()) {
444
498
  try {
@@ -732,14 +786,21 @@ export const DISPATCH_RULES: DispatchRule[] = [
732
786
  // Fire BEFORE the execution-entry phase rules so we redispatch to
733
787
  // `discuss-milestone` instead of hitting the plan-v2 gate.
734
788
  name: "execution-entry phase (no context) → discuss-milestone",
735
- match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
789
+ match: async ({ state, mid, midTitle, basePath, session, prefs, structuredQuestionsAvailable }) => {
736
790
  if (!EXECUTION_ENTRY_PHASES.has(state.phase)) return null;
737
791
  if (!MILESTONE_ID_RE.test(mid)) return null;
738
792
  if (isRegistryMilestoneComplete(state, mid)) return null;
739
- if (hasMilestonePassedDiscuss(basePath, mid)) return null;
793
+ // Resolve discuss/context artifacts against the active session worktree,
794
+ // mirroring the executing rules below. For a suffixed-worktree milestone
795
+ // the CONTEXT and slice plans live under the worktree, not the project
796
+ // root; checking the raw project-root basePath misreads the milestone as
797
+ // "never discussed" and re-dispatches discuss-milestone after task
798
+ // closeout instead of continuing execution (#1317).
799
+ const artifactBasePath = resolveArtifactBasePath(basePath, mid, session);
800
+ if (hasMilestonePassedDiscuss(artifactBasePath, mid)) return null;
740
801
  // Align with the plan-v2 gate's lookup semantics: whitespace-only counts
741
802
  // as missing, and an auto worktree may fall back to GSD_PROJECT_ROOT.
742
- if (hasFinalizedMilestoneContext(basePath, mid)) return null;
803
+ if (hasFinalizedMilestoneContext(artifactBasePath, mid)) return null;
743
804
  // H6 fix (#4973): non-deep auto-mode has no human to answer the
744
805
  // depth-verification question, so pre-marking avoids a write-gate
745
806
  // deadlock. Deep planning is still user-driven even inside auto-mode,
@@ -1095,10 +1156,13 @@ export const DISPATCH_RULES: DispatchRule[] = [
1095
1156
  },
1096
1157
  {
1097
1158
  name: "pre-planning (no context) → discuss-milestone",
1098
- match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
1159
+ match: async ({ state, mid, midTitle, basePath, prefs, session, structuredQuestionsAvailable }) => {
1099
1160
  if (state.phase !== "pre-planning") return null;
1100
1161
  if (isRegistryMilestoneComplete(state, mid)) return null;
1101
- const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
1162
+ const contextBasePath = resolveWorktreeProjectRoot(basePath, session?.originalBasePath);
1163
+ const contextFile =
1164
+ resolveMilestoneFile(basePath, mid, "CONTEXT") ??
1165
+ (contextBasePath !== basePath ? resolveMilestoneFile(contextBasePath, mid, "CONTEXT") : null);
1102
1166
  const hasContext = !!(contextFile && (await loadFile(contextFile)));
1103
1167
  if (hasContext) return null; // fall through to next rule
1104
1168
  if (prefs?.planning_depth === "deep") return null;
@@ -1908,36 +1972,39 @@ function applyLanguageDirectiveToDispatch(
1908
1972
  export async function resolveDispatch(
1909
1973
  ctx: DispatchContext,
1910
1974
  ): Promise<DispatchAction> {
1911
- if (ctx.mid && isDbAvailable()) {
1912
- const milestone = getMilestone(ctx.mid);
1975
+ const scopedMilestone = resolveDispatchMilestoneScope(ctx);
1976
+ const effectiveMid = resolveEffectiveDispatchMilestoneId(ctx, scopedMilestone);
1977
+ const dispatchCtx = withEffectiveDispatchMilestone(ctx, effectiveMid);
1978
+
1979
+ if (dispatchCtx.mid && isDbAvailable()) {
1980
+ const milestone = getMilestone(dispatchCtx.mid);
1913
1981
  if (milestone && isClosedStatus(milestone.status)) {
1914
1982
  return {
1915
1983
  action: "stop",
1916
1984
  reason:
1917
- `Milestone ${ctx.mid} is closed (status: ${milestone.status}); auto-mode will not reopen or recover it implicitly. ` +
1985
+ `Milestone ${dispatchCtx.mid} is closed (status: ${milestone.status}); auto-mode will not reopen or recover it implicitly. ` +
1918
1986
  "Use an explicit reopen command before planning or executing more work for this milestone.",
1919
1987
  level: "warning",
1920
1988
  };
1921
1989
  }
1922
1990
  }
1923
1991
 
1924
- const activeMid = ctx.state.activeMilestone?.id;
1925
- if (activeMid && ctx.mid !== activeMid) {
1992
+ const activeMid = dispatchCtx.state.activeMilestone?.id;
1993
+ if (activeMid && !milestoneIdsDispatchCompatible(dispatchCtx.mid, activeMid)) {
1926
1994
  return {
1927
1995
  action: "stop",
1928
1996
  reason:
1929
- `Dispatch milestone mismatch: context mid "${ctx.mid}" does not match active milestone "${activeMid}". ` +
1997
+ `Dispatch milestone mismatch: context mid "${dispatchCtx.mid}" does not match active milestone "${activeMid}". ` +
1930
1998
  "This usually means a project-level deep setup pseudo-id leaked into milestone dispatch; rerun /gsd auto after setup state is reconciled.",
1931
1999
  level: "warning",
1932
2000
  };
1933
2001
  }
1934
2002
 
1935
- const scopedMilestone = resolveDispatchMilestoneScope(ctx);
1936
- if (scopedMilestone && ctx.mid !== scopedMilestone.id) {
2003
+ if (scopedMilestone && !milestoneIdsDispatchCompatible(dispatchCtx.mid, scopedMilestone.id)) {
1937
2004
  return {
1938
2005
  action: "stop",
1939
2006
  reason:
1940
- `Dispatch milestone mismatch: context mid "${ctx.mid}" does not match ${scopedMilestone.source} "${scopedMilestone.id}". ` +
2007
+ `Dispatch milestone mismatch: context mid "${dispatchCtx.mid}" does not match ${scopedMilestone.source} "${scopedMilestone.id}". ` +
1941
2008
  "The active worktree/session and derived project state disagree; recover, park, or discard the stranded milestone before continuing.",
1942
2009
  level: "warning",
1943
2010
  };
@@ -1946,10 +2013,10 @@ export async function resolveDispatch(
1946
2013
  // Delegate to registry when available
1947
2014
  try {
1948
2015
  const registry = getRegistry();
1949
- const action = annotateBackgroundable(await registry.evaluateDispatch(ctx));
2016
+ const action = annotateBackgroundable(await registry.evaluateDispatch(dispatchCtx));
1950
2017
  if (
1951
2018
  action.action === "dispatch" &&
1952
- ctx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)
2019
+ dispatchCtx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)
1953
2020
  ) {
1954
2021
  return {
1955
2022
  action: "stop",
@@ -1964,13 +2031,13 @@ export async function resolveDispatch(
1964
2031
  }
1965
2032
 
1966
2033
  for (const rule of DISPATCH_RULES) {
1967
- const result = await rule.match(ctx);
2034
+ const result = await rule.match(dispatchCtx);
1968
2035
  if (result) {
1969
2036
  if (result.action !== "skip") result.matchedRule = rule.name;
1970
2037
  const action = annotateBackgroundable(result);
1971
2038
  if (
1972
2039
  action.action === "dispatch" &&
1973
- ctx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)
2040
+ dispatchCtx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)
1974
2041
  ) {
1975
2042
  return {
1976
2043
  action: "stop",
@@ -1698,6 +1698,10 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
1698
1698
  `Safety: task ${sTid} claimed passing verification that failed in recorded execution`,
1699
1699
  "error",
1700
1700
  );
1701
+ const gitActionResult = await runCloseoutGitAction(pctx, s.currentUnit);
1702
+ if (gitActionResult === "dispatched") {
1703
+ return "dispatched";
1704
+ }
1701
1705
  await pauseAuto(ctx, pi);
1702
1706
  return "dispatched";
1703
1707
  }
@@ -16,6 +16,7 @@ import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
16
16
  import {
17
17
  resolveMilestoneFile, resolveSliceFile, resolveSlicePath,
18
18
  resolveTasksDir, resolveTaskFiles, resolveTaskFile,
19
+ taskIdFromTaskFileName,
19
20
  relMilestoneFile, relSliceFile, relSlicePath, relMilestonePath,
20
21
  relTaskFile, resolveGsdRootFile, relGsdRootFile, resolveRuntimeFile,
21
22
  } from "./paths.js";
@@ -28,7 +29,8 @@ import type { GSDPreferences } from "./preferences.js";
28
29
  import { join, basename, relative, sep } from "node:path";
29
30
  import { existsSync } from "node:fs";
30
31
  import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary, type MinimalModelRegistry } from "./context-budget.js";
31
- import { getGateResults, getPendingGates, getPendingGatesForTurn } from "./gsd-db.js";
32
+ import type { TokenProvider } from "./token-counter.js";
33
+ import { getBlockingReworkFindingsForTask, getGateResults, getPendingGates, getPendingGatesForTurn } from "./gsd-db.js";
32
34
  import {
33
35
  GATE_REGISTRY,
34
36
  assertGateCoverage,
@@ -91,13 +93,29 @@ function resolvePromptBudgets(): ReturnType<typeof computeBudgets> {
91
93
  const prefs = loadEffectiveGSDPreferences();
92
94
  const sessionWindow = prefs?.preferences.context_window_override;
93
95
  const windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences, sessionWindow);
94
- return computeBudgets(windowTokens);
96
+ return computeBudgets(windowTokens, resolveExecutionProvider(prefs?.preferences));
95
97
  } catch (e) {
96
98
  logWarning("prompt", `resolvePromptBudgets failed: ${(e as Error).message}`);
97
99
  return computeBudgets(200_000);
98
100
  }
99
101
  }
100
102
 
103
+ /**
104
+ * Best-effort provider for the chars/token ratio: the executor's configured
105
+ * model profile is the only provider source reachable here (the runtime
106
+ * `sessionProvider` that reaches `formatExecutorConstraints` isn't threaded to
107
+ * `capPreamble`/summary callers). Undefined when no explicit provider is set —
108
+ * `computeBudgets` then uses the 4.0 default, i.e. today's behavior.
109
+ */
110
+ function resolveExecutionProvider(prefs?: { models?: { execution?: unknown } }): TokenProvider | undefined {
111
+ const exec = prefs?.models?.execution;
112
+ if (exec && typeof exec === "object" && "provider" in exec) {
113
+ const provider = (exec as { provider?: unknown }).provider;
114
+ if (typeof provider === "string" && provider) return provider as TokenProvider;
115
+ }
116
+ return undefined;
117
+ }
118
+
101
119
  /**
102
120
  * Character budget for dependency/prior slice summaries injected into dispatch
103
121
  * prompts. Scales with the executor's configured context window (issue #4435).
@@ -106,6 +124,34 @@ function resolveSummaryBudgetChars(): number {
106
124
  return resolvePromptBudgets().summaryBudgetChars;
107
125
  }
108
126
 
127
+
128
+ function renderBlockingReworkFindingsBlock(mid: string, sid: string, tid: string): string {
129
+ const findings = getBlockingReworkFindingsForTask(mid, sid, tid)
130
+ .filter((finding) => finding.status === "pending");
131
+ if (findings.length === 0) return "";
132
+
133
+ const lines = [
134
+ "## Blocking Rework Findings (non-optional)",
135
+ "",
136
+ "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`.",
137
+ "",
138
+ ];
139
+ for (const finding of findings) {
140
+ lines.push(`### ${finding.finding_id} (${finding.severity})`);
141
+ lines.push(`- Status: ${finding.status}`);
142
+ lines.push(`- Finding: ${finding.description}`);
143
+ lines.push(`- Required fix: ${finding.required_fix}`);
144
+ if (finding.verification_commands.length > 0) {
145
+ lines.push("- Required verification:");
146
+ for (const command of finding.verification_commands) {
147
+ lines.push(` - \`${command}\``);
148
+ }
149
+ }
150
+ lines.push("");
151
+ }
152
+ return lines.join("\n").trim();
153
+ }
154
+
109
155
  function formatProjectClassificationForPlanning(classification: ProjectClassification): string {
110
156
  const sampleFiles = classification.contentFiles.slice(0, 8);
111
157
  const sample = sampleFiles.length > 0 ? sampleFiles.map((file) => `\`${file}\``).join(", ") : "(none)";
@@ -208,7 +254,7 @@ function formatCloseoutReviewInstructions(validationContent: string | null, vali
208
254
  ].join("\n");
209
255
  }
210
256
 
211
- function capPreamble(preamble: string): string {
257
+ export function capPreamble(preamble: string): string {
212
258
  // Cap inlined context at min(static ceiling, scaled inline budget).
213
259
  // The ceiling bounds repeated auto prompt payloads; the scaled
214
260
  // budget tightens the cap for small-window users whose true safe limit is
@@ -218,6 +264,41 @@ function capPreamble(preamble: string): string {
218
264
  return truncateAtSectionBoundary(preamble, budget).content;
219
265
  }
220
266
 
267
+ /**
268
+ * Cap the execute-task inline blocks against one shared budget in priority
269
+ * order. Unlike `capPreamble` (single concatenated preamble), execute-task
270
+ * feeds these blocks into separate, non-contiguous template placeholders, so
271
+ * they can't be joined and re-split — the budget is spent block-by-block.
272
+ *
273
+ * The task plan is the authoritative execution contract: it is never truncated
274
+ * here (it consumes budget first, whole). Remaining budget flows to the slice
275
+ * excerpt, then templates, each truncated at section boundaries so the lowest-
276
+ * priority context drops whole trailing sections first. When the task plan
277
+ * alone meets or exceeds the budget, the trailing blocks are dropped rather
278
+ * than the task plan being cut.
279
+ */
280
+ function capExecuteTaskInlineBlocks(
281
+ taskPlan: string,
282
+ slicePlan: string,
283
+ templates: string,
284
+ budgetChars: number,
285
+ ): { taskPlan: string; slicePlan: string; templates: string } {
286
+ let remaining = budgetChars - taskPlan.length;
287
+ if (remaining <= 0) {
288
+ return { taskPlan, slicePlan: "", templates: "" };
289
+ }
290
+ const cappedSlice = slicePlan.length <= remaining
291
+ ? slicePlan
292
+ : truncateAtSectionBoundary(slicePlan, remaining).content;
293
+ remaining -= cappedSlice.length;
294
+ const cappedTemplates = remaining <= 0
295
+ ? ""
296
+ : templates.length <= remaining
297
+ ? templates
298
+ : truncateAtSectionBoundary(templates, remaining).content;
299
+ return { taskPlan, slicePlan: cappedSlice, templates: cappedTemplates };
300
+ }
301
+
221
302
  type PromptContextMode = "inline" | "excerpt" | "on-demand" | "skipped";
222
303
 
223
304
  interface PromptContextTelemetryEntry {
@@ -296,7 +377,7 @@ function prependContextModeToBlock(
296
377
  block: string,
297
378
  renderMode: ContextModeRenderMode = "standalone",
298
379
  ): string {
299
- const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
380
+ const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode, basePath: base });
300
381
  const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
301
382
  const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
302
383
  if (!guidance) return block;
@@ -377,7 +458,7 @@ function formatExecutorConstraints(
377
458
  // so DEFAULT_CONTEXT_WINDOW stays the single source of truth.
378
459
  windowTokens = resolveExecutorContextWindow(undefined, undefined, sessionContextWindow, sessionProvider);
379
460
  }
380
- const budgets = computeBudgets(windowTokens);
461
+ const budgets = computeBudgets(windowTokens, sessionProvider as TokenProvider | undefined);
381
462
  const { min, max } = budgets.taskCountRange;
382
463
  const execWindowK = Math.round(windowTokens / 1000);
383
464
  const perTaskBudgetK = Math.round(budgets.inlineContextBudgetChars / 1000);
@@ -1403,6 +1484,18 @@ function resolveTaskSummariesLocation(
1403
1484
  return { dir: slicePath, relPrefix: sRel };
1404
1485
  }
1405
1486
 
1487
+ function summaryFileBelongsToSlice(
1488
+ fileName: string,
1489
+ base: string,
1490
+ mid: string,
1491
+ sid: string,
1492
+ ): boolean {
1493
+ const tid = taskIdFromTaskFileName(fileName, "SUMMARY");
1494
+ if (!tid) return false;
1495
+ const resolved = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
1496
+ return resolved !== null && basename(resolved) === fileName;
1497
+ }
1498
+
1406
1499
  export async function getPriorTaskSummaryPaths(
1407
1500
  mid: string, sid: string, currentTid: string, base: string,
1408
1501
  ): Promise<string[]> {
@@ -1414,7 +1507,10 @@ export async function getPriorTaskSummaryPaths(
1414
1507
 
1415
1508
  return summaryFiles
1416
1509
  .filter(f => {
1417
- const num = parseInt(f.replace(/^T/, ""), 10);
1510
+ if (!summaryFileBelongsToSlice(f, base, mid, sid)) return false;
1511
+ const tid = taskIdFromTaskFileName(f, "SUMMARY");
1512
+ if (!tid) return false;
1513
+ const num = parseInt(tid.replace(/^T/, ""), 10);
1418
1514
  return num < currentNum;
1419
1515
  })
1420
1516
  .map(f => `${loc.relPrefix}/${f}`);
@@ -1447,8 +1543,9 @@ export async function getDependencyTaskSummaryPaths(
1447
1543
 
1448
1544
  return summaryFiles
1449
1545
  .filter((f) => {
1450
- // Extract task ID from filename: "T02-SUMMARY.md" → "T02"
1451
- const tid = f.replace(/-SUMMARY\.md$/i, "").toUpperCase();
1546
+ if (!summaryFileBelongsToSlice(f, base, mid, sid)) return false;
1547
+ const tid = taskIdFromTaskFileName(f, "SUMMARY");
1548
+ if (!tid) return false;
1452
1549
  return depSet.has(tid);
1453
1550
  })
1454
1551
  .map((f) => `${loc.relPrefix}/${f}`);
@@ -2697,7 +2794,7 @@ export async function buildExecuteTaskPrompt(
2697
2794
  // Compute verification budget for the executor's context window (issue #707)
2698
2795
  const prefs = loadEffectiveGSDPreferences();
2699
2796
  const contextWindow = resolveExecutorContextWindow(opts.modelRegistry, prefs?.preferences, opts.sessionContextWindow, opts.sessionProvider);
2700
- const budgets = computeBudgets(contextWindow);
2797
+ const budgets = computeBudgets(contextWindow, opts.sessionProvider as TokenProvider | undefined);
2701
2798
  const verificationBudget = `~${Math.round(budgets.verificationBudgetChars / 1000)}K chars`;
2702
2799
 
2703
2800
  // Truncate carry-forward section when it exceeds 40% of inline context budget.
@@ -2745,6 +2842,15 @@ export async function buildExecuteTaskPrompt(
2745
2842
  logWarning("prompt", `reopen reason injection failed: ${(reopenErr as Error).message}`);
2746
2843
  }
2747
2844
 
2845
+ const reworkFindingsBlock = renderBlockingReworkFindingsBlock(mid, sid, tid);
2846
+ if (reworkFindingsBlock) {
2847
+ const block = reworkFindingsBlock + "\n\n---\n\n";
2848
+ phaseAnchorSection = phaseAnchorSection
2849
+ ? `${block}${phaseAnchorSection}`
2850
+ : block;
2851
+ trackPromptContext(contextTelemetry, "rework-findings", "inline", reworkFindingsBlock);
2852
+ }
2853
+
2748
2854
  // ADR-011 Phase 2: inject any resolved-but-unapplied escalation override
2749
2855
  // into this task's prompt. Claim is atomic via DB UPDATE WHERE IS NULL, so
2750
2856
  // if a parallel build already injected it, we skip. Feature-gated by
@@ -2805,10 +2911,26 @@ export async function buildExecuteTaskPrompt(
2805
2911
  }
2806
2912
  },
2807
2913
  });
2808
- const taskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
2809
- const slicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
2914
+ const rawTaskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
2915
+ const rawSlicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
2810
2916
  const contractedCarryForward = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "prior-task-summaries");
2811
- const contractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
2917
+ const rawContractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
2918
+ // Cap the static inline blocks against one shared budget so a small-window
2919
+ // executor can't overflow (the sibling builders cap via `capPreamble`;
2920
+ // execute-task's blocks feed separate template slots, so they share a budget
2921
+ // block-by-block). Carry-forward already has its own truncation above.
2922
+ const inlineBudget = Math.min(MAX_PREAMBLE_CHARS, budgets.inlineContextBudgetChars);
2923
+ const { taskPlan: taskPlanInline, slicePlan: slicePlanExcerpt, templates: contractedTemplates } =
2924
+ capExecuteTaskInlineBlocks(rawTaskPlanInline, rawSlicePlanExcerpt, rawContractedTemplates, inlineBudget);
2925
+ const inlineDropped = (rawTaskPlanInline.length + rawSlicePlanExcerpt.length + rawContractedTemplates.length)
2926
+ - (taskPlanInline.length + slicePlanExcerpt.length + contractedTemplates.length);
2927
+ trackPromptContext(
2928
+ contextTelemetry,
2929
+ "inline-cap",
2930
+ inlineDropped > 0 ? "excerpt" : "skipped",
2931
+ null,
2932
+ inlineDropped > 0 ? `dropped ${inlineDropped} chars (budget ${inlineBudget})` : "within budget",
2933
+ );
2812
2934
  const onDemandResult = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
2813
2935
  const onDemandContext = onDemandResult.text;
2814
2936
  trackPromptContext(
@@ -2904,12 +3026,14 @@ export async function buildCompleteSlicePrompt(
2904
3026
  trackPromptContext(contextTelemetry, "prior-task-summaries", "skipped", null, "missing tasks dir");
2905
3027
  return null;
2906
3028
  }
2907
- const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY").sort();
3029
+ const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY")
3030
+ .filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
3031
+ .sort();
2908
3032
  const blocks: string[] = [];
2909
3033
  for (const file of summaryFiles) {
2910
3034
  const absPath = join(loc.dir, file);
2911
3035
  const relPath = `${loc.relPrefix}/${file}`;
2912
- const taskId = file.replace(/-SUMMARY\.md$/i, "");
3036
+ const taskId = taskIdFromTaskFileName(file, "SUMMARY") ?? file.replace(/-SUMMARY\.md$/i, "");
2913
3037
  blocks.push(await buildTaskSummaryExcerpt(absPath, relPath, taskId));
2914
3038
  }
2915
3039
  const body = blocks.length > 0 ? blocks.join("\n\n---\n\n") : null;
@@ -3522,7 +3646,9 @@ export async function buildReplanSlicePrompt(
3522
3646
  let blockerTaskId = "";
3523
3647
  const summaryLoc = resolveTaskSummariesLocation(base, mid, sid);
3524
3648
  if (summaryLoc) {
3525
- const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY").sort();
3649
+ const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY")
3650
+ .filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
3651
+ .sort();
3526
3652
  for (const file of summaryFiles) {
3527
3653
  const absPath = join(summaryLoc.dir, file);
3528
3654
  const content = await loadFile(absPath);
@@ -3530,7 +3656,7 @@ export async function buildReplanSlicePrompt(
3530
3656
  const summary = parseSummary(content);
3531
3657
  const relPath = `${summaryLoc.relPrefix}/${file}`;
3532
3658
  if (summary.frontmatter.blocker_discovered) {
3533
- blockerTaskId = summary.frontmatter.id || file.replace(/-SUMMARY\.md$/i, "");
3659
+ blockerTaskId = summary.frontmatter.id || taskIdFromTaskFileName(file, "SUMMARY") || file.replace(/-SUMMARY\.md$/i, "");
3534
3660
  inlined.push(await buildTaskSummaryExcerpt(absPath, relPath, blockerTaskId, { blocker: true }));
3535
3661
  }
3536
3662
  }
@@ -39,8 +39,7 @@ import { isClosedStatus, isInactiveStatus } from "./status-guards.js";
39
39
  import {
40
40
  resolveSlicePath,
41
41
  resolveSliceFile,
42
- resolveTasksDir,
43
- resolveTaskFiles,
42
+ resolveTaskFile,
44
43
  relMilestoneFile,
45
44
  relSliceFile,
46
45
  buildSliceFileName,
@@ -324,13 +323,16 @@ export function writeReactiveExecuteBlocker(
324
323
  const slicePath = resolveSlicePath(base, mid, sid);
325
324
  if (!slicePath) return null;
326
325
 
327
- const tasksDir = resolveTasksDir(base, mid, sid) ?? slicePath;
328
- const existingSummaries = new Set(
329
- resolveTaskFiles(tasksDir, "SUMMARY").map((f) => f.replace(/-SUMMARY\.md$/i, "").toUpperCase()),
330
- );
326
+ // Resolve each batch task's SUMMARY with slice-qualified paths so flat-phase
327
+ // slices that reuse a task id (e.g. two T03s in one phase) don't collide: a
328
+ // sibling slice's summary must never make this slice's task look complete.
329
+ const hasSummary = (tid: string): boolean => {
330
+ const summaryPath = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
331
+ return summaryPath !== null && existsSync(summaryPath);
332
+ };
331
333
 
332
- const summaryPresent = batchIds.filter((tid) => existingSummaries.has(tid.toUpperCase()));
333
- const summaryMissing = batchIds.filter((tid) => !existingSummaries.has(tid.toUpperCase()));
334
+ const summaryPresent = batchIds.filter((tid) => hasSummary(tid));
335
+ const summaryMissing = batchIds.filter((tid) => !hasSummary(tid));
334
336
  const completedTaskIds: string[] = [];
335
337
  const skippedTaskIds: string[] = [];
336
338
  const unchangedTaskIds: string[] = [];
@@ -10,6 +10,7 @@ import { existsSync, realpathSync, unlinkSync } from "node:fs";
10
10
  import { isAbsolute, join, relative } from "node:path";
11
11
 
12
12
  import { gsdRoot } from "./paths.js";
13
+ import { milestoneMetaPath } from "./git-service.js";
13
14
  import { logWarning } from "./workflow-logger.js";
14
15
 
15
16
  function isSamePath(a: string, b: string): boolean {
@@ -93,6 +94,9 @@ export function clearProjectRootStateFiles(
93
94
  // worth removing on teardown.
94
95
  const transientFiles = [
95
96
  join(gsdDir, "STATE.md"),
97
+ // Integration-branch META now lives flat at .gsd/<MID>-META.json (ADR-045).
98
+ milestoneMetaPath(basePath, milestoneId),
99
+ // Legacy location — still cleaned for pre-migration trees.
96
100
  join(gsdDir, "milestones", milestoneId, `${milestoneId}-META.json`),
97
101
  ];
98
102
 
@@ -65,7 +65,7 @@ export function teardownAutoWorktree(
65
65
 
66
66
  // Mirror cleanup steps from mergeMilestoneToMain abort path:
67
67
 
68
- // 1. Remove transient state files (STATE.md, auto.lock, {MID}-META.json).
68
+ // 1. Remove transient state files (STATE.md, auto.lock, .gsd/{MID}-META.json).
69
69
  // Non-fatal — must not block teardown.
70
70
  try {
71
71
  clearProjectRootStateFiles(originalBasePath, milestoneId);
@@ -19,7 +19,7 @@ import type {
19
19
  SessionMessageEntry,
20
20
  } from "@gsd/pi-coding-agent";
21
21
 
22
- import { deriveState } from "./state.js";
22
+ import { deriveState, invalidateStateCache } from "./state.js";
23
23
  import {
24
24
  buildRequirementsBacklogSummaryLines,
25
25
  countUnmappedActiveRequirements,
@@ -443,6 +443,9 @@ function captureMilestoneLockEnv(milestoneId: string | null): void {
443
443
  } else {
444
444
  delete process.env.GSD_MILESTONE_LOCK;
445
445
  }
446
+ // The derive cache is keyed on basePath only; GSD_MILESTONE_LOCK changes
447
+ // what deriveState computes, so a lock flip must not serve a cached result.
448
+ invalidateStateCache();
446
449
  }
447
450
 
448
451
  function restoreMilestoneLockEnv(): void {
@@ -457,6 +460,7 @@ function restoreMilestoneLockEnv(): void {
457
460
  s.previousMilestoneLockEnv = null;
458
461
  s.hadMilestoneLockEnv = false;
459
462
  s.milestoneLockEnvCaptured = false;
463
+ invalidateStateCache();
460
464
  }
461
465
 
462
466
  /**