gsd-pi 2.81.0 → 2.82.0-dev.2841a1e44

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 (572) hide show
  1. package/README.md +63 -32
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/GSD-WORKFLOW.md +3 -1
  4. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  5. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  6. package/dist/resources/extensions/cmux/index.js +5 -0
  7. package/dist/resources/extensions/gsd/auto/loop.js +111 -8
  8. package/dist/resources/extensions/gsd/auto/orchestrator.js +113 -6
  9. package/dist/resources/extensions/gsd/auto/phases.js +199 -97
  10. package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
  11. package/dist/resources/extensions/gsd/auto/session.js +9 -0
  12. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
  13. package/dist/resources/extensions/gsd/auto-dashboard.js +182 -178
  14. package/dist/resources/extensions/gsd/auto-dispatch.js +14 -11
  15. package/dist/resources/extensions/gsd/auto-post-unit.js +176 -125
  16. package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
  17. package/dist/resources/extensions/gsd/auto-recovery.js +6 -181
  18. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  19. package/dist/resources/extensions/gsd/auto-start.js +20 -23
  20. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  21. package/dist/resources/extensions/gsd/auto-verification.js +38 -26
  22. package/dist/resources/extensions/gsd/auto-worktree.js +8 -0
  23. package/dist/resources/extensions/gsd/auto.js +371 -106
  24. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +13 -6
  25. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +13 -2
  26. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  27. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +16 -7
  28. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  29. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +3 -1
  30. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  31. package/dist/resources/extensions/gsd/commands/catalog.js +4 -1
  32. package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -1
  33. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  34. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
  35. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  36. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  37. package/dist/resources/extensions/gsd/context-store.js +112 -0
  38. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  39. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  40. package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
  41. package/dist/resources/extensions/gsd/git-service.js +2 -1
  42. package/dist/resources/extensions/gsd/gsd-db.js +7 -23
  43. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  44. package/dist/resources/extensions/gsd/health-widget.js +4 -10
  45. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  46. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  47. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  48. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  49. package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
  50. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  51. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  52. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  53. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  54. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  55. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  56. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  57. package/dist/resources/extensions/gsd/native-git-bridge.js +14 -14
  58. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  59. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  60. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  61. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  62. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  63. package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
  64. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  65. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  66. package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
  67. package/dist/resources/extensions/gsd/session-lock.js +40 -0
  68. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
  69. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +247 -0
  70. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +50 -0
  71. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +87 -0
  72. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
  73. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
  74. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
  75. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
  76. package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
  77. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
  78. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
  79. package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
  80. package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
  81. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  82. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  83. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  84. package/dist/resources/extensions/gsd/unit-context-manifest.js +25 -2
  85. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  86. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  87. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  88. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  89. package/dist/resources/extensions/gsd/worktree-lifecycle.js +743 -318
  90. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  91. package/dist/resources/extensions/subagent/index.js +448 -78
  92. package/dist/resources/extensions/subagent/launch.js +77 -0
  93. package/dist/resources/extensions/subagent/run-store.js +148 -0
  94. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  95. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  96. package/dist/resources/extensions/visual-brief/index.js +5 -0
  97. package/dist/resources/extensions/visual-brief/page-contract.js +122 -0
  98. package/dist/resources/extensions/visual-brief/prompts.js +111 -0
  99. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  100. package/dist/web/standalone/.next/BUILD_ID +1 -1
  101. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  102. package/dist/web/standalone/.next/build-manifest.json +4 -4
  103. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  104. package/dist/web/standalone/.next/react-loadable-manifest.json +3 -3
  105. package/dist/web/standalone/.next/required-server-files.json +3 -3
  106. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  107. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  117. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  126. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  145. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  165. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  175. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  181. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  197. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  201. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +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_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/index.html +1 -1
  211. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  212. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  213. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  214. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  216. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  217. package/dist/web/standalone/.next/server/app/page.js +2 -2
  218. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  220. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  221. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  222. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/middleware.js +2 -2
  225. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  227. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  228. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  229. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  230. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  231. package/dist/web/standalone/.next/static/chunks/{8359.e059d86b255fce1c.js → 8359.7eb3bb8f8ecf4c01.js} +2 -2
  232. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  233. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  234. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-6a95bc41e0f7ec89.js} +1 -1
  238. package/dist/web/standalone/.next/static/css/0262768ec1b89d34.css +1 -0
  239. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  240. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  241. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  242. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  243. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  244. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  245. package/dist/web/standalone/server.js +1 -1
  246. package/dist/welcome-screen.d.ts +0 -7
  247. package/dist/welcome-screen.js +60 -69
  248. package/package.json +5 -4
  249. package/packages/contracts/dist/rpc.test.js +7 -0
  250. package/packages/contracts/dist/rpc.test.js.map +1 -1
  251. package/packages/contracts/dist/workflow.d.ts +21 -0
  252. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  253. package/packages/contracts/dist/workflow.js +24 -0
  254. package/packages/contracts/dist/workflow.js.map +1 -1
  255. package/packages/contracts/src/rpc.test.ts +8 -0
  256. package/packages/contracts/src/workflow.ts +24 -0
  257. package/packages/daemon/package.json +2 -2
  258. package/packages/mcp-server/README.md +14 -3
  259. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  260. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  261. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  262. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  263. package/packages/mcp-server/package.json +2 -2
  264. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  265. package/packages/mcp-server/src/workflow-tools.test.ts +22 -0
  266. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  267. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  268. package/packages/native/package.json +1 -1
  269. package/packages/pi-agent-core/package.json +1 -1
  270. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  271. package/packages/pi-ai/dist/index.d.ts +2 -2
  272. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  273. package/packages/pi-ai/dist/index.js +1 -1
  274. package/packages/pi-ai/dist/index.js.map +1 -1
  275. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  276. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  277. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  278. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  279. package/packages/pi-ai/package.json +1 -1
  280. package/packages/pi-ai/src/index.ts +7 -2
  281. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  282. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  283. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  284. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  292. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  300. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  303. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  309. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  311. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  332. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  333. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  334. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  335. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.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 +27 -26
  340. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  342. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  344. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  345. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  346. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  347. package/packages/pi-coding-agent/package.json +1 -1
  348. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  349. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  350. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
  351. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  352. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  353. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  354. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  355. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  356. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  357. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
  358. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
  359. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  360. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  361. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  362. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  363. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  364. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  365. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  366. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  367. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  368. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  369. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  370. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  372. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  373. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  374. package/packages/pi-tui/dist/tui.js +5 -0
  375. package/packages/pi-tui/dist/tui.js.map +1 -1
  376. package/packages/pi-tui/package.json +1 -1
  377. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  378. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  379. package/packages/pi-tui/src/tui.ts +6 -0
  380. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  381. package/packages/rpc-client/package.json +1 -1
  382. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  383. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  384. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  385. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  386. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  387. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  388. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  389. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  390. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  391. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  392. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  393. package/pkg/package.json +1 -1
  394. package/src/resources/GSD-WORKFLOW.md +3 -1
  395. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  396. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  397. package/src/resources/extensions/cmux/index.ts +6 -0
  398. package/src/resources/extensions/gsd/auto/contracts.ts +46 -11
  399. package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
  400. package/src/resources/extensions/gsd/auto/loop.ts +113 -9
  401. package/src/resources/extensions/gsd/auto/orchestrator.ts +118 -6
  402. package/src/resources/extensions/gsd/auto/phases.ts +158 -19
  403. package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
  404. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  405. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  406. package/src/resources/extensions/gsd/auto-dashboard.ts +230 -183
  407. package/src/resources/extensions/gsd/auto-dispatch.ts +15 -1
  408. package/src/resources/extensions/gsd/auto-post-unit.ts +201 -138
  409. package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
  410. package/src/resources/extensions/gsd/auto-recovery.ts +7 -209
  411. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  412. package/src/resources/extensions/gsd/auto-start.ts +22 -22
  413. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  414. package/src/resources/extensions/gsd/auto-verification.ts +46 -38
  415. package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
  416. package/src/resources/extensions/gsd/auto.ts +411 -106
  417. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +21 -6
  418. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -2
  419. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  420. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +16 -6
  421. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  422. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +3 -2
  423. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  424. package/src/resources/extensions/gsd/commands/catalog.ts +4 -1
  425. package/src/resources/extensions/gsd/commands/handlers/core.ts +25 -1
  426. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  427. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
  428. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  429. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  430. package/src/resources/extensions/gsd/context-store.ts +120 -1
  431. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  432. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  433. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  434. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  435. package/src/resources/extensions/gsd/git-service.ts +2 -0
  436. package/src/resources/extensions/gsd/gsd-db.ts +7 -23
  437. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  438. package/src/resources/extensions/gsd/health-widget.ts +6 -10
  439. package/src/resources/extensions/gsd/journal.ts +2 -0
  440. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  441. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  442. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  443. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  444. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
  445. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  446. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  447. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  448. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  449. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  450. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  451. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  452. package/src/resources/extensions/gsd/native-git-bridge.ts +14 -13
  453. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  454. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  455. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  456. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  457. package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  458. package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
  459. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  460. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  461. package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
  462. package/src/resources/extensions/gsd/session-lock.ts +41 -0
  463. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  464. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +337 -0
  465. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +69 -0
  466. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +109 -0
  467. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  468. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  469. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  470. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  471. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  472. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  473. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
  474. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  475. package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
  476. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  477. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  478. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +99 -0
  479. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +729 -176
  480. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +408 -4
  481. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +292 -4
  482. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
  483. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +18 -0
  484. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  485. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  486. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  487. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  488. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  489. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  490. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
  491. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  492. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  493. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  494. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +20 -2
  495. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +44 -0
  496. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
  497. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  498. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  499. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  500. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
  501. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  502. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  503. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +26 -0
  504. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  505. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
  506. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  507. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  508. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
  509. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  510. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  511. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  512. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  513. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
  514. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  515. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
  516. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  517. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  518. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  519. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  520. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
  521. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  522. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  523. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +81 -3
  524. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
  525. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
  526. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  527. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
  528. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
  529. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  530. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +24 -0
  531. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +71 -58
  532. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +952 -0
  533. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
  534. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
  535. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  536. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +21 -0
  537. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  538. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  539. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +6 -0
  540. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +158 -58
  541. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +597 -118
  542. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  543. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
  544. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  545. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  546. package/src/resources/extensions/gsd/unit-context-manifest.ts +35 -2
  547. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  548. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  549. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  550. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  551. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  552. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1171 -526
  553. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  554. package/src/resources/extensions/subagent/index.ts +567 -103
  555. package/src/resources/extensions/subagent/launch.ts +131 -0
  556. package/src/resources/extensions/subagent/run-store.ts +218 -0
  557. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  558. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  559. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  560. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  561. package/src/resources/extensions/visual-brief/index.ts +8 -0
  562. package/src/resources/extensions/visual-brief/page-contract.ts +134 -0
  563. package/src/resources/extensions/visual-brief/prompts.ts +147 -0
  564. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +172 -0
  565. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  566. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  567. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  568. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  569. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  570. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
  571. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → Qgr2B_MRhPxC0z8fwv4vT}/_buildManifest.js +0 -0
  572. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → Qgr2B_MRhPxC0z8fwv4vT}/_ssgManifest.js +0 -0
