@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6

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 (500) hide show
  1. package/dist/cli-web-branch.d.ts +2 -0
  2. package/dist/cli-web-branch.js +9 -2
  3. package/dist/help-text.js +5 -0
  4. package/dist/project-sessions.js +4 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/extensions/ask-user-questions.js +78 -23
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
  8. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  9. package/dist/resources/extensions/github-sync/templates.js +3 -3
  10. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  11. package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
  12. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
  14. package/dist/resources/extensions/gsd/auto/phases.js +28 -3
  15. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  16. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  17. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  21. package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
  22. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  23. package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
  24. package/dist/resources/extensions/gsd/auto-start.js +12 -23
  25. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  26. package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
  27. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
  28. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  29. package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
  30. package/dist/resources/extensions/gsd/auto.js +73 -471
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  32. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
  33. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
  36. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  37. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  38. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  39. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  40. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  41. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  42. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  43. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  44. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  45. package/dist/resources/extensions/gsd/debug-logger.js +10 -0
  46. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  47. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  48. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  49. package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
  50. package/dist/resources/extensions/gsd/doctor.js +16 -9
  51. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  52. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  53. package/dist/resources/extensions/gsd/gsd-db.js +12 -0
  54. package/dist/resources/extensions/gsd/guided-flow.js +36 -470
  55. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  56. package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
  57. package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
  58. package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
  59. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  60. package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
  61. package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
  62. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  63. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  64. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  65. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  66. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  67. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  68. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  69. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  70. package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
  71. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  72. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  73. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  74. package/dist/resources/extensions/gsd/preferences.js +147 -29
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  76. package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  78. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  79. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  80. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  84. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  85. package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  86. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  88. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  89. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  90. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  91. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  92. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  93. package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
  94. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  95. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
  96. package/dist/resources/extensions/gsd/state.js +13 -5
  97. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  98. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  99. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  100. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  101. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  102. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  103. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  104. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  105. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  106. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  107. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
  108. package/dist/resources/extensions/gsd/uat-policy.js +16 -10
  109. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  110. package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
  111. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  112. package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
  113. package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
  114. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  115. package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  117. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  118. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  119. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  120. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  121. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  122. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  123. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  125. package/dist/update-cmd.js +20 -0
  126. package/dist/web/standalone/.next/BUILD_ID +1 -1
  127. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  128. package/dist/web/standalone/.next/build-manifest.json +3 -3
  129. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  130. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  131. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/index.html +1 -1
  183. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  190. package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
  191. package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
  192. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  193. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  196. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  197. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  198. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  199. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  200. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  201. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  202. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  203. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  204. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  206. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  207. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  208. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  209. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  210. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  211. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  212. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  213. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  214. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  215. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  216. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  217. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  218. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  219. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  220. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  221. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  222. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  223. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  224. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  225. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  226. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  227. package/dist/web-mode.d.ts +2 -0
  228. package/dist/web-mode.js +20 -8
  229. package/package.json +17 -11
  230. package/packages/cloud-mcp-gateway/package.json +2 -2
  231. package/packages/contracts/package.json +1 -1
  232. package/packages/daemon/package.json +4 -4
  233. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  234. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  235. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  236. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  237. package/packages/gsd-agent-core/package.json +5 -5
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  249. package/packages/gsd-agent-modes/package.json +7 -7
  250. package/packages/mcp-server/dist/server.d.ts +10 -0
  251. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  252. package/packages/mcp-server/dist/server.js +8 -0
  253. package/packages/mcp-server/dist/server.js.map +1 -1
  254. package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
  255. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  256. package/packages/mcp-server/dist/workflow-tools.js +2 -1
  257. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  258. package/packages/mcp-server/package.json +3 -3
  259. package/packages/native/package.json +1 -1
  260. package/packages/pi-agent-core/package.json +1 -1
  261. package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
  262. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  263. package/packages/pi-ai/dist/image-models.generated.js +30 -0
  264. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  265. package/packages/pi-ai/dist/models.generated.d.ts +8 -127
  266. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  267. package/packages/pi-ai/dist/models.generated.js +47 -166
  268. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  269. package/packages/pi-ai/package.json +1 -1
  270. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
  272. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  273. package/packages/pi-coding-agent/package.json +7 -7
  274. package/packages/pi-tui/dist/components/input.js +1 -1
  275. package/packages/pi-tui/dist/components/input.js.map +1 -1
  276. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  277. package/packages/pi-tui/dist/keys.js +39 -30
  278. package/packages/pi-tui/dist/keys.js.map +1 -1
  279. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  280. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  281. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  282. package/packages/pi-tui/package.json +2 -2
  283. package/packages/rpc-client/package.json +2 -2
  284. package/pkg/package.json +1 -1
  285. package/scripts/install/deps.js +10 -0
  286. package/scripts/link-workspace-packages.cjs +7 -40
  287. package/src/resources/extensions/ask-user-questions.ts +87 -24
  288. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
  289. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
  290. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  291. package/src/resources/extensions/github-sync/templates.ts +3 -3
  292. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  293. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  294. package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
  295. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  296. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  297. package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
  298. package/src/resources/extensions/gsd/auto/phases.ts +35 -3
  299. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  300. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  301. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  302. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  303. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  304. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
  305. package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
  306. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  307. package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
  308. package/src/resources/extensions/gsd/auto-start.ts +17 -20
  309. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  310. package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
  311. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
  312. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  313. package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
  314. package/src/resources/extensions/gsd/auto.ts +96 -508
  315. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  316. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
  317. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  318. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
  319. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
  320. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  321. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  322. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  323. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  324. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  325. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  326. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  327. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  328. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  329. package/src/resources/extensions/gsd/debug-logger.ts +11 -0
  330. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  331. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  332. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  333. package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
  334. package/src/resources/extensions/gsd/doctor.ts +15 -5
  335. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  336. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  337. package/src/resources/extensions/gsd/gsd-db.ts +12 -0
  338. package/src/resources/extensions/gsd/guided-flow.ts +49 -560
  339. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  340. package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
  341. package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
  342. package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
  343. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  344. package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
  345. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  346. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  347. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  348. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  349. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  350. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  351. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  352. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  353. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  354. package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
  355. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  356. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  357. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  358. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  359. package/src/resources/extensions/gsd/preferences.ts +173 -28
  360. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  361. package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
  362. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  363. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  364. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  365. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  366. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  367. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  368. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  369. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  370. package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  371. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  372. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  373. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  374. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  375. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  376. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  377. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  378. package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
  379. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  380. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
  381. package/src/resources/extensions/gsd/state.ts +15 -5
  382. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  383. package/src/resources/extensions/gsd/templates/project.md +1 -0
  384. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  385. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  386. package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
  387. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  388. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  389. package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
  390. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
  391. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  392. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  393. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
  394. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
  395. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  396. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  397. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  398. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  399. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
  400. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
  401. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  402. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
  403. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  404. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
  405. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  406. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  407. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  408. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  409. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
  410. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
  411. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  412. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
  413. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  414. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  415. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  416. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  417. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  418. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  419. package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
  420. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
  421. package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
  422. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  423. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
  424. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  425. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  426. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  427. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
  428. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  429. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  430. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  431. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
  432. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
  433. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  434. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
  435. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  436. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
  437. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  438. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
  439. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
  440. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  441. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  442. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
  443. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
  444. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
  445. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  446. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
  447. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
  448. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  449. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
  450. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  451. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
  452. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  453. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
  454. package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
  455. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  456. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  457. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  458. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  459. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  460. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  461. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
  462. package/src/resources/extensions/gsd/uat-policy.ts +19 -10
  463. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  464. package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
  465. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  466. package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
  467. package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
  468. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  469. package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
  470. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  471. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  472. package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
  473. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  474. package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
  475. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  476. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  477. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  478. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  479. package/dist/web/standalone/.next/server/chunks/678.js +0 -2
  480. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  483. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  485. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  486. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
  487. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
  488. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
  489. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
  490. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
  491. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
  492. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
  493. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
  494. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
  495. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
  496. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
  497. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
  498. package/scripts/ensure-workspace-builds.cjs +0 -129
  499. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
  500. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
