@opengsd/gsd-pi 1.3.0-dev.eed73bea → 1.4.0

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 (505) hide show
  1. package/README.md +10 -10
  2. package/dist/cli.js +17 -4
  3. package/dist/headless-answers.js +1 -1
  4. package/dist/headless-ui.d.ts +1 -1
  5. package/dist/headless-ui.js +1 -1
  6. package/dist/headless.js +1 -1
  7. package/dist/resources/.managed-resources-content-hash +1 -1
  8. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  9. package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
  10. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  11. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  12. package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
  13. package/dist/resources/extensions/gsd/auto-budget.js +5 -1
  14. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -6
  15. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  16. package/dist/resources/extensions/gsd/auto-prompts.js +8 -24
  17. package/dist/resources/extensions/gsd/auto-recovery.js +9 -517
  18. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
  19. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
  20. package/dist/resources/extensions/gsd/auto-verification.js +5 -2
  21. package/dist/resources/extensions/gsd/auto.js +19 -10
  22. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
  23. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +5 -4
  24. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  25. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -18
  26. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +48 -36
  27. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +15 -4
  28. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
  29. package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
  30. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  31. package/dist/resources/extensions/gsd/commands-usage.js +1 -1
  32. package/dist/resources/extensions/gsd/db/engine.js +4 -1
  33. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
  34. package/dist/resources/extensions/gsd/db-workspace.js +55 -3
  35. package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
  36. package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  37. package/dist/resources/extensions/gsd/doctor-engine-checks.js +192 -4
  38. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
  39. package/dist/resources/extensions/gsd/exec-sandbox.js +8 -2
  40. package/dist/resources/extensions/gsd/flat-phase-migration.js +45 -0
  41. package/dist/resources/extensions/gsd/git-service.js +57 -0
  42. package/dist/resources/extensions/gsd/gitignore.js +4 -1
  43. package/dist/resources/extensions/gsd/guided-flow-queue.js +20 -13
  44. package/dist/resources/extensions/gsd/json-persistence.js +20 -0
  45. package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
  46. package/dist/resources/extensions/gsd/layout-policy.js +3 -1
  47. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -7
  48. package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
  49. package/dist/resources/extensions/gsd/metrics.js +4 -4
  50. package/dist/resources/extensions/gsd/migrate-external.js +11 -2
  51. package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
  52. package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
  53. package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
  54. package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
  55. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  56. package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -3
  57. package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
  58. package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
  59. package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
  60. package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
  61. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  62. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  63. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  64. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  65. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  66. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  67. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +27 -33
  68. package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
  69. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
  70. package/dist/resources/extensions/gsd/state.js +12 -611
  71. package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
  72. package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -34
  73. package/dist/resources/extensions/gsd/tools/complete-task.js +8 -41
  74. package/dist/resources/extensions/gsd/tools/plan-slice.js +59 -44
  75. package/dist/resources/extensions/gsd/tools/plan-task.js +28 -5
  76. package/dist/resources/extensions/gsd/undo.js +43 -6
  77. package/dist/resources/extensions/gsd/unit-registry.js +11 -3
  78. package/dist/resources/extensions/gsd/verification-gate.js +7 -0
  79. package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
  80. package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
  81. package/dist/resources/extensions/gsd/worktree-manager.js +44 -2
  82. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  83. package/dist/web/standalone/.next/BUILD_ID +1 -1
  84. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  85. package/dist/web/standalone/.next/build-manifest.json +4 -4
  86. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  87. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  88. package/dist/web/standalone/.next/required-server-files.json +3 -3
  89. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  90. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  100. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  116. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  128. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  150. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  160. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  166. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  186. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/index.html +1 -1
  196. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  197. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  198. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  199. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  201. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/page.js +2 -2
  203. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  205. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  206. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  207. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/middleware.js +3 -3
  210. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  211. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  212. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  213. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  214. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  216. package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
  217. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  218. package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
  219. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  220. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/app/{layout-4ae2d68984392bbf.js → layout-b35cbfff38aaf4cf.js} +1 -1
  222. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/{main-app-90d1d8d5e5d2dc6b.js → main-app-590a74400e35f685.js} +1 -1
  224. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  226. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  227. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  228. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  229. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  230. package/dist/web/standalone/server.js +1 -1
  231. package/package.json +6 -6
  232. package/packages/cloud-mcp-gateway/package.json +2 -2
  233. package/packages/contracts/package.json +1 -1
  234. package/packages/daemon/package.json +4 -4
  235. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  236. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  237. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  238. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  239. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  240. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  241. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  242. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  243. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  244. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  245. package/packages/gsd-agent-core/dist/index.js +2 -0
  246. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  247. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  248. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  249. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  250. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  251. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  252. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  253. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  254. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  255. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  256. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  257. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  258. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  259. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  260. package/packages/gsd-agent-core/package.json +5 -5
  261. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  262. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  263. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  264. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  267. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  269. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  270. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  271. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -841
  272. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  273. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  274. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  275. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  276. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  277. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  278. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  279. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  280. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  281. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  282. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  283. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +258 -0
  284. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  285. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  287. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  289. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
  290. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  291. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
  292. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  293. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  294. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  295. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  296. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  297. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  298. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  299. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  300. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  301. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  302. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  303. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  304. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  305. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  306. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  307. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  308. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  309. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
  310. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  311. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +23 -5
  312. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  313. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  314. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  315. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  316. package/packages/gsd-agent-modes/package.json +7 -7
  317. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  318. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  319. package/packages/mcp-server/package.json +4 -4
  320. package/packages/native/package.json +1 -1
  321. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  322. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  323. package/packages/pi-agent-core/package.json +1 -1
  324. package/packages/pi-ai/dist/models.generated.d.ts +46 -0
  325. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  326. package/packages/pi-ai/dist/models.generated.js +38 -0
  327. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  328. package/packages/pi-ai/package.json +1 -1
  329. package/packages/pi-coding-agent/README.md +3 -2
  330. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  331. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  332. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  333. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  334. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  335. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  336. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  337. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  338. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  339. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  341. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  342. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
  343. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  344. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  345. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  346. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  347. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
  349. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  351. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  352. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  353. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  354. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  356. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  357. package/packages/pi-coding-agent/package.json +7 -7
  358. package/packages/pi-tui/package.json +2 -2
  359. package/packages/rpc-client/package.json +2 -2
  360. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  361. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  362. package/pkg/dist/theme/theme-schema.js +1 -1
  363. package/pkg/dist/theme/theme-schema.js.map +1 -1
  364. package/pkg/dist/theme/theme.d.ts.map +1 -1
  365. package/pkg/dist/theme/theme.js +11 -7
  366. package/pkg/dist/theme/theme.js.map +1 -1
  367. package/pkg/package.json +1 -1
  368. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  369. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
  370. package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
  371. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  372. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  373. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
  374. package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
  375. package/src/resources/extensions/gsd/auto-budget.ts +12 -1
  376. package/src/resources/extensions/gsd/auto-dispatch.ts +17 -7
  377. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  378. package/src/resources/extensions/gsd/auto-prompts.ts +7 -23
  379. package/src/resources/extensions/gsd/auto-recovery.ts +13 -518
  380. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
  381. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
  382. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  383. package/src/resources/extensions/gsd/auto.ts +23 -8
  384. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
  385. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +5 -4
  386. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  387. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +43 -18
  388. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
  389. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +50 -37
  390. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +16 -4
  391. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
  392. package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
  393. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  394. package/src/resources/extensions/gsd/commands-usage.ts +1 -1
  395. package/src/resources/extensions/gsd/db/engine.ts +8 -1
  396. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
  397. package/src/resources/extensions/gsd/db-workspace.ts +61 -3
  398. package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
  399. package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  400. package/src/resources/extensions/gsd/doctor-engine-checks.ts +233 -5
  401. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
  402. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  403. package/src/resources/extensions/gsd/exec-sandbox.ts +7 -2
  404. package/src/resources/extensions/gsd/flat-phase-migration.ts +44 -0
  405. package/src/resources/extensions/gsd/git-service.ts +64 -0
  406. package/src/resources/extensions/gsd/gitignore.ts +4 -1
  407. package/src/resources/extensions/gsd/guided-flow-queue.ts +20 -13
  408. package/src/resources/extensions/gsd/json-persistence.ts +20 -0
  409. package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
  410. package/src/resources/extensions/gsd/layout-policy.ts +2 -1
  411. package/src/resources/extensions/gsd/markdown-renderer.ts +2 -10
  412. package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
  413. package/src/resources/extensions/gsd/metrics.ts +4 -4
  414. package/src/resources/extensions/gsd/migrate-external.ts +8 -2
  415. package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
  416. package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
  417. package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
  418. package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
  419. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  420. package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -3
  421. package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
  422. package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
  423. package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
  424. package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
  425. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  426. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  427. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  428. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  429. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  430. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  431. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +36 -30
  432. package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
  433. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
  434. package/src/resources/extensions/gsd/state.ts +32 -732
  435. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
  436. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
  437. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
  438. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
  439. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
  440. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +35 -0
  441. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
  442. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
  443. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
  444. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
  445. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
  446. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
  447. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
  448. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
  449. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +239 -2
  450. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
  451. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
  452. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +37 -2
  453. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
  454. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +11 -2
  455. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
  456. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
  457. package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
  458. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
  459. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
  460. package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
  461. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
  462. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  463. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
  464. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
  465. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +10 -0
  466. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
  467. package/src/resources/extensions/gsd/tests/plan-task.test.ts +44 -1
  468. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
  469. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  470. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
  471. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
  472. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +103 -0
  473. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
  474. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
  475. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +56 -0
  476. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +115 -0
  477. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +140 -0
  478. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +6 -3
  479. package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
  480. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +38 -0
  481. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
  482. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
  483. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
  484. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
  485. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +6 -5
  486. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
  487. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  488. package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -30
  489. package/src/resources/extensions/gsd/tools/complete-task.ts +7 -39
  490. package/src/resources/extensions/gsd/tools/plan-slice.ts +60 -47
  491. package/src/resources/extensions/gsd/tools/plan-task.ts +30 -5
  492. package/src/resources/extensions/gsd/undo.ts +47 -6
  493. package/src/resources/extensions/gsd/unit-registry.ts +11 -3
  494. package/src/resources/extensions/gsd/verification-gate.ts +8 -0
  495. package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
  496. package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
  497. package/src/resources/extensions/gsd/worktree-manager.ts +41 -1
  498. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  499. package/dist/web/standalone/.next/static/chunks/796.3976108148518f7d.js +0 -10
  500. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +0 -1
  501. package/dist/web/standalone/.next/static/chunks/app/page-6644fc6ee8ca1247.js +0 -1
  502. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +0 -1
  503. package/dist/web/standalone/.next/static/chunks/webpack-7c1d97e39be2da11.js +0 -1
  504. /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → zQLcXm0Za8lexoXtgDpMG}/_buildManifest.js +0 -0
  505. /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → zQLcXm0Za8lexoXtgDpMG}/_ssgManifest.js +0 -0
