@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.9ad8ae33

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 (575) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +123 -20
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  14. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  15. package/dist/resources/extensions/async-jobs/index.js +65 -0
  16. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  17. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  18. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  19. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  20. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  21. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  22. package/dist/resources/extensions/bg-shell/utilities.js +3 -0
  23. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  24. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  25. package/dist/resources/extensions/browser-tools/index.js +69 -12
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +30 -4
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
  33. package/dist/resources/extensions/gsd/auto/phases.js +49 -6
  34. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
  39. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  40. package/dist/resources/extensions/gsd/auto-start.js +41 -18
  41. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  42. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  43. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  44. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  45. package/dist/resources/extensions/gsd/auto-worktree.js +44 -91
  46. package/dist/resources/extensions/gsd/auto.js +41 -14
  47. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  48. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  49. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
  50. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  51. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  52. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
  53. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
  54. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  55. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  56. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  57. package/dist/resources/extensions/gsd/captures.js +4 -6
  58. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  59. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  60. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  61. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  62. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  63. package/dist/resources/extensions/gsd/constants.js +0 -2
  64. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  65. package/dist/resources/extensions/gsd/db/queries.js +26 -0
  66. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  67. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  68. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  69. package/dist/resources/extensions/gsd/doctor-environment.js +2 -6
  70. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  71. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  72. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
  73. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  74. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  75. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  76. package/dist/resources/extensions/gsd/files.js +33 -19
  77. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  78. package/dist/resources/extensions/gsd/gsd-db.js +2 -1
  79. package/dist/resources/extensions/gsd/guidance.js +158 -0
  80. package/dist/resources/extensions/gsd/guided-flow.js +23 -5
  81. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  82. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  83. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  84. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  85. package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
  86. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  87. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  88. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  89. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  90. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
  91. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  92. package/dist/resources/extensions/gsd/paths.js +27 -0
  93. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  94. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  95. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  96. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  97. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  99. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  100. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  103. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  104. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  105. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  108. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  109. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  110. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  111. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  112. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  113. package/dist/resources/extensions/gsd/publication.js +87 -0
  114. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  115. package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
  116. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  117. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  118. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  119. package/dist/resources/extensions/gsd/state.js +6 -20
  120. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  121. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  122. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  123. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  124. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  125. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  126. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  127. package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
  128. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  129. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  130. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  131. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  132. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  133. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  134. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  135. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  136. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  137. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  138. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  139. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  140. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  141. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  142. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  143. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  144. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  145. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  146. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  147. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  148. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  149. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  150. package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
  151. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  152. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  153. package/dist/resources/extensions/gsd/worktree-root.js +11 -0
  154. package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
  155. package/dist/resources/extensions/gsd/worktree.js +8 -1
  156. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  157. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  158. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  159. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  160. package/dist/resources/shared/package-manager-detection.js +1 -1
  161. package/dist/resources/shared/package.json +3 -0
  162. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  163. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  164. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  165. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  166. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  167. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  168. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  169. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  170. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  171. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  172. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  173. package/dist/update-check.d.ts +2 -0
  174. package/dist/update-check.js +24 -1
  175. package/dist/update-cmd.js +20 -3
  176. package/dist/web/standalone/.next/BUILD_ID +1 -1
  177. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  178. package/dist/web/standalone/.next/build-manifest.json +3 -3
  179. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  180. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  192. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  193. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  194. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/index.html +1 -1
  200. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  207. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  208. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  209. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  212. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  213. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  214. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  215. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  216. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  217. package/dist/web/standalone/package.json +1 -1
  218. package/dist/worktree-cli.js +3 -6
  219. package/dist/worktree-status-banner.js +7 -15
  220. package/package.json +2 -2
  221. package/packages/cloud-mcp-gateway/package.json +2 -2
  222. package/packages/contracts/dist/rpc.d.ts +1 -0
  223. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  224. package/packages/contracts/dist/rpc.js.map +1 -1
  225. package/packages/contracts/dist/workflow.d.ts +4 -0
  226. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  227. package/packages/contracts/dist/workflow.js.map +1 -1
  228. package/packages/contracts/package.json +1 -1
  229. package/packages/daemon/package.json +4 -4
  230. package/packages/gsd-agent-core/package.json +5 -5
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  237. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  240. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  248. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  249. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  250. package/packages/gsd-agent-modes/package.json +7 -7
  251. package/packages/mcp-server/dist/cli.js +9 -1
  252. package/packages/mcp-server/dist/cli.js.map +1 -1
  253. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  254. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  255. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  256. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  257. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  258. package/packages/mcp-server/dist/server.js +4 -0
  259. package/packages/mcp-server/dist/server.js.map +1 -1
  260. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  261. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  262. package/packages/mcp-server/dist/workflow-tools.js +116 -39
  263. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  264. package/packages/mcp-server/package.json +5 -4
  265. package/packages/native/package.json +1 -1
  266. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  267. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  268. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  269. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  270. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  271. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  272. package/packages/pi-agent-core/dist/index.js +3 -0
  273. package/packages/pi-agent-core/dist/index.js.map +1 -1
  274. package/packages/pi-agent-core/package.json +1 -1
  275. package/packages/pi-ai/README.md +1 -0
  276. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  277. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  278. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  279. package/packages/pi-ai/dist/index.d.ts +2 -0
  280. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  281. package/packages/pi-ai/dist/index.js +2 -0
  282. package/packages/pi-ai/dist/index.js.map +1 -1
  283. package/packages/pi-ai/dist/models.generated.d.ts +35 -125
  284. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  285. package/packages/pi-ai/dist/models.generated.js +46 -120
  286. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  287. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  288. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  289. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  290. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  291. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  292. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  293. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  294. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  295. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  296. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  297. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  298. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  299. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  300. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  301. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  303. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  304. package/packages/pi-ai/package.json +3 -2
  305. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  306. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  308. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  311. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  313. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  315. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  317. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/index.js +1 -1
  319. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  321. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  323. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  324. package/packages/pi-coding-agent/package.json +7 -7
  325. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  326. package/packages/pi-tui/dist/tui.js +9 -0
  327. package/packages/pi-tui/dist/tui.js.map +1 -1
  328. package/packages/pi-tui/package.json +2 -2
  329. package/packages/rpc-client/package.json +2 -2
  330. package/pkg/package.json +1 -1
  331. package/src/resources/GSD-WORKFLOW.md +5 -4
  332. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  333. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  334. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  335. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  336. package/src/resources/extensions/async-jobs/index.ts +79 -0
  337. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  338. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  339. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  340. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  341. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  342. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  343. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  344. package/src/resources/extensions/bg-shell/utilities.ts +3 -0
  345. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  346. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  347. package/src/resources/extensions/browser-tools/index.ts +71 -13
  348. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  349. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  350. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  351. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +34 -4
  352. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  353. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  354. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  355. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  356. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  357. package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
  358. package/src/resources/extensions/gsd/auto/phases.ts +65 -26
  359. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  360. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  361. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  362. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  363. package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
  364. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  365. package/src/resources/extensions/gsd/auto-start.ts +42 -21
  366. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  367. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  368. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  369. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  370. package/src/resources/extensions/gsd/auto-worktree.ts +44 -94
  371. package/src/resources/extensions/gsd/auto.ts +52 -16
  372. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  373. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  374. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
  375. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  376. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  377. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
  378. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
  379. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  380. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  381. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  382. package/src/resources/extensions/gsd/captures.ts +4 -6
  383. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  384. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  385. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  386. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  387. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  388. package/src/resources/extensions/gsd/constants.ts +0 -3
  389. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  390. package/src/resources/extensions/gsd/db/queries.ts +37 -0
  391. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  392. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  393. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  394. package/src/resources/extensions/gsd/doctor-environment.ts +2 -7
  395. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  396. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  397. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
  398. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  399. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  400. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  401. package/src/resources/extensions/gsd/files.ts +33 -12
  402. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  403. package/src/resources/extensions/gsd/gsd-db.ts +4 -3
  404. package/src/resources/extensions/gsd/guidance.ts +217 -0
  405. package/src/resources/extensions/gsd/guided-flow.ts +37 -28
  406. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  407. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  408. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  409. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  410. package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
  411. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  412. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  413. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  414. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  415. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
  416. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  417. package/src/resources/extensions/gsd/paths.ts +33 -0
  418. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  419. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  420. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  421. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  422. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  423. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  424. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  425. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  426. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  427. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  428. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  429. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  430. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  431. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  432. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  433. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  434. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  435. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  436. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  437. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  438. package/src/resources/extensions/gsd/publication.ts +122 -0
  439. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  440. package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
  441. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  442. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  443. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  444. package/src/resources/extensions/gsd/state.ts +9 -21
  445. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  446. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  447. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  448. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  449. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  450. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  451. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  452. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  453. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  454. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  455. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  456. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  457. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  458. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  459. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  460. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  461. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  462. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  463. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  464. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  465. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  466. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  467. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  468. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  469. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  470. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  471. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  472. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  473. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  474. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  475. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  476. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
  477. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -58
  478. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  479. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  480. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  481. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  482. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  483. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  484. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  485. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  486. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  487. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  488. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  489. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  490. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  491. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  492. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  493. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
  494. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  495. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  496. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  497. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  498. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  499. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  500. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  501. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  502. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  503. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  504. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  505. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  506. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  507. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  508. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  509. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  510. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  511. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  512. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  513. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  514. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  515. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  516. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  517. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  518. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  519. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  520. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  521. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  522. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  523. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  524. package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
  525. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  526. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  527. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  528. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  529. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  530. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  531. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  532. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  533. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  534. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  535. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  536. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  537. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  538. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  539. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  540. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  541. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  542. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  543. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  544. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  545. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  546. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  547. package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
  548. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  549. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  550. package/src/resources/extensions/gsd/worktree-root.ts +12 -0
  551. package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
  552. package/src/resources/extensions/gsd/worktree.ts +7 -1
  553. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  554. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  555. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  556. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  557. package/src/resources/shared/package-manager-detection.ts +1 -1
  558. package/src/resources/shared/package.json +3 -0
  559. package/src/resources/skills/create-skill/SKILL.md +3 -0
  560. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  561. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  562. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  563. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  564. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  565. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  566. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  567. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  568. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  569. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  570. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  571. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  572. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  573. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  574. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
  575. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
