gsd-pi 2.77.0-dev.eaa4973bc → 2.78.0-dev.aeeb2ca00

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 (545) hide show
  1. package/README.md +53 -17
  2. package/dist/claude-cli-check.js +46 -10
  3. package/dist/headless.js +49 -4
  4. package/dist/resource-loader.d.ts +40 -0
  5. package/dist/resource-loader.js +32 -13
  6. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  7. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  8. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  9. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  10. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  11. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  12. package/dist/resources/extensions/claude-code-cli/readiness.js +72 -16
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +481 -17
  14. package/dist/resources/extensions/github-sync/templates.js +103 -0
  15. package/dist/resources/extensions/google-search/index.js +3 -2
  16. package/dist/resources/extensions/gsd/auto/loop.js +124 -2
  17. package/dist/resources/extensions/gsd/auto/phases.js +57 -39
  18. package/dist/resources/extensions/gsd/auto/session.js +6 -2
  19. package/dist/resources/extensions/gsd/auto-dispatch.js +142 -29
  20. package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
  21. package/dist/resources/extensions/gsd/auto-post-unit.js +150 -64
  22. package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
  23. package/dist/resources/extensions/gsd/auto-recovery.js +197 -48
  24. package/dist/resources/extensions/gsd/auto-start.js +107 -29
  25. package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
  26. package/dist/resources/extensions/gsd/auto-worktree.js +122 -26
  27. package/dist/resources/extensions/gsd/auto.js +76 -21
  28. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
  29. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
  30. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +3 -6
  31. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
  32. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
  33. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  34. package/dist/resources/extensions/gsd/component-types.js +69 -0
  35. package/dist/resources/extensions/gsd/context-store.js +23 -7
  36. package/dist/resources/extensions/gsd/detection.js +49 -1
  37. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -17
  38. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  39. package/dist/resources/extensions/gsd/forensics.js +106 -0
  40. package/dist/resources/extensions/gsd/gate-registry.js +2 -2
  41. package/dist/resources/extensions/gsd/git-constants.js +28 -1
  42. package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
  43. package/dist/resources/extensions/gsd/git-service.js +126 -2
  44. package/dist/resources/extensions/gsd/gsd-db.js +6 -3
  45. package/dist/resources/extensions/gsd/guided-flow.js +39 -13
  46. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  47. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  48. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  49. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  50. package/dist/resources/extensions/gsd/model-router.js +6 -0
  51. package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
  52. package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
  53. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  54. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  55. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  56. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  57. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  58. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
  59. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  60. package/dist/resources/extensions/gsd/session-lock.js +19 -10
  61. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  62. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  63. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
  64. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  65. package/dist/resources/extensions/gsd/state.js +69 -58
  66. package/dist/resources/extensions/gsd/sync-lock.js +98 -42
  67. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  68. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  69. package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
  70. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  71. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  72. package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
  73. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  74. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  75. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  76. package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
  77. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  78. package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
  79. package/dist/resources/extensions/gsd/worktree-manager.js +85 -8
  80. package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
  81. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  82. package/dist/resources/extensions/mcp-client/index.js +3 -1
  83. package/dist/resources/extensions/ollama/index.js +5 -1
  84. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  85. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  86. package/dist/web/standalone/.next/BUILD_ID +1 -1
  87. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  88. package/dist/web/standalone/.next/build-manifest.json +2 -2
  89. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  90. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/index.html +1 -1
  108. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  115. package/dist/web/standalone/.next/server/chunks/1926.js +1 -1
  116. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  117. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  119. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  120. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  121. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  122. package/package.json +2 -3
  123. package/packages/daemon/package.json +2 -2
  124. package/packages/daemon/src/logger.ts +4 -3
  125. package/packages/mcp-server/dist/server.d.ts +24 -0
  126. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  127. package/packages/mcp-server/dist/server.js +88 -87
  128. package/packages/mcp-server/dist/server.js.map +1 -1
  129. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  130. package/packages/mcp-server/dist/workflow-tools.js +15 -6
  131. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  132. package/packages/mcp-server/package.json +2 -2
  133. package/packages/mcp-server/src/mcp-server.test.ts +25 -3
  134. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  135. package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
  136. package/packages/mcp-server/src/server.ts +131 -105
  137. package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
  138. package/packages/mcp-server/src/workflow-tools.ts +19 -6
  139. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  140. package/packages/native/package.json +2 -2
  141. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  142. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  143. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  144. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  145. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  146. package/packages/pi-agent-core/package.json +1 -1
  147. package/packages/pi-agent-core/src/agent-loop.test.ts +5 -15
  148. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  149. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  150. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  151. package/packages/pi-ai/dist/models/capability-patches.js +9 -2
  152. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  153. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  154. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  155. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  156. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  157. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  158. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  159. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  160. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  161. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  162. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  163. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  164. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  165. package/packages/pi-ai/dist/models.test.js +36 -11
  166. package/packages/pi-ai/dist/models.test.js.map +1 -1
  167. package/packages/pi-ai/package.json +1 -1
  168. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  169. package/packages/pi-ai/src/models/capability-patches.ts +10 -2
  170. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  171. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  172. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  173. package/packages/pi-ai/src/models.test.ts +48 -11
  174. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  175. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
  176. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  177. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  178. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  180. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  181. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  182. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/extensions/loader.js +61 -0
  184. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +30 -4
  186. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +17 -0
  188. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  190. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  192. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  193. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  194. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  195. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  197. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  198. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  199. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  200. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  201. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -2
  203. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  204. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  205. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  206. package/packages/pi-coding-agent/dist/index.js +1 -0
  207. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  209. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  210. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  211. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  212. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  214. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  216. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
  217. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  218. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +125 -0
  219. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
  221. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  224. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  225. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
  226. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  227. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  228. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  229. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  230. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  231. package/packages/pi-coding-agent/package.json +1 -1
  232. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
  233. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  234. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  235. package/packages/pi-coding-agent/src/core/extensions/loader.ts +58 -0
  236. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +35 -4
  237. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +20 -0
  238. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  239. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  240. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  241. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  242. package/packages/pi-coding-agent/src/core/system-prompt.ts +35 -1
  243. package/packages/pi-coding-agent/src/index.ts +1 -0
  244. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  245. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  246. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  247. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +146 -1
  248. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
  249. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
  250. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
  251. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  252. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  253. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +18 -8
  254. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  255. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  256. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  257. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +37 -11
  258. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  259. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  260. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  261. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  262. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  263. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  264. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  265. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  266. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  267. package/packages/pi-tui/dist/components/editor.d.ts +14 -0
  268. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  269. package/packages/pi-tui/dist/components/editor.js +19 -0
  270. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  271. package/packages/pi-tui/dist/components/image.test.js +6 -5
  272. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  273. package/packages/pi-tui/dist/editor-component.d.ts +2 -0
  274. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
  275. package/packages/pi-tui/dist/editor-component.js.map +1 -1
  276. package/packages/pi-tui/package.json +1 -1
  277. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +24 -8
  278. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  279. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +42 -11
  280. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  281. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  282. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  283. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  284. package/packages/pi-tui/src/components/editor.ts +22 -0
  285. package/packages/pi-tui/src/components/image.test.ts +10 -5
  286. package/packages/pi-tui/src/editor-component.ts +3 -0
  287. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  288. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  289. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  290. package/packages/rpc-client/package.json +1 -1
  291. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  292. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  293. package/pkg/package.json +1 -1
  294. package/scripts/install.js +15 -1
  295. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  296. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  297. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  298. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  299. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  300. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  301. package/src/resources/extensions/claude-code-cli/readiness.ts +75 -16
  302. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +518 -19
  303. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +919 -75
  304. package/src/resources/extensions/github-sync/templates.ts +151 -0
  305. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  306. package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
  307. package/src/resources/extensions/google-search/index.ts +3 -2
  308. package/src/resources/extensions/gsd/auto/loop.ts +142 -2
  309. package/src/resources/extensions/gsd/auto/phases.ts +62 -38
  310. package/src/resources/extensions/gsd/auto/session.ts +7 -2
  311. package/src/resources/extensions/gsd/auto-dispatch.ts +156 -29
  312. package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
  313. package/src/resources/extensions/gsd/auto-post-unit.ts +163 -73
  314. package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
  315. package/src/resources/extensions/gsd/auto-recovery.ts +230 -51
  316. package/src/resources/extensions/gsd/auto-start.ts +127 -9
  317. package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
  318. package/src/resources/extensions/gsd/auto-worktree.ts +130 -26
  319. package/src/resources/extensions/gsd/auto.ts +90 -23
  320. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
  321. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
  322. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +3 -7
  323. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
  324. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
  325. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  326. package/src/resources/extensions/gsd/component-types.ts +362 -0
  327. package/src/resources/extensions/gsd/context-store.ts +25 -8
  328. package/src/resources/extensions/gsd/detection.ts +58 -1
  329. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -20
  330. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  331. package/src/resources/extensions/gsd/forensics.ts +118 -1
  332. package/src/resources/extensions/gsd/gate-registry.ts +2 -2
  333. package/src/resources/extensions/gsd/git-constants.ts +30 -1
  334. package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
  335. package/src/resources/extensions/gsd/git-service.ts +149 -2
  336. package/src/resources/extensions/gsd/gsd-db.ts +6 -3
  337. package/src/resources/extensions/gsd/guided-flow.ts +57 -14
  338. package/src/resources/extensions/gsd/journal.ts +11 -1
  339. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  340. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  341. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  342. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  343. package/src/resources/extensions/gsd/model-router.ts +6 -0
  344. package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
  345. package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
  346. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  347. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  348. package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  349. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  350. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  351. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
  352. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  353. package/src/resources/extensions/gsd/session-lock.ts +20 -10
  354. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  355. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  356. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
  357. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  358. package/src/resources/extensions/gsd/state.ts +76 -66
  359. package/src/resources/extensions/gsd/sync-lock.ts +97 -39
  360. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
  361. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  362. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
  363. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
  364. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +133 -292
  365. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  366. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
  367. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
  368. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +93 -0
  369. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  370. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
  371. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +3 -2
  372. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  373. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  374. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  375. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
  376. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  377. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  378. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  379. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  380. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  381. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
  382. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  383. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  384. package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
  385. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  386. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  387. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  388. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  389. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
  390. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
  391. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  392. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
  393. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
  394. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
  395. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
  396. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  397. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  398. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +5 -0
  399. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  400. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  401. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
  402. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  403. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  404. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  405. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  406. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
  407. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  408. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
  409. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +14 -4
  410. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  411. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  412. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
  413. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
  414. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  415. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  416. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
  417. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
  418. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
  419. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  420. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  421. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
  422. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  423. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +8 -37
  424. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  425. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
  426. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  427. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  428. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  429. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  430. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
  431. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  432. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  433. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
  434. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  435. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
  436. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  437. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  438. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  439. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +23 -24
  440. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +32 -0
  441. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  442. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  443. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
  444. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  445. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  446. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  447. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  448. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
  449. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  450. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  451. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
  452. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  453. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  454. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  455. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  456. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  457. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  458. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  459. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
  460. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  461. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  462. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
  463. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  464. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  465. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  466. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  467. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  468. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
  469. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  470. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  471. package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
  472. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  473. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
  474. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
  475. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  476. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
  477. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  478. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  479. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
  480. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  481. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  482. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  483. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
  484. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  485. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +12 -0
  486. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
  487. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  488. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  489. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  490. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
  491. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  492. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  493. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  494. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  495. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  496. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
  497. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
  498. package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
  499. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
  500. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  501. package/src/resources/extensions/gsd/types.ts +3 -3
  502. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  503. package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
  504. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  505. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  506. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  507. package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
  508. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  509. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  510. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  511. package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
  512. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  513. package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
  514. package/src/resources/extensions/gsd/worktree-manager.ts +108 -7
  515. package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
  516. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  517. package/src/resources/extensions/mcp-client/index.ts +3 -1
  518. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  519. package/src/resources/extensions/ollama/index.ts +5 -1
  520. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  521. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  522. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  523. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  524. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  525. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  526. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
  527. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
  528. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
  529. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
  530. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
  531. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
  532. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -157
  533. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  534. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  535. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  536. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  537. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  538. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
  539. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  540. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  541. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  542. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  543. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
  544. /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → cAJH99yNS1UPbeSEiNRrV}/_buildManifest.js +0 -0
  545. /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → cAJH99yNS1UPbeSEiNRrV}/_ssgManifest.js +0 -0