@@ -0,0 +1,464 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Auto-mode artifact verification and worktree path fallbacks.
3
+
4
+ import { parseUnitId } from "./unit-id.js";
5
+ import { MILESTONE_ID_RE } from "./milestone-ids.js";
6
+ import { clearParseCache } from "./files.js";
7
+ import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
8
+ import {
9
+ isDbAvailable,
10
+ getTask,
11
+ getSlice,
12
+ getSliceTasks,
13
+ getPendingGatesForTurn,
14
+ } from "./gsd-db.js";
15
+ import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
16
+ import { isValidationTerminal } from "./state.js";
17
+ import { getErrorMessage } from "./error-utils.js";
18
+ import { logWarning, logError } from "./workflow-logger.js";
19
+ import { isClosedStatus } from "./status-guards.js";
20
+ import {
21
+ resolveSlicePath,
22
+ resolveSliceFile,
23
+ resolveTasksDir,
24
+ resolveTaskFiles,
25
+ relSliceFile,
26
+ resolveMilestoneFile,
27
+ clearPathCache,
28
+ resolveGsdRootFile,
29
+ } from "./paths.js";
30
+ import { existsSync, readFileSync } from "node:fs";
31
+ import { execFileSync } from "node:child_process";
32
+ import { LAYOUT_SEGMENTS } from "./layout-policy.js";
33
+ import { dirname, join, resolve } from "node:path";
34
+ import {
35
+ resolveExpectedArtifactPath,
36
+ resolveExistingSliceResearchPath,
37
+ } from "./auto-artifact-paths.js";
38
+ import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
39
+ import { hasVerdict } from "./verdict-parser.js";
40
+ import { validateArtifact } from "./schemas/validate.js";
41
+ import { getProjectResearchStatus } from "./project-research-policy.js";
42
+ import { isGsdWorktreePath } from "./worktree-root.js";
43
+ import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
44
+ import { resolveWorktreeProjectRoot } from "./worktree-root.js";
45
+ import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
46
+ import { loadAllCaptures, loadPendingCaptures } from "./captures.js";
47
+ import { proveMilestoneCloseout } from "./milestone-closeout-proof.js";
48
+
49
+ /**
50
+ * Optional override for the legacy roadmap parser used by verifyExpectedArtifact.
51
+ * Production leaves this null so the real parseLegacyRoadmap runs; tests inject
52
+ * a throwing function to deterministically exercise the parse-failure catches.
53
+ * @internal
54
+ */
55
+ let _roadmapParserFn: ((content: string) => { slices: Array<{ id: string; done: boolean; depends?: string[] }> }) | null = null;
56
+
57
+ /**
58
+ * Inject an override for the legacy roadmap parser, returning a function that
59
+ * restores the default (real parser) behavior. No production caller.
60
+ * @internal
61
+ */
62
+ export function _setRoadmapParserFnForTests(
63
+ fn: ((content: string) => { slices: Array<{ id: string; done: boolean; depends?: string[] }> }) | null,
64
+ ): () => void {
65
+ const previous = _roadmapParserFn;
66
+ _roadmapParserFn = fn;
67
+ return () => { _roadmapParserFn = previous; };
68
+ }
69
+
70
+ function parseRoadmapForRecovery(content: string): ReturnType<NonNullable<typeof _roadmapParserFn>> {
71
+ if (_roadmapParserFn) return _roadmapParserFn(content);
72
+ return parseLegacyRoadmap(content) as unknown as ReturnType<NonNullable<typeof _roadmapParserFn>>;
73
+ }
74
+
75
+ export function diagnoseWorktreeIntegrityFailure(basePath: string): string | null {
76
+ if (!isGsdWorktreePath(basePath)) return null;
77
+ if (!existsSync(basePath)) {
78
+ return `Worktree integrity failure: ${basePath} does not exist. Repair or recreate the worktree before retrying.`;
79
+ }
80
+
81
+ const gitPath = join(basePath, ".git");
82
+ if (!existsSync(gitPath)) {
83
+ return `Worktree integrity failure: ${basePath} is not a valid git worktree (.git missing). Repair or recreate the worktree before retrying.`;
84
+ }
85
+
86
+ try {
87
+ execFileSync("git", ["rev-parse", "--git-dir"], {
88
+ cwd: basePath,
89
+ stdio: ["ignore", "pipe", "pipe"],
90
+ encoding: "utf-8",
91
+ });
92
+ return null;
93
+ } catch (err) {
94
+ return `Worktree integrity failure: ${basePath} is not a valid git worktree (git rev-parse failed: ${getErrorMessage(err).split("\n")[0]}). Repair or recreate the worktree before retrying.`;
95
+ }
96
+ }
97
+
98
+ export function resolveArtifactVerificationBase(unitId: string, base: string): string {
99
+ const { milestone } = parseUnitId(unitId);
100
+ if (!MILESTONE_ID_RE.test(milestone)) return base;
101
+ return resolveCanonicalMilestoneRoot(base, milestone);
102
+ }
103
+
104
+ function hasCapturedWorkflowPrefs(base: string): boolean {
105
+ const prefsPath = resolveExpectedArtifactPath("workflow-preferences", "WORKFLOW-PREFS", base);
106
+ if (!prefsPath || !existsSync(prefsPath)) return false;
107
+ const content = readFileSync(prefsPath, "utf-8");
108
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
109
+ return !!match && /^workflow_prefs_captured:\s*true\s*$/m.test(match[1]);
110
+ }
111
+
112
+ function hasValidResearchDecision(base: string): boolean {
113
+ const decisionPath = resolveExpectedArtifactPath("research-decision", "RESEARCH-DECISION", base);
114
+ if (!decisionPath || !existsSync(decisionPath)) return false;
115
+ try {
116
+ const cfg = JSON.parse(readFileSync(decisionPath, "utf-8")) as Record<string, unknown>;
117
+ return cfg.decision === "research" || cfg.decision === "skip";
118
+ } catch {
119
+ return false;
120
+ }
121
+ }
122
+
123
+ function hasCompleteProjectResearch(base: string): boolean {
124
+ return getProjectResearchStatus(base).complete;
125
+ }
126
+
127
+ function escapeRegExp(value: string): string {
128
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
129
+ }
130
+
131
+ function hasCheckedTaskCompletionOnDisk(base: string, mid: string, sid: string, tid: string): boolean {
132
+ const slicePath = resolveSlicePath(base, mid, sid);
133
+ if (!slicePath) return false;
134
+
135
+ const planAbs = resolveSliceFile(base, mid, sid, "PLAN");
136
+ if (!planAbs || !existsSync(planAbs)) return false;
137
+
138
+ const planContent = readFileSync(planAbs, "utf-8");
139
+ const cbRe = new RegExp(`^\\s*-\\s+\\[[xX]\\]\\s+\\*\\*${escapeRegExp(tid)}(?:\\*\\*)?:`, "m");
140
+ return cbRe.test(planContent);
141
+ }
142
+
143
+ /**
144
+ * Check whether the expected artifact(s) for a unit exist on disk.
145
+ * Returns true if all required artifacts exist, or if the unit type has no
146
+ * single verifiable artifact (e.g., replan-slice).
147
+ */
148
+ export function verifyExpectedArtifact(
149
+ unitType: string,
150
+ unitId: string,
151
+ base: string,
152
+ ): boolean {
153
+ if (unitType.startsWith("hook/")) return true;
154
+
155
+ clearPathCache();
156
+ clearParseCache();
157
+
158
+ if (unitType === "rewrite-docs") {
159
+ const overridesPath = resolveGsdRootFile(base, "OVERRIDES");
160
+ if (!existsSync(overridesPath)) return true;
161
+ const content = readFileSync(overridesPath, "utf-8");
162
+ return !content.includes("**Scope:** active");
163
+ }
164
+
165
+ if (unitType === "workflow-preferences") {
166
+ return hasCapturedWorkflowPrefs(base);
167
+ }
168
+
169
+ if (unitType === "triage-captures") {
170
+ const pending = loadPendingCaptures(base);
171
+ if (pending.length === 0) return true;
172
+ logWarning("recovery", `verify-fail triage-captures ${unitId}: ${pending.length} pending capture(s) remain in CAPTURES.md`);
173
+ return false;
174
+ }
175
+
176
+ if (unitType === "quick-task") {
177
+ const { slice: captureId } = parseUnitId(unitId);
178
+ const capture = captureId ? loadAllCaptures(base).find((entry) => entry.id === captureId) : undefined;
179
+ if (capture?.executed === true) return true;
180
+ logWarning("recovery", `verify-fail quick-task ${unitId}: capture ${captureId ?? "(missing capture id)"} not found or not marked executed`);
181
+ return false;
182
+ }
183
+
184
+ if (unitType === "discuss-project") {
185
+ const projectPath = resolveExpectedArtifactPath(unitType, unitId, base);
186
+ return !!projectPath && existsSync(projectPath) && validateArtifact(projectPath, "project").ok;
187
+ }
188
+
189
+ if (unitType === "discuss-requirements") {
190
+ const requirementsPath = resolveExpectedArtifactPath(unitType, unitId, base);
191
+ return !!requirementsPath && existsSync(requirementsPath) && validateArtifact(requirementsPath, "requirements").ok;
192
+ }
193
+
194
+ if (unitType === "research-decision") {
195
+ return hasValidResearchDecision(base);
196
+ }
197
+
198
+ if (unitType === "research-project") {
199
+ return hasCompleteProjectResearch(base);
200
+ }
201
+
202
+ if (unitType === "reactive-execute") {
203
+ const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
204
+ if (!mid || !sid || !batchPart) return false;
205
+ const blockerPath = resolveExpectedArtifactPath(unitType, unitId, base);
206
+ if (blockerPath && existsSync(blockerPath)) {
207
+ return true;
208
+ }
209
+ const slicePath = resolveSlicePath(base, mid, sid);
210
+ if (!slicePath) return false;
211
+
212
+ const plusIdx = batchPart.indexOf("+");
213
+ if (plusIdx === -1) {
214
+ const tDir = resolveTasksDir(base, mid, sid) ?? slicePath;
215
+ const summaryFiles = resolveTaskFiles(tDir, "SUMMARY");
216
+ return summaryFiles.length > 0;
217
+ }
218
+
219
+ const batchIds = batchPart.slice(plusIdx + 1).split(",").filter(Boolean);
220
+ if (batchIds.length === 0) return false;
221
+
222
+ const tDir = resolveTasksDir(base, mid, sid) ?? slicePath;
223
+ const existingSummaries = new Set(
224
+ resolveTaskFiles(tDir, "SUMMARY").map((f) =>
225
+ f.replace(/-SUMMARY\.md$/i, "").toUpperCase(),
226
+ ),
227
+ );
228
+
229
+ for (const tid of batchIds) {
230
+ if (!existingSummaries.has(tid.toUpperCase())) return false;
231
+ }
232
+ return true;
233
+ }
234
+
235
+ if (unitType === "gate-evaluate") {
236
+ const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
237
+ if (!mid || !sid || !batchPart) return false;
238
+
239
+ const plusIdx = batchPart.indexOf("+");
240
+ if (plusIdx === -1) return true;
241
+
242
+ const gateIds = batchPart.slice(plusIdx + 1).split(",").filter(Boolean);
243
+ if (gateIds.length === 0) return true;
244
+
245
+ try {
246
+ if (!isDbAvailable()) return false;
247
+ const pending = getPendingGatesForTurn(mid, sid, "gate-evaluate");
248
+ const pendingIds = new Set<string>(pending.map((g) => g.gate_id));
249
+ for (const gid of gateIds) {
250
+ if (pendingIds.has(gid)) return false;
251
+ }
252
+ } catch (err) {
253
+ logWarning("recovery", `gate-evaluate DB check failed: ${err instanceof Error ? err.message : String(err)}`);
254
+ }
255
+ return true;
256
+ }
257
+
258
+ if (unitType === "research-slice" && unitId.endsWith("/parallel-research")) {
259
+ const { milestone: mid } = parseUnitId(unitId);
260
+ if (!mid) return false;
261
+
262
+ const blockerPath = resolveExpectedArtifactPath(unitType, unitId, base);
263
+ if (blockerPath && existsSync(blockerPath)) {
264
+ return true;
265
+ }
266
+
267
+ const roadmapFile = resolveExpectedArtifactPath("plan-milestone", mid, base);
268
+ if (!roadmapFile || !existsSync(roadmapFile)) {
269
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap missing`);
270
+ return false;
271
+ }
272
+ try {
273
+ const roadmap = parseRoadmapForRecovery(readFileSync(roadmapFile, "utf-8"));
274
+ const milestoneResearchFile = resolveExpectedArtifactPath("research-milestone", mid, base);
275
+ const hasMilestoneResearch = !!milestoneResearchFile && existsSync(milestoneResearchFile);
276
+ for (const slice of roadmap.slices) {
277
+ if (slice.done) continue;
278
+ if (hasMilestoneResearch && slice.id === "S01") continue;
279
+ const depsComplete = (slice.depends ?? []).every((depId) => {
280
+ const summaryPath = resolveExpectedArtifactPath("complete-slice", `${mid}/${depId}`, base);
281
+ return !!summaryPath && existsSync(summaryPath);
282
+ });
283
+ if (!depsComplete) continue;
284
+ if (!resolveExistingSliceResearchPath(base, mid, slice.id)) {
285
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: slice ${slice.id} missing RESEARCH`);
286
+ return false;
287
+ }
288
+ }
289
+ return true;
290
+ } catch (err) {
291
+ logWarning("recovery", `parallel-research verification failed: ${err instanceof Error ? err.message : String(err)}`);
292
+ return false;
293
+ }
294
+ }
295
+
296
+ const artifactBase = resolveArtifactVerificationBase(unitId, base);
297
+ let absPath = resolveExpectedArtifactPath(unitType, unitId, artifactBase);
298
+ if (!absPath || !existsSync(absPath)) {
299
+ const projectRoot = resolve(resolveWorktreeProjectRoot(artifactBase));
300
+ if (projectRoot && projectRoot !== artifactBase) {
301
+ const projectPath = resolveExpectedArtifactPath(unitType, unitId, projectRoot);
302
+ if (projectPath && existsSync(projectPath)) {
303
+ absPath = projectPath;
304
+ }
305
+ }
306
+ }
307
+ if (!absPath) {
308
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: resolveExpectedArtifactPath returned null (no artifact contract registered for this unit type)`);
309
+ return false;
310
+ }
311
+ if (!existsSync(absPath)) {
312
+ const worktreeFailure = diagnoseWorktreeIntegrityFailure(artifactBase);
313
+ if (worktreeFailure) {
314
+ logError("recovery", `${worktreeFailure} Unit: ${unitType} ${unitId}.`);
315
+ return false;
316
+ }
317
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: existsSync false for ${absPath}`);
318
+ return false;
319
+ }
320
+
321
+ if (unitType === "validate-milestone") {
322
+ const validationContent = readFileSync(absPath, "utf-8");
323
+ if (!isValidationTerminal(validationContent)) {
324
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: validation not terminal (len=${validationContent.length}) at ${absPath}`);
325
+ return false;
326
+ }
327
+ }
328
+
329
+ if (unitType === "run-uat") {
330
+ const assessmentContent = readFileSync(absPath, "utf-8");
331
+ if (!hasVerdict(assessmentContent)) {
332
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: assessment missing verdict at ${absPath}`);
333
+ return false;
334
+ }
335
+ }
336
+
337
+ if (unitType === "plan-milestone") {
338
+ try {
339
+ const roadmap = parseRoadmapForRecovery(readFileSync(absPath, "utf-8"));
340
+ if (roadmap.slices.length === 0) {
341
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap has zero slices at ${absPath}`);
342
+ return false;
343
+ }
344
+ } catch (err) {
345
+ logWarning("recovery", `plan-milestone roadmap verification failed: ${err instanceof Error ? err.message : String(err)}`);
346
+ return false;
347
+ }
348
+ }
349
+
350
+ if (unitType === "plan-slice") {
351
+ const { milestone: mid, slice: sid } = parseUnitId(unitId);
352
+ if (mid && sid) {
353
+ try {
354
+ let taskIds: string[] | null = null;
355
+ let dbPrimary = false;
356
+ if (isDbAvailable()) {
357
+ const refreshed = refreshWorkflowDatabaseFromDisk();
358
+ if (refreshed) {
359
+ const tasks = getSliceTasks(mid, sid);
360
+ if (tasks.length > 0) {
361
+ taskIds = tasks.map(t => t.id);
362
+ dbPrimary = true;
363
+ }
364
+ }
365
+ }
366
+
367
+ if (!taskIds) {
368
+ const planContent = readFileSync(absPath, "utf-8");
369
+ const hasCheckboxTask = /^\s*- \[[xX ]\] \*\*T\d+/m.test(planContent);
370
+ const hasHeadingTask = /^\s*#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(planContent);
371
+ if (!hasCheckboxTask && !hasHeadingTask) {
372
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: plan has no task checkbox/heading (len=${planContent.length}) at ${absPath}`);
373
+ return false;
374
+ }
375
+ const plan = parseLegacyPlan(planContent);
376
+ if (plan.tasks.length > 0) taskIds = plan.tasks.map((t: { id: string }) => t.id);
377
+ }
378
+
379
+ if (taskIds && taskIds.length > 0) {
380
+ const tasksDir = join(dirname(absPath), "tasks");
381
+ if (existsSync(tasksDir)) {
382
+ for (const tid of taskIds) {
383
+ const taskPlanFile = join(tasksDir, `${tid}-PLAN.md`);
384
+ if (!existsSync(taskPlanFile)) {
385
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: task plan missing ${taskPlanFile}`);
386
+ return false;
387
+ }
388
+ }
389
+ } else if (!dbPrimary && !absPath.replace(/\\/g, "/").includes(`.gsd/${LAYOUT_SEGMENTS.level1}`)) {
390
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: tasks dir missing at ${tasksDir}`);
391
+ return false;
392
+ }
393
+ }
394
+ } catch (err) {
395
+ logWarning("recovery", `plan-slice task plan verification failed: ${err instanceof Error ? err.message : String(err)}`);
396
+ }
397
+ }
398
+ }
399
+
400
+ if (unitType === "execute-task") {
401
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
402
+ if (mid && sid && tid) {
403
+ const dbTask = getTask(mid, sid, tid);
404
+ if (dbTask) {
405
+ if (dbTask.status !== "complete" && dbTask.status !== "done" && !hasCheckedTaskCompletionOnDisk(base, mid, sid, tid)) {
406
+ return false;
407
+ }
408
+ } else if (!isDbAvailable()) {
409
+ if (!hasCheckedTaskCompletionOnDisk(base, mid, sid, tid)) return false;
410
+ } else {
411
+ return false;
412
+ }
413
+ }
414
+ }
415
+
416
+ if (unitType === "complete-slice") {
417
+ const { milestone: mid, slice: sid } = parseUnitId(unitId);
418
+ if (mid && sid) {
419
+ const uatPath = resolveSliceFile(base, mid, sid, "UAT")
420
+ ?? join(base, relSliceFile(base, mid, sid, "UAT"));
421
+ if (!existsSync(uatPath)) return false;
422
+
423
+ const dbSlice = getSlice(mid, sid);
424
+ if (dbSlice) {
425
+ if (dbSlice.status !== "complete") return false;
426
+ } else if (!isDbAvailable()) {
427
+ const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
428
+ if (roadmapFile && existsSync(roadmapFile)) {
429
+ try {
430
+ const roadmapContent = readFileSync(roadmapFile, "utf-8");
431
+ const roadmap = parseRoadmapForRecovery(roadmapContent);
432
+ const slice = roadmap.slices.find((s) => s.id === sid);
433
+ if (slice && !slice.done) return false;
434
+ } catch (e) {
435
+ logWarning("recovery", `roadmap parse failed: ${(e as Error).message}`);
436
+ return false;
437
+ }
438
+ }
439
+ }
440
+ }
441
+ }
442
+
443
+ if (unitType === "complete-milestone") {
444
+ const { milestone: mid } = parseUnitId(unitId);
445
+ if (!mid) return false;
446
+ const closeoutProof = proveMilestoneCloseout(mid, {
447
+ refreshFromDisk: true,
448
+ summaryArtifactBasePath: artifactBase,
449
+ implementationEvidence: {
450
+ basePath: base,
451
+ requirement: "not-absent",
452
+ },
453
+ });
454
+ if (!closeoutProof.ok) {
455
+ if (!isDbAvailable() && closeoutProof.reason === "db-unavailable") {
456
+ const summaryOutcome = classifyMilestoneSummaryContent(readFileSync(absPath, "utf-8"));
457
+ return summaryOutcome !== "failure" && hasImplementationArtifacts(base, mid) !== "absent";
458
+ }
459
+ return false;
460
+ }
461
+ }
462
+
463
+ return true;
464
+ }
@@ -52,6 +52,7 @@ export type PauseAutoUnitIdentity = {
52
52
 
53
53
  export interface PauseAutoOptions {
54
54
  expectedCurrentUnit?: PauseAutoUnitIdentity | null;
55
+ abortActiveTurn?: boolean;
55
56
  }
56
57
 
57
58
  type PauseAutoFn = (
@@ -30,6 +30,7 @@ import { normalizeRealPath } from "../paths.js";
30
30
  import type { MilestoneScope } from "../workspace.js";
31
31
  import type { RootDirtySnapshot } from "../root-write-leak-guard.js";
32
32
  import type { MilestoneSettlementOutcome } from "../milestone-settlement.js";
33
+ import type { ToolSurfaceSnapshot } from "../tool-surface-snapshot.js";
33
34
 
34
35
  // ─── Exported Types ──────────────────────────────────────────────────────────
35
36
 
@@ -55,6 +56,7 @@ export type ThinkingLevelSnapshot = ReturnType<ExtensionAPI["getThinkingLevel"]>
55
56
  export interface PendingVerificationRetry {
56
57
  unitId: string;
57
58
  failureContext: string;
59
+ signature?: string;
58
60
  attempt: number;
59
61
  }
60
62
 
@@ -160,6 +162,9 @@ export class AutoSession {
160
162
  currentMilestoneId: string | null = null;
161
163
  readonly sourceObservations = new SourceObservationStore();
162
164
 
165
+ /** Live tool-surface snapshot for dashboard / runtime telemetry while auto is active. */
166
+ toolSurfaceSnapshot: ToolSurfaceSnapshot | null = null;
167
+
163
168
  // ── Model state ──────────────────────────────────────────────────────────
164
169
  autoModeStartModel: StartModel | null = null;
165
170
  /** Explicit /gsd model pin captured at bootstrap (session-scoped policy override). */
@@ -207,6 +212,13 @@ export class AutoSession {
207
212
  * the issues after MAX_PRE_EXEC_RETRIES re-attempts.
208
213
  */
209
214
  readonly preExecRetryCount: Map<string, number> = new Map();
215
+ /**
216
+ * Tracks how many times each slice unit has been re-dispatched to plan-slice
217
+ * because task plan files were missing. Keyed by unitId (e.g. "M001/S01").
218
+ * Separate from preExecRetryCount so pre-exec gate failures do not block or
219
+ * conflate with missing-task-plan recovery.
220
+ */
221
+ readonly missingTaskPlanRetryCount: Map<string, number> = new Map();
210
222
 
211
223
  // ── Tool invocation errors (#2883) ──────────────────────────────────
212
224
  /** Set when a GSD tool execution ends with isError due to malformed/truncated
@@ -367,6 +379,7 @@ export class AutoSession {
367
379
 
368
380
  // Unit
369
381
  this.clearCurrentUnit();
382
+ this.toolSurfaceSnapshot = null;
370
383
  this.currentTraceId = null;
371
384
  this.currentTurnId = null;
372
385
  this.currentUnitRouting = null;
@@ -407,6 +420,7 @@ export class AutoSession {
407
420
  this.consecutiveCompleteBootstraps = 0;
408
421
  this.lastPreExecFailure = null;
409
422
  this.preExecRetryCount.clear();
423
+ this.missingTaskPlanRetryCount.clear();
410
424
  this.lastToolInvocationError = null;
411
425
  this.toolUnavailableRetries = 0;
412
426
  this.lastUnitAgentEndMessages = null;
@@ -63,7 +63,9 @@ export function decideVerificationRetry(input: {
63
63
  }
64
64
 
65
65
  const key = verificationRetryKey(unitType, retryInfo.unitId);
66
- const failureHash = hashVerificationFailureContext(retryInfo.failureContext);
66
+ const failureHash = hashVerificationFailureContext(
67
+ retryInfo.signature ?? retryInfo.failureContext,
68
+ );
67
69
  if (input.previousFailureHash === failureHash) {
68
70
  return {
69
71
  action: "pause",
@@ -22,7 +22,8 @@ import {
22
22
  } from "./paths.js";
23
23
  import { milestoneIdToPhaseNum } from "./layout-policy.js";
24
24
  import { parseUnitId } from "./unit-id.js";
25
- import { dirname, join } from "node:path";
25
+ import { dirname, join, relative } from "node:path";
26
+ import { existsSync } from "node:fs";
26
27
 
27
28
  function resolveMilestoneArtifactPath(
28
29
  base: string,
@@ -314,3 +315,48 @@ export function diagnoseExpectedArtifact(
314
315
  return null;
315
316
  }
316
317
  }
318
+
319
+ export interface SliceResearchLocation {
320
+ /** Absolute path when research exists; null when missing. */
321
+ absolutePath: string | null;
322
+ /** Prompt-friendly relative path when research exists. */
323
+ relativePath: string | null;
324
+ }
325
+
326
+ /**
327
+ * Resolve slice RESEARCH with worktree projection first, then canonical
328
+ * project-root path. Shared by dispatch rules, execute-task prompts, and
329
+ * artifact verification.
330
+ */
331
+ export function resolveSliceResearchLocation(
332
+ basePath: string,
333
+ mid: string,
334
+ sid: string,
335
+ ): SliceResearchLocation {
336
+ const projectedFile = resolveSliceFile(basePath, mid, sid, "RESEARCH");
337
+ if (projectedFile) {
338
+ return {
339
+ absolutePath: projectedFile,
340
+ relativePath: relSliceFile(basePath, mid, sid, "RESEARCH"),
341
+ };
342
+ }
343
+
344
+ const canonicalPath = resolveExpectedArtifactPath("research-slice", `${mid}/${sid}`, basePath);
345
+ if (canonicalPath && existsSync(canonicalPath)) {
346
+ return {
347
+ absolutePath: canonicalPath,
348
+ relativePath: relative(basePath, canonicalPath),
349
+ };
350
+ }
351
+
352
+ return { absolutePath: null, relativePath: null };
353
+ }
354
+
355
+ /** Returns the absolute RESEARCH path when it exists, otherwise null. */
356
+ export function resolveExistingSliceResearchPath(
357
+ basePath: string,
358
+ mid: string,
359
+ sid: string,
360
+ ): string | null {
361
+ return resolveSliceResearchLocation(basePath, mid, sid).absolutePath;
362
+ }
@@ -79,7 +79,9 @@ export function resolveCompactionThresholdPercent(raw: number | undefined): numb
79
79
  return value <= 1 ? value * 100 : value;
80
80
  }
81
81
 
82
- export function shouldRerootStepSessionForContext(
82
+ export const HARD_CONTEXT_REROOT_THRESHOLD_PERCENT = 90;
83
+
84
+ export function shouldWarnStepSessionForContext(
83
85
  contextPercent: number | null | undefined,
84
86
  compactionThresholdPercent?: number,
85
87
  ): boolean {
@@ -88,3 +90,12 @@ export function shouldRerootStepSessionForContext(
88
90
  resolveCompactionThresholdPercent(compactionThresholdPercent),
89
91
  ) === "pause";
90
92
  }
93
+
94
+ export function shouldRerootStepSessionForContext(
95
+ contextPercent: number | null | undefined,
96
+ ): boolean {
97
+ return getContextPauseAction(
98
+ contextPercent,
99
+ HARD_CONTEXT_REROOT_THRESHOLD_PERCENT,
100
+ ) === "pause";
101
+ }