gsd-pi 2.50.0 → 2.51.0-dev.ae8f7cb

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 (511) hide show
  1. package/README.md +2 -0
  2. package/dist/cli.js +26 -0
  3. package/dist/loader.js +4 -0
  4. package/dist/resource-loader.d.ts +4 -1
  5. package/dist/resource-loader.js +138 -3
  6. package/dist/resources/extensions/async-jobs/async-bash-tool.js +3 -1
  7. package/dist/resources/extensions/bg-shell/interaction.js +3 -1
  8. package/dist/resources/extensions/bg-shell/process-manager.js +4 -1
  9. package/dist/resources/extensions/claude-code-cli/partial-builder.js +5 -0
  10. package/dist/resources/extensions/gsd/auto/phases.js +16 -1
  11. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +22 -3
  13. package/dist/resources/extensions/gsd/auto-dispatch.js +81 -54
  14. package/dist/resources/extensions/gsd/auto-observability.js +54 -0
  15. package/dist/resources/extensions/gsd/auto-post-unit.js +37 -76
  16. package/dist/resources/extensions/gsd/auto-prompts.js +57 -0
  17. package/dist/resources/extensions/gsd/auto-recovery.js +21 -25
  18. package/dist/resources/extensions/gsd/auto-utils.js +20 -0
  19. package/dist/resources/extensions/gsd/auto.js +15 -5
  20. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +16 -0
  21. package/dist/resources/extensions/gsd/crash-recovery.js +6 -2
  22. package/dist/resources/extensions/gsd/custom-execution-policy.js +3 -2
  23. package/dist/resources/extensions/gsd/custom-verification.js +3 -1
  24. package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -2
  25. package/dist/resources/extensions/gsd/dashboard-overlay.js +4 -0
  26. package/dist/resources/extensions/gsd/detection.js +589 -3
  27. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
  28. package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -0
  29. package/dist/resources/extensions/gsd/files.js +5 -1
  30. package/dist/resources/extensions/gsd/guided-flow.js +10 -0
  31. package/dist/resources/extensions/gsd/init-wizard.js +9 -1
  32. package/dist/resources/extensions/gsd/model-router.js +25 -0
  33. package/dist/resources/extensions/gsd/notifications.js +23 -0
  34. package/dist/resources/extensions/gsd/observability-validator.js +422 -0
  35. package/dist/resources/extensions/gsd/preferences-skills.js +11 -5
  36. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  37. package/dist/resources/extensions/gsd/preferences-validation.js +25 -0
  38. package/dist/resources/extensions/gsd/preferences.js +3 -0
  39. package/dist/resources/extensions/gsd/prompts/forensics.md +11 -7
  40. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
  41. package/dist/resources/extensions/gsd/provider-error-pause.js +8 -0
  42. package/dist/resources/extensions/gsd/roadmap-mutations.js +110 -0
  43. package/dist/resources/extensions/gsd/rtk-status.js +43 -0
  44. package/dist/resources/extensions/gsd/rule-registry.js +10 -11
  45. package/dist/resources/extensions/gsd/session-forensics.js +7 -3
  46. package/dist/resources/extensions/gsd/skill-catalog.js +1026 -0
  47. package/dist/resources/extensions/gsd/skill-discovery.js +3 -2
  48. package/dist/resources/extensions/gsd/skill-health.js +2 -2
  49. package/dist/resources/extensions/gsd/skill-telemetry.js +15 -5
  50. package/dist/resources/extensions/gsd/state.js +17 -5
  51. package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
  52. package/dist/resources/extensions/gsd/templates/preferences.md +2 -0
  53. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
  54. package/dist/resources/extensions/gsd/undo.js +8 -7
  55. package/dist/resources/extensions/gsd/unit-runtime.js +2 -1
  56. package/dist/resources/extensions/gsd/verification-gate.js +3 -1
  57. package/dist/resources/extensions/shared/rtk-session-stats.js +189 -0
  58. package/dist/resources/extensions/shared/rtk.js +100 -0
  59. package/dist/rtk.d.ts +52 -0
  60. package/dist/rtk.js +332 -0
  61. package/dist/web/standalone/.next/BUILD_ID +1 -1
  62. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -11
  63. package/dist/web/standalone/.next/build-manifest.json +4 -4
  64. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  65. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  66. package/dist/web/standalone/.next/required-server-files.json +3 -3
  67. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  68. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  69. package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  72. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  80. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  83. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  84. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  85. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  87. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  90. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  92. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  95. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  98. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  100. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  101. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js.nft.json +1 -1
  104. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  107. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  110. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js.nft.json +1 -1
  113. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  116. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/experimental/route.js +3 -0
  118. package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +1 -0
  119. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -0
  120. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  122. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  125. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  128. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  131. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/preferences/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -26
  160. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  169. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  190. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  193. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  196. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  199. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/index.html +1 -1
  214. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  215. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  216. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  217. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  219. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  220. package/dist/web/standalone/.next/server/app/page.js +2 -2
  221. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -11
  224. package/dist/web/standalone/.next/server/chunks/2229.js +12 -0
  225. package/dist/web/standalone/.next/server/chunks/2331.js +25 -0
  226. package/dist/web/standalone/.next/server/chunks/{741.js → 4741.js} +1 -1
  227. package/dist/web/standalone/.next/server/chunks/5822.js +2 -0
  228. package/dist/web/standalone/.next/server/chunks/7471.js +13 -0
  229. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  230. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/middleware.js +3 -3
  233. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  235. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  236. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  237. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  238. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  239. package/dist/web/standalone/.next/static/5_KeZz1X0tXJK-d_4OhjB/_buildManifest.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/{485.243af25f0cdf50d6.js → 2008.817d0885545aaea9.js} +6 -6
  241. package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +9 -0
  242. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  244. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +1 -0
  254. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +1 -0
  260. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +1 -0
  261. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +1 -0
  262. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +1 -0
  263. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +1 -0
  264. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +1 -0
  265. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +1 -0
  266. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +1 -0
  267. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +1 -0
  268. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +1 -0
  269. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +1 -0
  270. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +1 -0
  271. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +1 -0
  272. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +1 -0
  273. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +1 -0
  274. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +1 -0
  275. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +1 -0
  277. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +1 -0
  279. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +1 -0
  280. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +1 -0
  281. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +1 -0
  282. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +1 -0
  283. package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +1 -0
  284. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +1 -0
  285. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  286. package/dist/web/standalone/.next/static/chunks/app/page-b950e4e384cc62b3.js +1 -0
  287. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  288. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +1 -0
  289. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  291. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +1 -0
  292. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +1 -0
  293. package/dist/web/standalone/.next/static/chunks/webpack-cfc9a116e6450a6b.js +1 -0
  294. package/dist/web/standalone/.next/static/css/de141508b083f922.css +1 -0
  295. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  296. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  297. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  298. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  299. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  300. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  301. package/dist/web/standalone/server.js +1 -1
  302. package/package.json +1 -1
  303. package/packages/pi-ai/dist/types.d.ts +1 -0
  304. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  305. package/packages/pi-ai/dist/types.js.map +1 -1
  306. package/packages/pi-ai/src/types.ts +1 -1
  307. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +1 -0
  308. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -0
  310. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +3 -1
  312. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/bash-executor.js +10 -1
  314. package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  316. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  317. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -0
  319. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/core/extensions/runner.js +13 -0
  321. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +19 -1
  323. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/core/extensions/wrapper.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +8 -0
  327. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/package-manager.js +8 -1
  330. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/skills.d.ts +11 -1
  332. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/skills.js +30 -8
  334. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  337. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  339. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/index.js +1 -1
  341. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +3 -2
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +6 -4
  347. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +5 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +12 -0
  351. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +2 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  355. package/packages/pi-coding-agent/package.json +1 -1
  356. package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
  357. package/packages/pi-coding-agent/src/core/bash-executor.ts +10 -2
  358. package/packages/pi-coding-agent/src/core/extensions/index.ts +2 -0
  359. package/packages/pi-coding-agent/src/core/extensions/runner.ts +18 -0
  360. package/packages/pi-coding-agent/src/core/extensions/types.ts +21 -0
  361. package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +9 -0
  362. package/packages/pi-coding-agent/src/core/package-manager.ts +10 -1
  363. package/packages/pi-coding-agent/src/core/skills.ts +35 -10
  364. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  365. package/packages/pi-coding-agent/src/index.ts +4 -0
  366. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +3 -2
  367. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +6 -4
  368. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +15 -0
  369. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +2 -1
  370. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  371. package/pkg/dist/modes/interactive/theme/themes.js +2 -1
  372. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  373. package/pkg/package.json +1 -1
  374. package/scripts/postinstall.js +163 -6
  375. package/src/resources/extensions/async-jobs/async-bash-tool.ts +3 -1
  376. package/src/resources/extensions/bg-shell/interaction.ts +3 -1
  377. package/src/resources/extensions/bg-shell/process-manager.ts +4 -1
  378. package/src/resources/extensions/claude-code-cli/partial-builder.ts +5 -0
  379. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +105 -0
  380. package/src/resources/extensions/gsd/auto/phases.ts +15 -1
  381. package/src/resources/extensions/gsd/auto/session.ts +6 -0
  382. package/src/resources/extensions/gsd/auto-dashboard.ts +31 -3
  383. package/src/resources/extensions/gsd/auto-dispatch.ts +84 -51
  384. package/src/resources/extensions/gsd/auto-observability.ts +72 -0
  385. package/src/resources/extensions/gsd/auto-post-unit.ts +56 -83
  386. package/src/resources/extensions/gsd/auto-prompts.ts +48 -0
  387. package/src/resources/extensions/gsd/auto-recovery.ts +19 -26
  388. package/src/resources/extensions/gsd/auto-utils.ts +25 -0
  389. package/src/resources/extensions/gsd/auto.ts +15 -5
  390. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +17 -0
  391. package/src/resources/extensions/gsd/crash-recovery.ts +6 -2
  392. package/src/resources/extensions/gsd/custom-execution-policy.ts +3 -2
  393. package/src/resources/extensions/gsd/custom-verification.ts +3 -1
  394. package/src/resources/extensions/gsd/custom-workflow-engine.ts +3 -2
  395. package/src/resources/extensions/gsd/dashboard-overlay.ts +7 -0
  396. package/src/resources/extensions/gsd/detection.ts +662 -3
  397. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
  398. package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -0
  399. package/src/resources/extensions/gsd/files.ts +6 -1
  400. package/src/resources/extensions/gsd/guided-flow.ts +11 -0
  401. package/src/resources/extensions/gsd/init-wizard.ts +9 -1
  402. package/src/resources/extensions/gsd/model-router.ts +25 -0
  403. package/src/resources/extensions/gsd/notifications.ts +23 -0
  404. package/src/resources/extensions/gsd/observability-validator.ts +456 -0
  405. package/src/resources/extensions/gsd/preferences-skills.ts +11 -5
  406. package/src/resources/extensions/gsd/preferences-types.ts +20 -0
  407. package/src/resources/extensions/gsd/preferences-validation.ts +26 -0
  408. package/src/resources/extensions/gsd/preferences.ts +3 -0
  409. package/src/resources/extensions/gsd/prompts/forensics.md +11 -7
  410. package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
  411. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  412. package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
  413. package/src/resources/extensions/gsd/rtk-status.ts +53 -0
  414. package/src/resources/extensions/gsd/rule-registry.ts +10 -11
  415. package/src/resources/extensions/gsd/session-forensics.ts +7 -3
  416. package/src/resources/extensions/gsd/skill-catalog.ts +1085 -0
  417. package/src/resources/extensions/gsd/skill-discovery.ts +3 -2
  418. package/src/resources/extensions/gsd/skill-health.ts +2 -2
  419. package/src/resources/extensions/gsd/skill-telemetry.ts +15 -5
  420. package/src/resources/extensions/gsd/state.ts +16 -5
  421. package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -0
  422. package/src/resources/extensions/gsd/templates/preferences.md +2 -0
  423. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +16 -0
  424. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
  425. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +68 -0
  426. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
  427. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +5 -3
  428. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +33 -0
  429. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
  430. package/src/resources/extensions/gsd/tests/detection.test.ts +838 -0
  431. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
  432. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +97 -0
  433. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +63 -0
  434. package/src/resources/extensions/gsd/tests/model-router.test.ts +40 -0
  435. package/src/resources/extensions/gsd/tests/notifications.test.ts +28 -6
  436. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
  437. package/src/resources/extensions/gsd/tests/preferences.test.ts +50 -0
  438. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +40 -0
  439. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
  440. package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +161 -0
  441. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +4 -5
  442. package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +82 -0
  443. package/src/resources/extensions/gsd/tests/run-uat.test.ts +146 -0
  444. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
  445. package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
  446. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +24 -0
  447. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
  448. package/src/resources/extensions/gsd/types.ts +2 -0
  449. package/src/resources/extensions/gsd/undo.ts +8 -7
  450. package/src/resources/extensions/gsd/unit-runtime.ts +2 -1
  451. package/src/resources/extensions/gsd/verification-gate.ts +3 -1
  452. package/src/resources/extensions/shared/rtk-session-stats.ts +249 -0
  453. package/src/resources/extensions/shared/rtk.ts +120 -0
  454. package/dist/web/standalone/.next/server/chunks/229.js +0 -12
  455. package/dist/web/standalone/.next/server/chunks/441.js +0 -2
  456. package/dist/web/standalone/.next/server/chunks/471.js +0 -13
  457. package/dist/web/standalone/.next/static/MQOhBnkC_TLtNn_JvZWDj/_buildManifest.js +0 -1
  458. package/dist/web/standalone/.next/static/chunks/4024.7c75ac378de0f2b5.js +0 -9
  459. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +0 -1
  460. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +0 -1
  461. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +0 -1
  462. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +0 -1
  463. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +0 -1
  464. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +0 -1
  465. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +0 -1
  466. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +0 -1
  467. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +0 -1
  468. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +0 -1
  469. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +0 -1
  470. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +0 -1
  471. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +0 -1
  472. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +0 -1
  473. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +0 -1
  474. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +0 -1
  475. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +0 -1
  476. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +0 -1
  477. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +0 -1
  478. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +0 -1
  479. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +0 -1
  480. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +0 -1
  483. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +0 -1
  485. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +0 -1
  486. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +0 -1
  487. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +0 -1
  488. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +0 -1
  489. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +0 -1
  490. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +0 -1
  491. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +0 -1
  492. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +0 -1
  493. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +0 -1
  494. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +0 -1
  495. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +0 -1
  496. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +0 -1
  497. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +0 -1
  498. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +0 -1
  499. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +0 -1
  500. package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +0 -1
  501. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  502. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +0 -1
  503. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +0 -1
  504. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  505. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +0 -1
  506. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +0 -1
  507. package/dist/web/standalone/.next/static/chunks/webpack-2473ce2c3879fff4.js +0 -1
  508. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +0 -1
  509. package/packages/pi-ai/pnpm-lock.yaml +0 -2022
  510. package/packages/pi-coding-agent/pnpm-lock.yaml +0 -454
  511. /package/dist/web/standalone/.next/static/{MQOhBnkC_TLtNn_JvZWDj → 5_KeZz1X0tXJK-d_4OhjB}/_ssgManifest.js +0 -0
