gsd-pi 2.50.0-dev.d210a87 → 2.50.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 (509) hide show
  1. package/README.md +0 -2
  2. package/dist/cli.js +0 -26
  3. package/dist/loader.js +0 -4
  4. package/dist/resource-loader.d.ts +1 -4
  5. package/dist/resource-loader.js +3 -138
  6. package/dist/resources/extensions/async-jobs/async-bash-tool.js +1 -3
  7. package/dist/resources/extensions/bg-shell/interaction.js +1 -3
  8. package/dist/resources/extensions/bg-shell/process-manager.js +1 -4
  9. package/dist/resources/extensions/claude-code-cli/partial-builder.js +0 -5
  10. package/dist/resources/extensions/gsd/auto/phases.js +1 -16
  11. package/dist/resources/extensions/gsd/auto/session.js +0 -5
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +3 -22
  13. package/dist/resources/extensions/gsd/auto-dispatch.js +54 -81
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +76 -37
  15. package/dist/resources/extensions/gsd/auto-prompts.js +0 -57
  16. package/dist/resources/extensions/gsd/auto-recovery.js +25 -21
  17. package/dist/resources/extensions/gsd/auto.js +5 -15
  18. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +0 -16
  19. package/dist/resources/extensions/gsd/crash-recovery.js +2 -6
  20. package/dist/resources/extensions/gsd/custom-execution-policy.js +2 -3
  21. package/dist/resources/extensions/gsd/custom-verification.js +1 -3
  22. package/dist/resources/extensions/gsd/custom-workflow-engine.js +2 -3
  23. package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -4
  24. package/dist/resources/extensions/gsd/detection.js +3 -589
  25. package/dist/resources/extensions/gsd/dispatch-guard.js +1 -2
  26. package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -15
  27. package/dist/resources/extensions/gsd/files.js +1 -5
  28. package/dist/resources/extensions/gsd/guided-flow.js +0 -10
  29. package/dist/resources/extensions/gsd/init-wizard.js +1 -9
  30. package/dist/resources/extensions/gsd/model-router.js +0 -25
  31. package/dist/resources/extensions/gsd/notifications.js +0 -23
  32. package/dist/resources/extensions/gsd/preferences-skills.js +5 -11
  33. package/dist/resources/extensions/gsd/preferences-types.js +0 -1
  34. package/dist/resources/extensions/gsd/preferences-validation.js +0 -25
  35. package/dist/resources/extensions/gsd/preferences.js +0 -3
  36. package/dist/resources/extensions/gsd/prompts/forensics.md +7 -11
  37. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -6
  38. package/dist/resources/extensions/gsd/provider-error-pause.js +0 -8
  39. package/dist/resources/extensions/gsd/rule-registry.js +11 -10
  40. package/dist/resources/extensions/gsd/session-forensics.js +3 -7
  41. package/dist/resources/extensions/gsd/skill-discovery.js +2 -3
  42. package/dist/resources/extensions/gsd/skill-health.js +2 -2
  43. package/dist/resources/extensions/gsd/skill-telemetry.js +5 -15
  44. package/dist/resources/extensions/gsd/state.js +5 -17
  45. package/dist/resources/extensions/gsd/templates/milestone-validation.md +0 -12
  46. package/dist/resources/extensions/gsd/templates/preferences.md +0 -2
  47. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +9 -28
  48. package/dist/resources/extensions/gsd/undo.js +7 -8
  49. package/dist/resources/extensions/gsd/unit-runtime.js +1 -2
  50. package/dist/resources/extensions/gsd/verification-gate.js +1 -3
  51. package/dist/web/standalone/.next/BUILD_ID +1 -1
  52. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -17
  53. package/dist/web/standalone/.next/build-manifest.json +4 -4
  54. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  55. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  56. package/dist/web/standalone/.next/required-server-files.json +3 -3
  57. package/dist/web/standalone/.next/routes-manifest.json +0 -6
  58. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  59. package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  60. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  61. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  62. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  70. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  74. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  75. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  77. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  80. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  82. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  85. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  88. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  90. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  91. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js.nft.json +1 -1
  94. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  97. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  100. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js.nft.json +1 -1
  103. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  106. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  109. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  112. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  115. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  118. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  121. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  124. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  127. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  130. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/preferences/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +26 -2
  147. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  177. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  183. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +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.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/index.html +1 -1
  201. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  202. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  203. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  204. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  206. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  207. package/dist/web/standalone/.next/server/app/page.js +2 -2
  208. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -17
  211. package/dist/web/standalone/.next/server/chunks/229.js +12 -0
  212. package/dist/web/standalone/.next/server/chunks/441.js +2 -0
  213. package/dist/web/standalone/.next/server/chunks/471.js +13 -0
  214. package/dist/web/standalone/.next/server/chunks/{4741.js → 741.js} +1 -1
  215. package/dist/web/standalone/.next/server/functions-config-manifest.json +0 -1
  216. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/middleware.js +3 -3
  219. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  221. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  222. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  223. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  224. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  225. package/dist/web/standalone/.next/static/MQOhBnkC_TLtNn_JvZWDj/_buildManifest.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/4024.7c75ac378de0f2b5.js +9 -0
  227. package/dist/web/standalone/.next/static/chunks/{2008.817d0885545aaea9.js → 485.243af25f0cdf50d6.js} +6 -6
  228. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  230. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  254. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  260. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  261. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  262. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  263. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  264. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  265. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  266. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  267. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  268. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  269. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  270. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  271. package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +1 -0
  272. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  273. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  274. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  275. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  277. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/webpack-2473ce2c3879fff4.js +1 -0
  279. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  280. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  281. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  282. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  283. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  284. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  285. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  286. package/dist/web/standalone/server.js +1 -1
  287. package/package.json +1 -1
  288. package/packages/pi-ai/dist/types.d.ts +0 -1
  289. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  290. package/packages/pi-ai/dist/types.js.map +1 -1
  291. package/packages/pi-ai/pnpm-lock.yaml +2022 -0
  292. package/packages/pi-ai/src/types.ts +1 -1
  293. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -1
  294. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/agent-session.js +0 -1
  296. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +1 -3
  298. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/bash-executor.js +1 -10
  300. package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  302. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +0 -1
  305. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -13
  307. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +1 -19
  309. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/core/extensions/wrapper.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +0 -8
  313. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/package-manager.js +1 -8
  316. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  317. package/packages/pi-coding-agent/dist/core/skills.d.ts +1 -11
  318. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  319. package/packages/pi-coding-agent/dist/core/skills.js +8 -30
  320. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/slash-commands.js +0 -1
  323. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  325. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/index.js +1 -1
  327. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +2 -3
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -6
  333. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +0 -5
  335. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +0 -12
  337. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -2
  340. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  341. package/packages/pi-coding-agent/pnpm-lock.yaml +454 -0
  342. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -2
  343. package/packages/pi-coding-agent/src/core/bash-executor.ts +2 -10
  344. package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -2
  345. package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -18
  346. package/packages/pi-coding-agent/src/core/extensions/types.ts +0 -21
  347. package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +0 -9
  348. package/packages/pi-coding-agent/src/core/package-manager.ts +1 -10
  349. package/packages/pi-coding-agent/src/core/skills.ts +10 -35
  350. package/packages/pi-coding-agent/src/core/slash-commands.ts +0 -1
  351. package/packages/pi-coding-agent/src/index.ts +0 -4
  352. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +2 -3
  353. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -6
  354. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +0 -15
  355. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -2
  356. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  357. package/pkg/dist/modes/interactive/theme/themes.js +1 -2
  358. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  359. package/scripts/postinstall.js +6 -163
  360. package/src/resources/extensions/async-jobs/async-bash-tool.ts +1 -3
  361. package/src/resources/extensions/bg-shell/interaction.ts +1 -3
  362. package/src/resources/extensions/bg-shell/process-manager.ts +1 -4
  363. package/src/resources/extensions/claude-code-cli/partial-builder.ts +0 -5
  364. package/src/resources/extensions/gsd/auto/phases.ts +1 -15
  365. package/src/resources/extensions/gsd/auto/session.ts +0 -6
  366. package/src/resources/extensions/gsd/auto-dashboard.ts +3 -31
  367. package/src/resources/extensions/gsd/auto-dispatch.ts +51 -84
  368. package/src/resources/extensions/gsd/auto-post-unit.ts +83 -56
  369. package/src/resources/extensions/gsd/auto-prompts.ts +0 -48
  370. package/src/resources/extensions/gsd/auto-recovery.ts +26 -19
  371. package/src/resources/extensions/gsd/auto.ts +5 -15
  372. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +0 -17
  373. package/src/resources/extensions/gsd/crash-recovery.ts +2 -6
  374. package/src/resources/extensions/gsd/custom-execution-policy.ts +2 -3
  375. package/src/resources/extensions/gsd/custom-verification.ts +1 -3
  376. package/src/resources/extensions/gsd/custom-workflow-engine.ts +2 -3
  377. package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -7
  378. package/src/resources/extensions/gsd/detection.ts +3 -662
  379. package/src/resources/extensions/gsd/dispatch-guard.ts +1 -2
  380. package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -15
  381. package/src/resources/extensions/gsd/files.ts +1 -6
  382. package/src/resources/extensions/gsd/guided-flow.ts +0 -11
  383. package/src/resources/extensions/gsd/init-wizard.ts +1 -9
  384. package/src/resources/extensions/gsd/model-router.ts +0 -25
  385. package/src/resources/extensions/gsd/notifications.ts +0 -23
  386. package/src/resources/extensions/gsd/preferences-skills.ts +5 -11
  387. package/src/resources/extensions/gsd/preferences-types.ts +0 -20
  388. package/src/resources/extensions/gsd/preferences-validation.ts +0 -26
  389. package/src/resources/extensions/gsd/preferences.ts +0 -3
  390. package/src/resources/extensions/gsd/prompts/forensics.md +7 -11
  391. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -6
  392. package/src/resources/extensions/gsd/provider-error-pause.ts +0 -9
  393. package/src/resources/extensions/gsd/rule-registry.ts +11 -10
  394. package/src/resources/extensions/gsd/session-forensics.ts +3 -7
  395. package/src/resources/extensions/gsd/skill-discovery.ts +2 -3
  396. package/src/resources/extensions/gsd/skill-health.ts +2 -2
  397. package/src/resources/extensions/gsd/skill-telemetry.ts +5 -15
  398. package/src/resources/extensions/gsd/state.ts +5 -16
  399. package/src/resources/extensions/gsd/templates/milestone-validation.md +0 -12
  400. package/src/resources/extensions/gsd/templates/preferences.md +0 -2
  401. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -16
  402. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
  403. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -68
  404. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
  405. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +3 -5
  406. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +0 -33
  407. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -4
  408. package/src/resources/extensions/gsd/tests/detection.test.ts +0 -838
  409. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +9 -28
  410. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -63
  411. package/src/resources/extensions/gsd/tests/model-router.test.ts +0 -40
  412. package/src/resources/extensions/gsd/tests/notifications.test.ts +6 -28
  413. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -50
  414. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -40
  415. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
  416. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +5 -4
  417. package/src/resources/extensions/gsd/tests/run-uat.test.ts +0 -146
  418. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
  419. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +0 -24
  420. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
  421. package/src/resources/extensions/gsd/types.ts +0 -2
  422. package/src/resources/extensions/gsd/undo.ts +7 -8
  423. package/src/resources/extensions/gsd/unit-runtime.ts +1 -2
  424. package/src/resources/extensions/gsd/verification-gate.ts +1 -3
  425. package/dist/resources/extensions/gsd/auto-observability.js +0 -54
  426. package/dist/resources/extensions/gsd/auto-utils.js +0 -20
  427. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  428. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  429. package/dist/resources/extensions/gsd/rtk-status.js +0 -43
  430. package/dist/resources/extensions/gsd/skill-catalog.js +0 -1026
  431. package/dist/resources/extensions/shared/rtk-session-stats.js +0 -189
  432. package/dist/resources/extensions/shared/rtk.js +0 -100
  433. package/dist/rtk.d.ts +0 -52
  434. package/dist/rtk.js +0 -332
  435. package/dist/web/standalone/.next/server/app/api/experimental/route.js +0 -3
  436. package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +0 -1
  437. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +0 -1
  438. package/dist/web/standalone/.next/server/chunks/2229.js +0 -12
  439. package/dist/web/standalone/.next/server/chunks/2331.js +0 -25
  440. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  441. package/dist/web/standalone/.next/server/chunks/7471.js +0 -13
  442. package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +0 -9
  443. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +0 -1
  444. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +0 -1
  445. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +0 -1
  446. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  447. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  448. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +0 -1
  449. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +0 -1
  450. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +0 -1
  451. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +0 -1
  452. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +0 -1
  453. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +0 -1
  454. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +0 -1
  455. package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +0 -1
  456. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +0 -1
  457. package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +0 -1
  458. package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +0 -1
  459. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +0 -1
  460. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +0 -1
  461. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +0 -1
  462. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +0 -1
  463. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +0 -1
  464. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +0 -1
  465. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +0 -1
  466. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +0 -1
  467. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +0 -1
  468. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +0 -1
  469. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +0 -1
  470. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +0 -1
  471. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +0 -1
  472. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +0 -1
  473. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +0 -1
  474. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +0 -1
  475. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +0 -1
  476. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +0 -1
  477. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +0 -1
  478. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  479. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +0 -1
  480. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +0 -1
  483. package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +0 -1
  485. package/dist/web/standalone/.next/static/chunks/app/page-b950e4e384cc62b3.js +0 -1
  486. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  487. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +0 -1
  488. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +0 -1
  489. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  490. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +0 -1
  491. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +0 -1
  492. package/dist/web/standalone/.next/static/chunks/webpack-cfc9a116e6450a6b.js +0 -1
  493. package/dist/web/standalone/.next/static/css/de141508b083f922.css +0 -1
  494. package/dist/web/standalone/.next/static/yJIyd5cXPNpmXTv18ZlyC/_buildManifest.js +0 -1
  495. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -105
  496. package/src/resources/extensions/gsd/auto-observability.ts +0 -72
  497. package/src/resources/extensions/gsd/auto-utils.ts +0 -25
  498. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  499. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  500. package/src/resources/extensions/gsd/rtk-status.ts +0 -53
  501. package/src/resources/extensions/gsd/skill-catalog.ts +0 -1085
  502. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +0 -97
  503. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  504. package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +0 -161
  505. package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +0 -82
  506. package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +0 -193
  507. package/src/resources/extensions/shared/rtk-session-stats.ts +0 -249
  508. package/src/resources/extensions/shared/rtk.ts +0 -120
  509. /package/dist/web/standalone/.next/static/{yJIyd5cXPNpmXTv18ZlyC → MQOhBnkC_TLtNn_JvZWDj}/_ssgManifest.js +0 -0
