@opengsd/gsd-pi 1.3.0-dev.65546769 → 1.3.0-dev.72e3af2a

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 (357) hide show
  1. package/dist/resources/.managed-resources-content-hash +1 -1
  2. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +11 -2
  3. package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
  4. package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
  5. package/dist/resources/extensions/gsd/auto/orchestrator.js +12 -3
  6. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  7. package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
  8. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
  9. package/dist/resources/extensions/gsd/auto-prompts.js +26 -11
  10. package/dist/resources/extensions/gsd/auto-recovery.js +6 -507
  11. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
  12. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
  13. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -13
  14. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +38 -0
  15. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +6 -1
  16. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
  17. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +10 -19
  18. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -19
  19. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +68 -10
  20. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  21. package/dist/resources/extensions/gsd/commands-context.js +19 -1
  22. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -10
  23. package/dist/resources/extensions/gsd/commands-worktree.js +12 -10
  24. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -3
  25. package/dist/resources/extensions/gsd/db/queries.js +60 -0
  26. package/dist/resources/extensions/gsd/db-workspace.js +55 -3
  27. package/dist/resources/extensions/gsd/doctor-providers.js +92 -8
  28. package/dist/resources/extensions/gsd/exec-sandbox.js +45 -9
  29. package/dist/resources/extensions/gsd/forensics.js +2 -32
  30. package/dist/resources/extensions/gsd/git-service.js +4 -4
  31. package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
  32. package/dist/resources/extensions/gsd/health-widget.js +55 -29
  33. package/dist/resources/extensions/gsd/layout-policy.js +3 -1
  34. package/dist/resources/extensions/gsd/markdown-renderer.js +8 -9
  35. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
  36. package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
  37. package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
  38. package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
  39. package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
  40. package/dist/resources/extensions/gsd/quick.js +45 -2
  41. package/dist/resources/extensions/gsd/session-forensics.js +11 -1
  42. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  43. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  44. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  45. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  46. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  47. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  48. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +45 -2
  49. package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
  50. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
  51. package/dist/resources/extensions/gsd/state.js +12 -611
  52. package/dist/resources/extensions/gsd/tools/complete-slice.js +2 -2
  53. package/dist/resources/extensions/gsd/tools/complete-task.js +43 -14
  54. package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
  55. package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
  56. package/dist/resources/extensions/gsd/unit-registry.js +32 -4
  57. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +33 -3
  58. package/dist/resources/extensions/gsd/validation-block-guard.js +9 -4
  59. package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
  60. package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
  61. package/dist/resources/extensions/gsd/worktree-manager.js +44 -2
  62. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  63. package/dist/web/standalone/.next/BUILD_ID +1 -1
  64. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  65. package/dist/web/standalone/.next/build-manifest.json +3 -3
  66. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  67. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  68. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  87. package/dist/web/standalone/.next/server/app/index.html +1 -1
  88. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  89. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  90. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  91. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  96. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  99. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  100. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  101. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  102. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  103. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  104. package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
  105. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  106. package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
  107. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  108. package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
  109. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  110. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  111. package/package.json +1 -1
  112. package/packages/cloud-mcp-gateway/package.json +2 -2
  113. package/packages/contracts/dist/workflow.d.ts +1 -0
  114. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  115. package/packages/contracts/dist/workflow.js +2 -0
  116. package/packages/contracts/dist/workflow.js.map +1 -1
  117. package/packages/contracts/package.json +1 -1
  118. package/packages/daemon/package.json +4 -4
  119. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  120. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  121. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  122. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  123. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  124. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  125. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  126. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  127. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  128. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  129. package/packages/gsd-agent-core/dist/index.js +2 -0
  130. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  131. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  132. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  133. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  134. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  135. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  136. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  137. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  138. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  139. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  140. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  141. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  142. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  143. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  144. package/packages/gsd-agent-core/package.json +5 -5
  145. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  146. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  147. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  148. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  149. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  150. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  151. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  152. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  153. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  154. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  155. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -829
  156. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  157. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  158. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  159. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  160. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  161. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  162. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  163. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  164. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  165. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  166. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  167. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +258 -0
  168. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  169. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  170. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  171. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  172. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  173. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
  174. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  175. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
  176. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  177. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  178. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  179. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  180. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  181. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  182. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  184. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  186. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  187. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  188. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  189. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  190. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  191. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  192. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  193. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  194. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  195. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  196. package/packages/gsd-agent-modes/package.json +7 -7
  197. package/packages/mcp-server/README.md +1 -1
  198. package/packages/mcp-server/dist/server.d.ts +1 -1
  199. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  200. package/packages/mcp-server/dist/server.js +3 -3
  201. package/packages/mcp-server/dist/server.js.map +1 -1
  202. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  203. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  204. package/packages/mcp-server/dist/workflow-tools.js +34 -20
  205. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  206. package/packages/mcp-server/package.json +4 -4
  207. package/packages/native/package.json +1 -1
  208. package/packages/pi-agent-core/package.json +1 -1
  209. package/packages/pi-ai/package.json +1 -1
  210. package/packages/pi-coding-agent/README.md +3 -2
  211. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  212. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  213. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  214. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  215. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  216. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  217. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  218. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  219. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  220. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  221. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  222. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  223. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
  224. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  225. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  226. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  227. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  228. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  229. package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
  230. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  232. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  233. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  234. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  236. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  237. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  238. package/packages/pi-coding-agent/package.json +7 -7
  239. package/packages/pi-tui/package.json +2 -2
  240. package/packages/rpc-client/package.json +2 -2
  241. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  242. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  243. package/pkg/dist/theme/theme-schema.js +1 -1
  244. package/pkg/dist/theme/theme-schema.js.map +1 -1
  245. package/pkg/dist/theme/theme.d.ts.map +1 -1
  246. package/pkg/dist/theme/theme.js +11 -7
  247. package/pkg/dist/theme/theme.js.map +1 -1
  248. package/pkg/package.json +1 -1
  249. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +20 -2
  250. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +80 -0
  251. package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
  252. package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
  253. package/src/resources/extensions/gsd/auto/orchestrator.ts +25 -11
  254. package/src/resources/extensions/gsd/auto/session.ts +5 -0
  255. package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
  256. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -23
  257. package/src/resources/extensions/gsd/auto-prompts.ts +38 -12
  258. package/src/resources/extensions/gsd/auto-recovery.ts +10 -508
  259. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
  260. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
  261. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +125 -12
  262. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +43 -0
  263. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +6 -1
  264. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
  265. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -19
  266. package/src/resources/extensions/gsd/bootstrap/system-context.ts +52 -18
  267. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +74 -10
  268. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  269. package/src/resources/extensions/gsd/commands-context.ts +18 -1
  270. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +14 -9
  271. package/src/resources/extensions/gsd/commands-worktree.ts +12 -10
  272. package/src/resources/extensions/gsd/dashboard-overlay.ts +32 -3
  273. package/src/resources/extensions/gsd/db/queries.ts +79 -0
  274. package/src/resources/extensions/gsd/db-workspace.ts +61 -3
  275. package/src/resources/extensions/gsd/doctor-providers.ts +103 -9
  276. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  277. package/src/resources/extensions/gsd/forensics.ts +2 -33
  278. package/src/resources/extensions/gsd/git-service.ts +5 -5
  279. package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
  280. package/src/resources/extensions/gsd/health-widget.ts +69 -32
  281. package/src/resources/extensions/gsd/layout-policy.ts +2 -1
  282. package/src/resources/extensions/gsd/markdown-renderer.ts +8 -11
  283. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
  284. package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
  285. package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
  286. package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
  287. package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
  288. package/src/resources/extensions/gsd/quick.ts +43 -2
  289. package/src/resources/extensions/gsd/session-forensics.ts +11 -1
  290. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  291. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  292. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  293. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  294. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  295. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  296. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +81 -7
  297. package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
  298. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
  299. package/src/resources/extensions/gsd/state.ts +32 -732
  300. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
  301. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +111 -1
  302. package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
  303. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
  304. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
  305. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +11 -0
  306. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
  307. package/src/resources/extensions/gsd/tests/complete-task.test.ts +75 -0
  308. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +55 -2
  309. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
  310. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
  311. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +107 -0
  312. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
  313. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
  314. package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
  315. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
  316. package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
  317. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +119 -1
  318. package/src/resources/extensions/gsd/tests/integration/queue-active-milestone-context-budget.test.ts +93 -0
  319. package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
  320. package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +14 -0
  321. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -0
  322. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  323. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +43 -1
  324. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +26 -0
  325. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +2 -1
  326. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  327. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +54 -1
  328. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  329. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +195 -1
  330. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -0
  331. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +87 -0
  332. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -0
  333. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +56 -0
  334. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  335. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +151 -0
  336. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +26 -0
  337. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +193 -14
  338. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +25 -0
  339. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +79 -0
  340. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +66 -0
  341. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
  342. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
  343. package/src/resources/extensions/gsd/tools/complete-slice.ts +2 -2
  344. package/src/resources/extensions/gsd/tools/complete-task.ts +53 -15
  345. package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
  346. package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
  347. package/src/resources/extensions/gsd/unit-registry.ts +32 -4
  348. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +41 -5
  349. package/src/resources/extensions/gsd/validation-block-guard.ts +13 -7
  350. package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
  351. package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
  352. package/src/resources/extensions/gsd/worktree-manager.ts +41 -1
  353. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  354. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
  355. package/dist/web/standalone/.next/static/chunks/webpack-f46ea08200a0227e.js +0 -1
  356. /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → O7xDYXO0r4zFhIzY1hrWV}/_buildManifest.js +0 -0
  357. /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → O7xDYXO0r4zFhIzY1hrWV}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- 0b507856bc29955a
