@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.6ccd27b3

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 (837) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli-style.d.ts +17 -0
  4. package/dist/cli-style.js +28 -0
  5. package/dist/cli.js +2 -19
  6. package/dist/headless-events.d.ts +4 -2
  7. package/dist/headless-events.js +14 -34
  8. package/dist/loader.js +6 -4
  9. package/dist/mcp-server.js +2 -1
  10. package/dist/models-resolver.d.ts +3 -13
  11. package/dist/models-resolver.js +3 -22
  12. package/dist/register-agent-bundles.d.ts +11 -2
  13. package/dist/register-agent-bundles.js +18 -4
  14. package/dist/resource-loader.d.ts +10 -5
  15. package/dist/resource-loader.js +123 -20
  16. package/dist/resources/.managed-resources-content-hash +1 -1
  17. package/dist/resources/GSD-WORKFLOW.md +5 -4
  18. package/dist/resources/extensions/ask-user-questions.js +3 -2
  19. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  20. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  21. package/dist/resources/extensions/async-jobs/index.js +65 -0
  22. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  23. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  24. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  25. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  26. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  27. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  28. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  29. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  30. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  31. package/dist/resources/extensions/browser-tools/index.js +69 -12
  32. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  33. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +464 -200
  34. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  35. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  36. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  37. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  38. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  39. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  40. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  41. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  42. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  43. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  44. package/dist/resources/extensions/gsd/auto/orchestrator.js +207 -73
  45. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  46. package/dist/resources/extensions/gsd/auto/phases.js +17 -2324
  47. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  48. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  49. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  50. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  51. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  52. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  53. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  54. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  55. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  56. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  57. package/dist/resources/extensions/gsd/auto-start.js +47 -29
  58. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  59. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  60. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  61. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  62. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  63. package/dist/resources/extensions/gsd/auto-worktree.js +50 -354
  64. package/dist/resources/extensions/gsd/auto.js +49 -22
  65. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  66. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  67. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +69 -19
  68. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  69. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  70. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  71. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  72. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  73. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  74. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  75. package/dist/resources/extensions/gsd/captures.js +5 -15
  76. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  77. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  78. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  79. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  80. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  81. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  82. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  83. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  84. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  85. package/dist/resources/extensions/gsd/constants.js +0 -2
  86. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  87. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  88. package/dist/resources/extensions/gsd/db/queries.js +428 -0
  89. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  90. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  91. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  92. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  93. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  94. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  95. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  96. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  97. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  98. package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
  99. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  100. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  101. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  102. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  103. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  104. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  105. package/dist/resources/extensions/gsd/files.js +33 -19
  106. package/dist/resources/extensions/gsd/git-service.js +1 -0
  107. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  108. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  109. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  110. package/dist/resources/extensions/gsd/guidance.js +158 -0
  111. package/dist/resources/extensions/gsd/guided-flow.js +144 -9
  112. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  113. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  114. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  115. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  116. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  117. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  118. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  119. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  120. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  121. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  122. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  123. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  124. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  125. package/dist/resources/extensions/gsd/model-router.js +3 -0
  126. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  127. package/dist/resources/extensions/gsd/notifications.js +12 -7
  128. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  129. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  130. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  131. package/dist/resources/extensions/gsd/paths.js +37 -24
  132. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  133. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  134. package/dist/resources/extensions/gsd/preferences.js +14 -0
  135. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  136. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  137. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  138. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  139. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  140. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  141. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  142. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  143. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  144. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  145. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  146. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  147. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  148. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  149. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  150. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  151. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  152. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  153. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  154. package/dist/resources/extensions/gsd/publication.js +87 -0
  155. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  156. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  157. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  158. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  159. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  160. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  161. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  162. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  163. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  164. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  165. package/dist/resources/extensions/gsd/state.js +12 -22
  166. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  167. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  168. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  169. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  170. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  171. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  172. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  173. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  174. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  175. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  176. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  177. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  178. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  179. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  180. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  181. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  182. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  183. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  184. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  185. package/dist/resources/extensions/gsd/undo.js +8 -7
  186. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  187. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  188. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  189. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  190. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  191. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  192. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  193. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  194. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  195. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  196. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  197. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  198. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  199. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  200. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  201. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  202. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  203. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  204. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  205. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  206. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  207. package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
  208. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  209. package/dist/resources/extensions/gsd/worktree.js +8 -1
  210. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  211. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  212. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  213. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  214. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  215. package/dist/resources/shared/package-manager-detection.js +1 -1
  216. package/dist/resources/shared/package.json +3 -0
  217. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  218. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  219. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  220. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  221. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  222. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  223. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  224. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  225. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  226. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  227. package/dist/runtime-checks.d.ts +10 -0
  228. package/dist/runtime-checks.js +27 -0
  229. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  230. package/dist/update-check.d.ts +2 -0
  231. package/dist/update-check.js +24 -1
  232. package/dist/update-cmd.js +20 -3
  233. package/dist/web/standalone/.next/BUILD_ID +1 -1
  234. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  235. package/dist/web/standalone/.next/build-manifest.json +3 -3
  236. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  237. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  238. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  239. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  240. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  241. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  242. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  243. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  244. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  245. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  246. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  247. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  248. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  249. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  250. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  251. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  252. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  253. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  257. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  258. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  261. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  262. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  263. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  264. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  265. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  266. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  267. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  268. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  269. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  271. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  272. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  273. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  274. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  275. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  276. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  277. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  278. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  279. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  280. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  281. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  282. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  283. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  284. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  285. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  286. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  287. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  289. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  290. package/dist/web/standalone/.next/server/app/index.html +1 -1
  291. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  292. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  293. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  294. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  295. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  296. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  297. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  298. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  299. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  300. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  301. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  302. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  303. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  304. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  305. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  306. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  307. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  308. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  309. package/dist/web/standalone/package.json +1 -1
  310. package/dist/worktree-cli.js +3 -6
  311. package/dist/worktree-status-banner.js +7 -11
  312. package/package.json +3 -3
  313. package/packages/cloud-mcp-gateway/package.json +2 -2
  314. package/packages/contracts/dist/rpc.d.ts +1 -0
  315. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  316. package/packages/contracts/dist/rpc.js.map +1 -1
  317. package/packages/contracts/dist/workflow.d.ts +4 -0
  318. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  319. package/packages/contracts/dist/workflow.js.map +1 -1
  320. package/packages/contracts/package.json +1 -1
  321. package/packages/daemon/package.json +4 -4
  322. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  323. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  324. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  325. package/packages/gsd-agent-core/package.json +5 -5
  326. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  327. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  328. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  329. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  330. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  331. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  332. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  333. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  334. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  335. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  336. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  337. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  338. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  339. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  340. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  341. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  342. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  343. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  344. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  345. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  346. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  347. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  348. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  349. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  350. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  351. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  352. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  353. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  354. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  355. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  356. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  357. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  358. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  359. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  360. package/packages/gsd-agent-modes/package.json +7 -7
  361. package/packages/mcp-server/README.md +12 -3
  362. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  363. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  364. package/packages/mcp-server/dist/cli-runner.js +137 -0
  365. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  366. package/packages/mcp-server/dist/cli.js +2 -50
  367. package/packages/mcp-server/dist/cli.js.map +1 -1
  368. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  369. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  370. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  371. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  372. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  373. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  374. package/packages/mcp-server/dist/pid-registry.js +452 -0
  375. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  376. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  377. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  378. package/packages/mcp-server/dist/probe-mode.js +10 -0
  379. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  380. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  381. package/packages/mcp-server/dist/server.js +4 -0
  382. package/packages/mcp-server/dist/server.js.map +1 -1
  383. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  384. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  385. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  386. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  387. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  388. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  389. package/packages/mcp-server/dist/workflow-tools.js +207 -102
  390. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  391. package/packages/mcp-server/package.json +5 -4
  392. package/packages/native/package.json +1 -1
  393. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  394. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  395. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  396. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  397. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  398. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  399. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  400. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  401. package/packages/pi-agent-core/dist/index.js +3 -0
  402. package/packages/pi-agent-core/dist/index.js.map +1 -1
  403. package/packages/pi-agent-core/package.json +1 -1
  404. package/packages/pi-ai/README.md +1 -0
  405. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  406. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  407. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  408. package/packages/pi-ai/dist/index.d.ts +2 -0
  409. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  410. package/packages/pi-ai/dist/index.js +2 -0
  411. package/packages/pi-ai/dist/index.js.map +1 -1
  412. package/packages/pi-ai/dist/models.generated.d.ts +158 -17
  413. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  414. package/packages/pi-ai/dist/models.generated.js +132 -17
  415. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  416. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  417. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  418. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  419. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  420. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  421. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  422. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  423. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  424. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  425. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  426. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  427. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  428. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  429. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  430. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  431. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  432. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  433. package/packages/pi-ai/package.json +3 -2
  434. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  435. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  436. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  437. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  438. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  440. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  442. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  443. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  444. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  445. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  447. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  449. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  450. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  451. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  452. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  453. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  454. package/packages/pi-coding-agent/dist/index.js +1 -1
  455. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  456. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  457. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  458. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  459. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  460. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  461. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  462. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  463. package/packages/pi-coding-agent/package.json +7 -7
  464. package/packages/pi-tui/dist/index.d.ts +1 -1
  465. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  466. package/packages/pi-tui/dist/index.js +1 -1
  467. package/packages/pi-tui/dist/index.js.map +1 -1
  468. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  469. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  470. package/packages/pi-tui/dist/terminal-image.js +54 -2
  471. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  472. package/packages/pi-tui/dist/tui.d.ts +8 -0
  473. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  474. package/packages/pi-tui/dist/tui.js +72 -18
  475. package/packages/pi-tui/dist/tui.js.map +1 -1
  476. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  477. package/packages/pi-tui/dist/utils.js +110 -36
  478. package/packages/pi-tui/dist/utils.js.map +1 -1
  479. package/packages/pi-tui/package.json +2 -2
  480. package/packages/rpc-client/package.json +2 -2
  481. package/pkg/dist/theme/theme.d.ts.map +1 -1
  482. package/pkg/dist/theme/theme.js +45 -17
  483. package/pkg/dist/theme/theme.js.map +1 -1
  484. package/pkg/package.json +1 -1
  485. package/src/resources/GSD-WORKFLOW.md +5 -4
  486. package/src/resources/extensions/ask-user-questions.ts +7 -2
  487. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  488. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  489. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  490. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  491. package/src/resources/extensions/async-jobs/index.ts +79 -0
  492. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  493. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  494. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  495. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  496. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  497. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  498. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  499. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  500. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  501. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  502. package/src/resources/extensions/browser-tools/index.ts +71 -13
  503. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  504. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  505. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  506. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  507. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +543 -202
  508. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +700 -7
  509. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  510. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  511. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  512. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  513. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  514. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  515. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  516. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  517. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  518. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  519. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  520. package/src/resources/extensions/gsd/auto/orchestrator.ts +232 -76
  521. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  522. package/src/resources/extensions/gsd/auto/phases.ts +58 -3013
  523. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  524. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  525. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  526. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  527. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  528. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  529. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  530. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  531. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  532. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  533. package/src/resources/extensions/gsd/auto-start.ts +48 -33
  534. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  535. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  536. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  537. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  538. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  539. package/src/resources/extensions/gsd/auto-worktree.ts +56 -366
  540. package/src/resources/extensions/gsd/auto.ts +69 -26
  541. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  542. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  543. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +89 -18
  544. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  545. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  546. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  547. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  548. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  549. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  550. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  551. package/src/resources/extensions/gsd/captures.ts +5 -16
  552. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  553. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  554. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  555. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  556. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  557. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  558. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  559. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  560. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  561. package/src/resources/extensions/gsd/constants.ts +0 -3
  562. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  563. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  564. package/src/resources/extensions/gsd/db/queries.ts +519 -0
  565. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  566. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  567. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  568. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  569. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  570. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  571. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  572. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  573. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  574. package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
  575. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  576. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  577. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  578. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  579. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  580. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  581. package/src/resources/extensions/gsd/files.ts +33 -12
  582. package/src/resources/extensions/gsd/git-service.ts +1 -0
  583. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  584. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  585. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  586. package/src/resources/extensions/gsd/guidance.ts +217 -0
  587. package/src/resources/extensions/gsd/guided-flow.ts +195 -29
  588. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  589. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  590. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  591. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  592. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  593. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  594. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  595. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  596. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  597. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  598. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  599. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  600. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  601. package/src/resources/extensions/gsd/model-router.ts +3 -0
  602. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  603. package/src/resources/extensions/gsd/notifications.ts +13 -6
  604. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  605. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  606. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  607. package/src/resources/extensions/gsd/paths.ts +42 -22
  608. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  609. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  610. package/src/resources/extensions/gsd/preferences.ts +18 -0
  611. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  612. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  613. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  614. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  615. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  616. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  617. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  618. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  619. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  620. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  621. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  622. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  623. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  624. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  625. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  626. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  627. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  628. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  629. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  630. package/src/resources/extensions/gsd/publication.ts +122 -0
  631. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  632. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  633. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  634. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  635. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  636. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  637. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  638. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  639. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  640. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  641. package/src/resources/extensions/gsd/state.ts +16 -22
  642. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  643. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  644. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  645. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  646. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +329 -22
  647. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  648. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  649. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  650. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +54 -1
  651. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  652. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  653. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  654. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  655. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  656. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  657. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  658. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  659. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  660. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  661. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  662. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  663. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  664. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  665. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  666. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  667. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  668. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  669. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  670. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  671. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  672. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  673. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  674. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  675. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  676. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  677. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  678. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  679. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  680. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  681. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  682. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  683. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  684. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  685. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  686. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  687. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  688. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  689. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  690. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  691. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  692. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
  693. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  694. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  695. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  696. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  697. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  698. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  699. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  700. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  701. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  702. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  703. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  704. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  705. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  706. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  707. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  708. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  709. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  710. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  711. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  712. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  713. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  714. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  715. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  716. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  717. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  718. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  719. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  720. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  721. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  722. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  723. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  724. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  725. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  726. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  727. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  728. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
  729. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  730. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  731. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  732. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  733. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  734. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  735. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  736. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  737. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  738. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  739. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  740. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  741. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  742. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  743. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  744. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  745. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  746. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  747. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  748. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  749. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  750. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  751. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  752. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  753. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  754. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
  755. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  756. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  757. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  758. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  759. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  760. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  761. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  762. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  763. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  764. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  765. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  766. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -1
  767. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  768. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  769. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  770. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  771. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  772. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  773. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  774. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  775. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  776. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  777. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  778. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  779. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  780. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  781. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  782. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  783. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  784. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  785. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  786. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  787. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  788. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  789. package/src/resources/extensions/gsd/undo.ts +9 -8
  790. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  791. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  792. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  793. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  794. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  795. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  796. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  797. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  798. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  799. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  800. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  801. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  802. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  803. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  804. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  805. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  806. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  807. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  808. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  809. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  810. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  811. package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
  812. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  813. package/src/resources/extensions/gsd/worktree.ts +7 -1
  814. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  815. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  816. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  817. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  818. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  819. package/src/resources/shared/package-manager-detection.ts +1 -1
  820. package/src/resources/shared/package.json +3 -0
  821. package/src/resources/skills/create-skill/SKILL.md +3 -0
  822. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  823. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  824. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  825. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  826. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  827. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  828. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  829. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  830. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  831. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  832. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  833. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  834. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  835. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  836. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
  837. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