@@ -19,9 +19,9 @@ import {
19
19
  type PostUnitContext,
20
20
  type PreVerificationOpts,
21
21
  } from "../auto-post-unit.js";
22
- import { lastAssistantText } from "../user-input-boundary.js";
23
- import { resolveEffectiveUnitIsolationMode } from "../preferences.js";
24
- import type { Phase } from "../types.js";
22
+ import { lastAssistantText } from "../consent-question.js";
23
+ import { resolveEffectiveUnitIsolationMode, getIsolationMode } from "../preferences.js";
24
+ import type { GSDState, Phase } from "../types.js";
25
25
  import {
26
26
  MAX_RECOVERY_CHARS,
27
27
  BUDGET_THRESHOLDS,
@@ -33,6 +33,7 @@ import {
33
33
  type IterationData,
34
34
  } from "./types.js";
35
35
  import { detectStuck } from "./detect-stuck.js";
36
+ import { STUCK_WINDOW_SIZE } from "./dispatch-history.js";
36
37
  import { runUnit } from "./run-unit.js";
37
38
  import { debugLog } from "../debug-logger.js";
38
39
  import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "../worktree-root.js";
@@ -61,9 +62,10 @@ import { writeUnitRuntimeRecord } from "../unit-runtime.js";
61
62
  import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
62
63
  import { getEligibleSlices } from "../slice-parallel-eligibility.js";
63
64
  import { isSliceParallelActive, startSliceParallel } from "../slice-parallel-orchestrator.js";
64
- import { isDbAvailable, getMilestoneSlices, getSlice, getTask } from "../gsd-db.js";
65
+ import { isDbAvailable, getMilestone, getMilestoneSlices, getSlice, getTask } from "../gsd-db.js";
65
66
  import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
66
67
  import { isClosedStatus } from "../status-guards.js";
68
+ import { findUnmergedCompletedMilestones } from "../unmerged-milestone-guard.js";
67
69
  import { setRuntimeKv } from "../db/runtime-kv.js";
68
70
  import { getLatestForUnit } from "../db/unit-dispatches.js";
69
71
  import { reconcileBeforeSpawn } from "../state-reconciliation.js";
@@ -81,11 +83,8 @@ import { parseUnitId } from "../unit-id.js";
81
83
  import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
82
84
  import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
83
85
  import { getContextPauseAction } from "../auto-budget.js";
84
- import {
85
- getWorkflowTransportSupportError,
86
- getRequiredWorkflowToolsForAutoUnit,
87
- supportsStructuredQuestions,
88
- } from "../workflow-mcp.js";
86
+ import { supportsStructuredQuestions } from "../workflow-mcp.js";
87
+ import { getUnitWorkflowDispatchReadinessError } from "../tool-contract.js";
89
88
  import { prepareWorkflowMcpForProject } from "../workflow-mcp-auto-prep.js";
90
89
  import {
91
90
  applyThinkingLevelForModel,
@@ -107,7 +106,6 @@ import {
107
106
  } from "../root-write-leak-guard.js";
108
107
  import { classifyError, isTransient } from "../error-classifier.js";
109
108
 
110
- export const STUCK_WINDOW_SIZE = 6;
111
109
  const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
112
110
  const ZERO_TOOL_PROVIDER_ERROR_PREFIX_RE =
113
111
  /^(?:api error(?::|$|\s*\()|provider error(?::|$|\s*\()|request failed\b|(?:http\s*)?(?:429|500|502|503)\b|\b(?:econnreset|etimedout|econnrefused|epipe)\b|socket hang up\b|fetch failed\b|(?:network|connection|server) error(?::|$)|connection (?:reset|refused)(?::|$|\s+by\b)|dns\b.*(?:fail|error|timeout)|unexpected eof\b|stream idle timeout\b|partial response received\b|stream_exhausted\b|terminated(?::|$)|(?:connection|stream|request)\b.{0,40}\bterminated\b|other side closed\b|rate.?limit(?:ed| exceeded| reached| error)|too many requests\b|you(?:'ve| have) (?:hit|reached) your (?:\w+ )?limit\b|.*\b(?:usage|session|weekly|daily|monthly|quota) limit\b|limit\b.{0,40}\bresets?\b|out of extra usage\b|service.?unavailable\b|internal(?: server)? error(?::|$)|internal(?:[_-]server)?[_-]error\b|server[_-]error\b|(?:provider|server|api|model|codex|claude|openai|anthropic|gemini)\b.{0,80}\boverloaded\b|overloaded\b.{0,80}\b(?:provider|server|api|model)\b|context (?:window|length) exceed|context window exceed)/i;
@@ -838,6 +836,39 @@ async function failClosedOnFinalizeTimeout(
838
836
  return { action: "break", reason: progressKind };
839
837
  }
840
838
 
839
+ export async function shouldSkipTerminalMilestoneCloseout(
840
+ s: AutoSession,
841
+ state: Pick<GSDState, "phase" | "lastCompletedMilestone" | "activeMilestone">,
842
+ mid?: string | null,
843
+ ): Promise<{ skip: boolean; milestoneId?: string }> {
844
+ const closeoutMilestoneId = mid ?? s.currentMilestoneId ?? state.lastCompletedMilestone?.id;
845
+ if (s.completionStopInProgress) {
846
+ return { skip: true, milestoneId: closeoutMilestoneId };
847
+ }
848
+ if (!closeoutMilestoneId) {
849
+ return { skip: false };
850
+ }
851
+ if (isDbAvailable()) refreshWorkflowDatabaseFromDisk();
852
+ const closeoutBasePath = s.originalBasePath || s.canonicalProjectRoot || s.basePath;
853
+ let closeoutMergePending = false;
854
+ if (getIsolationMode(closeoutBasePath) !== "none") {
855
+ try {
856
+ const blockers = await findUnmergedCompletedMilestones(closeoutBasePath);
857
+ closeoutMergePending = blockers.some((blocker) => blocker.milestoneId === closeoutMilestoneId);
858
+ } catch {
859
+ // Fail open: without git/DB inspection we cannot safely treat closeout as done.
860
+ closeoutMergePending = true;
861
+ }
862
+ }
863
+ const milestoneAlreadyClosedOut = isDbAvailable()
864
+ && isClosedStatus(getMilestone(closeoutMilestoneId)?.status ?? "")
865
+ && !closeoutMergePending;
866
+ if (milestoneAlreadyClosedOut) {
867
+ return { skip: true, milestoneId: closeoutMilestoneId };
868
+ }
869
+ return { skip: false, milestoneId: closeoutMilestoneId };
870
+ }
871
+
841
872
  // ─── runPreDispatch ───────────────────────────────────────────────────────────
842
873
 
843
874
  /**
@@ -1279,6 +1310,14 @@ export async function runPreDispatch(
1279
1310
 
1280
1311
  // ── Terminal conditions ──────────────────────────────────────────────
1281
1312
 
1313
+ if (state.phase === "complete") {
1314
+ const closeoutSkip = await shouldSkipTerminalMilestoneCloseout(s, state, mid);
1315
+ if (closeoutSkip.skip) {
1316
+ debugLog("autoLoop", { phase: "complete", reason: "milestone-already-closed", milestoneId: closeoutSkip.milestoneId });
1317
+ return { action: "break", reason: "milestone-complete" };
1318
+ }
1319
+ }
1320
+
1282
1321
  if (!mid) {
1283
1322
  if (s.currentUnit) {
1284
1323
  await deps.closeoutUnit(
@@ -2324,22 +2363,19 @@ export async function runUnitPhase(
2324
2363
  ? `${(s.currentUnitModel as any).provider ?? ""}/${(s.currentUnitModel as any).id ?? ""}`
2325
2364
  : null;
2326
2365
 
2327
- const compatibilityError = getWorkflowTransportSupportError(
2328
- s.currentUnitModel?.provider ?? ctx.model?.provider,
2329
- getRequiredWorkflowToolsForAutoUnit(unitType),
2330
- {
2331
- projectRoot: s.basePath,
2332
- surface: "auto-mode",
2333
- unitType,
2334
- authMode: s.currentUnitModel?.provider
2335
- ? ctx.modelRegistry.getProviderAuthMode(s.currentUnitModel.provider)
2336
- : ctx.model?.provider
2337
- ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
2338
- : undefined,
2339
- baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
2340
- activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
2341
- },
2342
- );
2366
+ const compatibilityError = getUnitWorkflowDispatchReadinessError({
2367
+ provider: s.currentUnitModel?.provider ?? ctx.model?.provider,
2368
+ projectRoot: s.basePath,
2369
+ surface: "auto-mode",
2370
+ unitType,
2371
+ authMode: s.currentUnitModel?.provider
2372
+ ? ctx.modelRegistry.getProviderAuthMode(s.currentUnitModel.provider)
2373
+ : ctx.model?.provider
2374
+ ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
2375
+ : undefined,
2376
+ baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
2377
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
2378
+ });
2343
2379
  const workflowMcpPrepModel = s.currentUnitModel;
2344
2380
  if (compatibilityError) {
2345
2381
  s.currentUnitRouting = prevUnitRouting;
@@ -2409,6 +2445,9 @@ export async function runUnitPhase(
2409
2445
  causedBy: "unit-start",
2410
2446
  });
2411
2447
  s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
2448
+ if (nextDispatchCount <= 1) {
2449
+ s.toolUnavailableRetries = 0;
2450
+ }
2412
2451
  const unitStartSeq = ic.nextSeq();
2413
2452
  deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
2414
2453
  deps.captureAvailableSkills();
@@ -212,6 +212,8 @@ export class AutoSession {
212
212
  /** Set when a GSD tool execution ends with isError due to malformed/truncated
213
213
  * JSON arguments. Checked by postUnitPreVerification to break retry loops. */
214
214
  lastToolInvocationError: string | null = null;
215
+ /** Consecutive tool-unavailable retries for the current unit (MCP startup race). */
216
+ toolUnavailableRetries = 0;
215
217
  /** Agent-end messages from the just-finished unit, consumed during finalize. */
216
218
  lastUnitAgentEndMessages: unknown[] | null = null;
217
219
  /** Set when turn-level git action fails during closeout. */
@@ -406,6 +408,7 @@ export class AutoSession {
406
408
  this.lastPreExecFailure = null;
407
409
  this.preExecRetryCount.clear();
408
410
  this.lastToolInvocationError = null;
411
+ this.toolUnavailableRetries = 0;
409
412
  this.lastUnitAgentEndMessages = null;
410
413
  this.lastGitActionFailure = null;
411
414
  this.lastGitActionStatus = null;
@@ -10,10 +10,9 @@ import type {
10
10
 
11
11
  import { deriveState } from "./state.js";
12
12
  import { loadFile } from "./files.js";
13
- import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
14
- import { parseRoadmap } from "./parsers-legacy.js";
13
+ import { isDbAvailable, getClosedSliceIds } from "./gsd-db.js";
15
14
  import {
16
- resolveMilestoneFile, resolveSliceFile, relSliceFile,
15
+ resolveSliceFile, relSliceFile,
17
16
  } from "./paths.js";
18
17
  import {
19
18
  buildResearchSlicePrompt,
@@ -32,10 +31,7 @@ import { loadEffectiveGSDPreferences } from "./preferences.js";
32
31
  import type { MinimalModelRegistry } from "./context-budget.js";
33
32
  import { pauseAuto } from "./auto.js";
34
33
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
35
- import {
36
- getWorkflowTransportSupportError,
37
- getRequiredWorkflowToolsForAutoUnit,
38
- } from "./workflow-mcp.js";
34
+ import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
39
35
 
40
36
  export async function dispatchDirectPhase(
41
37
  ctx: ExtensionCommandContext,
@@ -182,21 +178,9 @@ export async function dispatchDirectPhase(
182
178
 
183
179
  case "reassess":
184
180
  case "reassess-roadmap": {
185
- // DB primary pathget completed slices, fall back to file parsing when DB has no data
186
- let completedSliceIds: string[] = [];
187
- if (isDbAvailable()) {
188
- completedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
189
- }
190
- if (completedSliceIds.length === 0) {
191
- // File-based fallback: parse roadmap checkboxes
192
- const roadmapPath = resolveMilestoneFile(dispatchBase, mid, "ROADMAP");
193
- if (roadmapPath) {
194
- const roadmapContent = await loadFile(roadmapPath);
195
- if (roadmapContent) {
196
- completedSliceIds = parseRoadmap(roadmapContent).slices.filter(s => s.done).map(s => s.id);
197
- }
198
- }
199
- }
181
+ // DB-authoritative read (ADR-017)markdown projections are never
182
+ // consulted for dispatch decisions. No DB rows means no completed slices.
183
+ const completedSliceIds = isDbAvailable() ? getClosedSliceIds(mid) : [];
200
184
  if (completedSliceIds.length === 0) {
201
185
  ctx.ui.notify("Cannot dispatch reassess-roadmap: no completed slices.", "warning");
202
186
  return;
@@ -222,20 +206,9 @@ export async function dispatchDirectPhase(
222
206
  // incomplete) slice. After slice completion, state.activeSlice advances
223
207
  // to the next incomplete slice, so we find the last done slice from the
224
208
  // roadmap instead (#1693).
225
- let uatCompletedSliceIds: string[] = [];
226
- if (isDbAvailable()) {
227
- uatCompletedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
228
- }
229
- if (uatCompletedSliceIds.length === 0) {
230
- // File-based fallback: parse roadmap checkboxes
231
- const roadmapPath = resolveMilestoneFile(dispatchBase, mid, "ROADMAP");
232
- if (roadmapPath) {
233
- const roadmapContent = await loadFile(roadmapPath);
234
- if (roadmapContent) {
235
- uatCompletedSliceIds = parseRoadmap(roadmapContent).slices.filter(s => s.done).map(s => s.id);
236
- }
237
- }
238
- }
209
+ // DB-authoritative read (ADR-017) — no markdown fallback for dispatch
210
+ // decisions.
211
+ const uatCompletedSliceIds = isDbAvailable() ? getClosedSliceIds(mid) : [];
239
212
  if (uatCompletedSliceIds.length === 0) {
240
213
  ctx.ui.notify("Cannot dispatch run-uat: no completed slices.", "warning");
241
214
  return;
@@ -280,18 +253,15 @@ export async function dispatchDirectPhase(
280
253
  return;
281
254
  }
282
255
 
283
- const compatibilityError = getWorkflowTransportSupportError(
284
- ctx.model?.provider,
285
- getRequiredWorkflowToolsForAutoUnit(unitType),
286
- {
287
- projectRoot,
288
- surface: "direct phase dispatch",
289
- unitType,
290
- authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
291
- baseUrl: ctx.model?.baseUrl,
292
- activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
293
- },
294
- );
256
+ const compatibilityError = getUnitWorkflowDispatchReadinessError({
257
+ provider: ctx.model?.provider,
258
+ projectRoot,
259
+ surface: "direct phase dispatch",
260
+ unitType,
261
+ authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
262
+ baseUrl: ctx.model?.baseUrl,
263
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
264
+ });
295
265
  if (compatibilityError) {
296
266
  ctx.ui.notify(compatibilityError, "error");
297
267
  return;
@@ -20,6 +20,8 @@ import { getUatBrowserToolSupportError, type UatType } from "./uat-policy.js";
20
20
  import {
21
21
  isDbAvailable,
22
22
  getMilestoneSlices,
23
+ getMilestoneSliceSummaries,
24
+ getClosedSliceIds,
23
25
  getPendingGatesForTurn,
24
26
  markPendingGatesOmittedForTurn,
25
27
  getMilestone,
@@ -47,7 +49,6 @@ import {
47
49
  buildTaskFileName,
48
50
  gsdProjectionRoot,
49
51
  } from "./paths.js";
50
- import { parseRoadmap } from "./parsers-legacy.js";
51
52
  import { validateArtifact } from "./schemas/validate.js";
52
53
  import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
53
54
  import { logWarning, logError } from "./workflow-logger.js";
@@ -84,13 +85,15 @@ import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
84
85
  import { getMilestonePipelineVariant } from "./milestone-scope-classifier.js";
85
86
  import { EXECUTION_ENTRY_PHASES, hasFinalizedMilestoneContext } from "./uok/plan-v2.js";
86
87
  import { isAutoActive } from "./auto.js";
87
- import { markDepthVerified } from "./bootstrap/write-gate.js";
88
+ // Host adapter explicitly: auto-dispatch runs in the extension host, and the
89
+ // ambient write-gate exports env-sniff the adapter per call (they are reserved
90
+ // for the workflow MCP child's dynamic-import surface).
91
+ import { hostWriteGateAdapter } from "./bootstrap/write-gate.js";
88
92
  import { ensureWorkflowPreferencesCaptured } from "./planning-depth.js";
89
93
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
90
- import {
91
- getWorkflowTransportSupportError,
92
- getRequiredWorkflowToolsForAutoUnit,
93
- } from "./workflow-mcp.js";
94
+ import { resolveWorkflowMcpProjectRoot } from "./workflow-mcp.js";
95
+ import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
96
+ import { prepareBrowserDaemonForUat } from "./browser-daemon-auto-prep.js";
94
97
  import {
95
98
  PROJECT_RESEARCH_INFLIGHT_MARKER,
96
99
  } from "./project-research-policy.js";
@@ -490,27 +493,12 @@ function persistSliceAssessmentBackfill(
490
493
  }
491
494
 
492
495
  function backfillMissingAssessmentsFromSummaries(basePath: string, mid: string): void {
493
- const completedSliceIds = new Set<string>();
494
- if (isDbAvailable()) {
495
- for (const slice of getMilestoneSlices(mid)) {
496
- if (slice.status === "complete" || slice.status === "done") {
497
- completedSliceIds.add(slice.id);
498
- }
499
- }
500
- } else {
501
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
502
- if (!roadmapFile) return;
503
- try {
504
- const roadmap = parseRoadmap(readFileSync(roadmapFile, "utf-8"));
505
- for (const slice of roadmap.slices) {
506
- if (slice.done) completedSliceIds.add(slice.id);
507
- }
508
- } catch {
509
- return;
510
- }
511
- }
512
-
513
- for (const sliceId of completedSliceIds) {
496
+ // DB-authoritative (ADR-017): no markdown fallback. Without DB rows there
497
+ // is nothing to backfill.
498
+ if (!isDbAvailable()) return;
499
+ // Canonical closed vocabulary (complete/done/skipped/closed) a skipped or
500
+ // closed slice with a SUMMARY gets the same assessment backfill treatment.
501
+ for (const sliceId of getClosedSliceIds(mid)) {
514
502
  const summaryPath = resolveSliceFile(basePath, mid, sliceId, "SUMMARY");
515
503
  if (!summaryPath || !existsSync(summaryPath)) continue;
516
504
 
@@ -696,7 +684,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
696
684
  // deadlock. Deep planning is still user-driven even inside auto-mode,
697
685
  // so it must wait for explicit approval instead of taking this bypass.
698
686
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
699
- markDepthVerified(mid, basePath);
687
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
700
688
  }
701
689
  return {
702
690
  action: "dispatch",
@@ -754,11 +742,15 @@ export const DISPATCH_RULES: DispatchRule[] = [
754
742
  // Transport preflight: verify required MCP tools are actually connected
755
743
  // before consuming a retry attempt. Fixes tool-starved sessions burning
756
744
  // all MAX_UAT_ATTEMPTS before stopping (#477).
757
- const transportError = getWorkflowTransportSupportError(
758
- sessionProvider,
759
- getRequiredWorkflowToolsForAutoUnit("run-uat"),
760
- { projectRoot: basePath, surface: "auto-mode", unitType: "run-uat", authMode: sessionAuthMode, baseUrl: sessionBaseUrl, activeTools },
761
- );
745
+ const transportError = getUnitWorkflowDispatchReadinessError({
746
+ provider: sessionProvider,
747
+ projectRoot: basePath,
748
+ surface: "auto-mode",
749
+ unitType: "run-uat",
750
+ authMode: sessionAuthMode,
751
+ baseUrl: sessionBaseUrl,
752
+ activeTools,
753
+ });
762
754
  if (transportError) {
763
755
  return { action: "stop" as const, reason: transportError, level: "warning" as const };
764
756
  }
@@ -772,6 +764,16 @@ export const DISPATCH_RULES: DispatchRule[] = [
772
764
  if (browserToolError) {
773
765
  return { action: "stop" as const, reason: browserToolError, level: "warning" as const };
774
766
  }
767
+ const browserDaemonError = prepareBrowserDaemonForUat({
768
+ uatType,
769
+ sessionProvider,
770
+ sessionAuthMode,
771
+ sessionBaseUrl,
772
+ projectRoot: resolveWorkflowMcpProjectRoot(basePath),
773
+ });
774
+ if (browserDaemonError) {
775
+ return { action: "stop" as const, reason: browserDaemonError, level: "warning" as const };
776
+ }
775
777
 
776
778
  // Cap run-uat dispatch attempts to prevent infinite replay (#3624).
777
779
  // Check before incrementing so an exhausted counter cannot create a
@@ -808,23 +810,10 @@ export const DISPATCH_RULES: DispatchRule[] = [
808
810
  // Only applies when UAT dispatch is enabled
809
811
  if (!prefs?.uat_dispatch) return null;
810
812
 
811
- // DB-first: prefer closed slices from DB; fall back to ROADMAP on disk.
812
- let closedSliceIds: string[];
813
- if (isDbAvailable()) {
814
- closedSliceIds = getMilestoneSlices(mid)
815
- .filter(s => isClosedStatus(s.status))
816
- .map(s => s.id);
817
- } else {
818
- // Filesystem fallback for degraded / unmigrated projects.
819
- // `slice.done` in the parsed ROADMAP is the disk-level closed signal.
820
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
821
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
822
- if (!roadmapContent) return null;
823
- const roadmap = parseRoadmap(roadmapContent);
824
- closedSliceIds = roadmap.slices.filter(s => s.done).map(s => s.id);
825
- }
826
-
827
- for (const sliceId of closedSliceIds) {
813
+ // DB-authoritative (ADR-017): closed slices come from the DB only; the
814
+ // ROADMAP projection is never parsed for gate decisions.
815
+ if (!isDbAvailable()) return null;
816
+ for (const sliceId of getClosedSliceIds(mid)) {
828
817
  const result = await readUatGateVerdict(basePath, mid, sliceId);
829
818
  if (!result) continue;
830
819
  const { verdict, uatType } = result;
@@ -879,7 +868,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
879
868
  // H6 fix (#4973): keep the non-deep auto-mode bypass, but do not
880
869
  // pre-verify deep planning's user-facing milestone approval gate.
881
870
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
882
- markDepthVerified(mid, basePath);
871
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
883
872
  }
884
873
  return {
885
874
  action: "dispatch",
@@ -1050,7 +1039,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
1050
1039
  // H6 fix (#4973): keep the non-deep auto-mode bypass, but do not
1051
1040
  // pre-verify deep planning's user-facing milestone approval gate.
1052
1041
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
1053
- markDepthVerified(mid, basePath);
1042
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
1054
1043
  }
1055
1044
  return {
1056
1045
  action: "dispatch",
@@ -1128,13 +1117,11 @@ export const DISPATCH_RULES: DispatchRule[] = [
1128
1117
  // behavior.
1129
1118
  if (await getMilestonePipelineVariant(mid) === "trivial") return null;
1130
1119
 
1131
- // Load roadmap to find all slices
1132
- const roadmapFile =
1133
- resolveExistingExpectedArtifact("plan-milestone", mid, basePath) ??
1134
- resolveMilestoneFile(basePath, mid, "ROADMAP");
1135
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
1136
- if (!roadmapContent) return null;
1137
- const roadmap = parseRoadmap(roadmapContent);
1120
+ // DB-authoritative slice list (ADR-017): the ROADMAP projection is
1121
+ // never parsed for dispatch decisions. No DB / no rows → skip this rule.
1122
+ if (!isDbAvailable()) return null;
1123
+ const dbSlices = getMilestoneSliceSummaries(mid);
1124
+ if (dbSlices.length === 0) return null;
1138
1125
 
1139
1126
  // Find slices that need research (no RESEARCH file, dependencies done)
1140
1127
  const milestoneResearchFile =
@@ -1142,14 +1129,14 @@ export const DISPATCH_RULES: DispatchRule[] = [
1142
1129
  resolveMilestoneFile(basePath, mid, "RESEARCH");
1143
1130
  const researchReadySlices: Array<{ id: string; title: string }> = [];
1144
1131
 
1145
- for (const slice of roadmap.slices) {
1132
+ for (const slice of dbSlices) {
1146
1133
  if (slice.done) continue;
1147
1134
  // Skip S01 when milestone research exists
1148
1135
  if (milestoneResearchFile && slice.id === "S01") continue;
1149
1136
  // Skip if already has research
1150
1137
  if (resolveExistingExpectedArtifact("research-slice", `${mid}/${slice.id}`, basePath)) continue;
1151
1138
  // Skip if dependencies aren't done (check for SUMMARY files)
1152
- const depsComplete = (slice.depends ?? []).every((depId) =>
1139
+ const depsComplete = slice.depends.every((depId) =>
1153
1140
  !!resolveExistingExpectedArtifact("complete-slice", `${mid}/${depId}`, basePath),
1154
1141
  );
1155
1142
  if (!depsComplete) continue;
@@ -18,7 +18,7 @@ import { getSessionModelOverride } from "./session-model-override.js";
18
18
  import { logWarning } from "./workflow-logger.js";
19
19
  import { resolveUokFlags } from "./uok/flags.js";
20
20
  import { applyModelPolicyFilter } from "./uok/model-policy.js";
21
- import { isModelBlocked } from "./blocked-models.js";
21
+ import { isModelBlocked, isModelTemporarilyUnavailable } from "./blocked-models.js";
22
22
  import { getRequiredWorkflowToolsForAutoUnit, isWorkflowMcpSurfaceTool } from "./workflow-mcp.js";
23
23
 
24
24
  /**
@@ -272,6 +272,15 @@ function buildModelPolicyBlockReasons(
272
272
  }];
273
273
  }
274
274
 
275
+ function isModelUnavailable(
276
+ basePath: string,
277
+ provider: string | undefined,
278
+ id: string | undefined,
279
+ ): boolean {
280
+ return isModelBlocked(basePath, provider, id) ||
281
+ isModelTemporarilyUnavailable(basePath, provider, id);
282
+ }
283
+
275
284
  function restoreToolBaseline(pi: ExtensionAPI): void {
276
285
  const key = pi as unknown as object;
277
286
  const baseline = TOOL_BASELINE.get(key);
@@ -817,9 +826,9 @@ export async function selectAndApplyModel(
817
826
  // (issue #4513). The block is persisted in .gsd/runtime/blocked-models.json
818
827
  // so it survives /gsd auto restarts — without this, the same dead model
819
828
  // gets reselected after every restart.
820
- if (isModelBlocked(basePath, model.provider, model.id)) {
829
+ if (isModelUnavailable(basePath, model.provider, model.id)) {
821
830
  ctx.ui.notify(
822
- `Skipping blocked model ${model.provider}/${model.id} (provider rejected it for this account).`,
831
+ `Skipping unavailable model ${model.provider}/${model.id}.`,
823
832
  "warning",
824
833
  );
825
834
  continue;
@@ -896,7 +905,7 @@ export async function selectAndApplyModel(
896
905
  for (const model of buildPolicyEligibleFallbackOrder(ctx, routingEligibleModels, autoModeStartModel)) {
897
906
  const key = `${model.provider.toLowerCase()}/${model.id.toLowerCase()}`;
898
907
  if (!policyAllowedModelKeys.has(key)) continue;
899
- if (isModelBlocked(basePath, model.provider, model.id)) continue;
908
+ if (isModelUnavailable(basePath, model.provider, model.id)) continue;
900
909
  const ok = await pi.setModel(model, { persist: false });
901
910
  if (!ok) continue;
902
911
  appliedModel = model;
@@ -926,10 +935,10 @@ export async function selectAndApplyModel(
926
935
  autoModeStartModel,
927
936
  effectiveSessionModelOverride,
928
937
  );
929
- const startBlocked = isModelBlocked(basePath, autoModeStartModel.provider, autoModeStartModel.id);
938
+ const startBlocked = isModelUnavailable(basePath, autoModeStartModel.provider, autoModeStartModel.id);
930
939
  if (startBlocked) {
931
940
  ctx.ui.notify(
932
- `Auto-mode start model ${autoModeStartModel.provider}/${autoModeStartModel.id} is blocked for this account. Using current session model instead.`,
941
+ `Auto-mode start model ${autoModeStartModel.provider}/${autoModeStartModel.id} is unavailable. Using current session model instead.`,
933
942
  "warning",
934
943
  );
935
944
  } else {
@@ -940,7 +949,7 @@ export async function selectAndApplyModel(
940
949
  const ok = await pi.setModel(startModel, { persist: false });
941
950
  if (!ok) {
942
951
  const byId = availableModels.find(
943
- m => m.id === autoModeStartModel.id && !isModelBlocked(basePath, m.provider, m.id),
952
+ m => m.id === autoModeStartModel.id && !isModelUnavailable(basePath, m.provider, m.id),
944
953
  );
945
954
  if (byId) {
946
955
  const fallbackOk = await pi.setModel(byId, { persist: false });
@@ -1041,16 +1050,36 @@ export function resolveModelId<T extends { id: string; provider: string }>(
1041
1050
  if (providerMatch) return providerMatch;
1042
1051
  }
1043
1052
 
1044
- // Prefer "anthropic" as the canonical provider for Anthropic models.
1045
- // Transport-specific tiebreaker (ADR-012): intentionally keys on provider,
1046
- // not api we want the plain Anthropic transport when multiple are available.
1047
- const anthropicMatch = candidates.find(m => m.provider === "anthropic");
1048
- if (anthropicMatch) return anthropicMatch;
1053
+ // Subscription/OAuth routes beat pay-per-token API when the same model ID
1054
+ // exists on multiple providers. Order matters — first match wins.
1055
+ for (const provider of BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE) {
1056
+ const match = candidates.find(m => m.provider === provider);
1057
+ if (match) return match;
1058
+ }
1049
1059
 
1050
1060
  // Fall back to first non-extension candidate, or any candidate
1051
1061
  return candidates.find(m => !EXTENSION_PROVIDERS.has(m.provider)) ?? candidates[0];
1052
1062
  }
1053
1063
 
1064
+ /**
1065
+ * When a bare model ID exists on multiple providers, prefer subscription/OAuth
1066
+ * routes over pay-per-token API keys. Matches PROVIDER_ROUTES in doctor-providers
1067
+ * but applies when *both* sides are authenticated.
1068
+ *
1069
+ * Order rationale:
1070
+ * - openai-codex before github-copilot: ChatGPT-native for shared GPT IDs
1071
+ * - google-gemini-cli before github-copilot: first-party Gemini CLI
1072
+ * - anthropic before github-copilot: first-party Claude API/OAuth over Copilot
1073
+ * - github-copilot before openai/google: Copilot OAuth over platform API keys
1074
+ */
1075
+ export const BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE = [
1076
+ "openai-codex",
1077
+ "google-gemini-cli",
1078
+ "anthropic",
1079
+ "github-copilot",
1080
+ "google-antigravity",
1081
+ ] as const;
1082
+
1054
1083
  /**
1055
1084
  * Flat-rate providers charge the same per request regardless of model.
1056
1085
  * Dynamic routing provides no cost benefit — it only degrades quality (#3453).