1
+ f088e947f0ebb875
@@ -285,8 +285,10 @@ export function buildPromptFromContext(context, toolContext = {}) {
285
285
  ? "- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, gsd_save_gate_result, etc.) " +
286
286
  `are MCP tools — call them as mcp__${toolContext.workflowMcpServerName}__<tool_name> ` +
287
287
  `(e.g. mcp__${toolContext.workflowMcpServerName}__gsd_exec, mcp__${toolContext.workflowMcpServerName}__gsd_save_gate_result)\n` +
288
- `- Structured user input: call mcp__${toolContext.workflowMcpServerName}__ask_user_questions. ` +
289
- "Do not call bare ask_user_questions. Do not call native AskUserQuestion.\n"
288
+ (toolContext.questionToolAvailable !== false
289
+ ? `- Structured user input: call mcp__${toolContext.workflowMcpServerName}__ask_user_questions. ` +
290
+ "Do not call bare ask_user_questions. Do not call native AskUserQuestion.\n"
291
+ : "")
290
292
  : "- GSD workflow MCP tools are unavailable in this Claude Code run.\n";
291
293
  const toolSearchLine = toolContext.workflowMcpServerName
292
294
  ? "- ToolSearch is available only for Claude Code deferred workflow MCP hydration. " +
@@ -1413,6 +1415,12 @@ function workflowMcpServerNameFromAllowedTools(allowedTools) {
1413
1415
  }
1414
1416
  return undefined;
1415
1417
  }