@@ -33,7 +33,8 @@ import { writeUnitRuntimeRecord } from "../unit-runtime.js";
33
33
  import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
34
34
  import { getEligibleSlices } from "../slice-parallel-eligibility.js";
35
35
  import { isSliceParallelActive, startSliceParallel } from "../slice-parallel-orchestrator.js";
36
- import { isDbAvailable, getMilestoneSlices, getSlice, getTask, refreshOpenDatabaseFromDisk } from "../gsd-db.js";
36
+ import { isDbAvailable, getMilestoneSlices, getSlice, getTask } from "../gsd-db.js";
37
+ import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
37
38
  import { isClosedStatus } from "../status-guards.js";
38
39
  import { setRuntimeKv } from "../db/runtime-kv.js";
39
40
  import { getLatestForUnit } from "../db/unit-dispatches.js";
@@ -49,7 +50,7 @@ import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
49
50
  import { getContextPauseAction } from "../auto-budget.js";
50
51
  import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForAutoUnit, supportsStructuredQuestions, } from "../workflow-mcp.js";
51
52
  import { prepareWorkflowMcpForProject } from "../workflow-mcp-auto-prep.js";
52
- import { getToolBaselineSnapshot, applyThinkingLevelForModel, floorThinkingLevelForUnit } from "../auto-model-selection.js";
53
+ import { applyThinkingLevelForModel, floorThinkingLevelForUnit, getRegisteredToolSnapshot, getToolBaselineSnapshot, } from "../auto-model-selection.js";
53
54
  import { resolveManifest } from "../unit-context-manifest.js";
54
55
  import { createWorktreeSafetyModule } from "../worktree-safety.js";
55
56
  import { isSuspiciousGhostCompletion } from "../auto-unit-closeout.js";