@@ -98,6 +98,66 @@ const ROOT_STATE_FILES = [
98
98
  // because the project root is authoritative for preferences (#2684).
99
99
  ] as const;
100
100
 
101
+ /**
102
+ * Pop a stash entry by tracking the unique marker embedded in its message so
103
+ * concurrent stash operations against the same project root cannot cause us to
104
+ * pop the wrong entry.
105
+ *
106
+ * If `stashMarker` is null or no longer present in the stash list (e.g. a
107
+ * concurrent process popped/dropped it), leaves the stash list untouched and
108
+ * returns null.
109
+ *
110
+ * Throws on pop failure so callers can handle conflict cases the same way
111
+ * they would with the prior `git stash pop` form. When throwing after a
112
+ * targeted pop attempt, the error is annotated with the targeted stash ref.
113
+ *
114
+ * (Issue #4980 HIGH-6)
115
+ */
116
+ function popStashByRef(basePath: string, stashMarker: string | null): string | null {
117
+ let popArg: string | null = null;
118
+ if (stashMarker) {
119
+ try {
120
+ const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
121
+ cwd: basePath,
122
+ stdio: ["ignore", "pipe", "pipe"],
123
+ encoding: "utf-8",
124
+ }).trim().split("\n").filter(Boolean);
125
+ for (const entry of list) {
126
+ const [ref, subject] = entry.split("\0");
127
+ if (ref && subject?.includes(stashMarker)) {
128
+ popArg = ref;
129
+ break;
130
+ }
131
+ }
132
+ } catch (err) {
133
+ logWarning("worktree", `stash list lookup failed; leaving stash untouched: ${err instanceof Error ? err.message : String(err)}`);
134
+ }
135
+ }
136
+ if (!popArg) {
137
+ logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic pop");
138
+ return null;
139
+ }
140
+ try {
141
+ execFileSync("git", ["stash", "pop", popArg], {
142
+ cwd: basePath,
143
+ stdio: ["ignore", "pipe", "pipe"],
144
+ encoding: "utf-8",
145
+ });
146
+ } catch (err) {
147
+ if (err && typeof err === "object") {
148
+ (err as { stashRef?: string }).stashRef = popArg;
149
+ }
150
+ throw err;
151
+ }
152
+ return popArg;
153
+ }
154
+
155
+ function stashRefFromError(err: unknown): string | null {
156
+ if (!err || typeof err !== "object") return null;
157
+ const stashRef = (err as { stashRef?: unknown }).stashRef;
158
+ return typeof stashRef === "string" && stashRef.length > 0 ? stashRef : null;
159
+ }
160
+
101
161
  /**
102
162
  * Check if two filesystem paths resolve to the same real location.
103
163
  * Returns false if either path cannot be resolved (e.g. doesn't exist).
@@ -971,6 +1031,32 @@ export function enterBranchModeForMilestone(
971
1031
  validatedPrefBranch ??
972
1032
  nativeDetectMainBranch(basePath);
973
1033
 
1034
+ // TOCTOU ancestry guard (Issue #4980 HIGH-3).
1035
+ //
1036
+ // The outer `branchExists` check at line 1012 is racy: a concurrent
1037
+ // process (parallel-orchestrator worker, side-by-side `gsd` instance,
1038
+ // or manual `git branch` invocation) may have created the branch with
1039
+ // real commits between that check and this point. `nativeBranchForceReset`
1040
+ // does `git branch -f`, which silently overwrites the branch ref —
1041
+ // orphaning any commits not reachable from `startPoint`. Re-check
1042
+ // immediately before the destructive call and refuse if the branch
1043
+ // suddenly exists with non-ancestor commits.
1044
+ //
1045
+ // Note: under single-threaded execution this is rarely reached, but it
1046
+ // is NOT dead code — it is the only barrier against a TOCTOU-induced
1047
+ // commit loss in this code path.
1048
+ const concurrentlyCreated = nativeBranchExists(basePath, branch);
1049
+ if (
1050
+ concurrentlyCreated &&
1051
+ !nativeIsAncestor(basePath, branch, startPoint)
1052
+ ) {
1053
+ throw new GSDError(
1054
+ GSD_GIT_ERROR,
1055
+ `Branch "${branch}" was created concurrently with commits not reachable from "${startPoint}". ` +
1056
+ `Refusing to force-reset — would orphan prior work. ` +
1057
+ `Resume the existing milestone or run \`git branch -D ${branch}\` to discard.`,
1058
+ );
1059
+ }
974
1060
  // nativeBranchForceReset creates (or resets) branch at startPoint,
975
1061
  // then checkout switches HEAD to it.
976
1062
  nativeBranchForceReset(basePath, branch, startPoint);
@@ -1576,7 +1662,20 @@ export function mergeMilestoneToMain(
1576
1662
 
1577
1663
  // 5. Checkout integration branch (skip if already current — avoids git error
1578
1664
  // when main is already checked out in the project-root worktree, #757)
1665
+ //
1666
+ // Refuse to proceed if the project root is in detached HEAD state. Silently
1667
+ // running `nativeCheckoutBranch(mainBranch)` on a detached HEAD would
1668
+ // abandon the user's deliberately-checked-out commit (mid-bisect, reviewing
1669
+ // a tag, CI checkout-sha) without warning. (Issue #4980 HIGH-10)
1579
1670
  const currentBranchAtBase = nativeGetCurrentBranch(originalBasePath_);
1671
+ if (!currentBranchAtBase || currentBranchAtBase.length === 0) {
1672
+ process.chdir(previousCwd);
1673
+ throw new GSDError(
1674
+ GSD_GIT_ERROR,
1675
+ `Project root is in detached HEAD state — cannot perform milestone merge. ` +
1676
+ `Checkout an integration branch (e.g. \`git checkout ${mainBranch}\`) before resuming.`,
1677
+ );
1678
+ }
1580
1679
  if (currentBranchAtBase !== mainBranch) {
1581
1680
  nativeCheckoutBranch(originalBasePath_, mainBranch);
1582
1681
  }
@@ -1768,6 +1867,11 @@ export function mergeMilestoneToMain(
1768
1867
  }
1769
1868
 
1770
1869
  let stashed = false;
1870
+ // Embed a unique marker in the stash message so subsequent pop/drop targets
1871
+ // the entry we created, not whatever happens to be at stash@{0} (concurrent
1872
+ // milestone merges share the project-root stash list and can shift positions).
1873
+ // (Issue #4980 HIGH-6)
1874
+ let stashMarker: string | null = null;
1771
1875
  try {
1772
1876
  const status = execFileSync("git", ["status", "--porcelain"], {
1773
1877
  cwd: originalBasePath_,
@@ -1775,9 +1879,10 @@ export function mergeMilestoneToMain(
1775
1879
  encoding: "utf-8",
1776
1880
  }).trim();
1777
1881
  if (status) {
1882
+ stashMarker = `gsd-pre-merge:${milestoneId}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
1778
1883
  execFileSync(
1779
1884
  "git",
1780
- ["stash", "push", "--include-untracked", "-m", `gsd: pre-merge stash for ${milestoneId}`],
1885
+ ["stash", "push", "--include-untracked", "-m", `gsd: pre-merge stash for ${milestoneId} [${stashMarker}]`],
1781
1886
  { cwd: originalBasePath_, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
1782
1887
  );
1783
1888
  stashed = true;
@@ -1834,11 +1939,7 @@ export function mergeMilestoneToMain(
1834
1939
  // Pop stash before throwing so local work is not lost.
1835
1940
  if (stashed) {
1836
1941
  try {
1837
- execFileSync("git", ["stash", "pop"], {
1838
- cwd: originalBasePath_,
1839
- stdio: ["ignore", "pipe", "pipe"],
1840
- encoding: "utf-8",
1841
- });
1942
+ popStashByRef(originalBasePath_, stashMarker);
1842
1943
  } catch (err) { /* stash pop conflict is non-fatal */