@@ -3,6 +3,11 @@
3
3
  // GSD Extension — State Derivation
4
4
  // DB-authoritative runtime derivation with explicit legacy filesystem fallback.
5
5
  // Pure TypeScript, zero Pi dependencies.
6
+ // Pre-migration fallback ONLY (ADR-017): deriveState must work on projects
7
+ // whose DB does not exist yet (before md-importer runs), so it parses markdown
8
+ // projections when `isDbAvailable()` is false or the DB has no rows. Once the
9
+ // DB is populated, decision reads go through gsd-db queries — these parsers
10
+ // must never be consulted when DB data is present.
6
11
  import { parseRoadmap, parsePlan, } from './parsers-legacy.js';
7
12
  import { parseSummary, loadFile, parseRequirementCounts, parseContextDependsOn, } from './files.js';
8
13
  import { resolveMilestoneFile, resolveSlicePath, resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveGsdRootFile, gsdRoot, } from './paths.js';
@@ -18,30 +23,11 @@ import { logWarning } from './workflow-logger.js';
18
23
  import { extractVerdict } from './verdict-parser.js';
19
24
  import { detectPendingEscalation } from './escalation.js';
20
25
  import { isTerminalMilestoneSummaryContent } from './milestone-summary-classifier.js';
21
- import { isDbAvailable, getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, getRequirementCounts, getLatestAssessmentByScope, getPendingGateCountForTurn, } from './gsd-db.js';
26
+ import { isDbAvailable, getAllMilestones, getMilestone, getSlicesByMilestoneIds, getSliceTasks, getReplanHistory, getSlice, getRequirementCounts, getLatestAssessmentByScope, getPendingGateCountForTurn, } from './gsd-db.js';
22
27
  import { wasWorkflowDatabaseOpenAttempted } from './db-workspace.js';