@@ -26,6 +26,11 @@ import { getActiveWorktreeName } from "./worktree-command.js";
26
26
  import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
27
27
  import { resolveServiceTierIcon, getEffectiveServiceTier } from "./service-tier.js";
28
28
  import { parseUnitId } from "./unit-id.js";
29
+ import {
30
+ formatRtkSavingsLabel,
31
+ getRtkSessionSavings,
32
+ type RtkSessionSavings,
33
+ } from "../shared/rtk-session-stats.js";
29
34
 
30
35
  // ─── UAT Slice Extraction ─────────────────────────────────────────────────────
31
36
 
@@ -59,6 +64,10 @@ export interface AutoDashboardData {
59
64
  profileDowngraded?: boolean;
60
65
  /** Number of pending captures awaiting triage (0 if none or file missing) */
61
66
  pendingCaptureCount: number;
67
+ /** RTK token savings for the current session, or null when unavailable. */
68
+ rtkSavings?: RtkSessionSavings | null;
69
+ /** Whether RTK is enabled via experimental.rtk preference. False when not opted in. */
70
+ rtkEnabled?: boolean;
62
71
  /** Cross-process: another auto-mode session detected via auto.lock (PID, startedAt) */
63
72
  remoteSession?: { pid: number; startedAt: string; unitType: string; unitId: string };
64
73
  }