1843
1944
  logWarning("worktree", `git stash pop failed: ${err instanceof Error ? err.message : String(err)}`);
1844
1945
  }
@@ -1910,11 +2011,7 @@ export function mergeMilestoneToMain(
1910
2011
  // Pop stash before throwing so local work is not lost (#2151).
1911
2012
  if (stashed) {
1912
2013
  try {
1913
- execFileSync("git", ["stash", "pop"], {
1914
- cwd: originalBasePath_,
1915
- stdio: ["ignore", "pipe", "pipe"],
1916
- encoding: "utf-8",
1917
- });
2014
+ popStashByRef(originalBasePath_, stashMarker);
1918
2015
  } catch (err) { /* stash pop conflict is non-fatal */
1919
2016
  logWarning("worktree", `git stash pop failed: ${err instanceof Error ? err.message : String(err)}`);
1920
2017
  }
@@ -1962,13 +2059,11 @@ export function mergeMilestoneToMain(
1962
2059
  // or the commit content. Conflict on pop is non-fatal — the stash entry is
1963
2060
  // preserved and the user can resolve manually with `git stash pop`.
1964
2061
  if (stashed) {
2062
+ let stashRefForDrop: string | null = null;
1965
2063
  try {
1966
- execFileSync("git", ["stash", "pop"], {
1967
- cwd: originalBasePath_,
1968
- stdio: ["ignore", "pipe", "pipe"],
1969
- encoding: "utf-8",
1970
- });
2064
+ stashRefForDrop = popStashByRef(originalBasePath_, stashMarker);
1971
2065
  } catch (e) {
2066
+ stashRefForDrop = stashRefFromError(e);
1972
2067
  logWarning("worktree", `git stash pop failed, attempting conflict resolution: ${(e as Error).message}`);
1973
2068
  // Stash pop after squash merge can conflict on .gsd/ state files that
1974
2069
  // diverged between branches. Left unresolved, these UU entries block
@@ -1997,22 +2092,31 @@ export function mergeMilestoneToMain(
1997
2092
  }
1998
2093
  }
1999
2094
 
2000
- if (nonGsdUU.length === 0) {
2095
+ if (gsdUU.length > 0 && nonGsdUU.length === 0) {
2001
2096
  // All conflicts were .gsd/ files — safe to drop the stash
2002
- try {
2003
- execFileSync("git", ["stash", "drop"], {
2004
- cwd: originalBasePath_,
2005
- stdio: ["ignore", "pipe", "pipe"],
2006
- encoding: "utf-8",
2007
- });
2008
- } catch (err) { /* stash may already be consumed */
2009
- logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
2097
+ if (stashRefForDrop) {
2098
+ try {
2099
+ execFileSync("git", ["stash", "drop", stashRefForDrop], {
2100
+ cwd: originalBasePath_,
2101
+ stdio: ["ignore", "pipe", "pipe"],
2102
+ encoding: "utf-8",
2103
+ });
2104
+ } catch (err) { /* stash may already be consumed */
2105
+ logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
2106
+ }
2107
+ } else {
2108
+ logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
2010
2109
  }
2011
- } else {
2110
+ } else if (nonGsdUU.length > 0) {
2012
2111
  // Non-.gsd conflicts remain — leave stash for manual resolution
2013
2112
  logWarning("reconcile", "Stash pop conflict on non-.gsd files after merge", {
2014
2113
  files: nonGsdUU.join(", "),
2015
2114
  });
2115
+ } else {
2116
+ logWarning(
2117
+ "worktree",
2118
+ "git stash pop failed without resolvable conflict files; leaving stash for manual recovery",
2119
+ );
2016
2120
  }
2017
2121
  }
2018
2122
  }
@@ -84,10 +84,11 @@ import {
84
84
  clearInFlightTools,
85
85
  isToolInvocationError,
86
86
  isQueuedUserMessageSkip,
87
+ isDeterministicPolicyError,
87
88
  } from "./auto-tool-tracking.js";
88
89
  import { closeoutUnit } from "./auto-unit-closeout.js";
89
90
  import { recoverTimedOutUnit } from "./auto-timeout-recovery.js";
90
- import { selectAndApplyModel, resolveModelId } from "./auto-model-selection.js";
91
+ import { selectAndApplyModel, resolveModelId, clearToolBaseline } from "./auto-model-selection.js";
91
92
  import { resetRoutingHistory, recordOutcome } from "./routing-history.js";
92
93
  import {
93
94
  checkPostUnitHooks,
@@ -169,6 +170,7 @@ import {
169
170
  buildLoopRemediationSteps,
170
171
  reconcileMergeState,
171
172
  } from "./auto-recovery.js";
173
+ import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
172
174
  import { resolveDispatch, DISPATCH_RULES } from "./auto-dispatch.js";
173
175
  import { getErrorMessage } from "./error-utils.js";
174
176
  import { recoverFailedMigration } from "./migrate-external.js";
@@ -231,9 +233,7 @@ import { reorderForCaching } from "./prompt-ordering.js";
231
233
 
232
234
  import {
233
235
  AutoSession,
234
- MAX_UNIT_DISPATCHES,
235
236
  STUB_RECOVERY_THRESHOLD,
236
- MAX_LIFETIME_DISPATCHES,
237
237
  NEW_SESSION_TIMEOUT_MS,
238
238
  } from "./auto/session.js";
239
239
  import type {
@@ -242,9 +242,7 @@ import type {
242
242
  StartModel,
243
243
  } from "./auto/session.js";
244
244
  export {
245
- MAX_UNIT_DISPATCHES,
246
245
  STUB_RECOVERY_THRESHOLD,
247
- MAX_LIFETIME_DISPATCHES,
248
246
  NEW_SESSION_TIMEOUT_MS,
249
247
  } from "./auto/session.js";
250
248
  export type {
@@ -336,6 +334,25 @@ function normalizeSessionFilePath(raw: unknown): string | null {
336
334
  return candidate;
337
335
  }
338
336
 
337
+ function synthesizePausedSessionRecovery(
338
+ basePath: string,
339
+ unitType: string,
340
+ unitId: string,
341
+ sessionFile: string,
342
+ ): ReturnType<typeof synthesizeCrashRecovery> {
343
+ const activityDir = join(gsdRoot(basePath), "activity");
344
+ return synthesizeCrashRecovery(basePath, unitType, unitId, sessionFile, activityDir);
345
+ }
346
+
347
+ export function _synthesizePausedSessionRecoveryForTest(
348
+ basePath: string,
349
+ unitType: string,
350
+ unitId: string,
351
+ sessionFile: string,
352
+ ): ReturnType<typeof synthesizeCrashRecovery> {
353
+ return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
354
+ }
355
+
339
356
  export function startAutoDetached(
340
357
  ctx: ExtensionCommandContext,
341
358
  pi: ExtensionAPI,
@@ -543,12 +560,14 @@ export function markToolEnd(toolCallId: string): void {
543
560
  /**
544
561
  * Record a tool invocation error on the current session (#2883).
545
562
  * Called from tool_execution_end when a GSD tool fails with isError.
546
- * Only stores the error if it matches the tool-invocation-error pattern
547
- * (malformed/truncated JSON), not normal business-logic errors.
563
+ * Stores the error if it matches:
564
+ * - tool-invocation-error pattern (malformed/truncated JSON)
565
+ * - queued-user-message skip pattern
566
+ * - deterministic policy rejection (#4973, e.g. context_write_blocked)
548
567
  */
549
568
  export function recordToolInvocationError(toolName: string, errorMsg: string): void {
550
569
  if (!s.active) return;
551
- if (isToolInvocationError(errorMsg) || isQueuedUserMessageSkip(errorMsg)) {
570
+ if (isToolInvocationError(errorMsg) || isQueuedUserMessageSkip(errorMsg) || isDeterministicPolicyError(errorMsg)) {
552
571
  s.lastToolInvocationError = `${toolName}: ${errorMsg}`;
553
572
  }
554
573
  }
@@ -795,6 +814,43 @@ export async function stopAuto(
795
814
  const loadedPreferences = loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences;
796
815
  const reasonSuffix = reason ? ` — ${reason}` : "";
797
816
 
817
+ // #4764 — telemetry: record the exit reason and whether the current milestone
818
+ // was merged before we entered stopAuto. This is the producer-side signal for
819
+ // the #4761 orphan class: milestoneMerged=false + currentMilestoneId present
820
+ // is exactly the pattern that strands work.
821
+ try {
822
+ const { emitAutoExit } = await import("./worktree-telemetry.js");
823
+ type AutoExitReason =
824
+ | "pause" | "stop" | "blocked" | "merge-conflict" | "merge-failed"
825
+ | "slice-merge-conflict" | "all-complete" | "no-active-milestone" | "other";
826
+ // Normalize the free-form reason to a closed set so the telemetry
827
+ // aggregator buckets stably. Raw detail is preserved in the phases.ts
828
+ // notification and the notify'd error string.
829
+ const rawReason = reason ?? "stop";
830
+ const normalizedReason: AutoExitReason = rawReason.startsWith("Blocked:")
831
+ ? "blocked"
832
+ : rawReason.startsWith("Merge conflict")
833
+ ? "merge-conflict"
834
+ : rawReason.startsWith("Merge error") || rawReason.startsWith("Merge failed")
835
+ ? "merge-failed"
836
+ : rawReason.startsWith("slice-merge-conflict")
837
+ ? "slice-merge-conflict"
838
+ : rawReason === "All milestones complete"
839
+ ? "all-complete"
840
+ : rawReason === "No active milestone"
841
+ ? "no-active-milestone"
842
+ : rawReason === "stop" || rawReason === "pause"
843
+ ? rawReason
844
+ : "other";
845
+ emitAutoExit(s.originalBasePath || s.basePath, {
846
+ reason: normalizedReason,
847
+ milestoneId: s.currentMilestoneId ?? undefined,
848
+ milestoneMerged: s.milestoneMergedInPhases === true,
849
+ });
850
+ } catch (err) {
851
+ logWarning("engine", `auto-exit telemetry failed: ${err instanceof Error ? err.message : String(err)}`);
852
+ }
853
+
798
854
  try {
799
855
  // ── Step 1: Timers and locks ──
800
856
  try {
@@ -1050,6 +1106,12 @@ export async function stopAuto(
1050
1106
  restoreProjectRootEnv();
1051
1107
  restoreMilestoneLockEnv();
1052
1108
 
1109
+ // Drop the active-tool baseline so a subsequent /gsd auto run on the
1110
+ // same `pi` instance recaptures from the live tool set rather than
1111
+ // restoring this session's snapshot and silently undoing any tool
1112
+ // changes the user made between sessions (#4959 / CodeRabbit).
1113
+ if (pi) clearToolBaseline(pi);
1114
+
1053
1115
  // Reset all session state in one call
1054
1116
  s.reset();
1055
1117
  }
@@ -1350,6 +1412,15 @@ export async function startAuto(
1350
1412
  return;
1351
1413
  }
1352
1414
 
1415
+ // On a *fresh* start, drop any stale active-tool baseline left by a prior
1416
+ // auto session that didn't run stopAuto cleanly. Skip on resume: pauseAuto
1417
+ // leaves the last provider-trimmed active tools in place, so clearing here
1418
+ // would let the next selectAndApplyModel recapture that already-narrowed
1419
+ // set as the new baseline — exactly the cross-unit poisoning this PR is
1420
+ // fixing (#4959 / CodeRabbit Major). The pre-pause baseline survives in
1421
+ // the WeakMap keyed by `pi`.
1422
+ if (!s.paused) clearToolBaseline(pi);
1423
+
1353
1424
  const requestedStepMode = options?.step ?? false;
1354
1425
  const interruptedAssessment = options?.interrupted ?? null;
1355
1426
  if (options?.milestoneLock !== undefined) {
@@ -1419,7 +1490,15 @@ export async function startAuto(
1419
1490
  // Validate the milestone still exists and isn't already complete (#1664).
1420
1491
  const mDir = resolveMilestonePath(base, meta.milestoneId);
1421
1492
  const summaryFile = resolveMilestoneFile(base, meta.milestoneId, "SUMMARY");
1422
- if (!mDir || summaryFile) {
1493
+ let summaryIsTerminal = false;
1494
+ if (summaryFile) {
1495
+ try {
1496
+ summaryIsTerminal = classifyMilestoneSummaryContent(readFileSync(summaryFile, "utf-8")) !== "failure";
1497
+ } catch {
1498
+ summaryIsTerminal = false;
1499
+ }
1500
+ }
1501
+ if (!mDir || summaryIsTerminal) {
1423
1502
  try { unlinkSync(pausedPath); } catch (err) {
1424
1503
  if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
1425
1504
  logWarning("session", `pause file cleanup failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
@@ -1510,16 +1589,6 @@ export async function startAuto(
1510
1589
  return;
1511
1590
  }
1512
1591
 
1513
- // Lock acquired — now safe to delete the pause file
1514
- if (s.pausedSessionFile) {
1515
- try { unlinkSync(s.pausedSessionFile); } catch (err) {
1516
- if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
1517
- logWarning("session", `pause file cleanup failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1518
- }
1519
- }
1520
- s.pausedSessionFile = null;
1521
- }
1522
-
1523
1592
  s.paused = false;
1524
1593
  s.active = true;
1525
1594
  s.verbose = verboseMode;
@@ -1617,13 +1686,11 @@ export async function startAuto(
1617
1686
  invalidateAllCaches();
1618
1687
 
1619
1688
  if (s.pausedSessionFile) {
1620
- const activityDir = join(gsdRoot(s.basePath), "activity");
1621
- const recovery = synthesizeCrashRecovery(
1689
+ const recovery = synthesizePausedSessionRecovery(
1622
1690
  s.basePath,
1623
1691
  s.currentUnit?.type ?? s.pausedUnitType ?? "unknown",
1624
1692
  s.currentUnit?.id ?? s.pausedUnitId ?? "unknown",
1625
- s.pausedSessionFile ?? undefined,
1626
- activityDir,
1693
+ s.pausedSessionFile,
1627
1694
  );
1628
1695
  if (recovery && recovery.trace.toolCallCount > 0) {
1629
1696
  s.pendingCrashRecovery = recovery.prompt;
@@ -7,6 +7,7 @@ import {
7
7
  maybeHandleEmptyIntentTurn,
8
8
  resetEmptyTurnCounter,
9
9
  } from "../guided-flow.js";
10
+ import { clearPathCache } from "../paths.js";
10
11
  import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
11
12
  import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
12
13
  import { pauseAutoForProviderError } from "../provider-error-pause.js";
@@ -25,7 +26,15 @@ import { blockModel, isModelBlocked } from "../blocked-models.js";
25
26
 
26
27
  const retryState = createRetryState();
27
28
  const MAX_NETWORK_RETRIES = 2;
28
- const MAX_TRANSIENT_AUTO_RESUMES = 8;
29
+ /**
30
+ * Cap on auto-resume attempts for sustained transient-provider errors.
31
+ *
32
+ * Exported so tests assert against the shared constant instead of
33
+ * regex-scraping the source literal (see #4837). Raising this value to
34
+ * handle longer provider overloads should update the single constant; the
35
+ * test in provider-errors.test.ts consumes it directly.
36
+ */
37
+ export const MAX_TRANSIENT_AUTO_RESUMES = 8;
29
38
 
30
39
  /**
31
40
  * Reset the module-level retry state so a resumed auto-session starts fresh.
@@ -76,6 +85,16 @@ export async function handleAgentEnd(
76
85
  event: { messages: any[] },
77
86
  ctx: ExtensionContext,
78
87
  ): Promise<void> {
88
+ // #4648 — Invalidate the directory-listing cache before any artifact-existence
89
+ // checks. The LLM may have written milestone files (CONTEXT.md, ROADMAP.md,
90
+ // PROJECT.md, REQUIREMENTS.md) via tool calls during the turn that just
91
+ // ended. `paths.ts` caches readdir() results without a TTL, so without this
92
+ // flush, `resolveMilestoneFile` returns the pre-write listing and the guards
93
+ // below (`checkAutoStartAfterDiscuss` and `maybeHandleReadyPhraseWithoutFiles`)
94
+ // falsely report files as missing — producing a spurious "ready signal
95
+ // rejected" loop even though the files are on disk.
96
+ clearPathCache();
97
+
79
98
  if (checkAutoStartAfterDiscuss()) {
80
99
  clearDiscussionFlowState();
81
100
  return;