23
28
  import { formatCompletePhaseNextAction, countUnmappedActiveRequirements } from './requirements-backlog.js';
24
29
  import { classifyMilestoneReadiness, readinessNeedsDiscussion, } from './milestone-readiness.js';
25
- function formatNeedsAttentionBlocker(milestoneId) {
26
- return [
27
- `Milestone ${milestoneId} is blocked because milestone validation returned needs-attention.`,
28
- `Fix options:`,
29
- `1. Review the validation details: \`/gsd status\``,
30
- `2. If you fixed the missing evidence or issue, re-run milestone validation: \`/gsd validate-milestone\``,
31
- `3. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
32
- `4. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
33
- `After validation or override passes, run \`/gsd auto\` to complete and merge the milestone.`,
34
- ].join("\n");
35
- }
36
- function formatNeedsRemediationBlocker(milestoneId) {
37
- return [
38
- `Milestone ${milestoneId} is blocked because milestone validation returned needs-remediation, but all slices are complete.`,
39
- `Fix options:`,
40
- `1. Run \`/gsd dispatch reassess\` to add remediation slices, then run \`/gsd auto\``,
41
- `2. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
42
- `3. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
43
- ].join("\n");
44
- }
30
+ import { needsAttentionBlockerGuidance as formatNeedsAttentionBlocker, needsRemediationBlockerGuidance as formatNeedsRemediationBlocker, } from './guidance.js';
45
31
  /**
46
32
  * A "ghost" milestone directory contains only META.json (and no substantive
47
33
  * files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
@@ -380,12 +366,16 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
380
366
  let activeMilestoneFound = false;
381
367
  let activeMilestoneHasDraft = false;
382
368
  let firstDeferredQueuedShell = null;
369
+ const activeMilestoneIds = milestones
370
+ .filter((m) => !parkedMilestoneIds.has(m.id))
371
+ .map((m) => m.id);
372
+ const slicesByMilestone = getSlicesByMilestoneIds(activeMilestoneIds);
383
373
  for (const m of milestones) {
384
374
  if (parkedMilestoneIds.has(m.id)) {
385
375
  registry.push({ id: m.id, title: stripMilestonePrefix(m.title) || m.id, status: 'parked' });
386
376
  continue;
387
377
  }
388
- const slices = getMilestoneSlices(m.id);
378
+ const slices = slicesByMilestone.get(m.id) ?? [];
389
379
  // DB-authoritative completeness (#4179): only trust completeMilestoneIds,
390
380
  // which is itself derived from DB status. SUMMARY-file presence alone must
391
381
  // not imply completion.
@@ -1,16 +1,64 @@
1
1
  /**
2
- * Status predicates for GSD state-machine guards.
2
+ * Status predicates and the canonical status vocabulary for GSD state-machine
3
+ * guards (ADR-030).
3
4
  *
4
- * The DB stores status as free-form strings. Three values indicate
5
- * "closed": "complete" (canonical), "done" (legacy / alias),
6
- * "closed" (legacy/imported), and
7
- * "skipped" (user-directed skip via rethink or backtrack).
8
- * Every inline `status === "complete" || status === "done"` should
9
- * use isClosedStatus() instead.
5
+ * The DB column is free-form `string` so legacy/imported rows still load. Three
6
+ * raw values besides canonical "complete"/"skipped" indicate "closed": "done"
7
+ * (legacy alias), "closed" (legacy/imported), and "skipped" (user-directed skip
8
+ * via rethink or backtrack). `RAW_CLOSED_STATUSES` is the single source for both
9
+ * `isClosedStatus()` and the SQL terminal-status fragment
10
+ * (`db/sql-constants.ts` derives `TERMINAL_STATUS_SQL` from it), replacing the
11
+ * prior independent definitions.
12
+ *
13
+ * `toStatus()` is the single seam where a free-form string becomes the canonical
14
+ * `Status` vocabulary; the Status Transition Core writes canonical, so the store
15
+ * converges over time without a forced migration.
16
+ */
17
+ /**
18
+ * Canonical, normalized entity-status vocabulary across milestones, slices, and
19
+ * tasks — the single source for both the `Status` type and the runtime
20
+ * membership set. The in-memory domain speaks `Status`; the DB column stays
21
+ * free-form.
22
+ */
23
+ export const CANONICAL_STATUSES = [
24
+ "pending", "queued", "active", "parked", "in_progress", "blocked", "complete", "skipped", "deferred",
25
+ ];
26
+ const CANONICAL_STATUS_SET = new Set(CANONICAL_STATUSES);
27
+ /**
28
+ * Raw status values that mean a unit is closed — the single source of truth.
29
+ * Includes legacy/imported aliases ("done", "closed") alongside canonical
30
+ * "complete"/"skipped" because the DB column is free-form and older rows /
31
+ * imports still carry them. Order matters: `TERMINAL_STATUS_SQL` is derived
32
+ * from this array verbatim.
33
+ */
34
+ export const RAW_CLOSED_STATUSES = ["complete", "done", "skipped", "closed"];
35
+ const RAW_CLOSED_SET = new Set(RAW_CLOSED_STATUSES);
36
+ /** Free-form aliases mapped to their canonical Status on read. */
37
+ const ALIAS_TO_CANONICAL = {
38
+ done: "complete",
39
+ closed: "complete",
40
+ planned: "pending",
41
+ "in-progress": "in_progress",
42
+ };
43
+ /**
44
+ * Normalize a free-form DB status string into the canonical `Status`
45
+ * vocabulary. Maps known aliases (done/closed → complete, planned → pending,
46
+ * in-progress → in_progress). An unrecognized/legacy value is **quarantined** —
47
+ * preserved verbatim rather than silently remapped to a wrong canonical state —
48
+ * so reads never fail and reconciliation/telemetry can surface it.
10
49
  */