@@ -7,7 +7,6 @@
7
7
  * globals or AutoContext dependency.
8
8
  */
9
9
 
10
- import type { ExtensionContext } from "@gsd/pi-coding-agent";
11
10
  import { parseUnitId } from "./unit-id.js";
12
11
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
13
12
  import { appendEvent } from "./workflow-events.js";
@@ -20,15 +19,6 @@ import { getErrorMessage } from "./error-utils.js";
20
19
  import { logWarning, logError } from "./workflow-logger.js";
21
20
  import { readIntegrationBranch } from "./git-service.js";
22
21
  import { isClosedStatus } from "./status-guards.js";
23
- import {
24
- nativeConflictFiles,
25
- nativeCommit,
26
- nativeCheckoutTheirs,
27
- nativeAddPaths,
28
- nativeMergeAbort,
29
- nativeRebaseAbort,
30
- nativeResetHard,
31
- } from "./native-git-bridge.js";
32
22
  import {
33
23
  resolveSlicePath,
34
24
  resolveSliceFile,
@@ -46,7 +36,6 @@ import {
46
36
  mkdirSync,
47
37
  readFileSync,
48
38
  writeFileSync,
49
- unlinkSync,
50
39
  } from "node:fs";
51
40
  import { execFileSync } from "node:child_process";
52
41
  import { dirname, join } from "node:path";
@@ -1001,205 +990,14 @@ export function writeBlockerPlaceholder(
1001
990
  }
1002
991
 
1003
992
  // ─── Merge State Reconciliation ───────────────────────────────────────────────
993
+ // Body relocated to state-reconciliation/drift/merge-state.ts (ADR-017 #5701).
994
+ // Re-exported here for backward compatibility with existing call sites:
995
+ // auto.ts, auto/loop-deps.ts, tests/integration/auto-recovery.test.ts.
1004
996
 
1005
- /**
1006
- * Best-effort abort of a pending merge/squash and hard-reset to HEAD.
1007
- * Handles both real merges (MERGE_HEAD) and squash merges (SQUASH_MSG).
1008
- */
1009
- function abortAndResetMerge(
1010
- basePath: string,
1011
- hasMergeHead: boolean,
1012
- squashMsgPath: string,
1013
- ): void {
1014
- if (hasMergeHead) {
1015
- try {
1016
- nativeMergeAbort(basePath);
1017
- } catch (err) {
1018
- /* best-effort */
1019
- logWarning("recovery", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
1020
- }
1021
- } else if (squashMsgPath) {
1022
- try {
1023
- unlinkSync(squashMsgPath);
1024
- } catch (err) {
1025
- /* best-effort */
1026
- logWarning("recovery", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
1027
- }
1028
- }
1029
- try {
1030
- nativeResetHard(basePath);
1031
- } catch (err) {
1032
- /* best-effort */
1033
- logError("recovery", `git reset failed: ${err instanceof Error ? err.message : String(err)}`);
1034
- }
1035
- }
1036
-
1037
- export type MergeReconcileResult = "clean" | "reconciled" | "blocked";
1038
-
1039
- /**
1040
- * Detect and abort other in-progress git operations left behind by a SIGKILL'd
1041
- * worker (rebase, cherry-pick, revert). Without this, a killed worker mid-rebase
1042
- * leaves `.git/rebase-merge/` or `.git/CHERRY_PICK_HEAD` and the worktree is
1043
- * wedged until the user manually runs the matching `--abort`.
1044
- *
1045
- * Called before merge-state reconciliation because these states block any
1046
- * subsequent merge/commit operation. (Issue #4980 HIGH-7)
1047
- */
1048
- function reconcileOtherInProgressGitOps(
1049
- basePath: string,
1050
- ctx: ExtensionContext,
1051
- ): "clean" | "reconciled" | "blocked" {
1052
- const gitDir = join(basePath, ".git");
1053
- const states: Array<{
1054
- label: string;
1055
- indicators: string[];
1056
- abort: () => void;
1057
- }> = [
1058
- {
1059
- label: "rebase",
1060
- indicators: [join(gitDir, "rebase-merge"), join(gitDir, "rebase-apply")],
1061
- abort: () => nativeRebaseAbort(basePath),
1062
- },
1063
- {
1064
- label: "cherry-pick",
1065
- indicators: [join(gitDir, "CHERRY_PICK_HEAD")],
1066
- abort: () => {
1067
- // No native helper; fall back to git CLI.
1068
- try {
1069
- execFileSync("git", ["cherry-pick", "--abort"], {
1070
- cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8",
1071
- });
1072
- } catch (err) { logWarning("recovery", `cherry-pick --abort failed: ${getErrorMessage(err)}`); }
1073
- },
1074
- },
1075
- {
1076
- label: "revert",
1077
- indicators: [join(gitDir, "REVERT_HEAD")],
1078
- abort: () => {
1079
- try {
1080
- execFileSync("git", ["revert", "--abort"], {
1081
- cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8",
1082
- });
1083
- } catch (err) { logWarning("recovery", `revert --abort failed: ${getErrorMessage(err)}`); }
1084
- },
1085
- },
1086
- ];
1087
-
1088
- let reconciled = false;
1089
- for (const s of states) {
1090
- const present = s.indicators.some((p) => existsSync(p));
1091
- if (!present) continue;
1092
- try {
1093
- s.abort();
1094
- ctx.ui.notify(
1095
- `Detected leftover ${s.label} state from prior session — aborted.`,
1096
- "warning",
1097
- );
1098
- reconciled = true;
1099
- } catch (err) {
1100
- logError("recovery", `${s.label} abort failed: ${getErrorMessage(err)}`);
1101
- ctx.ui.notify(
1102
- `Detected leftover ${s.label} state but auto-abort failed. ` +
1103
- `Run \`git ${s.label} --abort\` manually before retrying.`,
1104
- "error",
1105
- );
1106
- return "blocked";
1107
- }
1108
- }
1109
- return reconciled ? "reconciled" : "clean";
1110
- }
1111
-
1112
- /**
1113
- * Detect leftover merge state from a prior session and reconcile it.
1114
- * If MERGE_HEAD or SQUASH_MSG exists, check whether conflicts are resolved.
1115
- * If resolved: finalize the commit. If only .gsd conflicts remain: auto-resolve.
1116
- * If code conflicts remain: fail safe without modifying the worktree.
1117
- */
1118
- export function reconcileMergeState(
1119
- basePath: string,
1120
- ctx: ExtensionContext,
1121
- ): MergeReconcileResult {
1122
- // First, abort any rebase/cherry-pick/revert left over from a SIGKILL'd
1123
- // worker. Doing this before the merge-state check unblocks any merge that
1124
- // would otherwise refuse with "you have unfinished operation". (HIGH-7)
1125
- const otherOpsResult = reconcileOtherInProgressGitOps(basePath, ctx);
1126
- if (otherOpsResult === "blocked") return "blocked";
1127
-
1128
- const mergeHeadPath = join(basePath, ".git", "MERGE_HEAD");
1129
- const squashMsgPath = join(basePath, ".git", "SQUASH_MSG");
1130
- const hasMergeHead = existsSync(mergeHeadPath);
1131
- const hasSquashMsg = existsSync(squashMsgPath);
1132
- if (!hasMergeHead && !hasSquashMsg) {
1133
- // If we cleaned up another op type, return "reconciled" so the caller
1134
- // re-derives state from a known-good baseline.
1135
- return otherOpsResult === "reconciled" ? "reconciled" : "clean";
1136
- }
1137
-
1138
- const conflictedFiles = nativeConflictFiles(basePath);
1139
- if (conflictedFiles.length === 0) {
1140
- // All conflicts resolved — finalize the merge/squash commit
1141
- try {
1142
- const commitSha = nativeCommit(basePath, "chore(gsd): reconcile merge state");
1143
- if (commitSha) {
1144
- const mode = hasMergeHead ? "merge" : "squash commit";
1145
- ctx.ui.notify(`Finalized leftover ${mode} from prior session.`, "info");
1146
- } else {
1147
- ctx.ui.notify("No new commit needed for leftover merge/squash state — already committed.", "info");
1148
- }
1149
- } catch (err) {
1150
- const errorMessage = getErrorMessage(err);
1151
- ctx.ui.notify(`Failed to finalize leftover merge/squash commit: ${errorMessage}`, "error");
1152
- return "blocked";
1153
- }
1154
- } else {
1155
- // Still conflicted — try auto-resolving .gsd/ state file conflicts (#530)
1156
- const gsdConflicts = conflictedFiles.filter((f) => f.startsWith(".gsd/"));
1157
- const codeConflicts = conflictedFiles.filter((f) => !f.startsWith(".gsd/"));
1158
-
1159
- if (gsdConflicts.length > 0 && codeConflicts.length === 0) {
1160
- // All conflicts are in .gsd/ state files — auto-resolve by accepting theirs
1161
- let resolved = true;
1162
- try {
1163
- nativeCheckoutTheirs(basePath, gsdConflicts);
1164
- nativeAddPaths(basePath, gsdConflicts);
1165
- } catch (e) {
1166
- logError("recovery", `auto-resolve .gsd/ conflicts failed: ${(e as Error).message}`);
1167
- resolved = false;
1168
- }
1169
- if (resolved) {
1170
- try {
1171
- nativeCommit(
1172
- basePath,
1173
- "chore: auto-resolve .gsd/ state file conflicts",
1174
- );
1175
- ctx.ui.notify(
1176
- `Auto-resolved ${gsdConflicts.length} .gsd/ state file conflict(s) from prior merge.`,
1177
- "info",
1178
- );
1179
- } catch (e) {
1180
- logError("recovery", `auto-commit .gsd/ conflict resolution failed: ${(e as Error).message}`);
1181
- resolved = false;
1182
- }
1183
- }
1184
- if (!resolved) {
1185
- abortAndResetMerge(basePath, hasMergeHead, squashMsgPath);
1186
- ctx.ui.notify(
1187
- "Detected leftover merge state — auto-resolve failed, cleaned up. Re-deriving state.",
1188
- "warning",
1189
- );
1190
- }
1191
- } else {
1192
- // Code conflicts present — fail safe and preserve any manual resolution
1193
- // work instead of discarding it with merge --abort/reset --hard.
1194
- ctx.ui.notify(
1195
- "Detected leftover merge state with unresolved code conflicts. Auto-mode will pause without modifying the worktree so manual conflict resolution is preserved.",
1196
- "error",
1197
- );
1198
- return "blocked";
1199
- }
1200
- }
1201
- return "reconciled";
1202
- }
997
+ export {
998
+ reconcileMergeState,
999
+ type MergeReconcileResult,
1000
+ } from "./state-reconciliation/drift/merge-state.js";
1203
1001
 
1204
1002
  // ─── Loop Remediation ─────────────────────────────────────────────────────────
1205
1003
 
@@ -56,3 +56,8 @@ export function recordToolInvocationError(toolName: string, errorMsg: string): v
56
56
  autoSession.lastToolInvocationError = `${toolName}: ${errorMsg}`;
57
57
  }
58
58
  }
59
+
60
+ export function clearToolInvocationError(): void {
61
+ if (!autoSession.active) return;
62
+ autoSession.lastToolInvocationError = null;
63
+ }
@@ -904,29 +904,24 @@ export async function bootstrapAutoSession(
904
904
  {
905
905
  const orphan = findUnmergedCompletedMilestone(base, getIsolationMode(base));
906
906
  if (orphan && orphan !== state.activeMilestone?.id) {
907
- const priorBasePath = s.basePath;
908
- const priorOriginalBasePath = s.originalBasePath;
909
- s.originalBasePath = base;
910
- s.basePath = getAutoWorktreePath(base, orphan) ?? base;
911
- const result = _mergeOrphanCompletedMilestone(buildLifecycle(), orphan, ctx.ui);
907
+ // ADR-016 phase 2 / B4 (#5622): the swap-run-revert protocol for
908
+ // the orphan-merge dance is owned by `adoptOrphanWorktree`. The
909
+ // verb snapshots prior `s.basePath` / `s.originalBasePath`, swaps
910
+ // into the orphan worktree, runs the merge callback under the
911
+ // swap, and reverts (or holds the swap) based on the result.
912
+ // Callers can no longer forget the revert step on failure — the
913
+ // pattern that originally motivated this verb.
914
+ const lifecycle = buildLifecycle();
915
+ const result = lifecycle.adoptOrphanWorktree(orphan, base, () =>
916
+ _mergeOrphanCompletedMilestone(lifecycle, orphan, ctx.ui),
917
+ );
912
918
  if (!result.merged) {
913
- s.basePath = base;
914
- s.originalBasePath = base;
915
- try {
916
- process.chdir(base);
917
- } catch (err) {
918
- logWarning("bootstrap", `could not restore cwd after orphan merge failure: ${err instanceof Error ? err.message : String(err)}`);
919
- }
919
+ // Verb already restored basePath/originalBasePath to `base` and
920
+ // chdir'd there. Return early.
920
921
  return releaseLockAndReturn();
921
922
  }
922
- if (!s.active) {
923
- s.basePath = priorBasePath || base;
924
- s.originalBasePath = priorOriginalBasePath || base;
925
- }
926
- if (result.merged) {
927
- invalidateAllCaches();
928
- state = await deriveState(base);
929
- }
923
+ invalidateAllCaches();
924
+ state = await deriveState(base);
930
925
  }
931
926
  }
932
927
 
@@ -1040,7 +1035,10 @@ export async function bootstrapAutoSession(
1040
1035
  s.stepMode = requestedStepMode;
1041
1036
  s.verbose = verboseMode;
1042
1037
  s.cmdCtx = ctx;
1043
- s.basePath = base;
1038
+ // ADR-016 phase 2 / B2 (#5620): single owner of bootstrap basePath
1039
+ // mutation. Sets s.basePath = base and s.originalBasePath = base
1040
+ // (originalBasePath is empty on a fresh bootstrap).
1041
+ buildLifecycle().adoptSessionRoot(base);
1044
1042
  s.unitDispatchCount.clear();
1045
1043
  s.unitRecoveryCount.clear();
1046
1044
  s.lastBudgetAlertLevel = 0;
@@ -1098,7 +1096,9 @@ export async function bootstrapAutoSession(
1098
1096
  }
1099
1097
 
1100
1098
  // ── Auto-worktree setup ──
1101
- s.originalBasePath = base;
1099
+ // s.originalBasePath was set to `base` by `adoptSessionRoot(base)` above
1100
+ // (ADR-016 phase 2 / B2, #5620). The redundant assignment that used to
1101
+ // live here is gone.
1102
1102
 
1103
1103
  const isUnderGsdWorktrees = (p: string): boolean => {
1104
1104
  // Direct layout: /.gsd/worktrees/
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Auto-mode unit closeout metrics, activity capture, and ghost-run detection.
3
+
1
4
  /**
2
5
  * Unit closeout helper — consolidates the repeated pattern of
3
6
  * snapshotting metrics + saving activity log + extracting memories
@@ -24,6 +27,54 @@ export interface CloseoutOptions {
24
27
  gitError?: string;
25
28
  }
26
29
 
30
+ export interface UnitActivitySnapshot {
31
+ elapsedMs: number;
32
+ toolCalls: number;
33
+ assistantMessages: number;
34
+ }
35
+
36
+ export const GHOST_COMPLETION_MAX_ELAPSED_MS = 500;
37
+
38
+ export function snapshotUnitActivity(
39
+ ctx: ExtensionContext,
40
+ startedAt: number,
41
+ now = Date.now(),
42
+ ): UnitActivitySnapshot {
43
+ let toolCalls = 0;
44
+ let assistantMessages = 0;
45
+ const entries = ctx.sessionManager.getEntries() ?? [];
46
+
47
+ for (const entry of entries) {
48
+ if (entry.type !== "message") continue;
49
+ const msg = (entry as any).message;
50
+ if (!msg || msg.role !== "assistant") continue;
51
+ assistantMessages++;
52
+ if (!Array.isArray(msg.content)) continue;
53
+ for (const block of msg.content) {
54
+ if (block?.type === "toolCall") toolCalls++;
55
+ }
56
+ }
57
+
58
+ return {
59
+ elapsedMs: Math.max(0, now - startedAt),
60
+ toolCalls,
61
+ assistantMessages,
62
+ };
63
+ }
64
+
65
+ export function isSuspiciousGhostCompletion(
66
+ ctx: ExtensionContext,
67
+ startedAt: number,
68
+ maxElapsedMs = GHOST_COMPLETION_MAX_ELAPSED_MS,
69
+ ): boolean {
70
+ const activity = snapshotUnitActivity(ctx, startedAt);
71
+ return (
72
+ activity.elapsedMs < maxElapsedMs &&
73
+ activity.toolCalls === 0 &&
74
+ activity.assistantMessages === 0
75
+ );
76
+ }
77
+
27
78
  /**
28
79
  * Snapshot metrics, save activity log, and fire-and-forget memory extraction
29
80
  * for a completed unit. Returns the activity log file path (if any).
@@ -39,6 +39,8 @@ import type { VerificationResult as VerificationGateResult } from "./types.js";
39
39
  import { join } from "node:path";
40
40
  import { resolveUokFlags } from "./uok/flags.js";
41
41
  import { UokGateRunner } from "./uok/gate-runner.js";
42
+ import { verificationRetryKey } from "./auto/verification-retry-policy.js";
43
+ import { decideVerificationVerdict } from "./verification-verdict.js";
42
44
 
43
45
  export interface VerificationContext {
44
46
  s: AutoSession;
@@ -48,12 +50,6 @@ export interface VerificationContext {
48
50
 
49
51
  export type VerificationResult = "continue" | "retry" | "pause";
50
52
 
51
- function isInfraVerificationFailure(stderr: string): boolean {
52
- return /\b(ENOENT|ENOTFOUND|ETIMEDOUT|ECONNRESET|EAI_AGAIN|spawn\s+\S+\s+ENOENT|command not found)\b/i.test(
53
- stderr,
54
- );
55
- }
56
-
57
53
  /**
58
54
  * Post-unit guard for `validate-milestone` units (#4094).
59
55
  *
@@ -195,7 +191,7 @@ async function countIncompleteSlices(basePath: string, milestoneId: string): Pro
195
191
  /**
196
192
  * Run the verification gate for the current execute-task unit.
197
193
  * Returns:
198
- * - "continue" — gate passed (or no checks configured), proceed normally
194
+ * - "continue" — host-owned verification passed, proceed normally
199
195
  * - "retry" — gate failed with retries remaining, s.pendingVerificationRetry set for loop re-iteration
200
196
  * - "pause" — gate failed with retries exhausted, pauseAuto already called
201
197
  */
@@ -259,6 +255,11 @@ export async function runPostUnitVerification(
259
255
  }
260
256
  }
261
257
 
258
+ const verdict = decideVerificationVerdict(s.currentUnit.type, result);
259
+ if (!verdict.passed) {
260
+ result.passed = false;
261
+ }
262
+
262
263
  if (uokFlags.gates) {
263
264
  const gateRunner = new UokGateRunner();
264
265
  gateRunner.register({
@@ -271,10 +272,12 @@ export async function runPostUnitVerification(
271
272
  : "verification",
272
273
  rationale: result.passed
273
274
  ? "verification checks passed"
274
- : "verification checks failed",
275
+ : verdict.reason === "no-host-checks"
276
+ ? "no runnable host-owned verification checks discovered"
277
+ : "verification checks failed",
275
278
  findings: result.passed
276
279
  ? ""
277
- : formatFailureContext(result),
280
+ : verdict.failureContext || formatFailureContext(result),
278
281
  }),
279
282
  });
280
283
 
@@ -331,7 +334,8 @@ export async function runPostUnitVerification(
331
334
  }
332
335
 
333
336
  // Write verification evidence JSON
334
- const attempt = s.verificationRetryCount.get(s.currentUnit.id) ?? 0;
337
+ const retryKey = verificationRetryKey(s.currentUnit.type, s.currentUnit.id);
338
+ const attempt = s.verificationRetryCount.get(retryKey) ?? 0;
335
339
  if (mid && sid && tid) {
336
340
  try {
337
341
  const sDir = resolveSlicePath(s.basePath, mid, sid);
@@ -341,13 +345,18 @@ export async function runPostUnitVerification(
341
345
  writeVerificationJSON(result, tasksDir, tid, s.currentUnit.id);
342
346
  } else {
343
347
  const nextAttempt = attempt + 1;
348
+ const includeRetryMetadata =
349
+ !result.passed &&
350
+ verdict.retryable &&
351
+ autoFixEnabled &&
352
+ nextAttempt <= maxRetries;
344
353
  writeVerificationJSON(
345
354
  result,
346
355
  tasksDir,
347
356
  tid,
348
357
  s.currentUnit.id,
349
- nextAttempt,
350
- maxRetries,
358
+ includeRetryMetadata ? nextAttempt : undefined,
359
+ includeRetryMetadata ? maxRetries : undefined,
351
360
  );
352
361
  }
353
362
  }
@@ -356,25 +365,6 @@ export async function runPostUnitVerification(
356
365
  }
357
366
  }
358
367
 
359
- const advisoryFailure =
360
- !result.passed &&
361
- (result.discoverySource === "package-json" ||
362
- result.checks.some((check) =>
363
- isInfraVerificationFailure(check.stderr),
364
- ));
365
-
366
- if (advisoryFailure) {
367
- s.verificationRetryCount.delete(s.currentUnit.id);
368
- s.pendingVerificationRetry = null;
369
- ctx.ui.notify(
370
- result.discoverySource === "package-json"
371
- ? "Verification failed in auto-discovered package.json checks — treating as advisory."
372
- : "Verification failed due to infrastructure/runtime environment issues — treating as advisory.",
373
- "warning",
374
- );
375
- return "continue";
376
- }
377
-
378
368
  // ── Post-execution checks (run after main verification passes for execute-task units) ──
379
369
  let postExecChecks: PostExecutionCheckJSON[] | undefined;
380
370
  let postExecBlockingFailure = false;
@@ -565,13 +555,26 @@ export async function runPostUnitVerification(
565
555
 
566
556
  // ── Auto-fix retry logic ──
567
557
  if (result.passed) {
568
- s.verificationRetryCount.delete(s.currentUnit.id);
558
+ s.verificationRetryCount.delete(retryKey);
559
+ s.verificationRetryFailureHashes.delete(retryKey);
569
560
  s.pendingVerificationRetry = null;
570
561
  return "continue";
562
+ } else if (verdict.reason === "no-host-checks") {
563
+ s.verificationRetryCount.delete(retryKey);
564
+ s.verificationRetryFailureHashes.delete(retryKey);
565
+ s.pendingVerificationRetry = null;
566
+ ctx.ui.notify(
567
+ "Verification gate FAILED — no runnable host-owned verification checks were discovered. Pausing for human review.",
568
+ "error",
569
+ );
570
+ process.stderr.write(`verification-gate: ${verdict.failureContext}\n`);
571
+ await pauseAuto(ctx, pi);
572
+ return "pause";
571
573
  } else if (postExecBlockingFailure) {
572
574
  // Post-execution failures are cross-task consistency issues — retrying the same task won't fix them.
573
575
  // Skip retry and pause immediately for human review.
574
- s.verificationRetryCount.delete(s.currentUnit.id);
576
+ s.verificationRetryCount.delete(retryKey);
577
+ s.verificationRetryFailureHashes.delete(retryKey);
575
578
  s.pendingVerificationRetry = null;
576
579
  ctx.ui.notify(
577
580
  `Post-execution checks failed — cross-task consistency issue detected, pausing for human review`,
@@ -581,10 +584,10 @@ export async function runPostUnitVerification(
581
584
  return "pause";
582
585
  } else if (autoFixEnabled && attempt + 1 <= maxRetries) {
583
586
  const nextAttempt = attempt + 1;
584
- s.verificationRetryCount.set(s.currentUnit.id, nextAttempt);
587
+ s.verificationRetryCount.set(retryKey, nextAttempt);
585
588
  s.pendingVerificationRetry = {
586
589
  unitId: s.currentUnit.id,
587
- failureContext: formatFailureContext(result),
590
+ failureContext: verdict.failureContext || formatFailureContext(result),
588
591
  attempt: nextAttempt,
589
592
  };
590
593
  const failedCmds = result.checks
@@ -601,7 +604,8 @@ export async function runPostUnitVerification(
601
604
  return "retry";
602
605
  } else {
603
606
  // Gate failed, retries exhausted
604
- s.verificationRetryCount.delete(s.currentUnit.id);
607
+ s.verificationRetryCount.delete(retryKey);
608
+ s.verificationRetryFailureHashes.delete(retryKey);
605
609
  s.pendingVerificationRetry = null;
606
610
  const exhaustedFails = result.checks
607
611
  .filter((c) => c.exitCode !== 0)
@@ -617,9 +621,13 @@ export async function runPostUnitVerification(
617
621
  return "pause";
618
622
  }
619
623
  } catch (err) {
620
- // Gate errors are non-fatal
621
624
  logWarning("engine", `verification-gate error: ${(err as Error).message}`);
622
- return "continue";
625
+ ctx.ui.notify(
626
+ `Verification gate errored before producing an authoritative verdict: ${(err as Error).message}`,
627
+ "error",
628
+ );
629
+ await pauseAuto(ctx, pi);
630
+ return "pause";
623
631
  }
624
632
  }
625
633
 
@@ -1502,6 +1502,14 @@ function autoCommitDirtyState(cwd: string): boolean {
1502
1502
  * On merge conflict: throws MergeConflictError.
1503
1503
  * On "nothing to commit" after squash: safe only if milestone work is already
1504
1504
  * on the integration branch. Throws if unanchored code changes would be lost.
1505
+ *
1506
+ * @internal **Do not call directly.** This is the inner squash-merge primitive
1507
+ * for the Worktree Lifecycle Module (ADR-016 phase 2 / A3, issue #5619).
1508
+ * Production callers must go through `WorktreeLifecycle.mergeMilestoneStandalone`
1509
+ * or `WorktreeLifecycle.exitMilestone({ merge: true })`. The export keyword
1510
+ * is preserved only so `auto.ts:buildWorktreeLifecycleDeps()` can wire this
1511
+ * function through the Module's deps seam — that is the construction of the
1512
+ * seam, not a bypass.
1505
1513
  */
1506
1514
  export function mergeMilestoneToMain(
1507
1515
  originalBasePath_: string,