@@ -476,6 +485,19 @@ export function updateProgressWidget(
476
485
  let pulseBright = true;
477
486
  let cachedLines: string[] | undefined;
478
487
  let cachedWidth: number | undefined;
488
+ let cachedRtkLabel: string | null | undefined;
489
+
490
+ const refreshRtkLabel = (): void => {
491
+ try {
492
+ const sessionId = ctx.sessionManager.getSessionId();
493
+ const savings = sessionId ? getRtkSessionSavings(accessors.getBasePath(), sessionId) : null;
494
+ cachedRtkLabel = formatRtkSavingsLabel(savings);
495
+ } catch {
496
+ cachedRtkLabel = null;
497
+ }
498
+ };
499
+
500
+ refreshRtkLabel();
479
501
 
480
502
  const pulseTimer = setInterval(() => {
481
503
  pulseBright = !pulseBright;
@@ -487,12 +509,15 @@ export function updateProgressWidget(
487
509
  // task/slice completion mid-unit. Without this, the progress bar only
488
510
  // updates at dispatch time, appearing frozen during long-running units.
489
511
  // 15s (vs 5s) reduces synchronous file I/O on the hot path.
490
- const progressRefreshTimer = mid ? setInterval(() => {
512
+ const progressRefreshTimer = setInterval(() => {
491
513
  try {
492
- updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
514
+ if (mid) {
515
+ updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
516
+ }
517
+ refreshRtkLabel();
493
518
  cachedLines = undefined;
494
519
  } catch { /* non-fatal */ }
495
- }, 15_000) : null;
520
+ }, 15_000);
496
521
 
497
522
  return {
498
523
  render(width: number): string[] {
@@ -776,6 +801,9 @@ export function updateProgressWidget(
776
801
  if (statsLine) {
777
802
  lines.push(rightAlign("", statsLine, width));
778
803
  }
804
+ if (cachedRtkLabel) {
805
+ lines.push(rightAlign("", theme.fg("dim", cachedRtkLabel), width));
806
+ }
779
807
  }
780
808
  // PWD line with last commit info right-aligned
781
809
  const lastCommit = getLastCommit(accessors.getBasePath());
@@ -13,10 +13,11 @@ 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 } from "./gsd-db.js";
16
+ import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone } from "./gsd-db.js";
17
17
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
18
18
 
19
19
  import {
20
+ gsdRoot,
20
21
  resolveMilestoneFile,
21
22
  resolveMilestonePath,
22
23
  resolveSliceFile,
@@ -26,7 +27,7 @@ import {
26
27
  buildMilestoneFileName,
27
28
  buildSliceFileName,
28
29
  } from "./paths.js";
29
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
30
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
30
31
  import { join } from "node:path";
31
32
  import { hasImplementationArtifacts } from "./auto-recovery.js";
32
33
  import {
@@ -88,10 +89,46 @@ function missingSliceStop(mid: string, phase: string): DispatchAction {
88
89
  };
89
90
  }
90
91
 
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
+
91
105
  // ─── Rewrite Circuit Breaker ──────────────────────────────────────────────
92
106
 
93
107
  const MAX_REWRITE_ATTEMPTS = 3;
94
108
 
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
+
95
132
  // ─── Rules ────────────────────────────────────────────────────────────────
96
133
 
97
134
  export const DISPATCH_RULES: DispatchRule[] = [
@@ -100,14 +137,14 @@ export const DISPATCH_RULES: DispatchRule[] = [
100
137
  match: async ({ mid, midTitle, state, basePath, session }) => {
101
138
  const pendingOverrides = await loadActiveOverrides(basePath);
102
139
  if (pendingOverrides.length === 0) return null;
103
- const count = session?.rewriteAttemptCount ?? 0;
140
+ const count = getRewriteCount(basePath);
104
141
  if (count >= MAX_REWRITE_ATTEMPTS) {
105
142
  const { resolveAllOverrides } = await import("./files.js");
106
143
  await resolveAllOverrides(basePath);
107
- if (session) session.rewriteAttemptCount = 0;
144
+ setRewriteCount(basePath, 0);
108
145
  return null;
109
146
  }
110
- if (session) session.rewriteAttemptCount++;
147
+ setRewriteCount(basePath, count + 1);
111
148
  const unitId = state.activeSlice ? `${mid}/${state.activeSlice.id}` : mid;
112
149
  return {
113
150
  action: "dispatch",
@@ -543,30 +580,14 @@ export const DISPATCH_RULES: DispatchRule[] = [
543
580
  if (state.phase !== "validating-milestone") return null;
544
581
 
545
582
  // Safety guard (#1368): verify all roadmap slices have SUMMARY files before
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
- }
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
+ };
570
591
  }
571
592
 
572
593
  // Skip preference: write a minimal pass-through VALIDATION file
@@ -606,28 +627,13 @@ export const DISPATCH_RULES: DispatchRule[] = [
606
627
  if (state.phase !== "completing-milestone") return null;
607
628
 
608
629
  // Safety guard (#1368): verify all roadmap slices have SUMMARY files.
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
- }
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
+ };
631
637
  }
632
638
 
633
639
  // Safety guard (#1703): verify the milestone produced implementation
@@ -641,6 +647,33 @@ export const DISPATCH_RULES: DispatchRule[] = [
641
647
  };
642
648
  }
643
649
 
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
+
644
677
  return {
645
678
  action: "dispatch",
646
679
  unitType: "complete-milestone",
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Pre-dispatch observability checks for auto-mode units.
3
+ * Validates plan/summary file quality and builds repair instructions
4
+ * for the agent to fix gaps before proceeding with the unit.
5
+ */
6
+
7
+ import type { ExtensionContext } from "@gsd/pi-coding-agent";
8
+ import {
9
+ validatePlanBoundary,
10
+ validateExecuteBoundary,
11
+ validateCompleteBoundary,
12
+ formatValidationIssues,
13
+ } from "./observability-validator.js";
14
+ import type { ValidationIssue } from "./observability-validator.js";
15
+ import { parseUnitId } from "./unit-id.js";
16
+
17
+ export async function collectObservabilityWarnings(
18
+ ctx: ExtensionContext,
19
+ basePath: string,
20
+ unitType: string,
21
+ unitId: string,
22
+ ): Promise<ValidationIssue[]> {
23
+ // Hook units have custom artifacts — skip standard observability checks
24
+ if (unitType.startsWith("hook/")) return [];
25
+
26
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
27
+
28
+ if (!mid || !sid) return [];
29
+
30
+ let issues = [] as Awaited<ReturnType<typeof validatePlanBoundary>>;
31
+
32
+ if (unitType === "plan-slice") {
33
+ issues = await validatePlanBoundary(basePath, mid, sid);
34
+ } else if (unitType === "execute-task" && tid) {
35
+ issues = await validateExecuteBoundary(basePath, mid, sid, tid);
36
+ } else if (unitType === "complete-slice") {
37
+ issues = await validateCompleteBoundary(basePath, mid, sid);
38
+ }
39
+
40
+ if (issues.length > 0) {
41
+ ctx.ui.notify(
42
+ `Observability check (${unitType}) found ${issues.length} warning${issues.length === 1 ? "" : "s"}:\n${formatValidationIssues(issues)}`,
43
+ "warning",
44
+ );
45
+ }
46
+
47
+ return issues;
48
+ }
49
+
50
+ export function buildObservabilityRepairBlock(issues: ValidationIssue[]): string {
51
+ if (issues.length === 0) return "";
52
+ const items = issues.map(issue => {
53
+ const fileName = issue.file.split("/").pop() || issue.file;
54
+ let line = `- **${fileName}**: ${issue.message}`;
55
+ if (issue.suggestion) line += ` → ${issue.suggestion}`;
56
+ return line;
57
+ });
58
+ return [
59
+ "",
60
+ "---",
61
+ "",
62
+ "## Pre-flight: Observability gaps to fix FIRST",
63
+ "",
64
+ "The following issues were detected in plan/summary files for this unit.",
65
+ "**Read each flagged file, apply the fix described, then proceed with the unit.**",
66
+ "",
67
+ ...items,
68
+ "",
69
+ "---",
70
+ "",
71
+ ].join("\n");
72
+ }
@@ -47,8 +47,29 @@ 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 type { AutoSession } from "./auto/session.js";
51
-
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
+ }
52
73
  /** Unit types that only touch `.gsd/` internal state files (no code changes).
53
74
  * Auto-commit is skipped for these — their state files are picked up by the
54
75
  * next actual task commit via `smartStage()`. */
@@ -239,6 +260,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
239
260
 
240
261
  // Auto-commit
241
262
  if (s.currentUnit) {
263
+ const unit = s.currentUnit;
242
264
  try {
243
265
  let taskContext: TaskCommitContext | undefined;
244
266
 
@@ -297,64 +319,56 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
297
319
  }
298
320
 
299
321
  // GitHub sync (non-blocking, opt-in)
300
- try {
322
+ await runSafely("postUnit", "github-sync", async () => {
301
323
  const { runGitHubSync } = await import("../github-sync/sync.js");
302
- await runGitHubSync(s.basePath, s.currentUnit.type, s.currentUnit.id);
303
- } catch (e) {
304
- debugLog("postUnit", { phase: "github-sync", error: String(e) });
305
- }
324
+ await runGitHubSync(s.basePath, unit.type, unit.id);
325
+ });
306
326
 
307
327
  // Prune dead bg-shell processes
308
- try {
328
+ await runSafely("postUnit", "prune-bg-shell", async () => {
309
329
  const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
310
330
  pruneDeadProcesses();
311
- } catch (e) {
312
- debugLog("postUnit", { phase: "prune-bg-shell", error: String(e) });
313
- }
331
+ });
314
332
 
315
333
  // Tear down browser between units to prevent Chrome process accumulation (#1733)
316
- try {
334
+ await runSafely("postUnit", "browser-teardown", async () => {
317
335
  const { getBrowser } = await import("../browser-tools/state.js");
318
336
  if (getBrowser()) {
319
337
  const { closeBrowser } = await import("../browser-tools/lifecycle.js");
320
338
  await closeBrowser();
321
339
  debugLog("postUnit", { phase: "browser-teardown", status: "closed" });
322
340
  }
323
- } catch (e) {
324
- debugLog("postUnit", { phase: "browser-teardown", error: String(e) });
325
- }
341
+ });
326
342
 
327
343
  // Sync worktree state back to project root (skipped for lightweight sidecars)
328
344
  if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath !== s.basePath) {
329
- try {
330
- syncStateToProjectRoot(s.basePath, s.originalBasePath, s.currentMilestoneId);
331
- } catch (e) {
332
- debugLog("postUnit", { phase: "worktree-sync", error: String(e) });
333
- }
345
+ await runSafely("postUnit", "worktree-sync", () => {
346
+ syncStateToProjectRoot(s.basePath, s.originalBasePath!, s.currentMilestoneId);
347
+ });
334
348
  }
335
349
 
336
350
  // Rewrite-docs completion
337
351
  if (s.currentUnit.type === "rewrite-docs") {
338
- try {
352
+ await runSafely("postUnit", "rewrite-docs-resolve", async () => {
339
353
  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);
340
358
  s.rewriteAttemptCount = 0;
341
359
  ctx.ui.notify("Override(s) resolved — rewrite-docs completed.", "info");
342
- } catch (e) {
343
- debugLog("postUnit", { phase: "rewrite-docs-resolve", error: String(e) });
344
- }
360
+ });
345
361
  }
346
362
 
347
363
  // Reactive state cleanup on slice completion
348
364
  if (s.currentUnit.type === "complete-slice") {
349
- try {
350
- const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
365
+ await runSafely("postUnit", "reactive-state-cleanup", async () => {
366
+ const { milestone: mid, slice: sid } = parseUnitId(unit.id);
351
367
  if (mid && sid) {
352
368
  const { clearReactiveState } = await import("./reactive-graph.js");
353
369
  clearReactiveState(s.basePath, mid, sid);
354
370
  }
355
- } catch (e) {
356
- debugLog("postUnit", { phase: "reactive-state-cleanup", error: String(e) });
357
- }
371
+ });
358
372
  }
359
373
 
360
374
  // Post-triage: execute actionable resolutions
@@ -502,23 +516,11 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
502
516
  }
503
517
  persistHookState(s.basePath);
504
518
 
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";
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
+ );
522
524
  }