1418
+ function workflowQuestionToolAvailableFromAllowedTools(allowedTools, workflowMcpServerName, gsdPhase) {
1419
+ if (!workflowMcpServerName || !gsdPhase)
1420
+ return undefined;
1421
+ return Array.isArray(allowedTools)
1422
+ && allowedTools.includes(`mcp__${workflowMcpServerName}__ask_user_questions`);
1423
+ }
1416
1424
  function isRecord(value) {
1417
1425
  return !!value && typeof value === "object" && !Array.isArray(value);
1418
1426
  }
@@ -1821,6 +1829,7 @@ async function pumpSdkMessages(model, context, options, stream) {
1821
1829
  const prompt = buildPromptFromContext(context, {
1822
1830
  workflowMcpServerName,
1823
1831
  browserMcpServerName: browserMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
1832
+ questionToolAvailable: workflowQuestionToolAvailableFromAllowedTools(sdkOpts.allowedTools, workflowMcpServerName, gsdPhase),
1824
1833
  });
1825
1834
  const queryPrompt = buildSdkQueryPrompt(context, prompt);
1826
1835
  // Emit start with an empty partial
@@ -8,6 +8,64 @@ const ZERO_USAGE = {
8
8
  totalTokens: 0,
9
9
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
10
10
  };
11
+ const WINDOWS_CHILD_ENV_KEYS = new Set([
12
+ "ALLUSERSPROFILE",
13
+ "APPDATA",
14
+ "COMSPEC",
15
+ "COMMONPROGRAMFILES",
16
+ "COMMONPROGRAMFILES(X86)",
17
+ "FORCE_COLOR",
18
+ "HOME",
19
+ "HOMEDRIVE",
20
+ "HOMEPATH",
21
+ "LANG",
22
+ "LC_ALL",
23
+ "LOCALAPPDATA",
24
+ "NODE_EXTRA_CA_CERTS",
25
+ "NO_COLOR",
26
+ "NO_PROXY",
27
+ "PATHEXT",
28
+ "PATH",
29
+ "PROGRAMDATA",
30
+ "PROGRAMFILES",
31
+ "PROGRAMFILES(X86)",
32
+ "SSL_CERT_FILE",
33
+ "SYSTEMROOT",
34
+ "TEMP",
35
+ "TERM",
36
+ "TMP",
37
+ "TMPDIR",
38
+ "USER",
39
+ "USERNAME",
40
+ "USERPROFILE",
41
+ "WINDIR",
42
+ "XDG_CACHE_HOME",
43
+ "XDG_CONFIG_HOME",
44
+ "HTTP_PROXY",
45
+ "HTTPS_PROXY",
46
+ ]);
47
+ const WINDOWS_CHILD_ENV_PREFIXES = [
48
+ "AGY_",
49
+ "ANTIGRAVITY_",
50
+ "CLOUDSDK_",
51
+ "GEMINI_",
52
+ "GOOGLE_",
53
+ ];
54
+ export function buildGoogleCliChildEnv(env = process.env, platform = process.platform) {
55
+ if (platform !== "win32")
56
+ return env;
57
+ const childEnv = {};
58
+ for (const [key, value] of Object.entries(env)) {
59
+ if (typeof value !== "string")
60
+ continue;
61
+ const upperKey = key.toUpperCase();
62
+ if (WINDOWS_CHILD_ENV_KEYS.has(upperKey) ||
63
+ WINDOWS_CHILD_ENV_PREFIXES.some((prefix) => upperKey.startsWith(prefix))) {
64
+ childEnv[key] = value;
65
+ }
66
+ }
67
+ return childEnv;
68
+ }
11
69
  function textBlocks(content) {
12
70
  return content
13
71
  .map((block) => block.type === "text" ? block.text : `[${block.type} omitted]`)
@@ -87,16 +145,16 @@ function extractGeminiJsonResponse(raw) {
87
145
  function commandForProvider(provider) {
88
146
  return provider === "google-gemini-cli" ? "gemini" : "agy";
89
147
  }
90
- function argsForProvider(provider, model, prompt) {
148
+ function argsForProvider(provider, modelId, prompt) {
91
149
  if (provider === "google-gemini-cli") {
92
- const args = ["-p", prompt, "--output-format", "json"];
93
- if (model.id !== "default")
94
- args.unshift("-m", model.id);
150
+ const args = prompt === undefined ? ["--output-format", "json"] : ["-p", prompt, "--output-format", "json"];
151
+ if (modelId !== "default")
152
+ args.unshift("-m", modelId);
95
153
  return args;
96
154
  }
97
- const args = ["-p", prompt];
98
- if (model.id !== "default")
99
- args.unshift("-m", model.id);
155
+ const args = prompt === undefined ? [] : ["-p", prompt];
156
+ if (modelId !== "default")
157
+ args.unshift("-m", modelId);
100
158
  return args;
101
159
  }
102
160
  export function buildGoogleCliSpawnInvocation(command, args, platform = process.platform) {
@@ -105,13 +163,20 @@ export function buildGoogleCliSpawnInvocation(command, args, platform = process.
105
163
  }
106
164
  return { command, args };
107
165
  }
108
- function runCli(command, args, options) {
166
+ export function buildGoogleCliRunPlan(provider, modelId, prompt, platform = process.platform) {
167
+ const pipePrompt = platform === "win32";
168
+ const args = argsForProvider(provider, modelId, pipePrompt ? undefined : prompt);
169
+ return {
170
+ ...buildGoogleCliSpawnInvocation(commandForProvider(provider), args, platform),
171
+ ...(pipePrompt ? { stdin: prompt } : {}),
172
+ };
173
+ }
174
+ function runCli(plan, options) {
109
175
  return new Promise((resolve, reject) => {
110
- const invocation = buildGoogleCliSpawnInvocation(command, args);
111
- const child = spawn(invocation.command, invocation.args, {
176
+ const child = spawn(plan.command, plan.args, {
112
177
  cwd: options?.cwd || process.cwd(),
113
- env: process.env,
114
- stdio: ["ignore", "pipe", "pipe"],
178
+ env: buildGoogleCliChildEnv(),
179
+ stdio: [plan.stdin === undefined ? "ignore" : "pipe", "pipe", "pipe"],
115
180
  });
116
181
  let stdout = "";
117
182
  let stderr = "";
@@ -132,6 +197,10 @@ function runCli(command, args, options) {
132
197
  return;
133
198
  }
134
199
  options?.signal?.addEventListener("abort", onAbort);
200
+ if (plan.stdin !== undefined) {
201
+ child.stdin?.on("error", () => { });
202
+ child.stdin?.end(plan.stdin);
203
+ }
135
204
  child.stdout.setEncoding("utf8");
136
205
  child.stderr.setEncoding("utf8");
137
206
  child.stdout.on("data", (chunk) => {
@@ -185,9 +254,7 @@ export function streamViaGoogleCli(model, context, options) {
185
254
  queueMicrotask(async () => {
186
255
  try {
187
256
  const prompt = buildGoogleCliPrompt(context);
188
- const command = commandForProvider(provider);
189
- const args = argsForProvider(provider, model, prompt);
190
- const result = await runCli(command, args, options);
257
+ const result = await runCli(buildGoogleCliRunPlan(provider, model.id, prompt), options);
191
258
  if (result.code !== 0) {
192
259
  const detail = (result.stderr || result.stdout || `CLI exited with code ${result.code}`).trim();
193
260
  throw new Error(formatGoogleCliError(detail, provider));
@@ -0,0 +1,427 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Auto-mode artifact verification and worktree path fallbacks.
3
+ import { parseUnitId } from "./unit-id.js";
4
+ import { MILESTONE_ID_RE } from "./milestone-ids.js";
5
+ import { clearParseCache } from "./files.js";
6
+ import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
7
+ import { isDbAvailable, getTask, getSlice, getSliceTasks, getPendingGatesForTurn, } from "./gsd-db.js";
8
+ import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
9
+ import { isValidationTerminal } from "./state.js";
10
+ import { getErrorMessage } from "./error-utils.js";
11
+ import { logWarning, logError } from "./workflow-logger.js";
12
+ import { resolveSlicePath, resolveSliceFile, resolveTasksDir, resolveTaskFiles, relSliceFile, resolveMilestoneFile, clearPathCache, resolveGsdRootFile, } from "./paths.js";
13
+ import { existsSync, readFileSync } from "node:fs";
14
+ import { execFileSync } from "node:child_process";
15
+ import { LAYOUT_SEGMENTS } from "./layout-policy.js";
16
+ import { dirname, join, resolve } from "node:path";
17
+ import { resolveExpectedArtifactPath, resolveExistingSliceResearchPath, } from "./auto-artifact-paths.js";
18
+ import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
19
+ import { hasVerdict } from "./verdict-parser.js";
20
+ import { validateArtifact } from "./schemas/validate.js";
21
+ import { getProjectResearchStatus } from "./project-research-policy.js";
22
+ import { isGsdWorktreePath } from "./worktree-root.js";
23
+ import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
24
+ import { resolveWorktreeProjectRoot } from "./worktree-root.js";
25
+ import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
26
+ import { loadAllCaptures, loadPendingCaptures } from "./captures.js";
27
+ import { proveMilestoneCloseout } from "./milestone-closeout-proof.js";
28
+ /**
29
+ * Optional override for the legacy roadmap parser used by verifyExpectedArtifact.
30
+ * Production leaves this null so the real parseLegacyRoadmap runs; tests inject
31
+ * a throwing function to deterministically exercise the parse-failure catches.
32
+ * @internal
33
+ */
34
+ let _roadmapParserFn = null;
35
+ /**
36
+ * Inject an override for the legacy roadmap parser, returning a function that
37
+ * restores the default (real parser) behavior. No production caller.
38
+ * @internal
39
+ */
40
+ export function _setRoadmapParserFnForTests(fn) {
41
+ const previous = _roadmapParserFn;
42
+ _roadmapParserFn = fn;
43
+ return () => { _roadmapParserFn = previous; };
44
+ }
45
+ function parseRoadmapForRecovery(content) {
46
+ if (_roadmapParserFn)
47
+ return _roadmapParserFn(content);
48
+ return parseLegacyRoadmap(content);
49
+ }
50
+ export function diagnoseWorktreeIntegrityFailure(basePath) {
51
+ if (!isGsdWorktreePath(basePath))
52
+ return null;
53
+ if (!existsSync(basePath)) {
54
+ return `Worktree integrity failure: ${basePath} does not exist. Repair or recreate the worktree before retrying.`;
55
+ }
56
+ const gitPath = join(basePath, ".git");
57
+ if (!existsSync(gitPath)) {
58
+ return `Worktree integrity failure: ${basePath} is not a valid git worktree (.git missing). Repair or recreate the worktree before retrying.`;
59
+ }
60
+ try {
61
+ execFileSync("git", ["rev-parse", "--git-dir"], {
62
+ cwd: basePath,
63
+ stdio: ["ignore", "pipe", "pipe"],
64
+ encoding: "utf-8",
65
+ });
66
+ return null;
67
+ }
68
+ catch (err) {
69
+ 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.`;
70
+ }
71
+ }
72
+ export function resolveArtifactVerificationBase(unitId, base) {
73
+ const { milestone } = parseUnitId(unitId);
74
+ if (!MILESTONE_ID_RE.test(milestone))
75
+ return base;
76
+ return resolveCanonicalMilestoneRoot(base, milestone);
77
+ }
78
+ function hasCapturedWorkflowPrefs(base) {
79
+ const prefsPath = resolveExpectedArtifactPath("workflow-preferences", "WORKFLOW-PREFS", base);
80
+ if (!prefsPath || !existsSync(prefsPath))
81
+ return false;
82
+ const content = readFileSync(prefsPath, "utf-8");
83
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
84
+ return !!match && /^workflow_prefs_captured:\s*true\s*$/m.test(match[1]);
85
+ }
86
+ function hasValidResearchDecision(base) {
87
+ const decisionPath = resolveExpectedArtifactPath("research-decision", "RESEARCH-DECISION", base);
88
+ if (!decisionPath || !existsSync(decisionPath))
89
+ return false;
90
+ try {
91
+ const cfg = JSON.parse(readFileSync(decisionPath, "utf-8"));
92
+ return cfg.decision === "research" || cfg.decision === "skip";
93
+ }
94
+ catch {
95
+ return false;
96
+ }
97
+ }
98
+ function hasCompleteProjectResearch(base) {
99
+ return getProjectResearchStatus(base).complete;
100
+ }
101
+ function escapeRegExp(value) {
102
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
103
+ }
104
+ function hasCheckedTaskCompletionOnDisk(base, mid, sid, tid) {
105
+ const slicePath = resolveSlicePath(base, mid, sid);
106
+ if (!slicePath)
107
+ return false;
108
+ const planAbs = resolveSliceFile(base, mid, sid, "PLAN");
109
+ if (!planAbs || !existsSync(planAbs))
110
+ return false;
111
+ const planContent = readFileSync(planAbs, "utf-8");
112
+ const cbRe = new RegExp(`^\\s*-\\s+\\[[xX]\\]\\s+\\*\\*${escapeRegExp(tid)}(?:\\*\\*)?:`, "m");
113
+ return cbRe.test(planContent);
114
+ }
115
+ /**
116
+ * Check whether the expected artifact(s) for a unit exist on disk.
117
+ * Returns true if all required artifacts exist, or if the unit type has no
118
+ * single verifiable artifact (e.g., replan-slice).
119
+ */
120
+ export function verifyExpectedArtifact(unitType, unitId, base) {
121
+ if (unitType.startsWith("hook/"))
122
+ return true;
123
+ clearPathCache();
124
+ clearParseCache();
125
+ if (unitType === "rewrite-docs") {
126
+ const overridesPath = resolveGsdRootFile(base, "OVERRIDES");
127
+ if (!existsSync(overridesPath))
128
+ return true;
129
+ const content = readFileSync(overridesPath, "utf-8");
130
+ return !content.includes("**Scope:** active");
131
+ }
132
+ if (unitType === "workflow-preferences") {
133
+ return hasCapturedWorkflowPrefs(base);
134
+ }
135
+ if (unitType === "triage-captures") {
136
+ const pending = loadPendingCaptures(base);
137
+ if (pending.length === 0)
138
+ return true;
139
+ logWarning("recovery", `verify-fail triage-captures ${unitId}: ${pending.length} pending capture(s) remain in CAPTURES.md`);
140
+ return false;
141
+ }
142
+ if (unitType === "quick-task") {
143
+ const { slice: captureId } = parseUnitId(unitId);
144
+ const capture = captureId ? loadAllCaptures(base).find((entry) => entry.id === captureId) : undefined;
145
+ if (capture?.executed === true)
146
+ return true;
147
+ logWarning("recovery", `verify-fail quick-task ${unitId}: capture ${captureId ?? "(missing capture id)"} not found or not marked executed`);
148
+ return false;
149
+ }
150
+ if (unitType === "discuss-project") {
151
+ const projectPath = resolveExpectedArtifactPath(unitType, unitId, base);
152
+ return !!projectPath && existsSync(projectPath) && validateArtifact(projectPath, "project").ok;
153
+ }
154
+ if (unitType === "discuss-requirements") {
155
+ const requirementsPath = resolveExpectedArtifactPath(unitType, unitId, base);
156
+ return !!requirementsPath && existsSync(requirementsPath) && validateArtifact(requirementsPath, "requirements").ok;
157
+ }
158
+ if (unitType === "research-decision") {
159
+ return hasValidResearchDecision(base);
160
+ }
161
+ if (unitType === "research-project") {
162
+ return hasCompleteProjectResearch(base);
163
+ }
164
+ if (unitType === "reactive-execute") {
165
+ const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
166
+ if (!mid || !sid || !batchPart)
167
+ return false;
168
+ const blockerPath = resolveExpectedArtifactPath(unitType, unitId, base);
169
+ if (blockerPath && existsSync(blockerPath)) {
170
+ return true;
171
+ }
172
+ const slicePath = resolveSlicePath(base, mid, sid);
173
+ if (!slicePath)
174
+ return false;
175
+ const plusIdx = batchPart.indexOf("+");
176
+ if (plusIdx === -1) {
177
+ const tDir = resolveTasksDir(base, mid, sid) ?? slicePath;
178
+ const summaryFiles = resolveTaskFiles(tDir, "SUMMARY");
179
+ return summaryFiles.length > 0;
180
+ }
181
+ const batchIds = batchPart.slice(plusIdx + 1).split(",").filter(Boolean);
182
+ if (batchIds.length === 0)
183
+ return false;
184
+ const tDir = resolveTasksDir(base, mid, sid) ?? slicePath;
185
+ const existingSummaries = new Set(resolveTaskFiles(tDir, "SUMMARY").map((f) => f.replace(/-SUMMARY\.md$/i, "").toUpperCase()));
186
+ for (const tid of batchIds) {
187
+ if (!existingSummaries.has(tid.toUpperCase()))
188
+ return false;
189
+ }
190
+ return true;
191
+ }
192
+ if (unitType === "gate-evaluate") {
193
+ const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
194
+ if (!mid || !sid || !batchPart)
195
+ return false;
196
+ const plusIdx = batchPart.indexOf("+");
197
+ if (plusIdx === -1)
198
+ return true;
199
+ const gateIds = batchPart.slice(plusIdx + 1).split(",").filter(Boolean);
200
+ if (gateIds.length === 0)
201
+ return true;
202
+ try {
203
+ if (!isDbAvailable())
204
+ return false;
205
+ const pending = getPendingGatesForTurn(mid, sid, "gate-evaluate");
206
+ const pendingIds = new Set(pending.map((g) => g.gate_id));
207
+ for (const gid of gateIds) {
208
+ if (pendingIds.has(gid))
209
+ return false;
210
+ }
211
+ }
212
+ catch (err) {
213
+ logWarning("recovery", `gate-evaluate DB check failed: ${err instanceof Error ? err.message : String(err)}`);
214
+ }
215
+ return true;
216
+ }
217
+ if (unitType === "research-slice" && unitId.endsWith("/parallel-research")) {
218
+ const { milestone: mid } = parseUnitId(unitId);
219
+ if (!mid)
220
+ return false;
221
+ const blockerPath = resolveExpectedArtifactPath(unitType, unitId, base);
222
+ if (blockerPath && existsSync(blockerPath)) {
223
+ return true;
224
+ }
225
+ const roadmapFile = resolveExpectedArtifactPath("plan-milestone", mid, base);
226
+ if (!roadmapFile || !existsSync(roadmapFile)) {
227
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap missing`);
228
+ return false;
229
+ }
230
+ try {
231
+ const roadmap = parseRoadmapForRecovery(readFileSync(roadmapFile, "utf-8"));
232
+ const milestoneResearchFile = resolveExpectedArtifactPath("research-milestone", mid, base);
233
+ const hasMilestoneResearch = !!milestoneResearchFile && existsSync(milestoneResearchFile);
234
+ for (const slice of roadmap.slices) {
235
+ if (slice.done)
236
+ continue;
237
+ if (hasMilestoneResearch && slice.id === "S01")
238
+ continue;
239
+ const depsComplete = (slice.depends ?? []).every((depId) => {
240
+ const summaryPath = resolveExpectedArtifactPath("complete-slice", `${mid}/${depId}`, base);
241
+ return !!summaryPath && existsSync(summaryPath);
242
+ });
243
+ if (!depsComplete)
244
+ continue;
245
+ if (!resolveExistingSliceResearchPath(base, mid, slice.id)) {
246
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: slice ${slice.id} missing RESEARCH`);
247
+ return false;
248
+ }
249
+ }
250
+ return true;
251
+ }
252
+ catch (err) {
253
+ logWarning("recovery", `parallel-research verification failed: ${err instanceof Error ? err.message : String(err)}`);
254
+ return false;
255
+ }
256
+ }
257
+ const artifactBase = resolveArtifactVerificationBase(unitId, base);
258
+ let absPath = resolveExpectedArtifactPath(unitType, unitId, artifactBase);
259
+ if (!absPath || !existsSync(absPath)) {
260
+ const projectRoot = resolve(resolveWorktreeProjectRoot(artifactBase));
261
+ if (projectRoot && projectRoot !== artifactBase) {
262
+ const projectPath = resolveExpectedArtifactPath(unitType, unitId, projectRoot);
263
+ if (projectPath && existsSync(projectPath)) {
264
+ absPath = projectPath;
265
+ }
266
+ }
267
+ }
268
+ if (!absPath) {
269
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: resolveExpectedArtifactPath returned null (no artifact contract registered for this unit type)`);
270
+ return false;
271
+ }
272
+ if (!existsSync(absPath)) {
273
+ const worktreeFailure = diagnoseWorktreeIntegrityFailure(artifactBase);
274
+ if (worktreeFailure) {
275
+ logError("recovery", `${worktreeFailure} Unit: ${unitType} ${unitId}.`);
276
+ return false;
277
+ }
278
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: existsSync false for ${absPath}`);
279
+ return false;
280
+ }
281
+ if (unitType === "validate-milestone") {
282
+ const validationContent = readFileSync(absPath, "utf-8");
283
+ if (!isValidationTerminal(validationContent)) {
284
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: validation not terminal (len=${validationContent.length}) at ${absPath}`);
285
+ return false;
286
+ }
287
+ }
288
+ if (unitType === "run-uat") {
289
+ const assessmentContent = readFileSync(absPath, "utf-8");
290
+ if (!hasVerdict(assessmentContent)) {
291
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: assessment missing verdict at ${absPath}`);
292
+ return false;
293
+ }
294
+ }
295
+ if (unitType === "plan-milestone") {
296
+ try {
297
+ const roadmap = parseRoadmapForRecovery(readFileSync(absPath, "utf-8"));
298
+ if (roadmap.slices.length === 0) {
299
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap has zero slices at ${absPath}`);
300
+ return false;
301
+ }
302
+ }
303
+ catch (err) {
304
+ logWarning("recovery", `plan-milestone roadmap verification failed: ${err instanceof Error ? err.message : String(err)}`);
305
+ return false;
306
+ }
307
+ }
308
+ if (unitType === "plan-slice") {
309
+ const { milestone: mid, slice: sid } = parseUnitId(unitId);
310
+ if (mid && sid) {
311
+ try {
312
+ let taskIds = null;
313
+ let dbPrimary = false;
314
+ if (isDbAvailable()) {
315
+ const refreshed = refreshWorkflowDatabaseFromDisk();
316
+ if (refreshed) {
317
+ const tasks = getSliceTasks(mid, sid);
318
+ if (tasks.length > 0) {
319
+ taskIds = tasks.map(t => t.id);
320
+ dbPrimary = true;
321
+ }
322
+ }
323
+ }
324
+ if (!taskIds) {
325
+ const planContent = readFileSync(absPath, "utf-8");
326
+ const hasCheckboxTask = /^\s*- \[[xX ]\] \*\*T\d+/m.test(planContent);
327
+ const hasHeadingTask = /^\s*#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(planContent);
328
+ if (!hasCheckboxTask && !hasHeadingTask) {
329
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: plan has no task checkbox/heading (len=${planContent.length}) at ${absPath}`);
330
+ return false;
331
+ }
332
+ const plan = parseLegacyPlan(planContent);
333
+ if (plan.tasks.length > 0)
334
+ taskIds = plan.tasks.map((t) => t.id);
335
+ }
336
+ if (taskIds && taskIds.length > 0) {
337
+ const tasksDir = join(dirname(absPath), "tasks");
338
+ if (existsSync(tasksDir)) {
339
+ for (const tid of taskIds) {
340
+ const taskPlanFile = join(tasksDir, `${tid}-PLAN.md`);
341
+ if (!existsSync(taskPlanFile)) {
342
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: task plan missing ${taskPlanFile}`);
343
+ return false;
344
+ }
345
+ }
346
+ }
347
+ else if (!dbPrimary && !absPath.replace(/\\/g, "/").includes(`.gsd/${LAYOUT_SEGMENTS.level1}`)) {
348
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: tasks dir missing at ${tasksDir}`);
349
+ return false;
350
+ }
351
+ }
352
+ }
353
+ catch (err) {
354
+ logWarning("recovery", `plan-slice task plan verification failed: ${err instanceof Error ? err.message : String(err)}`);
355
+ }
356
+ }
357
+ }
358
+ if (unitType === "execute-task") {
359
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
360
+ if (mid && sid && tid) {
361
+ const dbTask = getTask(mid, sid, tid);
362
+ if (dbTask) {
363
+ if (dbTask.status !== "complete" && dbTask.status !== "done" && !hasCheckedTaskCompletionOnDisk(base, mid, sid, tid)) {
364
+ return false;
365
+ }
366
+ }
367
+ else if (!isDbAvailable()) {
368
+ if (!hasCheckedTaskCompletionOnDisk(base, mid, sid, tid))
369
+ return false;
370
+ }
371
+ else {
372
+ return false;
373
+ }
374
+ }
375
+ }
376
+ if (unitType === "complete-slice") {
377
+ const { milestone: mid, slice: sid } = parseUnitId(unitId);
378
+ if (mid && sid) {
379
+ const uatPath = resolveSliceFile(base, mid, sid, "UAT")
380
+ ?? join(base, relSliceFile(base, mid, sid, "UAT"));
381
+ if (!existsSync(uatPath))
382
+ return false;
383
+ const dbSlice = getSlice(mid, sid);
384
+ if (dbSlice) {
385
+ if (dbSlice.status !== "complete")
386
+ return false;
387
+ }
388
+ else if (!isDbAvailable()) {
389
+ const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
390
+ if (roadmapFile && existsSync(roadmapFile)) {
391
+ try {
392
+ const roadmapContent = readFileSync(roadmapFile, "utf-8");
393
+ const roadmap = parseRoadmapForRecovery(roadmapContent);
394
+ const slice = roadmap.slices.find((s) => s.id === sid);
395
+ if (slice && !slice.done)
396
+ return false;
397
+ }
398
+ catch (e) {
399
+ logWarning("recovery", `roadmap parse failed: ${e.message}`);
400
+ return false;
401
+ }
402
+ }
403
+ }
404
+ }
405
+ }
406
+ if (unitType === "complete-milestone") {
407
+ const { milestone: mid } = parseUnitId(unitId);
408
+ if (!mid)
409
+ return false;
410
+ const closeoutProof = proveMilestoneCloseout(mid, {
411
+ refreshFromDisk: true,
412
+ summaryArtifactBasePath: artifactBase,
413
+ implementationEvidence: {
414
+ basePath: base,
415
+ requirement: "not-absent",
416
+ },
417
+ });
418
+ if (!closeoutProof.ok) {
419
+ if (!isDbAvailable() && closeoutProof.reason === "db-unavailable") {
420
+ const summaryOutcome = classifyMilestoneSummaryContent(readFileSync(absPath, "utf-8"));
421
+ return summaryOutcome !== "failure" && hasImplementationArtifacts(base, mid) !== "absent";
422
+ }
423
+ return false;
424
+ }
425
+ }
426
+ return true;
427
+ }
@@ -396,14 +396,17 @@ export class AutoOrchestrator {
396
396
  }
397
397
  }
398
398
  // ── UokGateAdapter (folded) ──────────────────────────────────────────────
399
- async emitUokGate(input) {
399
+ resolveUokGateContext() {
400
400
  const activeBasePath = this.getLiveDispatchBasePath();
401
401
  const prefs = loadEffectiveGSDPreferencesWithRegistry(this.ctx.modelRegistry, activeBasePath, resolveProfileAnchorProvider(this.ctx.model?.provider, this.s.autoModeStartModel?.provider), this.s.autoModeStartModel
402
402
  ? `${this.s.autoModeStartModel.provider}/${this.s.autoModeStartModel.id}`
403
403
  : undefined)?.preferences;
404
- const uokFlags = resolveUokFlags(prefs);
405
- if (!uokFlags.gates)
404
+ return { activeBasePath, uokFlags: resolveUokFlags(prefs) };
405
+ }
406
+ async emitUokGate(input) {
407
+ if (!input.uokFlags.gates)
406
408
  return;
409
+ const activeBasePath = input.activeBasePath;
407
410
  const milestoneId = input.milestoneId ?? this.s.currentMilestoneId ?? undefined;
408
411
  try {
409
412
  const { UokGateRunner } = await import("../uok/gate-runner.js");
@@ -760,9 +763,11 @@ export class AutoOrchestrator {
760
763
  const stopAdvanceTimer = debugTime("orchestrator-advance");
761
764
  try {
762
765
  this.ensureLockOwnership();
766
+ const uokGateContext = this.resolveUokGateContext();
763
767
  const staleMsg = this.checkResourcesStale();
764
768
  if (staleMsg) {
765
769
  await this.emitUokGate({
770
+ ...uokGateContext,
766
771
  gateId: "resource-version-guard",
767
772
  gateType: "policy",
768
773
  outcome: "fail",
@@ -776,6 +781,7 @@ export class AutoOrchestrator {
776
781
  return blocked;
777
782
  }
778
783
  await this.emitUokGate({
784
+ ...uokGateContext,
779
785
  gateId: "resource-version-guard",
780
786
  gateType: "policy",
781
787
  outcome: "pass",
@@ -785,6 +791,7 @@ export class AutoOrchestrator {
785
791
  const gate = await this.preAdvanceGate();
786
792
  if (gate.kind === "fail") {
787
793
  await this.emitUokGate({
794
+ ...uokGateContext,
788
795
  gateId: "pre-dispatch-health-gate",
789
796
  gateType: "execution",
790
797
  outcome: "manual-attention",
@@ -803,6 +810,7 @@ export class AutoOrchestrator {
803
810
  }
804
811
  if (gate.kind === "threw") {
805
812
  await this.emitUokGate({
813
+ ...uokGateContext,
806
814
  gateId: "pre-dispatch-health-gate",
807
815
  gateType: "execution",
808
816
  outcome: "manual-attention",
@@ -814,6 +822,7 @@ export class AutoOrchestrator {
814
822
  }
815
823
  else {
816
824
  await this.emitUokGate({
825
+ ...uokGateContext,
817
826
  gateId: "pre-dispatch-health-gate",
818
827
  gateType: "execution",
819
828
  outcome: "pass",