50
+ export function toStatus(raw) {
51
+ const value = raw.trim();
52
+ if (CANONICAL_STATUS_SET.has(value))
53
+ return value;
54
+ const alias = ALIAS_TO_CANONICAL[value];
55
+ if (alias)
56
+ return alias;
57
+ return value;
58
+ }
11
59
  /** Returns true when a milestone, slice, or task status indicates closure. */
12
60
  export function isClosedStatus(status) {
13
- return status === "complete" || status === "done" || status === "skipped" || status === "closed";
61
+ return RAW_CLOSED_SET.has(status);
14
62
  }
15
63
  /** Returns true when a slice status indicates it was deferred by a decision. */
16
64
  export function isDeferredStatus(status) {
@@ -0,0 +1,57 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Stop Notice module — single owner of the auto/step-mode
3
+ // stop/pause notice vocabulary. Both sides of the wire live here: the
4
+ // formatters that produce the canonical prefixes (used by stopAuto/pauseAuto)
5
+ // and the classifiers that recognize them (used by the headless host to pick
6
+ // exit codes). Wording changes in this file keep emitter and detector in
7
+ // lockstep; round-trip tests enforce it.
8
+ /** A reason string of the form "Blocked: …" marks a blocked stop. */
9
+ export function isBlockedStopReason(reason) {
10
+ return /^Blocked:\s*/i.test(reason ?? "");
11
+ }
12
+ /** Strip the "Blocked: " marker for display. */
13
+ export function stopNoticeDisplayReason(reason) {
14
+ return (reason ?? "").replace(/^Blocked:\s*/i, "").trim();
15
+ }
16
+ export function stopNoticeKind(reason) {
17
+ return isBlockedStopReason(reason) ? "blocked" : "stopped";
18
+ }
19
+ /** Canonical stop-notice prefix: "Auto-mode blocked — reason" / "Auto-mode stopped". */
20
+ export function formatStopNoticePrefix(reason) {
21
+ const displayReason = stopNoticeDisplayReason(reason);
22
+ const prefix = stopNoticeKind(reason) === "blocked" ? "Auto-mode blocked" : "Auto-mode stopped";
23
+ return displayReason ? `${prefix} — ${displayReason}` : prefix;
24
+ }
25
+ // ─── Classification (headless host side) ────────────────────────────────
26
+ // The canonical lowercase prefixes the headless event loop recognizes in
27
+ // notify messages. Emitters above and ad-hoc emitters elsewhere must start
28
+ // their terminal notices with one of these.
29
+ export const PAUSED_NOTICE_PREFIXES = ["auto-mode paused", "step-mode paused"];
30
+ export const TERMINAL_NOTICE_PREFIXES = [
31
+ "auto-mode stopped",
32
+ "step-mode stopped",
33
+ "auto-mode complete",
34
+ "no active milestone",
35
+ "auto-mode idle",
36
+ ];
37
+ /** Manual-resolution notices emitted before auto-mode can formally pause/stop. */
38
+ export function isManualResolutionNotice(message) {
39
+ return (message.includes("resolve manually and re-run /gsd auto") ||
40
+ message.includes("resolve conflicts manually and run /gsd auto to resume") ||
41
+ message.includes("resolve and run /gsd auto to resume"));
42
+ }
43
+ export function isPauseNotice(message) {
44
+ return PAUSED_NOTICE_PREFIXES.some((prefix) => message.startsWith(prefix));
45
+ }
46
+ export function isTerminalNotice(message) {
47
+ return TERMINAL_NOTICE_PREFIXES.some((prefix) => message.startsWith(prefix));
48
+ }
49
+ /** Pauses that do not require operator intervention in headless mode. */
50
+ export function isNonBlockingPauseNotice(message) {
51
+ return message.includes("idempotent advance: unit already active");
52
+ }
53
+ export function isBlockedNoticeMessage(message) {
54
+ return (message.includes("blocked:") ||
55
+ (isPauseNotice(message) && !isNonBlockingPauseNotice(message)) ||
56
+ isManualResolutionNotice(message));
57
+ }
@@ -1,8 +1,8 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: ADR-015 Tool Contract module for Unit prompt, policy, and tool parity.
3
3
  import { resolveManifest, } from "./unit-context-manifest.js";
4
- import { getRequiredWorkflowToolsForAutoUnit } from "./workflow-mcp.js";
5
- import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
4
+ import { getWorkflowTransportSupportError, } from "./workflow-mcp.js";
5
+ import { getRequiredWorkflowToolsForUnit, getUnitToolSurfaceContract, } from "./unit-tool-contracts.js";
6
6
  import { WHOLE_FILE_OBSERVATION_MAX_BYTES, WHOLE_FILE_OBSERVATION_MAX_LINES, } from "./source-observations.js";
7
7
  export function compileUnitContextContract(unitType) {
8
8
  const manifest = resolveManifest(unitType);
@@ -15,6 +15,17 @@ export function compileUnitContextContract(unitType) {
15
15
  }
16
16
  return { ok: true, contract: buildPromptContextContract(unitType, manifest) };
17
17
  }
18
+ export function getUnitWorkflowDispatchReadinessError(input) {
19
+ return getWorkflowTransportSupportError(input.provider, getRequiredWorkflowToolsForUnit(input.unitType), {
20
+ projectRoot: input.projectRoot,
21
+ env: input.env,
22
+ surface: input.surface,
23
+ unitType: input.unitType,
24
+ authMode: input.authMode,
25
+ baseUrl: input.baseUrl,
26
+ activeTools: input.activeTools,
27
+ });
28
+ }
18
29
  export function compileUnitToolContract(unitType) {
19
30
  const manifest = resolveManifest(unitType);
20
31
  const surfaceContract = getUnitToolSurfaceContract(unitType);
@@ -25,7 +36,7 @@ export function compileUnitToolContract(unitType) {
25
36
  detail: `No Unit manifest is registered for ${unitType}`,
26
37
  };
27
38
  }
28
- const requiredWorkflowTools = getRequiredWorkflowToolsForAutoUnit(unitType);
39
+ const requiredWorkflowTools = getRequiredWorkflowToolsForUnit(unitType);
29
40
  const forbiddenWorkflowTools = Object.entries(surfaceContract?.forbiddenGsdTools ?? {})
30
41
  .map(([name, reason]) => ({ name, reason }));
31
42
  const closeoutTools = requiredWorkflowTools.filter((tool) => /^gsd_(?:task|slice|milestone|complete|validate|save|summary|uat)/.test(tool));
@@ -4,7 +4,7 @@ import { RUN_UAT_BROWSER_TOOL_NAMES, RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_TOOL_
4
4
  import { toMcpToolName } from "./mcp-tool-name.js";
5
5
  import { createToolSurfaceSnapshot } from "./tool-surface-snapshot.js";
6
6
  import { uatTypeIncludesBrowser } from "./uat-policy.js";
7
- import { canonicalWorkflowSurfaceToolName } from "./workflow-tool-surface.js";
7
+ import { canonicalWorkflowToolName } from "./engine-hook-contract.js";
8
8
  export { RUN_UAT_BROWSER_TOOL_NAMES, RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_TOOL_PRESENTATION_PLAN_ID, RUN_UAT_WORKFLOW_TOOL_NAMES, } from "./unit-tool-contracts.js";
9
9
  export const RUN_UAT_FORBIDDEN_TOOL_NAMES = [
10
10
  "edit",
@@ -24,9 +24,9 @@ export const RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES = [
24
24
  "Glob",
25
25
  "Grep",
26
26
  ];
27
- export function canonicalWorkflowToolName(toolName) {
28
- return canonicalWorkflowSurfaceToolName(toolName);
29
- }
27
+ // Normalizer seam lives in engine-hook-contract.ts; re-exported here for
28
+ // existing presentation importers (uat-run.ts).
29
+ export { canonicalWorkflowToolName };
30
30
  export { parseMcpToolName } from "./mcp-tool-name.js";
31
31
  export function toWorkflowMcpToolName(serverName, toolName) {
32
32
  return toMcpToolName(serverName, canonicalWorkflowToolName(toolName));
@@ -0,0 +1,108 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Tool Contract module's runtime face — verify the live SDK tool surface covers a Unit's required workflow tools.
3
+ import { testMcpServerConnection } from "../mcp-client/manager.js";
4
+ import { mcpToolMatchesBaseName } from "./mcp-tool-name.js";
5
+ import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
6
+ import { recordWorkflowMcpProbe, WORKFLOW_MCP_PROBE_TIMEOUT_MS, } from "./workflow-mcp-readiness-cache.js";
7
+ import { resolveWorkflowMcpProjectRoot } from "./workflow-mcp.js";
8
+ import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
9
+ /**
10
+ * Stable phrase recognized as transient by auto-tool-tracking's
11
+ * isToolUnavailableError and error-classifier's transient buckets,
12
+ * which build their matchers from this constant.
13
+ */
14
+ export const TOOL_SURFACE_NOT_READY = "workflow tool surface not ready";
15
+ /** MCP server statuses that will not self-heal within the session. */
16
+ const TERMINAL_MCP_SERVER_STATUSES = new Set(["failed", "needs-auth", "disabled"]);
17
+ export const DEFAULT_WORKFLOW_MCP_PREFLIGHT_TIMEOUT_MS = 30_000;
18
+ export const DEFAULT_WORKFLOW_MCP_PREFLIGHT_POLL_MS = 200;
19
+ const RUN_UAT_PREFLIGHT_TIMEOUT_MS = 90_000;
20
+ function resolveWorkflowMcpPreflightTimeoutMs(unitType) {
21
+ if (unitType === "run-uat")
22
+ return RUN_UAT_PREFLIGHT_TIMEOUT_MS;
23
+ return DEFAULT_WORKFLOW_MCP_PREFLIGHT_TIMEOUT_MS;
24
+ }
25
+ export function probeCoversRequiredWorkflowTools(tools, required) {
26
+ return required.every((tool) => tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)));
27
+ }
28
+ export async function awaitWorkflowMcpToolRegistration(input) {
29
+ const { unitType, workflowServerName, projectRoot } = input;
30
+ if (!unitType || !workflowServerName)
31
+ return null;
32
+ const required = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
33
+ if (required.length === 0)
34
+ return null;
35
+ const probe = input.probe ?? (async (serverName, root) => {
36
+ const result = await testMcpServerConnection(serverName, {
37
+ projectDir: resolveWorkflowMcpProjectRoot(root),
38
+ timeoutMs: WORKFLOW_MCP_PROBE_TIMEOUT_MS,
39
+ });
40
+ return { ok: result.ok, tools: result.tools };
41
+ });
42
+ const deadline = Date.now() + (input.timeoutMs ?? resolveWorkflowMcpPreflightTimeoutMs(unitType));
43
+ const pollMs = input.pollMs ?? DEFAULT_WORKFLOW_MCP_PREFLIGHT_POLL_MS;
44
+ while (Date.now() < deadline) {
45
+ throwIfAborted(input.signal);
46
+ const result = await probe(workflowServerName, projectRoot);
47
+ throwIfAborted(input.signal);
48
+ if (result.ok && probeCoversRequiredWorkflowTools(result.tools, required)) {
49
+ recordWorkflowMcpProbe(projectRoot, workflowServerName, result.tools);
50
+ return null;
51
+ }
52
+ await sleep(pollMs, input.signal);
53
+ }
54
+ return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" did not register required tools before session start: ${required.join(", ")}`;
55
+ }
56
+ function makeAbortError() {
57
+ const error = new Error("AbortError: The operation was aborted");
58
+ error.name = "AbortError";
59
+ return error;
60
+ }
61
+ function throwIfAborted(signal) {
62
+ if (signal?.aborted)
63
+ throw makeAbortError();
64
+ }
65
+ function sleep(ms, signal) {
66
+ throwIfAborted(signal);
67
+ return new Promise((resolve, reject) => {
68
+ const timeout = setTimeout(() => {
69
+ signal?.removeEventListener("abort", onAbort);
70
+ resolve();
71
+ }, ms);
72
+ const onAbort = () => {
73
+ clearTimeout(timeout);
74
+ reject(makeAbortError());
75
+ };
76
+ signal?.addEventListener("abort", onAbort, { once: true });
77
+ });
78
+ }
79
+ /** Brief pause after a successful preflight before SDK query (race with MCP attach). */
80
+ export const POST_PREFLIGHT_SDK_SETTLE_MS = 750;
81
+ export const POST_PREFLIGHT_READINESS_RETRY_DELAYS_MS = [
82
+ 1_000, 2_000, 3_000, 5_000, 8_000, 10_000, 15_000, 15_000, 15_000, 15_000,
83
+ ];
84
+ export function getToolSurfaceReadinessError(input) {
85
+ const { unitType, workflowServerName, observation } = input;
86
+ if (!unitType || !workflowServerName)
87
+ return null;
88
+ const required = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
89
+ if (required.length === 0)
90
+ return null;
91
+ const server = observation.mcpServers.find((entry) => entry.name === workflowServerName);
92
+ if (server && TERMINAL_MCP_SERVER_STATUSES.has(server.status)) {
93
+ const missing = required.filter((tool) => !observation.tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)));
94
+ const tools = missing.length > 0 ? missing : required;
95
+ return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" status is "${server.status}" (terminal) — cannot register: ${tools.join(", ")}`;
96
+ }
97
+ const missing = required.filter((tool) => !observation.tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)));
98
+ if (missing.length === 0) {
99
+ return null;
100
+ }
101
+ if (!server) {
102
+ return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" is absent from the init surface (not yet connected): ${missing.join(", ")}`;
103
+ }
104
+ if (server.status !== "connected") {
105
+ return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" status is "${server.status}" (not yet connected): ${missing.join(", ")}`;
106
+ }
107
+ return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" is connected but has not registered: ${missing.join(", ")}`;
108
+ }
@@ -16,7 +16,8 @@ import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
16
16
  import { isClosedStatus } from "../status-guards.js";