@@ -13,11 +13,10 @@ import type { GSDState } from "./types.js";
13
13
  import type { GSDPreferences } from "./preferences.js";
14
14
  import type { UatType } from "./files.js";
15
15
  import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
16
- import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone } from "./gsd-db.js";
16
+ import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted } from "./gsd-db.js";
17
17
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
18
18
 
19
19
  import {
20
- gsdRoot,
21
20
  resolveMilestoneFile,
22
21
  resolveMilestonePath,
23
22
  resolveSliceFile,
@@ -27,7 +26,7 @@ import {
27
26
  buildMilestoneFileName,
28
27
  buildSliceFileName,
29
28
  } from "./paths.js";
30
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
29
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
31
30
  import { join } from "node:path";
32
31
  import { hasImplementationArtifacts } from "./auto-recovery.js";
33
32
  import {
@@ -89,46 +88,10 @@ function missingSliceStop(mid: string, phase: string): DispatchAction {
89
88
  };
90
89
  }
91
90
 
92
- /**
93
- * Check for milestone slices missing SUMMARY files.
94
- * Returns array of missing slice IDs, or empty array if all present or DB unavailable.
95
- */
96
- function findMissingSummaries(basePath: string, mid: string): string[] {
97
- if (!isDbAvailable()) return [];
98
- const sliceIds = getMilestoneSlices(mid).map(s => s.id);
99
- return sliceIds.filter(sid => {
100
- const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
101
- return !summaryPath || !existsSync(summaryPath);
102
- });
103
- }
104
-
105
91
  // ─── Rewrite Circuit Breaker ──────────────────────────────────────────────
106
92
 
107
93
  const MAX_REWRITE_ATTEMPTS = 3;
108
94
 
109
- // ─── Disk-persisted rewrite attempt counter ──────────────────────────────────
110
- // The counter must survive session restarts (crash recovery, pause/resume,
111
- // step-mode). Storing it on the in-memory session object caused the circuit
112
- // breaker to never trip — see https://github.com/gsd-build/gsd-2/issues/2203
113
- function rewriteCountPath(basePath: string): string {
114
- return join(gsdRoot(basePath), "runtime", "rewrite-count.json");
115
- }
116
-
117
- export function getRewriteCount(basePath: string): number {
118
- try {
119
- const data = JSON.parse(readFileSync(rewriteCountPath(basePath), "utf-8"));
120
- return typeof data.count === "number" ? data.count : 0;
121
- } catch {
122
- return 0;
123
- }
124
- }
125
-
126
- export function setRewriteCount(basePath: string, count: number): void {
127
- const filePath = rewriteCountPath(basePath);
128
- mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
129
- writeFileSync(filePath, JSON.stringify({ count, updatedAt: new Date().toISOString() }) + "\n");
130
- }
131
-
132
95
  // ─── Rules ────────────────────────────────────────────────────────────────
133
96
 
134
97
  export const DISPATCH_RULES: DispatchRule[] = [
@@ -137,14 +100,14 @@ export const DISPATCH_RULES: DispatchRule[] = [
137
100
  match: async ({ mid, midTitle, state, basePath, session }) => {
138
101
  const pendingOverrides = await loadActiveOverrides(basePath);
139
102
  if (pendingOverrides.length === 0) return null;
140
- const count = getRewriteCount(basePath);
103
+ const count = session?.rewriteAttemptCount ?? 0;
141
104
  if (count >= MAX_REWRITE_ATTEMPTS) {
142
105
  const { resolveAllOverrides } = await import("./files.js");
143
106
  await resolveAllOverrides(basePath);
144
- setRewriteCount(basePath, 0);
107
+ if (session) session.rewriteAttemptCount = 0;
145
108
  return null;
146
109
  }
147
- setRewriteCount(basePath, count + 1);
110
+ if (session) session.rewriteAttemptCount++;
148
111
  const unitId = state.activeSlice ? `${mid}/${state.activeSlice.id}` : mid;
149
112
  return {
150
113
  action: "dispatch",
@@ -580,14 +543,30 @@ export const DISPATCH_RULES: DispatchRule[] = [
580
543
  if (state.phase !== "validating-milestone") return null;
581
544
 
582
545
  // Safety guard (#1368): verify all roadmap slices have SUMMARY files before
583
- // allowing milestone validation.
584
- const missingSlices = findMissingSummaries(basePath, mid);
585
- if (missingSlices.length > 0) {
586
- return {
587
- action: "stop",
588
- reason: `Cannot validate milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. These slices may have been skipped.`,
589
- level: "error",
590
- };
546
+ // allowing milestone validation. If any slice lacks a summary, the milestone
547
+ // is not genuinely complete — something skipped earlier slices.
548
+ let sliceIds: string[];
549
+ if (isDbAvailable()) {
550
+ sliceIds = getMilestoneSlices(mid).map(s => s.id);
551
+ } else {
552
+ sliceIds = [];
553
+ }
554
+
555
+ if (sliceIds.length > 0) {
556
+ const missingSlices: string[] = [];
557
+ for (const sid of sliceIds) {
558
+ const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
559
+ if (!summaryPath || !existsSync(summaryPath)) {
560
+ missingSlices.push(sid);
561
+ }
562
+ }
563
+ if (missingSlices.length > 0) {
564
+ return {
565
+ action: "stop",
566
+ reason: `Cannot validate milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. These slices may have been skipped.`,
567
+ level: "error",
568
+ };
569
+ }
591
570
  }
592
571
 
593
572
  // Skip preference: write a minimal pass-through VALIDATION file
@@ -627,13 +606,28 @@ export const DISPATCH_RULES: DispatchRule[] = [
627
606
  if (state.phase !== "completing-milestone") return null;
628
607
 
629
608
  // Safety guard (#1368): verify all roadmap slices have SUMMARY files.
630
- const missingSlices = findMissingSummaries(basePath, mid);
631
- if (missingSlices.length > 0) {
632
- return {
633
- action: "stop",
634
- reason: `Cannot complete milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. Run /gsd doctor to diagnose.`,
635
- level: "error",
636
- };
609
+ let sliceIds: string[];
610
+ if (isDbAvailable()) {
611
+ sliceIds = getMilestoneSlices(mid).map(s => s.id);
612
+ } else {
613
+ sliceIds = [];
614
+ }
615
+
616
+ if (sliceIds.length > 0) {
617
+ const missingSlices: string[] = [];
618
+ for (const sid of sliceIds) {
619
+ const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
620
+ if (!summaryPath || !existsSync(summaryPath)) {
621
+ missingSlices.push(sid);
622
+ }
623
+ }
624
+ if (missingSlices.length > 0) {
625
+ return {
626
+ action: "stop",
627
+ reason: `Cannot complete milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. Run /gsd doctor to diagnose.`,
628
+ level: "error",
629
+ };
630
+ }
637
631
  }
638
632
 
639
633
  // Safety guard (#1703): verify the milestone produced implementation
@@ -647,33 +641,6 @@ export const DISPATCH_RULES: DispatchRule[] = [
647
641
  };
648
642
  }
649
643
 
650
- // Verification class compliance: if operational verification was planned,
651
- // ensure the validation output documents it before allowing completion.
652
- try {
653
- if (isDbAvailable()) {
654
- const milestone = getMilestone(mid);
655
- if (milestone?.verification_operational &&
656
- milestone.verification_operational.toLowerCase() !== "none") {
657
- const validationPath = resolveMilestoneFile(basePath, mid, "VALIDATION");
658
- if (validationPath) {
659
- const validationContent = await loadFile(validationPath);
660
- if (validationContent) {
661
- const hasOperationalCheck =
662
- validationContent.includes("Operational") &&
663
- (validationContent.includes("MET") || validationContent.includes("N/A"));
664
- if (!hasOperationalCheck) {
665
- return {
666
- action: "stop" as const,
667
- reason: `Milestone ${mid} has planned operational verification ("${milestone.verification_operational.substring(0, 100)}") but the validation output does not address it. Re-run validation with verification class awareness, or update the validation to document operational compliance.`,
668
- level: "warning" as const,
669
- };
670
- }
671
- }
672
- }
673
- }
674
- }
675
- } catch { /* fall through — don't block on DB errors */ }
676
-
677
644
  return {
678
645
  action: "dispatch",
679
646
  unitType: "complete-milestone",
@@ -47,29 +47,8 @@ import {
47
47
  } from "./post-unit-hooks.js";
48
48
  import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
49
49
  import { debugLog } from "./debug-logger.js";
50
- import { runSafely } from "./auto-utils.js";
51
- import type { AutoSession, SidecarItem } from "./auto/session.js";
52
-
53
-
54
- /** Enqueue a sidecar item (hook, triage, or quick-task) for the main loop to
55
- * drain via runUnit. Logs the enqueue event and notifies the UI. */
56
- function enqueueSidecar(
57
- s: AutoSession,
58
- ctx: ExtensionContext,
59
- entry: SidecarItem,
60
- debugExtra: Record<string, unknown>,
61
- notification?: string,
62
- ): "continue" {
63
- s.sidecarQueue.push(entry);
64
- debugLog("postUnitPostVerification", {
65
- phase: "sidecar-enqueue",
66
- kind: entry.kind,
67
- unitId: entry.unitId,
68
- ...debugExtra,
69
- });
70
- if (notification) ctx.ui.notify(notification, "info");
71
- return "continue";
72
- }
50
+ import type { AutoSession } from "./auto/session.js";
51
+
73
52
  /** Unit types that only touch `.gsd/` internal state files (no code changes).
74
53
  * Auto-commit is skipped for these — their state files are picked up by the
75
54
  * next actual task commit via `smartStage()`. */
@@ -260,7 +239,6 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
260
239
 
261
240
  // Auto-commit
262
241
  if (s.currentUnit) {
263
- const unit = s.currentUnit;
264
242
  try {
265
243
  let taskContext: TaskCommitContext | undefined;
266
244
 
@@ -319,56 +297,64 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
319
297
  }
320
298
 
321
299
  // GitHub sync (non-blocking, opt-in)
322
- await runSafely("postUnit", "github-sync", async () => {
300
+ try {
323
301
  const { runGitHubSync } = await import("../github-sync/sync.js");
324
- await runGitHubSync(s.basePath, unit.type, unit.id);
325
- });
302
+ await runGitHubSync(s.basePath, s.currentUnit.type, s.currentUnit.id);
303
+ } catch (e) {
304
+ debugLog("postUnit", { phase: "github-sync", error: String(e) });
305
+ }
326
306
 
327
307
  // Prune dead bg-shell processes
328
- await runSafely("postUnit", "prune-bg-shell", async () => {
308
+ try {
329
309
  const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
330
310
  pruneDeadProcesses();
331
- });
311
+ } catch (e) {
312
+ debugLog("postUnit", { phase: "prune-bg-shell", error: String(e) });
313
+ }
332
314
 
333
315
  // Tear down browser between units to prevent Chrome process accumulation (#1733)
334
- await runSafely("postUnit", "browser-teardown", async () => {
316
+ try {
335
317
  const { getBrowser } = await import("../browser-tools/state.js");
336
318
  if (getBrowser()) {
337
319
  const { closeBrowser } = await import("../browser-tools/lifecycle.js");
338
320
  await closeBrowser();
339
321
  debugLog("postUnit", { phase: "browser-teardown", status: "closed" });
340
322
  }
341
- });
323
+ } catch (e) {
324
+ debugLog("postUnit", { phase: "browser-teardown", error: String(e) });
325
+ }
342
326
 
343
327
  // Sync worktree state back to project root (skipped for lightweight sidecars)
344
328
  if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath !== s.basePath) {
345
- await runSafely("postUnit", "worktree-sync", () => {
346
- syncStateToProjectRoot(s.basePath, s.originalBasePath!, s.currentMilestoneId);
347
- });
329
+ try {
330
+ syncStateToProjectRoot(s.basePath, s.originalBasePath, s.currentMilestoneId);
331
+ } catch (e) {
332
+ debugLog("postUnit", { phase: "worktree-sync", error: String(e) });
333
+ }
348
334
  }
349
335
 
350
336
  // Rewrite-docs completion
351
337
  if (s.currentUnit.type === "rewrite-docs") {
352
- await runSafely("postUnit", "rewrite-docs-resolve", async () => {
338
+ try {
353
339
  await resolveAllOverrides(s.basePath);
354
- // Reset both disk and in-memory counters. Disk counter is authoritative
355
- // (survives restarts); in-memory is kept in sync for the current session.
356
- const { setRewriteCount } = await import("./auto-dispatch.js");
357
- setRewriteCount(s.basePath, 0);
358
340
  s.rewriteAttemptCount = 0;
359
341
  ctx.ui.notify("Override(s) resolved — rewrite-docs completed.", "info");
360
- });
342
+ } catch (e) {
343
+ debugLog("postUnit", { phase: "rewrite-docs-resolve", error: String(e) });
344
+ }
361
345
  }
362
346
 
363
347
  // Reactive state cleanup on slice completion
364
348
  if (s.currentUnit.type === "complete-slice") {
365
- await runSafely("postUnit", "reactive-state-cleanup", async () => {
366
- const { milestone: mid, slice: sid } = parseUnitId(unit.id);
349
+ try {
350
+ const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
367
351
  if (mid && sid) {
368
352
  const { clearReactiveState } = await import("./reactive-graph.js");
369
353
  clearReactiveState(s.basePath, mid, sid);
370
354
  }
371
- });
355
+ } catch (e) {
356
+ debugLog("postUnit", { phase: "reactive-state-cleanup", error: String(e) });
357
+ }
372
358
  }
373
359
 
374
360
  // Post-triage: execute actionable resolutions
@@ -516,11 +502,23 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
516
502
  }
517
503
  persistHookState(s.basePath);
518
504
 
519
- return enqueueSidecar(
520
- s, ctx,
521
- { kind: "hook", unitType: hookUnit.unitType, unitId: hookUnit.unitId, prompt: hookUnit.prompt, model: hookUnit.model },
522
- { hookName: hookUnit.hookName },
523
- );
505
+ s.sidecarQueue.push({
506
+ kind: "hook",
507
+ unitType: hookUnit.unitType,
508
+ unitId: hookUnit.unitId,
509
+ prompt: hookUnit.prompt,
510
+ model: hookUnit.model,
511
+ });
512
+
513
+ debugLog("postUnitPostVerification", {
514
+ phase: "sidecar-enqueue",
515
+ kind: "hook",
516
+ unitType: hookUnit.unitType,
517
+ unitId: hookUnit.unitId,
518
+ hookName: hookUnit.hookName,
519
+ });
520
+
521
+ return "continue";
524
522
  }
525
523
 
526
524
  // Check if a hook requested a retry of the trigger unit
@@ -619,12 +617,26 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
619
617
  }
620
618
 
621
619
  const triageUnitId = `${mid}/${sid}/triage`;
622
- return enqueueSidecar(
623
- s, ctx,
624
- { kind: "triage", unitType: "triage-captures", unitId: triageUnitId, prompt },
625
- { pendingCount: pending.length },
620
+ s.sidecarQueue.push({
621
+ kind: "triage",
622
+ unitType: "triage-captures",
623
+ unitId: triageUnitId,
624
+ prompt,
625
+ });
626
+
627
+ debugLog("postUnitPostVerification", {
628
+ phase: "sidecar-enqueue",
629
+ kind: "triage",
630
+ unitId: triageUnitId,
631
+ pendingCount: pending.length,
632
+ });
633
+
634
+ ctx.ui.notify(
626
635
  `Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`,
636
+ "info",
627
637
  );
638
+
639
+ return "continue";
628
640
  }
629
641
  }
630
642
  }
@@ -653,12 +665,27 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
653
665
  markCaptureExecuted(s.basePath, capture.id);
654
666
 
655
667
  const qtUnitId = `${s.currentMilestoneId}/${capture.id}`;
656
- return enqueueSidecar(
657
- s, ctx,
658
- { kind: "quick-task", unitType: "quick-task", unitId: qtUnitId, prompt, captureId: capture.id },
659
- { captureId: capture.id },
668
+ s.sidecarQueue.push({
669
+ kind: "quick-task",
670
+ unitType: "quick-task",
671
+ unitId: qtUnitId,
672
+ prompt,
673
+ captureId: capture.id,
674
+ });
675
+
676
+ debugLog("postUnitPostVerification", {
677
+ phase: "sidecar-enqueue",
678
+ kind: "quick-task",
679
+ unitId: qtUnitId,
680
+ captureId: capture.id,
681
+ });
682
+
683
+ ctx.ui.notify(
660
684
  `Executing quick-task: ${capture.id} — "${capture.text}"`,
685
+ "info",
661
686
  );
687
+
688
+ return "continue";
662
689
  } catch (e) {
663
690
  debugLog("postUnit", { phase: "quick-task-dispatch", error: String(e) });
664
691
  }
@@ -784,14 +784,6 @@ export async function checkNeedsRunUat(
784
784
  if (!uatContent) return null;
785
785
  // If the UAT file already contains a verdict, UAT has been run — skip
786
786
  if (hasVerdict(uatContent)) return null;
787
- // Also check the ASSESSMENT file — the run-uat prompt writes the verdict
788
- // there (via gsd_summary_save artifact_type:"ASSESSMENT"), not into the
789
- // UAT spec file. Without this check the unit re-dispatches indefinitely.
790
- const assessmentFile = resolveSliceFile(base, mid, sid, "ASSESSMENT");
791
- if (assessmentFile) {
792
- const assessmentContent = await loadFile(assessmentFile);
793
- if (assessmentContent && hasVerdict(assessmentContent)) return null;
794
- }
795
787
  const uatType = getUatType(uatContent);
796
788
  return { sliceId: sid, uatType };
797
789
  }
@@ -816,13 +808,6 @@ export async function checkNeedsRunUat(
816
808
  if (!uatContentFb) return null;
817
809
  // If the UAT file already contains a verdict, UAT has been run — skip
818
810
  if (hasVerdict(uatContentFb)) return null;
819
- // Also check the ASSESSMENT file for the file-based fallback path (same
820
- // reason as the DB path above — verdict lives in ASSESSMENT, not UAT).
821
- const assessmentFileFb = resolveSliceFile(base, mid, uatSid, "ASSESSMENT");
822
- if (assessmentFileFb) {
823
- const assessmentContentFb = await loadFile(assessmentFileFb);
824
- if (assessmentContentFb && hasVerdict(assessmentContentFb)) return null;
825
- }
826
811
  const uatTypeFb = getUatType(uatContentFb);
827
812
  return { sliceId: uatSid, uatType: uatTypeFb };
828
813
  }
@@ -1345,24 +1330,6 @@ export async function buildValidateMilestonePrompt(
1345
1330
  const inlined: string[] = [];
1346
1331
  inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
1347
1332
 
1348
- // Inline verification classes from planning (if available in DB)
1349
- try {
1350
- const { isDbAvailable, getMilestone } = await import("./gsd-db.js");
1351
- if (isDbAvailable()) {
1352
- const milestone = getMilestone(mid);
1353
- if (milestone) {
1354
- const classes: string[] = [];
1355
- if (milestone.verification_contract) classes.push(`- **Contract:** ${milestone.verification_contract}`);
1356
- if (milestone.verification_integration) classes.push(`- **Integration:** ${milestone.verification_integration}`);
1357
- if (milestone.verification_operational) classes.push(`- **Operational:** ${milestone.verification_operational}`);
1358
- if (milestone.verification_uat) classes.push(`- **UAT:** ${milestone.verification_uat}`);
1359
- if (classes.length > 0) {
1360
- inlined.push(`### Verification Classes (from planning)\n\nThese verification tiers were defined during milestone planning. Each non-empty class must be checked for evidence during validation.\n\n${classes.join("\n")}`);
1361
- }
1362
- }
1363
- }
1364
- } catch { /* fall through */ }
1365
-
1366
1333
  // Inline all slice summaries and UAT results
1367
1334
  let valSliceIds: string[] = [];
1368
1335
  try {
@@ -1392,21 +1359,6 @@ export async function buildValidateMilestonePrompt(
1392
1359
  if (uatInline) inlined.push(uatInline);
1393
1360
  }
1394
1361
 
1395
- // Aggregate unresolved follow-ups and known limitations across slices
1396
- const outstandingItems: string[] = [];
1397
- for (const sid of valSliceIds) {
1398
- const summaryPath = resolveSliceFile(base, mid, sid, "SUMMARY");
1399
- if (!summaryPath) continue;
1400
- const content = await loadFile(summaryPath);
1401
- if (!content) continue;
1402
- const summary = parseSummary(content);
1403
- if (summary.followUps) outstandingItems.push(`- **${sid} Follow-ups:** ${summary.followUps.trim()}`);
1404
- if (summary.knownLimitations) outstandingItems.push(`- **${sid} Known Limitations:** ${summary.knownLimitations.trim()}`);
1405
- }
1406
- if (outstandingItems.length > 0) {
1407
- inlined.push(`### Outstanding Items (aggregated from slice summaries)\n\nThese follow-ups and known limitations were documented during slice completion but have not been resolved.\n\n${outstandingItems.join('\n')}`);
1408
- }
1409
-
1410
1362
  // Inline existing VALIDATION file if this is a re-validation round
1411
1363
  const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
1412
1364
  const validationRel = relMilestoneFile(base, mid, "VALIDATION");
@@ -12,7 +12,7 @@ import { parseUnitId } from "./unit-id.js";
12
12
  import { atomicWriteSync } from "./atomic-write.js";
13
13
  import { clearParseCache } from "./files.js";
14
14
  import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
15
- import { isDbAvailable, getTask, getSlice, getSliceTasks, updateTaskStatus } from "./gsd-db.js";
15
+ import { isDbAvailable, getTask, getSlice, getSliceTasks } from "./gsd-db.js";
16
16
  import { isValidationTerminal } from "./state.js";
17
17
  import {
18
18
  nativeConflictFiles,
@@ -195,8 +195,13 @@ export function verifyExpectedArtifact(
195
195
  // Reactive-execute: verify that each dispatched task's summary exists.
196
196
  // The unitId encodes the batch: "{mid}/{sid}/reactive+T02,T03"
197
197
  if (unitType === "reactive-execute") {
198
- const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
199
- if (!mid || !sid || !batchPart) return false;
198
+ const parts = unitId.split("/");
199
+ const mid = parts[0];
200
+ const sidAndBatch = parts[1];
201
+ const batchPart = parts[2]; // "reactive+T02,T03"
202
+ if (!mid || !sidAndBatch || !batchPart) return false;
203
+
204
+ const sid = sidAndBatch;
200
205
  const plusIdx = batchPart.indexOf("+");
201
206
  if (plusIdx === -1) {
202
207
  // Legacy format "reactive" without batch IDs — fall back to "any summary"
@@ -228,7 +233,10 @@ export function verifyExpectedArtifact(
228
233
  // Gate-evaluate: verify that each dispatched gate has been resolved in the DB.
229
234
  // The unitId encodes the batch: "{mid}/{sid}/gates+Q3,Q4"
230
235
  if (unitType === "gate-evaluate") {
231
- const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
236
+ const parts = unitId.split("/");
237
+ const mid = parts[0];
238
+ const sid = parts[1];
239
+ const batchPart = parts[2]; // "gates+Q3,Q4"
232
240
  if (!mid || !sid || !batchPart) return false;
233
241
 
234
242
  const plusIdx = batchPart.indexOf("+");
@@ -278,7 +286,10 @@ export function verifyExpectedArtifact(
278
286
  // execute-task: DB status is authoritative. Fall back to heading-style plan
279
287
  // detection when the DB is unavailable (unmigrated projects).
280
288
  if (unitType === "execute-task") {
281
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
289
+ const parts = unitId.split("/");
290
+ const mid = parts[0];
291
+ const sid = parts[1];
292
+ const tid = parts[2];
282
293
  if (mid && sid && tid) {
283
294
  const dbTask = getTask(mid, sid, tid);
284
295
  if (dbTask) {
@@ -308,7 +319,9 @@ export function verifyExpectedArtifact(
308
319
  // but omitted T{tid}-PLAN.md files would be marked complete, causing execute-task
309
320
  // to dispatch with a missing task plan (see issue #739).
310
321
  if (unitType === "plan-slice") {
311
- const { milestone: mid, slice: sid } = parseUnitId(unitId);
322
+ const parts = unitId.split("/");
323
+ const mid = parts[0];
324
+ const sid = parts[1];
312
325
  if (mid && sid) {
313
326
  try {
314
327
  // DB primary path — get task IDs to verify task plan files exist
@@ -343,7 +356,9 @@ export function verifyExpectedArtifact(
343
356
  // complete-slice: DB status is authoritative for whether the slice is done.
344
357
  // Fall back to file-based check (roadmap [x]) when DB is unavailable.
345
358
  if (unitType === "complete-slice") {
346
- const { milestone: mid, slice: sid } = parseUnitId(unitId);
359
+ const parts = unitId.split("/");
360
+ const mid = parts[0];
361
+ const sid = parts[1];
347
362
  if (mid && sid) {
348
363
  const dir = resolveSlicePath(base, mid, sid);
349
364
  if (dir) {
@@ -410,17 +425,6 @@ export function writeBlockerPlaceholder(
410
425
  `Review and replace this file before relying on downstream artifacts.`,
411
426
  ].join("\n");
412
427
  writeFileSync(absPath, content, "utf-8");
413
-
414
- // Mark the task as complete in the DB so verifyExpectedArtifact passes.
415
- // Without this, the DB status stays "pending" and the dispatch loop
416
- // re-derives the same task indefinitely (#2531).
417
- if (unitType === "execute-task" && isDbAvailable()) {
418
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
419
- if (mid && sid && tid) {
420
- try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch { /* non-fatal */ }
421
- }
422
- }
423
-
424
428
  return diagnoseExpectedArtifact(unitType, unitId, base);
425
429
  }
426
430
 
@@ -540,7 +544,10 @@ export function buildLoopRemediationSteps(
540
544
  unitId: string,
541
545
  base: string,
542
546
  ): string | null {
543
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
547
+ const parts = unitId.split("/");
548
+ const mid = parts[0];
549
+ const sid = parts[1];
550
+ const tid = parts[2];
544
551
  switch (unitType) {
545
552
  case "execute-task": {
546
553
  if (!mid || !sid || !tid) break;
@@ -17,7 +17,6 @@ import type {
17
17
  } from "@gsd/pi-coding-agent";
18
18
 
19
19
  import { deriveState } from "./state.js";
20
- import { parseUnitId } from "./unit-id.js";
21
20
  import type { GSDState } from "./types.js";
22
21
  import { getManifestStatus } from "./files.js";
23
22
  export { inlinePriorMilestoneSummary } from "./files.js";
@@ -105,7 +104,6 @@ import {
105
104
  captureAvailableSkills,
106
105
  resetSkillTelemetry,
107
106
  } from "./skill-telemetry.js";
108
- import { getRtkSessionSavings } from "../shared/rtk-session-stats.js";
109
107
  import {
110
108
  initMetrics,
111
109
  resetMetrics,
@@ -303,11 +301,6 @@ export { type AutoDashboardData } from "./auto-dashboard.js";
303
301
  export function getAutoDashboardData(): AutoDashboardData {
304
302
  const ledger = getLedger();
305
303
  const totals = ledger ? getProjectTotals(ledger.units) : null;
306
- const sessionId = s.cmdCtx?.sessionManager?.getSessionId?.() ?? null;
307
- const rtkSavings = sessionId && s.basePath
308
- ? getRtkSessionSavings(s.basePath, sessionId)
309
- : null;
310
- const rtkEnabled = loadEffectiveGSDPreferences()?.preferences.experimental?.rtk === true;
311
304
  // Pending capture count — lazy check, non-fatal
312
305
  let pendingCaptureCount = 0;
313
306
  try {
@@ -330,8 +323,6 @@ export function getAutoDashboardData(): AutoDashboardData {
330
323
  totalCost: totals?.cost ?? 0,
331
324
  totalTokens: totals?.tokens.total ?? 0,
332
325
  pendingCaptureCount,
333
- rtkSavings,
334
- rtkEnabled,
335
326
  };
336
327
  }
337
328
 
@@ -599,11 +590,8 @@ export async function stopAuto(
599
590
  // When the milestone is complete (has a SUMMARY), merge the worktree branch
600
591
  // back to main so code isn't stranded on the worktree branch (#2317).
601
592
  // For incomplete milestones, preserve the branch for later resumption.
602
- //
603
- // Skip if phases.ts already merged this milestone — avoids the double
604
- // mergeAndExit that fails because the branch was already deleted (#2645).
605
593
  try {
606
- if (s.currentMilestoneId && !s.milestoneMergedInPhases) {
594
+ if (s.currentMilestoneId) {
607
595
  const notifyCtx = ctx
608
596
  ? { notify: ctx.ui.notify.bind(ctx.ui) }
609
597
  : { notify: () => {} };
@@ -1289,7 +1277,8 @@ function ensurePreconditions(
1289
1277
  base: string,
1290
1278
  state: GSDState,
1291
1279
  ): void {
1292
- const { milestone: mid, slice: sid } = parseUnitId(unitId);
1280
+ const parts = unitId.split("/");
1281
+ const mid = parts[0]!;
1293
1282
 
1294
1283
  const mDir = resolveMilestonePath(base, mid);
1295
1284
  if (!mDir) {
@@ -1297,7 +1286,8 @@ function ensurePreconditions(
1297
1286
  mkdirSync(join(newDir, "slices"), { recursive: true });
1298
1287
  }
1299
1288
 
1300
- if (sid !== undefined) {
1289
+ if (parts.length >= 2) {
1290
+ const sid = parts[1]!;
1301
1291
 
1302
1292
  const mDirResolved = resolveMilestonePath(base, mid);
1303
1293
  if (mDirResolved) {