@@ -156,7 +157,7 @@ function rememberRetryDispatch(s, unit, iterData) {
156
157
  function getAlreadyClosedDispatchReason(unitType, unitId) {
157
158
  if (!isDbAvailable())
158
159
  return null;
159
- refreshOpenDatabaseFromDisk();
160
+ refreshWorkflowDatabaseFromDisk();
160
161
  const { milestone, slice, task } = parseUnitId(unitId);
161
162
  if (unitType === "execute-task" && milestone && slice && task) {
162
163
  const row = getTask(milestone, slice, task);
@@ -447,6 +448,14 @@ export async function _runMilestoneMergeWithStashRestore(ic, milestoneId, option
447
448
  const exitResult = deps.lifecycle.exitMilestone(milestoneId, { merge: true }, ctx.ui);
448
449
  if (exitResult.ok) {
449
450
  s.milestoneMergedInPhases = true;
451
+ try {
452
+ const projectRoot = s.originalBasePath || s.canonicalProjectRoot || s.basePath;
453
+ const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
454
+ await rebuildMarkdownProjectionsFromDb(projectRoot);
455
+ }
456
+ catch (err) {
457
+ logWarning("engine", `markdown projection rebuild after milestone merge failed: ${err instanceof Error ? err.message : String(err)}`);
458
+ }
450
459
  }
451
460
  else {
452
461
  mergeError = exitResult.cause ?? new Error(`exit ${exitResult.reason}`);
@@ -929,6 +938,19 @@ export async function runPreDispatch(ic, loopState) {
929
938
  catch (e) {
930
939
  logWarning("engine", "STATE.md rebuild failed after milestone transition", { error: String(e) });
931
940
  }
941
+ // Re-project ROADMAP/PLAN markdown from the authoritative DB. Worktree DB
942
+ // reconciliation during merge can leave main-branch markdown stale relative
943
+ // to gsd.db (the 3M/3S/10T vs 3M/5S/16T drift class at /gsd startup).
944
+ try {
945
+ const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
946
+ await rebuildMarkdownProjectionsFromDb(s.canonicalProjectRoot);
947
+ if (s.basePath !== s.canonicalProjectRoot) {
948
+ await rebuildMarkdownProjectionsFromDb(s.basePath);
949
+ }
950
+ }
951
+ catch (e) {
952
+ logWarning("engine", "markdown projection rebuild failed after milestone transition", { error: String(e) });
953
+ }
932
954
  }
933
955
  if (mid) {
934
956
  s.currentMilestoneId = mid;
@@ -1082,6 +1104,7 @@ export async function runDispatch(ic, preData, loopState) {
1082
1104
  // Checking a stale-narrowed set causes false transport-preflight warnings
1083
1105
  // that repeat on every /gsd auto resume (#477 follow-up).
1084
1106
  const activeTools = getToolBaselineSnapshot(pi);
1107
+ const registeredTools = getRegisteredToolSnapshot(pi);
1085
1108
  // Deep planning intentionally keeps human checkpoints in plain chat. In
1086
1109
  // Claude Code/local MCP transports, structured question requests can be
1087
1110
  // cancelled outside the normal chat flow, which made approval gates easy to
@@ -1105,6 +1128,7 @@ export async function runDispatch(ic, preData, loopState) {
1105
1128
  sessionProvider: ctx.model?.provider,
1106
1129
  modelRegistry: ctx.modelRegistry,
1107
1130
  activeTools,
1131
+ registeredTools,
1108
1132
  sessionBaseUrl: ctx.model?.baseUrl,
1109
1133
  sessionAuthMode: authMode,
1110
1134
  });
@@ -1131,6 +1155,7 @@ export async function runDispatch(ic, preData, loopState) {
1131
1155
  sessionProvider: ctx.model?.provider,
1132
1156
  modelRegistry: ctx.modelRegistry,
1133
1157
  activeTools,
1158
+ registeredTools,
1134
1159
  sessionBaseUrl: ctx.model?.baseUrl,
1135
1160
  sessionAuthMode: authMode,
1136
1161
  });
@@ -95,7 +95,8 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
95
95
  unitId,
96
96
  error: msg,
97
97
  });
98
- return { status: "cancelled", errorContext: { message: `Session creation failed: ${msg}`, category: "session-failed", isTransient: true } };
98
+ const isStructural = sessionErr instanceof TypeError || /is not a function/i.test(msg);
99
+ return { status: "cancelled", errorContext: { message: `Session creation failed: ${msg}`, category: "session-failed", isTransient: !isStructural } };
99
100
  }
100
101
  if (sessionTimeoutHandle)
101
102
  clearTimeout(sessionTimeoutHandle);
@@ -143,6 +143,8 @@ export class AutoSession {
143
143
  /** Set to true after phases.ts successfully calls mergeAndExit, so that
144
144
  * stopAuto does not attempt the same merge a second time (#2645). */
145
145
  milestoneMergedInPhases = false;
146
+ /** Last milestone settlement result observed by Auto Orchestration. */
147
+ milestoneSettlement = null;
146
148
  // #4765 — slice-cadence collapse: main-branch SHAs at the moment each
147
149
  // milestone's first slice merge began. Used by resquashMilestoneOnMain at
148
150
  // milestone completion to collapse N slice commits into one. Cleared when
@@ -311,6 +313,7 @@ export class AutoSession {
311
313
  this.strandedRecoveryIsolationMode = null;
312
314
  this.rootWriteBaseline = null;
313
315
  this.milestoneMergedInPhases = false;
316
+ this.milestoneSettlement = null;
314
317
  this.milestoneStartShas = new Map();
315
318
  this.checkpointSha = null;
316
319
  // Signal handler
@@ -16,6 +16,7 @@ import { parseUnitId } from "./unit-id.js";
16
16
  import { logWarning } from "./workflow-logger.js";
17
17
  import { formattedShortcutPair } from "./shortcut-defs.js";
18
18
  import { readUnitRuntimeRecord } from "./unit-runtime.js";
19
+ import { describeMilestoneReadinessPhase } from "./milestone-readiness.js";
19
20
  const ACTIVE_SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
20
21
  // ─── UAT Slice Extraction ─────────────────────────────────────────────────────
21
22
  /**
@@ -84,6 +85,18 @@ export function unitPhaseLabel(unitType) {
84
85
  default: return unitType.toUpperCase();
85
86
  }
86
87
  }
88
+ export function formatToolSurfaceSnapshot(snapshot) {
89
+ if (!snapshot)
90
+ return null;
91
+ const counts = [
92
+ `model ${snapshot.modelFacingToolNames.length}`,
93
+ `registered ${snapshot.registeredToolNames.length}`,
94
+ `scoped ${snapshot.scopedToolNames.length}`,
95
+ `presented ${snapshot.presentedToolNames.length}`,
96
+ ];
97
+ const label = snapshot.unitType ?? snapshot.phase ?? snapshot.source;
98
+ return `${label}: ${counts.join(" / ")}`;
99
+ }
87
100
  function peekNext(unitType, state) {
88
101
  // Show active hook info in progress display
89
102
  const activeHookState = getActiveHook();
@@ -118,11 +131,10 @@ export function describeNextUnit(state) {
118
131
  const sTitle = state.activeSlice?.title;
119
132
  const tid = state.activeTask?.id;
120
133
  const tTitle = state.activeTask?.title;
134
+ const readinessDescription = describeMilestoneReadinessPhase(state.phase);
135
+ if (readinessDescription)
136
+ return readinessDescription;
121
137
  switch (state.phase) {
122
- case "needs-discussion":
123
- return { label: "Discuss milestone draft", description: "Milestone has a draft context — needs discussion before planning." };
124
- case "pre-planning":
125
- return { label: "Research & plan milestone", description: "Scout the landscape and create the roadmap." };
126
138
  case "planning":
127
139
  return { label: `Plan ${sid}: ${sTitle}`, description: "Research and decompose into tasks." };
128
140
  case "executing":
@@ -37,7 +37,7 @@ import { probeGitConflictState } from "./git-conflict-state.js";
37
37
  import { runTurnGitAction } from "./git-service.js";
38
38
  import { parseUnitId } from "./unit-id.js";
39
39
  import { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
40
- import { checkCloseoutConsistencyGate, formatCloseoutConsistencyBlock, } from "./closeout-consistency-gate.js";
40
+ import { formatCloseoutProofBlock, proveMilestoneCloseout, } from "./milestone-closeout-proof.js";
41
41
  function resolveExistingExpectedArtifact(unitType, unitId, basePath) {
42
42
  const artifactPath = resolveExpectedArtifactPath(unitType, unitId, basePath);
43
43
  return artifactPath && existsSync(artifactPath) ? artifactPath : null;
@@ -518,7 +518,7 @@ export const DISPATCH_RULES = [
518
518
  },
519
519
  {
520
520
  name: "run-uat (post-completion)",
521
- match: async ({ state, mid, basePath, prefs, sessionProvider, sessionAuthMode, activeTools, sessionBaseUrl }) => {
521
+ match: async ({ state, mid, basePath, prefs, sessionProvider, sessionAuthMode, activeTools, registeredTools, sessionBaseUrl, }) => {
522
522
  const needsRunUat = await checkNeedsRunUat(basePath, mid, state, prefs);
523
523
  if (!needsRunUat)
524
524
  return null;
@@ -533,6 +533,7 @@ export const DISPATCH_RULES = [
533
533
  const browserToolError = getUatBrowserToolSupportError({
534
534
  uatType,
535
535
  activeTools,
536
+ registeredTools,
536
537
  milestoneId: mid,
537
538
  sliceId,
538
539
  });
@@ -1425,11 +1426,11 @@ export const DISPATCH_RULES = [
1425
1426
  };
1426
1427
  }
1427
1428
  if (milestone) {
1428
- const closeoutGate = checkCloseoutConsistencyGate(mid, { refreshFromDisk: true });
1429
- if (!closeoutGate.ok) {
1429
+ const closeoutProof = proveMilestoneCloseout(mid, { refreshFromDisk: true });
1430
+ if (!closeoutProof.ok) {
1430
1431
  return {
1431
1432
  action: "stop",
1432
- reason: formatCloseoutConsistencyBlock(closeoutGate),
1433
+ reason: formatCloseoutProofBlock(closeoutProof),
1433
1434
  level: "warning",
1434
1435
  };
1435
1436
  }
@@ -90,6 +90,14 @@ export function getToolBaselineSnapshot(pi) {
90
90
  return live;
91
91
  return [...new Set([...baseline, ...live])];
92
92
  }
93
+ export function getRegisteredToolSnapshot(pi) {
94
+ if (typeof pi.getAllTools !== "function")
95
+ return getToolBaselineSnapshot(pi);
96
+ const names = pi.getAllTools()
97
+ .map((tool) => tool.name)
98
+ .filter((name) => typeof name === "string" && name.length > 0);
99
+ return [...new Set(names)];
100
+ }
93
101
  /**
94
102
  * Models eligible for the pre-dispatch policy gate. Prefer registry-available
95
103
  * models; when that list is empty (common after worktree resume before registry
@@ -28,7 +28,8 @@ import { regenerateIfMissing } from "./workflow-projections.js";
28
28
  import { WorktreeStateProjection } from "./worktree-state-projection.js";
29
29
  import { createWorkspace, scopeMilestone } from "./workspace.js";
30
30
  import { normalizeWorktreePathForCompare } from "./worktree-root.js";
31
- import { isDbAvailable, getDbPath, refreshOpenDatabaseFromDisk, getTask, getSlice, getMilestone, getMilestoneSlices, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
31
+ import { isDbAvailable, getTask, getSlice, getMilestone, getMilestoneSlices, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
32
+ import { getWorkflowDatabasePath, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
32
33
  import { renderPlanCheckboxes, renderRoadmapFromDb } from "./markdown-renderer.js";
33
34
  import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
34
35
  import { consumeSignal } from "./session-status-io.js";
@@ -1052,9 +1053,9 @@ export async function postUnitPreVerification(pctx, opts) {
1052
1053
  if (!opts?.skipSettleDelay) {
1053
1054
  await new Promise(r => setTimeout(r, 100));
1054
1055
  }
1055
- const dbPath = getDbPath();
1056
+ const dbPath = getWorkflowDatabasePath();
1056
1057
  if (isDbAvailable() && dbPath && dbPath !== ":memory:") {
1057
- const refreshed = refreshOpenDatabaseFromDisk();
1058
+ const refreshed = refreshWorkflowDatabaseFromDisk();
1058
1059
  if (!refreshed) {
1059
1060
  logWarning("db", "post-unit database refresh failed; derived state may be stale");
1060
1061
  }
@@ -21,7 +21,9 @@ import { getPendingGatesForTurn } from "./gsd-db.js";
21
21
  import { assertGateCoverage, getGatesForTurn, } from "./gate-registry.js";
22
22
  import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
23
23
  import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
24
- import { composeContextModeInstructions, composeInlinedContext, composeUnitContext } from "./unit-context-composer.js";
24
+ import { composeContextModeInstructions, composeContractedUnitContext, composeInlinedContext, composeUnitContext, } from "./unit-context-composer.js";
25
+ import { resolveManifest } from "./unit-context-manifest.js";
26
+ import { compileUnitContextContract } from "./tool-contract.js";
25
27
  import { readCompactionSnapshot } from "./compaction-snapshot.js";
26
28
  import { logWarning } from "./workflow-logger.js";
27
29
  import { inlineGraphSubgraph } from "./graph-context.js";
@@ -32,6 +34,7 @@ import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-acti
32
34
  import { findMilestoneIds } from "./milestone-ids.js";
33
35
  import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
34
36
  import { resolveEffectiveUatType, shouldDispatchUatForContent } from "./uat-policy.js";
37
+ import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
35
38
  export { buildSkillActivationBlock, buildSkillDiscoveryVars };
36
39
  // ─── Preamble Cap ─────────────────────────────────────────────────────────────
37
40
  /**
@@ -228,6 +231,29 @@ function prependContextModeToBlock(unitType, base, block, renderMode = "standalo
228
231
  return contextMode;
229
232
  return `${contextMode}\n\n${block}`;
230
233
  }
234
+ function requireUnitPromptContextContract(unitType) {
235
+ const result = compileUnitContextContract(unitType);
236
+ if (result.ok)
237
+ return result.contract;
238
+ throw new Error(result.detail);
239
+ }
240
+ function requireComposedArtifactBlock(blocks, unitType, key) {
241
+ const block = blocks.find((item) => item.key === key);
242
+ if (!block) {
243
+ throw new Error(`Unit Context Contract for ${unitType} did not compose required artifact ${key}`);
244
+ }
245
+ return block.body;
246
+ }
247
+ function renderExecuteTaskOnDemandContext(base, mid, sid, artifacts) {
248
+ if (!artifacts.includes("slice-research"))
249
+ return "";
250
+ const researchPath = relSliceFile(base, mid, sid, "RESEARCH");
251
+ return [
252
+ "## On-demand Context",
253
+ "",
254
+ `Slice research is available at \`${researchPath}\`. Read it only if the inlined task plan, slice plan excerpt, and carry-forward context do not explain a required implementation detail.`,
255
+ ].join("\n");
256
+ }
231
257
  // ─── Executor Constraints ─────────────────────────────────────────────────────
232
258
  /**
233
259
  * Format executor context constraints for injection into the plan-slice prompt.
@@ -1451,6 +1477,75 @@ export async function buildDiscussRequirementsPrompt(base, structuredQuestionsAv
1451
1477
  commitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
1452
1478
  }));
1453
1479
  }
1480
+ /**
1481
+ * Bounded codebase snapshot for research-milestone grounding (ADR-029).
1482
+ *
1483
+ * Reuses the in-process, ~millisecond `analyzeCodebase` / `formatCodebaseBrief`
1484
+ * machinery that powers the guided-discuss Preparation Snapshot, so research
1485
+ * grounds on current code reality instead of running an open-ended `rg`/`find`/
1486
+ * `scout` survey on every dispatch (the auto-mode counterpart to ADR-028).
1487
+ *
1488
+ * Gated on the manifest's `codebaseMap` flag (previously a dead policy flag)
1489
+ * and the `discuss_preparation` opt-out. Failures degrade silently — research
1490
+ * still runs, it just falls back to on-demand reads.
1491
+ */
1492
+ async function buildResearchCodebaseSnapshot(base) {
1493
+ const manifest = resolveManifest("research-milestone");
1494
+ if (!manifest?.codebaseMap)
1495
+ return null;
1496
+ const prefs = loadEffectiveGSDPreferences(base)?.preferences;
1497
+ if (prefs?.discuss_preparation === false)
1498
+ return null;
1499
+ try {
1500
+ const { analyzeCodebase, formatCodebaseBrief } = await import("./preparation.js");
1501
+ const brief = await analyzeCodebase(base);
1502
+ const formatted = formatCodebaseBrief(brief).trim();
1503
+ if (!formatted)
1504
+ return null;
1505
+ return [
1506
+ "### Codebase Snapshot (current code reality)",
1507
+ "Source: in-process bounded scan of the working tree.",
1508
+ "",
1509
+ "This snapshot describes what already exists. Treat it as authoritative for current code reality and do NOT re-survey the tree to rediscover it. Read a specific file only when a research question hinges on its exact contents.",
1510
+ "",
1511
+ formatted,
1512
+ ].join("\n");
1513
+ }
1514
+ catch (err) {
1515
+ logWarning("prompt", `buildResearchCodebaseSnapshot failed: ${err instanceof Error ? err.message : String(err)}`);
1516
+ return null;
1517
+ }
1518
+ }
1519
+ /**
1520
+ * Lightweight research resume block (ADR-029).
1521
+ *
1522
+ * When a prior attempt for this milestone left durable output — a partial
1523
+ * RESEARCH artifact and/or a research phase anchor — inline it under a
1524
+ * "continue, do not redo" banner so a re-dispatched research unit extends
1525
+ * prior work instead of re-running every command from scratch (the
1526
+ * restart-from-scratch pattern observed in the 789 run trace). No new state
1527
+ * machine: the partial RESEARCH file and the existing phase anchor are the
1528
+ * durable signals. Returns null when there is nothing to resume.
1529
+ */
1530
+ async function buildResearchResumeBlock(base, mid) {
1531
+ const researchPath = resolveMilestoneFile(base, mid, "RESEARCH");
1532
+ const researchRel = relMilestoneFile(base, mid, "RESEARCH");
1533
+ const partial = await inlineFileOptional(researchPath, researchRel, "Prior Partial Research");
1534
+ const anchor = readPhaseAnchor(base, mid, "research-milestone");
1535
+ if (!partial && !anchor)
1536
+ return null;
1537
+ const lines = [
1538
+ "### Resume — Prior Partial Research (continue, do not redo)",
1539
+ "",
1540
+ "A previous research attempt for this milestone left the durable output below. **Build on it — do not restart from scratch.** Re-run a command only when its prior result is missing or stale, and persist progress incrementally with `gsd_summary_save` so any interruption keeps your findings.",
1541
+ "",
1542
+ ];
1543
+ if (anchor)
1544
+ lines.push(formatAnchorForPrompt(anchor), "");
1545
+ if (partial)
1546
+ lines.push(partial);
1547
+ return lines.join("\n").trimEnd();
1548
+ }
1454
1549
  export async function buildResearchMilestonePrompt(mid, midTitle, base) {
1455
1550
  const contextTelemetry = [];
1456
1551
  // Keep research milestone prompts focused on the milestone brief and
@@ -1490,6 +1585,32 @@ export async function buildResearchMilestonePrompt(mid, midTitle, base) {
1490
1585
  const parts = [];
1491
1586
  if (composed.prepend)
1492
1587
  parts.push(composed.prepend);
1588
+ // Resume grounding (ADR-029): if a prior attempt left partial research or a
1589
+ // phase anchor, inline it prominently so a re-dispatched unit continues
1590
+ // rather than re-running every command from scratch.
1591
+ const resumeBlock = await buildResearchResumeBlock(base, mid);
1592
+ if (resumeBlock) {
1593
+ parts.push(resumeBlock);
1594
+ trackPromptContext(contextTelemetry, "research-resume", "inline", resumeBlock);
1595
+ }
1596
+ else {
1597
+ trackPromptContext(contextTelemetry, "research-resume", "skipped", null, "no prior partial research");
1598
+ }
1599
+ // Project-size signal (ADR-029): same classification plan-milestone gets, so
1600
+ // research right-sizes effort on tiny projects instead of over-researching.
1601
+ const classificationBlock = formatProjectClassificationForPlanning(classifyProject(base));
1602
+ parts.push(classificationBlock);
1603
+ trackPromptContext(contextTelemetry, "project-classification", "inline", classificationBlock);
1604
+ // Codebase snapshot (ADR-029): bounded, in-process code-reality grounding so
1605
+ // research does not open-endedly survey the tree (auto-mode ADR-028).
1606
+ const codebaseSnapshot = await buildResearchCodebaseSnapshot(base);
1607
+ if (codebaseSnapshot) {
1608
+ parts.push(codebaseSnapshot);
1609
+ trackPromptContext(contextTelemetry, "codebase-snapshot", "inline", codebaseSnapshot);
1610
+ }
1611
+ else {
1612
+ trackPromptContext(contextTelemetry, "codebase-snapshot", "skipped", null, "disabled, empty, or scan failed");
1613
+ }
1493
1614
  if (knowledgeInlineRM && composed.inline) {
1494
1615
  const idx = composed.inline.lastIndexOf("### Output Template:");
1495
1616
  if (idx > 0) {
@@ -1649,6 +1770,13 @@ export async function buildPlanMilestonePrompt(mid, midTitle, base, level) {
1649
1770
  else {
1650
1771
  trackPromptContext(contextTelemetry, "knowledge", "skipped", null, "missing");
1651
1772
  }
1773
+ const webAppUatGuidance = buildWebAppUatGuidanceBlock(base);
1774
+ if (webAppUatGuidance) {
1775
+ pushTracked("web-app-uat", webAppUatGuidance);
1776
+ }
1777
+ else {
1778
+ trackPromptContext(contextTelemetry, "web-app-uat", "skipped", null, "not a web app");
1779
+ }
1652
1780
  pushTracked("templates", inlineTemplate("roadmap", "Roadmap"));
1653
1781
  if (inlineLevel === "full") {
1654
1782
  pushTracked("templates", inlineTemplate("decisions", "Decisions"));
@@ -1936,6 +2064,14 @@ async function renderSlicePrompt(options) {
1936
2064
  else {
1937
2065
  trackPromptContext(contextTelemetry, "graph-subgraph", "skipped", null, "missing");
1938
2066
  }
2067
+ const webAppUatGuidance = buildWebAppUatGuidanceBlock(base);
2068
+ if (webAppUatGuidance) {
2069
+ inlined.push(webAppUatGuidance);
2070
+ trackPromptContext(contextTelemetry, "web-app-uat", "inline", webAppUatGuidance);
2071
+ }
2072
+ else {
2073
+ trackPromptContext(contextTelemetry, "web-app-uat", "skipped", null, "not a web app");
2074
+ }
1939
2075
  const planTemplateInline = level === "minimal" ? inlineCompactTemplate("plan", "Slice Plan") : inlineTemplate("plan", "Slice Plan");
1940
2076
  inlined.push(planTemplateInline);
1941
2077
  trackPromptContext(contextTelemetry, "templates", "inline", planTemplateInline);
@@ -2077,7 +2213,7 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
2077
2213
  const taskPlanPath = resolveTaskFile(base, mid, sid, tid, "PLAN");
2078
2214
  const taskPlanContent = taskPlanPath ? await loadFile(taskPlanPath) : null;
2079
2215
  const taskPlanRelPath = relSlicePath(base, mid, sid) + `/tasks/${tid}-PLAN.md`;
2080
- const taskPlanInline = taskPlanContent
2216
+ const taskPlanContext = taskPlanContent
2081
2217
  ? [
2082
2218
  "## Inlined Task Plan (authoritative local execution contract)",
2083
2219
  `Source: \`${taskPlanRelPath}\``,
@@ -2088,11 +2224,11 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
2088
2224
  "## Inlined Task Plan (authoritative local execution contract)",
2089
2225
  `Task plan not found at dispatch time. Read \`${taskPlanRelPath}\` before executing.`,
2090
2226
  ].join("\n");
2091
- trackPromptContext(contextTelemetry, "task-plan", taskPlanContent ? "inline" : "on-demand", taskPlanInline, taskPlanContent ? undefined : "missing at dispatch");
2227
+ trackPromptContext(contextTelemetry, "task-plan", taskPlanContent ? "inline" : "on-demand", taskPlanContext, taskPlanContent ? undefined : "missing at dispatch");
2092
2228
  const slicePlanPath = resolveSliceFile(base, mid, sid, "PLAN");
2093
2229
  const slicePlanContent = slicePlanPath ? await loadFile(slicePlanPath) : null;
2094
- const slicePlanExcerpt = extractSliceExecutionExcerpt(slicePlanContent, relSliceFile(base, mid, sid, "PLAN"));
2095
- trackPromptContext(contextTelemetry, "slice-plan", slicePlanExcerpt ? "excerpt" : "skipped", slicePlanExcerpt, slicePlanExcerpt ? undefined : "missing");
2230
+ const slicePlanContext = extractSliceExecutionExcerpt(slicePlanContent, relSliceFile(base, mid, sid, "PLAN"));
2231
+ trackPromptContext(contextTelemetry, "slice-plan", slicePlanContext ? "excerpt" : "skipped", slicePlanContext, slicePlanContext ? undefined : "missing");
2096
2232
  // Check for continue file (new naming or legacy)
2097
2233
  const continueFile = resolveSliceFile(base, mid, sid, "CONTINUE");
2098
2234
  const legacyContinueDir = resolveSlicePath(base, mid, sid);
@@ -2191,6 +2327,30 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
2191
2327
  trackPromptContext(contextTelemetry, "decisions-template", "on-demand", decisionsOnDemandET);
2192
2328
  }
2193
2329
  trackPromptContext(contextTelemetry, "templates", "inline", inlinedTemplates, inlineLevel);
2330
+ const contextContract = requireUnitPromptContextContract("execute-task");
2331
+ const contractedContext = await composeContractedUnitContext(contextContract, {
2332
+ base: { unitType: "execute-task", basePath: base, milestoneId: mid, sliceId: sid, taskId: tid },
2333
+ resolveArtifact: async (key) => {
2334
+ switch (key) {
2335
+ case "task-plan":
2336
+ return taskPlanContext;
2337
+ case "slice-plan":
2338
+ return slicePlanContext;
2339
+ case "prior-task-summaries":
2340
+ return finalCarryForward;
2341
+ case "templates":
2342
+ return inlinedTemplates;
2343
+ default:
2344
+ return null;
2345
+ }
2346
+ },
2347
+ });
2348
+ const taskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
2349
+ const slicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
2350
+ const contractedCarryForward = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "prior-task-summaries");
2351
+ const contractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
2352
+ const onDemandContext = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
2353
+ trackPromptContext(contextTelemetry, "slice-research", onDemandContext ? "on-demand" : "skipped", onDemandContext, onDemandContext ? undefined : "not declared by contract");
2194
2354
  const prompt = loadPrompt("execute-task", {
2195
2355
  overridesSection,
2196
2356
  runtimeContext,
@@ -2202,11 +2362,12 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
2202
2362
  taskPlanPath: taskPlanRelPath,
2203
2363
  taskPlanInline,
2204
2364
  slicePlanExcerpt,
2205
- carryForwardSection: finalCarryForward,
2365
+ carryForwardSection: contractedCarryForward,
2206
2366
  resumeSection,
2207
2367
  priorTaskLines: priorLines,
2368
+ onDemandContext,
2208
2369
  taskSummaryPath,
2209
- inlinedTemplates,
2370
+ inlinedTemplates: contractedTemplates,
2210
2371
  verificationBudget,
2211
2372
  gatesToClose,
2212
2373
  skillActivation: buildSkillActivationBlock({
@@ -2217,7 +2378,7 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
2217
2378
  taskId: tid,
2218
2379
  taskTitle: tTitle,
2219
2380
  taskPlanContent,
2220
- extraContext: [taskPlanInline, slicePlanExcerpt, finalCarryForward, resumeSection],
2381
+ extraContext: [taskPlanInline, slicePlanExcerpt, contractedCarryForward, resumeSection],
2221
2382
  unitType: "execute-task",
2222
2383
  }),
2223
2384
  });
@@ -2328,6 +2489,14 @@ export async function buildCompleteSlicePrompt(mid, midTitle, sid, sTitle, base,
2328
2489
  body = `${body}\n\n---\n\n${knowledgeInlineCS}`;
2329
2490
  }
2330
2491
  }
2492
+ const webAppUatGuidance = buildWebAppUatGuidanceBlock(base);
2493
+ if (webAppUatGuidance && body) {
2494
+ body = `${webAppUatGuidance}\n\n---\n\n${body}`;
2495
+ trackPromptContext(contextTelemetry, "web-app-uat", "inline", webAppUatGuidance);
2496
+ }
2497
+ else {
2498
+ trackPromptContext(contextTelemetry, "web-app-uat", "skipped", null, webAppUatGuidance ? "missing composed body" : "not a web app");
2499
+ }
2331
2500
  // Overrides section prepends to the top of the inlined context —
2332
2501
  // standard pattern for slice-level builders (until composer v2 lands
2333
2502
  // the prepend contract).
@@ -3190,6 +3359,17 @@ opts) {
3190
3359
  // gate-registry.ts so that prompt builders, dispatch rules, state
3191
3360
  // derivation, and tool handlers all consult the same source of truth.
3192
3361
  // See gate-registry.ts for the full ownership map.
3362
+ /**
3363
+ * Adapt gate-registry guidance for section-close phases.
3364
+ *
3365
+ * Gate-registry text is shared with the gate-evaluate subagent, where
3366
+ * "Return verdict ..." is literal. Section-close units write artifact sections
3367
+ * instead, so translate that wording at render time without mutating the
3368
+ * canonical guidance.
3369
+ */
3370
+ function sectionModeGuidance(guidance) {
3371
+ return guidance.replace(/Return verdict '([^']+)'/g, (_match, verdict) => verdict === "omitted" ? "Leave the section empty" : `Record a \`${verdict}\``);
3372
+ }
3193
3373
  /**
3194
3374
  * Render a "Gates to Close" block for turns like `complete-slice` and
3195
3375
  * `validate-milestone` that own gates which are closed as a side-effect
@@ -3208,12 +3388,14 @@ function renderGatesToCloseBlock(gates, opts) {
3208
3388
  lines.push("");
3209
3389
  lines.push("These quality gates are still pending for this unit. You MUST address every one before calling the closing tool — the handler closes the DB row based on whether the corresponding artifact section is present.");
3210
3390
  lines.push("");
3391
+ lines.push("**Do NOT call `gsd_save_gate_result` (or any gate-result tool) for these gates** — that tool belongs to a different phase and the call will be blocked. You close each gate purely by writing its named section: a populated section records `pass`, an empty section records `omitted`, and the completion handler persists the verdict for you. Treat any \"return verdict\" wording in the guidance below as describing that section outcome, not as an instruction to call a tool.");
3392
+ lines.push("");
3211
3393
  for (const def of applicable) {
3212
3394
  lines.push(`### ${def.id} — ${def.promptSection}`);
3213
3395
  lines.push("");
3214
3396
  lines.push(`**Question:** ${def.question}`);
3215
3397
  lines.push("");
3216
- lines.push(def.guidance);
3398
+ lines.push(sectionModeGuidance(def.guidance));
3217
3399
  if (opts.allowOmit) {
3218
3400
  lines.push("");
3219
3401
  lines.push(`If this gate genuinely does not apply to this unit, leave the **${def.promptSection}** section empty and the handler will record it as \`omitted\`. Otherwise, fill the section with concrete evidence.`);