17
17
  import { saveFile, clearParseCache } from "../files.js";
18
18
  import { invalidateStateCache } from "../state.js";
19
- import { renderAllProjections, stripIdPrefix } from "../workflow-projections.js";
19
+ import { stripIdPrefix } from "../workflow-projections.js";
20
+ import { flushWorkflowProjections } from "../projection-flush.js";
20
21
  import { writeManifest } from "../workflow-manifest.js";
21
22
  import { appendEvent } from "../workflow-events.js";
22
23
  import { logWarning, logError } from "../workflow-logger.js";
@@ -166,7 +167,7 @@ export async function handleCompleteMilestone(params, basePath) {
166
167
  // Separate try/catch per step so a projection failure doesn't prevent
167
168
  // the event log entry (critical for worktree reconciliation).
168
169
  try {
169
- await renderAllProjections(artifactBasePath, params.milestoneId);
170
+ await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
170
171
  }
171
172
  catch (projErr) {
172
173
  logWarning("tool", `complete-milestone projection warning: ${projErr.message}`);
@@ -11,19 +11,17 @@
11
11
  */
12
12
  import { existsSync, readFileSync } from "node:fs";
13
13
  import { join } from "node:path";
14
- import { isClosedStatus } from "../status-guards.js";
15
- import { transaction, insertMilestone, insertSlice, getSlice, getSliceTasks, getMilestone, updateSliceStatus, setSliceSummaryMd, saveGateResult, getPendingGatesForTurn, getMilestoneSlices, updateMilestoneStatus, } from "../gsd-db.js";
14
+ import { completeSliceCascade, setSliceSummaryMd, saveGateResult, getPendingGatesForTurn, } from "../gsd-db.js";
16
15
  import { getGatesForTurn } from "../gate-registry.js";
17
16
  import { gsdProjectionRoot, clearPathCache, resolveMilestoneFile } from "../paths.js";
18
17
  import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
19
18
  import { checkOwnership, sliceUnitKey } from "../unit-ownership.js";
20
19
  import { saveFile, clearParseCache } from "../files.js";
21
- import { getDeclaredUatType, shouldEscalateArtifactUatToBrowser } from "../uat-policy.js";
20
+ import { classifyUatContent, escalatesArtifactUatToBrowser } from "../uat-policy.js";
22
21
  import { invalidateStateCache } from "../state.js";
23
- import { renderRoadmapFromDb } from "../markdown-renderer.js";
24
- import { parseRoadmap } from "../parsers-legacy.js";
22
+ import { renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "../markdown-renderer.js";
25
23
  import { isStaleWrite } from "../auto/turn-epoch.js";
26
- import { renderAllProjections } from "../workflow-projections.js";
24
+ import { flushWorkflowProjections } from "../projection-flush.js";
27
25
  import { writeManifest } from "../workflow-manifest.js";
28
26
  import { appendEvent } from "../workflow-events.js";
29
27
  import { logWarning, logError } from "../workflow-logger.js";
@@ -56,9 +54,11 @@ function hasCompleteSliceArtifactContract(basePath, milestoneId, sliceId) {
56
54
  join(gsdProjectionRoot(basePath), "milestones", milestoneId, `${milestoneId}-ROADMAP.md`);
57
55
  if (!existsSync(roadmapPath))
58
56
  return false;
57
+ // Projection-completeness check (ADR-017): the DB has already recorded the
58
+ // duplicate completion; this only verifies the rendered markdown artifacts
59
+ // exist and reflect it, deciding whether re-rendering is needed.
59
60
  try {
60
- const roadmap = parseRoadmap(readFileSync(roadmapPath, "utf-8"));
61
- return roadmap.slices.some((slice) => slice.id === sliceId && slice.done);
61
+ return roadmapRenderMarksSliceDone(readFileSync(roadmapPath, "utf-8"), sliceId);
62
62
  }
63
63
  catch {
64
64
  return false;
@@ -289,58 +289,48 @@ export async function handleCompleteSlice(params, basePath) {
289
289
  // `npx playwright test` via gsd_uat_exec, and live-runtime/mixed/
290
290
  // browser-executable receive browser tools (UAT_MODE_POLICIES).
291
291
  const uatContent = params.uatContent || "";
292
- const declaredUatMode = getDeclaredUatType(uatContent);
293
- if (shouldEscalateArtifactUatToBrowser(uatContent)) {
292
+ const uatPolicy = classifyUatContent(uatContent);
293
+ if (escalatesArtifactUatToBrowser(uatPolicy)) {
294
+ // Distinguish an explicit artifact-driven declaration from a missing or
295
+ // unparseable one that merely *defaulted* to artifact-driven — telling an
296
+ // agent it "declared artifact-driven" when its declaration simply failed
297
+ // to parse sends it into a rewrite loop with the same unparseable format.
298
+ const staticOnlyClause = `which only runs static/file checks and would defer the browser work to a human`;
299
+ const modeClause = uatPolicy.modeDeclared
300
+ ? `declares "UAT mode: artifact-driven", ${staticOnlyClause}`
301
+ : `has no parseable UAT mode declaration in its "## UAT Type" section (the declaration must be a bullet exactly like "- UAT mode: browser-executable"), so it defaults to "artifact-driven", ${staticOnlyClause}`;
294
302
  return {
295
- error: `UAT requires browser verification (opening a page in a browser, navigating to a page or localhost, screenshots) but declares "UAT mode: artifact-driven", which only runs static/file checks and would defer the browser work to a human. Use a mode that actually verifies the UI: "browser-executable" (interactive browser tools), "runtime-executable" (a browser test command such as playwright), or a browser-inclusive "mixed"/"live-runtime". Re-author the UAT Type section and complete the slice again.`,
303
+ error: `UAT requires browser verification (opening a page in a browser, navigating to a page or localhost, screenshots) but ${modeClause}. Use a mode that actually verifies the UI: "browser-executable" (interactive browser tools), "runtime-executable" (a browser test command such as playwright), or a browser-inclusive "mixed"/"live-runtime". Re-author the UAT Type section and complete the slice again.`,
296
304
  };
297
305
  }
298
- // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
306
+ // ── Atomic completion cascade (guards + writes in one transaction) ───────
299
307
  const completedAt = new Date().toISOString();
300
308
  let guardError = null;
301
309
  let existingSummaryMd = "";
302
310
  let duplicateComplete = false;
303
- transaction(() => {
304
- // State machine preconditions (inside txn for atomicity).
305
- // Milestone/slice not existing is OK — insertMilestone/insertSlice below will auto-create.
306
- // Only block if they exist and are closed.
307
- const milestone = getMilestone(params.milestoneId);
308
- if (milestone && isClosedStatus(milestone.status)) {
309
- guardError = `cannot complete slice in a closed milestone: ${params.milestoneId} (status: ${milestone.status})`;
310
- return;
311
- }
312
- const slice = getSlice(params.milestoneId, params.sliceId);
313
- existingSummaryMd = slice?.full_summary_md?.trim() ?? "";
314
- if (slice && isClosedStatus(slice.status)) {
315
- duplicateComplete = true;
316
- return;
317
- }
318
- // Verify all tasks are complete
319
- const tasks = getSliceTasks(params.milestoneId, params.sliceId);
320
- if (tasks.length === 0) {
321
- guardError = `no tasks found for slice ${params.sliceId} in milestone ${params.milestoneId}`;
322
- return;
323
- }
324
- const incompleteTasks = tasks.filter(t => !isClosedStatus(t.status));
325
- if (incompleteTasks.length > 0) {
326
- const incompleteIds = incompleteTasks.map(t => `${t.id} (status: ${t.status})`).join(", ");
327
- guardError = `incomplete tasks: ${incompleteIds}`;
328
- return;
329
- }
330
- // All guards passed — perform writes. Preserve existing planning metadata:
331
- // completion should not overwrite title/risk/depends/demo/sequence.
332
- insertMilestone({ id: params.milestoneId, title: params.milestoneId });
333
- if (!slice) {
334
- insertSlice({ id: params.sliceId, milestoneId: params.milestoneId, title: params.sliceTitle || params.sliceId });
335
- }
336
- updateSliceStatus(params.milestoneId, params.sliceId, "complete", completedAt);
337
- const updatedSlices = getMilestoneSlices(params.milestoneId);
338
- if (milestone?.status === "planned" &&
339
- updatedSlices.length > 0 &&
340
- updatedSlices.every((s) => isClosedStatus(s.status))) {
341
- updateMilestoneStatus(params.milestoneId, "active");
342
- }
311
+ const outcome = completeSliceCascade(params.milestoneId, params.sliceId, {
312
+ sliceTitle: params.sliceTitle,
313
+ completedAt,
343
314
  });
315
+ if (outcome.ok) {
316
+ existingSummaryMd = outcome.existingSummaryMd;
317
+ duplicateComplete = outcome.duplicate;
318
+ }
319
+ else {
320
+ switch (outcome.reason) {
321
+ case "milestone-closed":
322
+ guardError = `cannot complete slice in a closed milestone: ${params.milestoneId} (status: ${outcome.status})`;
323
+ break;
324
+ case "no-tasks":
325
+ guardError = `no tasks found for slice ${params.sliceId} in milestone ${params.milestoneId}`;
326
+ break;
327
+ case "incomplete-tasks": {
328
+ const incompleteIds = outcome.incomplete.map((t) => `${t.id} (status: ${t.status})`).join(", ");
329
+ guardError = `incomplete tasks: ${incompleteIds}`;
330
+ break;
331
+ }
332
+ }
333
+ }
344
334
  if (duplicateComplete) {
345
335
  const staleSummaryPath = sliceSummaryPath(artifactBasePath, params.milestoneId, params.sliceId);
346
336
  const duplicateIsStale = isStaleWrite("complete-slice");
@@ -407,8 +397,9 @@ export async function handleCompleteSlice(params, basePath) {
407
397
  await saveFile(uatPath, uatMd);
408
398
  const roadmap = await renderRoadmapFromDb(artifactBasePath, params.milestoneId);
409
399
  clearParseCache();
410
- const roadmapSlice = parseRoadmap(roadmap.content).slices.find((slice) => slice.id === params.sliceId);
411
- if (!roadmapSlice?.done) {
400
+ // Render verification (ADR-017): confirms the just-written projection
401
+ // reflects the DB completion; the DB row is already committed.
402
+ if (!roadmapRenderMarksSliceDone(roadmap.content, params.sliceId)) {
412
403
  throw new Error(`roadmap render did not mark ${params.milestoneId}/${params.sliceId} complete`);
413
404
  }
414
405
  }
@@ -457,7 +448,7 @@ export async function handleCompleteSlice(params, basePath) {
457
448
  // Separate try/catch per step so a projection failure doesn't prevent
458
449
  // the event log entry (critical for worktree reconciliation).
459
450
  try {
460
- await renderAllProjections(artifactBasePath, params.milestoneId);
451
+ await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
461
452
  }
462
453
  catch (projErr) {
463
454
  logWarning("tool", `complete-slice projection warning for ${params.milestoneId}/${params.sliceId}: ${projErr.message}`);