523
525
 
524
526
  // Check if a hook requested a retry of the trigger unit
@@ -617,26 +619,12 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
617
619
  }
618
620
 
619
621
  const triageUnitId = `${mid}/${sid}/triage`;
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(
622
+ return enqueueSidecar(
623
+ s, ctx,
624
+ { kind: "triage", unitType: "triage-captures", unitId: triageUnitId, prompt },
625
+ { pendingCount: pending.length },
635
626
  `Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`,
636
- "info",
637
627
  );
638
-
639
- return "continue";
640
628
  }
641
629
  }
642
630
  }
@@ -665,27 +653,12 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
665
653
  markCaptureExecuted(s.basePath, capture.id);
666
654
 
667
655
  const qtUnitId = `${s.currentMilestoneId}/${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(
656
+ return enqueueSidecar(
657
+ s, ctx,
658
+ { kind: "quick-task", unitType: "quick-task", unitId: qtUnitId, prompt, captureId: capture.id },
659
+ { captureId: capture.id },
684
660
  `Executing quick-task: ${capture.id} — "${capture.text}"`,
685
- "info",
686
661
  );
687
-
688
- return "continue";
689
662
  } catch (e) {
690
663
  debugLog("postUnit", { phase: "quick-task-dispatch", error: String(e) });
691
664
  }
@@ -784,6 +784,14 @@ 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
+ }
787
795
  const uatType = getUatType(uatContent);
788
796
  return { sliceId: sid, uatType };
789
797
  }
@@ -808,6 +816,13 @@ export async function checkNeedsRunUat(
808
816
  if (!uatContentFb) return null;
809
817
  // If the UAT file already contains a verdict, UAT has been run — skip
810
818
  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
+ }
811
826
  const uatTypeFb = getUatType(uatContentFb);
812
827
  return { sliceId: uatSid, uatType: uatTypeFb };
813
828
  }
@@ -1330,6 +1345,24 @@ export async function buildValidateMilestonePrompt(
1330
1345
  const inlined: string[] = [];
1331
1346
  inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
1332
1347
 
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
+
1333
1366
  // Inline all slice summaries and UAT results
1334
1367
  let valSliceIds: string[] = [];
1335
1368
  try {
@@ -1359,6 +1392,21 @@ export async function buildValidateMilestonePrompt(
1359
1392
  if (uatInline) inlined.push(uatInline);
1360
1393
  }
1361
1394
 
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
+
1362
1410
  // Inline existing VALIDATION file if this is a re-validation round
1363
1411
  const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
1364
1412
  const validationRel = relMilestoneFile(base, mid, "VALIDATION");