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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (575) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +123 -20
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  14. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  15. package/dist/resources/extensions/async-jobs/index.js +65 -0
  16. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  17. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  18. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  19. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  20. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  21. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  22. package/dist/resources/extensions/bg-shell/utilities.js +3 -0
  23. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  24. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  25. package/dist/resources/extensions/browser-tools/index.js +69 -12
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +30 -4
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
  33. package/dist/resources/extensions/gsd/auto/phases.js +49 -6
  34. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
  39. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  40. package/dist/resources/extensions/gsd/auto-start.js +41 -18
  41. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  42. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  43. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  44. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  45. package/dist/resources/extensions/gsd/auto-worktree.js +44 -91
  46. package/dist/resources/extensions/gsd/auto.js +41 -14
  47. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  48. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  49. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
  50. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  51. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  52. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
  53. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
  54. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  55. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  56. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  57. package/dist/resources/extensions/gsd/captures.js +4 -6
  58. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  59. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  60. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  61. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  62. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  63. package/dist/resources/extensions/gsd/constants.js +0 -2
  64. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  65. package/dist/resources/extensions/gsd/db/queries.js +26 -0
  66. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  67. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  68. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  69. package/dist/resources/extensions/gsd/doctor-environment.js +2 -6
  70. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  71. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  72. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
  73. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  74. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  75. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  76. package/dist/resources/extensions/gsd/files.js +33 -19
  77. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  78. package/dist/resources/extensions/gsd/gsd-db.js +2 -1
  79. package/dist/resources/extensions/gsd/guidance.js +158 -0
  80. package/dist/resources/extensions/gsd/guided-flow.js +23 -5
  81. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  82. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  83. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  84. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  85. package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
  86. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  87. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  88. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  89. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  90. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
  91. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  92. package/dist/resources/extensions/gsd/paths.js +27 -0
  93. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  94. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  95. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  96. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  97. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  99. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  100. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  103. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  104. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  105. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  108. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  109. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  110. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  111. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  112. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  113. package/dist/resources/extensions/gsd/publication.js +87 -0
  114. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  115. package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
  116. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  117. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  118. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  119. package/dist/resources/extensions/gsd/state.js +6 -20
  120. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  121. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  122. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  123. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  124. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  125. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  126. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  127. package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
  128. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  129. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  130. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  131. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  132. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  133. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  134. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  135. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  136. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  137. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  138. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  139. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  140. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  141. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  142. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  143. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  144. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  145. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  146. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  147. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  148. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  149. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  150. package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
  151. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  152. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  153. package/dist/resources/extensions/gsd/worktree-root.js +11 -0
  154. package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
  155. package/dist/resources/extensions/gsd/worktree.js +8 -1
  156. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  157. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  158. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  159. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  160. package/dist/resources/shared/package-manager-detection.js +1 -1
  161. package/dist/resources/shared/package.json +3 -0
  162. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  163. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  164. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  165. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  166. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  167. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  168. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  169. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  170. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  171. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  172. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  173. package/dist/update-check.d.ts +2 -0
  174. package/dist/update-check.js +24 -1
  175. package/dist/update-cmd.js +20 -3
  176. package/dist/web/standalone/.next/BUILD_ID +1 -1
  177. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  178. package/dist/web/standalone/.next/build-manifest.json +3 -3
  179. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  180. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  192. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  193. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  194. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/index.html +1 -1
  200. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  207. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  208. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  209. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  212. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  213. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  214. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  215. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  216. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  217. package/dist/web/standalone/package.json +1 -1
  218. package/dist/worktree-cli.js +3 -6
  219. package/dist/worktree-status-banner.js +7 -15
  220. package/package.json +2 -2
  221. package/packages/cloud-mcp-gateway/package.json +2 -2
  222. package/packages/contracts/dist/rpc.d.ts +1 -0
  223. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  224. package/packages/contracts/dist/rpc.js.map +1 -1
  225. package/packages/contracts/dist/workflow.d.ts +4 -0
  226. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  227. package/packages/contracts/dist/workflow.js.map +1 -1
  228. package/packages/contracts/package.json +1 -1
  229. package/packages/daemon/package.json +4 -4
  230. package/packages/gsd-agent-core/package.json +5 -5
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  237. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  240. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  248. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  249. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  250. package/packages/gsd-agent-modes/package.json +7 -7
  251. package/packages/mcp-server/dist/cli.js +9 -1
  252. package/packages/mcp-server/dist/cli.js.map +1 -1
  253. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  254. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  255. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  256. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  257. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  258. package/packages/mcp-server/dist/server.js +4 -0
  259. package/packages/mcp-server/dist/server.js.map +1 -1
  260. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  261. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  262. package/packages/mcp-server/dist/workflow-tools.js +116 -39
  263. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  264. package/packages/mcp-server/package.json +5 -4
  265. package/packages/native/package.json +1 -1
  266. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  267. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  268. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  269. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  270. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  271. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  272. package/packages/pi-agent-core/dist/index.js +3 -0
  273. package/packages/pi-agent-core/dist/index.js.map +1 -1
  274. package/packages/pi-agent-core/package.json +1 -1
  275. package/packages/pi-ai/README.md +1 -0
  276. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  277. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  278. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  279. package/packages/pi-ai/dist/index.d.ts +2 -0
  280. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  281. package/packages/pi-ai/dist/index.js +2 -0
  282. package/packages/pi-ai/dist/index.js.map +1 -1
  283. package/packages/pi-ai/dist/models.generated.d.ts +35 -125
  284. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  285. package/packages/pi-ai/dist/models.generated.js +46 -120
  286. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  287. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  288. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  289. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  290. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  291. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  292. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  293. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  294. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  295. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  296. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  297. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  298. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  299. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  300. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  301. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  303. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  304. package/packages/pi-ai/package.json +3 -2
  305. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  306. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  308. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  311. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  313. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  315. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  317. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/index.js +1 -1
  319. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  321. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  323. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  324. package/packages/pi-coding-agent/package.json +7 -7
  325. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  326. package/packages/pi-tui/dist/tui.js +9 -0
  327. package/packages/pi-tui/dist/tui.js.map +1 -1
  328. package/packages/pi-tui/package.json +2 -2
  329. package/packages/rpc-client/package.json +2 -2
  330. package/pkg/package.json +1 -1
  331. package/src/resources/GSD-WORKFLOW.md +5 -4
  332. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  333. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  334. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  335. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  336. package/src/resources/extensions/async-jobs/index.ts +79 -0
  337. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  338. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  339. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  340. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  341. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  342. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  343. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  344. package/src/resources/extensions/bg-shell/utilities.ts +3 -0
  345. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  346. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  347. package/src/resources/extensions/browser-tools/index.ts +71 -13
  348. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  349. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  350. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  351. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +34 -4
  352. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  353. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  354. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  355. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  356. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  357. package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
  358. package/src/resources/extensions/gsd/auto/phases.ts +65 -26
  359. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  360. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  361. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  362. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  363. package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
  364. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  365. package/src/resources/extensions/gsd/auto-start.ts +42 -21
  366. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  367. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  368. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  369. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  370. package/src/resources/extensions/gsd/auto-worktree.ts +44 -94
  371. package/src/resources/extensions/gsd/auto.ts +52 -16
  372. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  373. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  374. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
  375. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  376. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  377. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
  378. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
  379. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  380. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  381. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  382. package/src/resources/extensions/gsd/captures.ts +4 -6
  383. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  384. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  385. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  386. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  387. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  388. package/src/resources/extensions/gsd/constants.ts +0 -3
  389. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  390. package/src/resources/extensions/gsd/db/queries.ts +37 -0
  391. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  392. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  393. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  394. package/src/resources/extensions/gsd/doctor-environment.ts +2 -7
  395. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  396. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  397. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
  398. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  399. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  400. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  401. package/src/resources/extensions/gsd/files.ts +33 -12
  402. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  403. package/src/resources/extensions/gsd/gsd-db.ts +4 -3
  404. package/src/resources/extensions/gsd/guidance.ts +217 -0
  405. package/src/resources/extensions/gsd/guided-flow.ts +37 -28
  406. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  407. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  408. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  409. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  410. package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
  411. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  412. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  413. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  414. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  415. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
  416. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  417. package/src/resources/extensions/gsd/paths.ts +33 -0
  418. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  419. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  420. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  421. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  422. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  423. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  424. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  425. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  426. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  427. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  428. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  429. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  430. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  431. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  432. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  433. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  434. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  435. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  436. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  437. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  438. package/src/resources/extensions/gsd/publication.ts +122 -0
  439. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  440. package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
  441. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  442. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  443. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  444. package/src/resources/extensions/gsd/state.ts +9 -21
  445. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  446. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  447. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  448. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  449. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  450. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  451. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  452. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  453. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  454. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  455. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  456. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  457. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  458. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  459. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  460. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  461. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  462. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  463. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  464. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  465. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  466. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  467. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  468. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  469. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  470. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  471. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  472. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  473. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  474. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  475. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  476. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
  477. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -58
  478. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  479. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  480. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  481. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  482. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  483. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  484. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  485. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  486. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  487. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  488. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  489. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  490. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  491. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  492. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  493. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
  494. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  495. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  496. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  497. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  498. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  499. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  500. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  501. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  502. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  503. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  504. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  505. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  506. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  507. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  508. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  509. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  510. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  511. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  512. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  513. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  514. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  515. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  516. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  517. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  518. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  519. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  520. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  521. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  522. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  523. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  524. package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
  525. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  526. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  527. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  528. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  529. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  530. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  531. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  532. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  533. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  534. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  535. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  536. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  537. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  538. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  539. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  540. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  541. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  542. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  543. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  544. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  545. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  546. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  547. package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
  548. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  549. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  550. package/src/resources/extensions/gsd/worktree-root.ts +12 -0
  551. package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
  552. package/src/resources/extensions/gsd/worktree.ts +7 -1
  553. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  554. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  555. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  556. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  557. package/src/resources/shared/package-manager-detection.ts +1 -1
  558. package/src/resources/shared/package.json +3 -0
  559. package/src/resources/skills/create-skill/SKILL.md +3 -0
  560. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  561. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  562. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  563. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  564. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  565. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  566. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  567. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  568. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  569. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  570. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  571. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  572. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  573. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  574. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
  575. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
@@ -258,6 +258,48 @@ describe('complete-slice verification gate (#3580)', () => {
258
258
  }
259
259
  });
260
260
 
261
+ test('allows a browser UAT declared as a bare keyword under ## UAT Type (M006/S01 format drift)', async () => {
262
+ // Regression: the agent wrote `## UAT Type\nbrowser-executable` (no
263
+ // `- UAT mode:` bullet). The old parser defaulted that to artifact-driven
264
+ // and the gate rejected the slice in a loop.
265
+ const body = [
266
+ '## UAT Type',
267
+ 'browser-executable',
268
+ '',
269
+ '## Smoke Test',
270
+ '1. Open the page in a browser and perform add/edit/complete/delete once.',
271
+ ].join('\n');
272
+ const result = await handleCompleteSlice(
273
+ makeParams({ uatContent: body }),
274
+ basePath,
275
+ );
276
+ if ('error' in result) {
277
+ assert.doesNotMatch(
278
+ result.error,
279
+ /requires browser verification/i,
280
+ `bare browser-executable declaration must pass the browser gate, got: ${result.error}`,
281
+ );
282
+ }
283
+ });
284
+
285
+ test('explains the missing declaration when a browser UAT has no parseable UAT mode', async () => {
286
+ // When nothing was declared, the error must not claim the agent
287
+ // "declared artifact-driven" — it must show the expected bullet format.
288
+ const body = [
289
+ '## Smoke Test',
290
+ '1. Open the page in a browser and perform add/edit/complete/delete once.',
291
+ ].join('\n');
292
+ const result = await handleCompleteSlice(
293
+ makeParams({ uatContent: body }),
294
+ basePath,
295
+ );
296
+ assert.ok('error' in result, 'expected handler to reject an undeclared browser UAT');
297
+ const error = (result as { error: string }).error;
298
+ assert.match(error, /no parseable UAT mode declaration/i);
299
+ assert.match(error, /- UAT mode: browser-executable/);
300
+ assert.doesNotMatch(error, /but declares "UAT mode: artifact-driven"/);
301
+ });
302
+
261
303
  test('allows a browser UAT when it is declared mixed (mixed receives browser tools)', async () => {
262
304
  const body = BROWSER_UAT_BODY.replace('artifact-driven', 'mixed (artifact-driven + browser)');
263
305
  const result = await handleCompleteSlice(
@@ -0,0 +1,351 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ import {
5
+ type AnswerOutcome,
6
+ classifyQuestion,
7
+ evaluateAnswer,
8
+ evaluateAskUserQuestionsRound,
9
+ failPolicyForKind,
10
+ formatUnansweredConsentQuestionMessage,
11
+ isAwaitingUserInput,
12
+ lastAssistantText,
13
+ messageHasPendingAskUserQuestionsTool,
14
+ shouldPauseForQuestion,
15
+ } from "../consent-question.ts";
16
+
17
+ const GATE_OPTIONS = [
18
+ { label: "Yes, you got it (Recommended)" },
19
+ { label: "Needs adjustment" },
20
+ ];
21
+
22
+ const CONSENT_OPTIONS = [
23
+ { label: "Option A (Recommended)" },
24
+ { label: "Option B" },
25
+ ];
26
+
27
+ function assistantMessage(text: string): unknown {
28
+ return { role: "assistant", content: [{ type: "text", text }] };
29
+ }
30
+
31
+ // ── Classification ──────────────────────────────────────────────────────────
32
+
33
+ test("classifyQuestion: gate ids, consent defaults, prose kinds", () => {
34
+ assert.deepEqual(
35
+ classifyQuestion({ id: "depth_verification_M001_confirm" }),
36
+ { kind: "gate", gateSubKind: "approval" },
37
+ );
38
+ assert.deepEqual(
39
+ classifyQuestion({ id: "depth_verification" }),
40
+ { kind: "gate", gateSubKind: "depth-verification" },
41
+ );
42
+ assert.deepEqual(
43
+ classifyQuestion({ id: "destructive_confirm_rm" }),
44
+ { kind: "gate", gateSubKind: "destructive-confirm" },
45
+ );
46
+ // Any other structured question is a real elicitation → consent, fail-closed.
47
+ assert.equal(classifyQuestion({ id: "m004_shape", options: CONSENT_OPTIONS }).kind, "consent");
48
+ assert.equal(classifyQuestion({ id: "free_text_q" }).kind, "consent");
49
+ // Prose classification.
50
+ assert.equal(classifyQuestion({ text: "Should I proceed with the write?" }).kind, "consent");
51
+ assert.equal(
52
+ classifyQuestion({ text: "Want me to research this or skip?", unitType: "research-decision" }).kind,
53
+ "decision",
54
+ );
55
+ assert.equal(classifyQuestion({ text: "Here is the summary of changes." }).kind, "informational");
56
+ });
57
+
58
+ test("failPolicyForKind: only informational is fail-open", () => {
59
+ assert.equal(failPolicyForKind("gate"), "closed");
60
+ assert.equal(failPolicyForKind("consent"), "closed");
61
+ assert.equal(failPolicyForKind("decision"), "closed");
62
+ assert.equal(failPolicyForKind("informational"), "open");
63
+ });
64
+
65
+ // ── Policy table: (kind × answer shape) → outcome ───────────────────────────
66
+
67
+ type Row = {
68
+ name: string;
69
+ question: { id: string; options?: Array<{ label?: string }> };
70
+ details: Parameters<typeof evaluateAnswer>[0]["details"];
71
+ expected: AnswerOutcome;
72
+ };
73
+
74
+ const gateQ = { id: "depth_verification_M001_confirm", options: GATE_OPTIONS };
75
+ const consentQ = { id: "boundary_choice", options: CONSENT_OPTIONS };
76
+
77
+ const POLICY_TABLE: Row[] = [
78
+ // gate
79
+ { name: "gate × confirm selected → verified", question: gateQ, details: { response: { answers: { [gateQ.id]: { selected: "Yes, you got it (Recommended)" } } } }, expected: "verified" },
80
+ { name: "gate × decline selected → declined", question: gateQ, details: { response: { answers: { [gateQ.id]: { selected: "Needs adjustment" } } } }, expected: "declined" },
81
+ { name: "gate × empty selected → waiting", question: gateQ, details: { response: { answers: { [gateQ.id]: { selected: "" } } } }, expected: "waiting" },
82
+ { name: "gate × empty selected array → waiting", question: gateQ, details: { response: { answers: { [gateQ.id]: { selected: [] } } } }, expected: "waiting" },
83
+ { name: "gate × missing response → waiting", question: gateQ, details: {}, expected: "waiting" },
84
+ { name: "gate × notes-only → waiting (notes never satisfy a gate)", question: gateQ, details: { response: { answers: { [gateQ.id]: { notes: "looks fine" } } } }, expected: "waiting" },
85
+ { name: "gate × cancelled → cancelled", question: gateQ, details: { cancelled: true, response: null }, expected: "cancelled" },
86
+ // consent
87
+ { name: "consent × valid selected → answered", question: consentQ, details: { response: { answers: { [consentQ.id]: { selected: "Option B" } } } }, expected: "answered" },
88
+ { name: "consent × empty selected → waiting (#528)", question: consentQ, details: { response: { answers: { [consentQ.id]: { selected: "" } } } }, expected: "waiting" },
89
+ { name: "consent × missing answer → waiting", question: consentQ, details: { response: { answers: {} } }, expected: "waiting" },
90
+ { name: "consent × missing response → waiting", question: consentQ, details: {}, expected: "waiting" },
91
+ { name: "consent × notes-only → answered (a real user utterance)", question: consentQ, details: { response: { answers: { [consentQ.id]: { notes: "neither — keep it simple" } } } }, expected: "answered" },
92
+ { name: "consent × cancelled → cancelled", question: consentQ, details: { cancelled: true, response: null }, expected: "cancelled" },
93
+ ];
94
+
95
+ for (const row of POLICY_TABLE) {
96
+ test(`policy table: ${row.name}`, () => {
97
+ assert.equal(evaluateAnswer({ question: row.question, details: row.details }), row.expected);
98
+ });
99
+ }
100
+
101
+ // ── Round evaluation ────────────────────────────────────────────────────────
102
+
103
+ test("evaluateAskUserQuestionsRound: most blocking outcome wins", () => {
104
+ const details = {
105
+ response: {
106
+ answers: {
107
+ [consentQ.id]: { selected: "Option A (Recommended)" },
108
+ second: { selected: "" },
109
+ },
110
+ },
111
+ };
112
+ assert.equal(
113
+ evaluateAskUserQuestionsRound([consentQ, { id: "second", options: CONSENT_OPTIONS }], details),
114
+ "waiting",
115
+ );
116
+ assert.equal(evaluateAskUserQuestionsRound([consentQ], { cancelled: true }), "cancelled");
117
+ assert.equal(
118
+ evaluateAskUserQuestionsRound([consentQ], {
119
+ response: { answers: { [consentQ.id]: { selected: "Option A (Recommended)" } } },
120
+ }),
121
+ "answered",
122
+ );
123
+ // Empty round with no response is a no-op for callers.
124
+ assert.equal(evaluateAskUserQuestionsRound([], {}), "answered");
125
+ });
126
+
127
+ // ── Regression: #528 empty selected on a consent question never answers ─────
128
+
129
+ test("#528: empty selected on a NON-gate question is waiting, not answered", () => {
130
+ const outcome = evaluateAskUserQuestionsRound(
131
+ [{ id: "scope_check", options: CONSENT_OPTIONS }],
132
+ { response: { answers: { scope_check: { selected: "" } } } },
133
+ );
134
+ assert.equal(outcome, "waiting");
135
+ const message = formatUnansweredConsentQuestionMessage([{ id: "scope_check" }]);
136
+ assert.match(message, /scope_check/);
137
+ assert.match(message, /not consent/i);
138
+ });
139
+
140
+ // ── Regression: #682 pause promotion outside the old unit-type allowlist ────
141
+
142
+ test("#682: consent question in a non-allowlisted unit type pauses", () => {
143
+ const messages = [assistantMessage("The slice is staged. Ready to proceed with the merge?")];
144
+ assert.equal(shouldPauseForQuestion("execute-task", messages), true);
145
+ });
146
+
147
+ test("#682: consent question in interactive mode (no unit type) pauses", () => {
148
+ const messages = [assistantMessage("Does this capture your intent correctly?")];
149
+ assert.equal(shouldPauseForQuestion(undefined, messages), true);
150
+ });
151
+
152
+ test("#682: cancellation marker pauses regardless of unit type", () => {
153
+ const messages = [assistantMessage("ask_user_questions was cancelled before receiving a response")];
154
+ assert.equal(shouldPauseForQuestion(undefined, messages), true);
155
+ assert.equal(shouldPauseForQuestion("execute-task", messages), true);
156
+ });
157
+
158
+ test("shouldPauseForQuestion: informational prose never pauses", () => {
159
+ const messages = [assistantMessage("All tests pass. Moving on to the next task.")];
160
+ assert.equal(shouldPauseForQuestion(undefined, messages), false);
161
+ assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
162
+ });
163
+
164
+ test("shouldPauseForQuestion: plain non-approval question does not pause", () => {
165
+ // Generic questions (no approval/consent language) stay informational —
166
+ // matches the historical contract in deep-project-auto-loop tests.
167
+ const messages = [assistantMessage("Which file did you mean?")];
168
+ assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
169
+ });
170
+
171
+ test("shouldPauseForQuestion: explicit waiting-for-approval phrase pauses without a question mark", () => {
172
+ // The streaming pre-filter (no "?" → bail) must not skip the explicit
173
+ // wait-phrase boundary, which carries no question mark.
174
+ const messages = [assistantMessage("I am waiting for your approval before writing the file.")];
175
+ assert.equal(shouldPauseForQuestion(undefined, messages), true);
176
+ });
177
+
178
+ // ── Message-text extraction (merged from user-input-boundary tests) ─────────
179
+
180
+ test("lastAssistantText extracts the latest assistant text block content", () => {
181
+ assert.equal(
182
+ lastAssistantText([
183
+ { role: "assistant", content: "Older message" },
184
+ {
185
+ role: "assistant",
186
+ content: [
187
+ { type: "text", text: "First line" },
188
+ { type: "text", text: "Second line" },
189
+ ],
190
+ },
191
+ ]),
192
+ "First line\nSecond line",
193
+ );
194
+ assert.equal(lastAssistantText(null), "");
195
+ });
196
+
197
+ test("lastAssistantText includes thinking blocks so rate-limit notices are not dropped", () => {
198
+ // Turn with only a thinking block (no text block) — must not return ""
199
+ const result = lastAssistantText([
200
+ {
201
+ role: "assistant",
202
+ content: [
203
+ { type: "thinking", thinking: "You've hit your limit · resets in 2h" },
204
+ ],
205
+ },
206
+ ]);
207
+ assert.ok(result.includes("You've hit your limit"), `expected rate-limit text, got: ${JSON.stringify(result)}`);
208
+ });
209
+
210
+ // ── Awaiting-input boundaries (merged from user-input-boundary tests) ───────
211
+
212
+ test("isAwaitingUserInput does not trigger on thinking-block question marks", () => {
213
+ // A thinking block with a question mark must NOT pause auto-mode —
214
+ // it's internal reasoning, not a user-visible prompt.
215
+ const messages = [
216
+ {
217
+ role: "assistant",
218
+ content: [
219
+ { type: "thinking", thinking: "Should I skip research? Let me check the config." },
220
+ ],
221
+ },
222
+ ];
223
+ assert.equal(isAwaitingUserInput(messages), false);
224
+ assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
225
+ });
226
+
227
+ test("isAwaitingUserInput does not trigger on thinking-block approval phrases", () => {
228
+ // A thinking block with approval phrases must NOT pause auto-mode.
229
+ const messages = [
230
+ {
231
+ role: "assistant",
232
+ content: [
233
+ { type: "thinking", thinking: "The user confirmed and approved the plan. Should I proceed?" },
234
+ ],
235
+ },
236
+ ];
237
+ assert.equal(isAwaitingUserInput(messages), false);
238
+ assert.equal(shouldPauseForQuestion("discuss-requirements", messages), false);
239
+ });
240
+
241
+ test("isAwaitingUserInput treats plain-text next steps menus as waiting for the user (#454)", () => {
242
+ const messages = [
243
+ {
244
+ role: "assistant",
245
+ content: [
246
+ "Next steps:",
247
+ "1. Walk through the runtime placement check above.",
248
+ "2. Build a release once you're satisfied.",
249
+ "3. Other.",
250
+ ].join("\n"),
251
+ },
252
+ ];
253
+ assert.equal(isAwaitingUserInput(messages), true);
254
+ });
255
+
256
+ test("isAwaitingUserInput still triggers on text-block question marks when thinking is also present", () => {
257
+ // When thinking + text are both present and the text asks a question, it should still pause.
258
+ const messages = [
259
+ {
260
+ role: "assistant",
261
+ content: [
262
+ { type: "thinking", thinking: "Internal reasoning without questions." },
263
+ { type: "text", text: "Does this look correct?" },
264
+ ],
265
+ },
266
+ ];
267
+ assert.equal(isAwaitingUserInput(messages), true);
268
+ });
269
+
270
+ // ── In-flight ask_user_questions detection (merged from user-input-boundary) ─
271
+
272
+ test("messageHasPendingAskUserQuestionsTool detects in-flight structured question tools", () => {
273
+ // state: "running" with no externalResult → still in-flight
274
+ assert.equal(
275
+ messageHasPendingAskUserQuestionsTool({
276
+ role: "assistant",
277
+ content: [
278
+ { type: "text", text: "Which direction?" },
279
+ { type: "toolCall", name: "mcp__gsd-workflow__ask_user_questions", state: "running" },
280
+ ],
281
+ }),
282
+ true,
283
+ );
284
+
285
+ // no state, no externalResult — streaming block that hasn't completed yet
286
+ assert.equal(
287
+ messageHasPendingAskUserQuestionsTool({
288
+ role: "assistant",
289
+ content: [
290
+ { type: "toolCall", name: "ask_user_questions" },
291
+ ],
292
+ }),
293
+ true,
294
+ );
295
+
296
+ // state: "completed" — legacy state-based completion
297
+ assert.equal(
298
+ messageHasPendingAskUserQuestionsTool({
299
+ role: "assistant",
300
+ content: [
301
+ { type: "toolCall", name: "ask_user_questions", state: "completed" },
302
+ ],
303
+ }),
304
+ false,
305
+ );
306
+
307
+ // externalResult present — Claude Code signals completion via externalResult, not state
308
+ assert.equal(
309
+ messageHasPendingAskUserQuestionsTool({
310
+ role: "assistant",
311
+ content: [
312
+ { type: "toolCall", name: "ask_user_questions", externalResult: { content: [], isError: false } },
313
+ ],
314
+ }),
315
+ false,
316
+ );
317
+ assert.equal(
318
+ messageHasPendingAskUserQuestionsTool({
319
+ role: "assistant",
320
+ content: [
321
+ {
322
+ type: "toolCall",
323
+ name: "ask_user_questions",
324
+ externalResult: { content: [{ type: "text", text: "answer" }], isError: false },
325
+ },
326
+ ],
327
+ }),
328
+ false,
329
+ );
330
+
331
+ // serverToolUse shape (claude-code-cli MCP path) — no externalResult → in-flight
332
+ assert.equal(
333
+ messageHasPendingAskUserQuestionsTool({
334
+ role: "assistant",
335
+ content: [
336
+ { type: "serverToolUse", name: "mcp__gsd-workflow__ask_user_questions" },
337
+ ],
338
+ }),
339
+ true,
340
+ );
341
+ // serverToolUse shape — externalResult present → completed
342
+ assert.equal(
343
+ messageHasPendingAskUserQuestionsTool({
344
+ role: "assistant",
345
+ content: [
346
+ { type: "serverToolUse", name: "ask_user_questions", externalResult: { content: [], isError: false } },
347
+ ],
348
+ }),
349
+ false,
350
+ );
351
+ });
@@ -17,11 +17,13 @@ function makeSession(activeRunDir: string): {
17
17
  activeRunDir: string;
18
18
  basePath: string;
19
19
  verificationRetryCount: Map<string, number>;
20
+ exhaustedVerificationUnits: Set<string>;
20
21
  } {
21
22
  return {
22
23
  activeRunDir,
23
24
  basePath: activeRunDir,
24
25
  verificationRetryCount: new Map<string, number>(),
26
+ exhaustedVerificationUnits: new Set<string>(),
25
27
  };
26
28
  }
27
29
 
@@ -137,3 +139,68 @@ test("saveCustomVerifyRetryCounts deletes empty retry files and ignores missing
137
139
  rmSync(dir, { recursive: true, force: true });
138
140
  }
139
141
  });
142
+
143
+ test("saveCustomVerifyRetryCounts persists exhaustedVerificationUnits and hydrateCustomVerifyRetryCounts restores them", () => {
144
+ const dir = mkdtempSync(join(tmpdir(), "gsd-verify-retries-"));
145
+ try {
146
+ const session = makeSession(dir);
147
+ session.exhaustedVerificationUnits.add("execute-task:M001/S001/T001");
148
+ session.exhaustedVerificationUnits.add("execute-task:M001/S001/T002");
149
+
150
+ saveCustomVerifyRetryCounts(session, {
151
+ logFailure: () => assert.fail("logFailure should not be called"),
152
+ });
153
+
154
+ const session2 = makeSession(dir);
155
+ hydrateCustomVerifyRetryCounts(session2, {
156
+ logFailure: () => assert.fail("logFailure should not be called"),
157
+ });
158
+
159
+ assert.deepEqual(
160
+ [...session2.exhaustedVerificationUnits].sort(),
161
+ ["execute-task:M001/S001/T001", "execute-task:M001/S001/T002"],
162
+ );
163
+ assert.equal(session2.verificationRetryCount.size, 0);
164
+ } finally {
165
+ rmSync(dir, { recursive: true, force: true });
166
+ }
167
+ });
168
+
169
+ test("saveCustomVerifyRetryCounts keeps file when only exhaustedVerificationUnits is non-empty", () => {
170
+ const dir = mkdtempSync(join(tmpdir(), "gsd-verify-retries-"));
171
+ try {
172
+ const session = makeSession(dir);
173
+ session.exhaustedVerificationUnits.add("execute-task:M001/S001/T001");
174
+
175
+ saveCustomVerifyRetryCounts(session, {
176
+ logFailure: () => assert.fail("logFailure should not be called"),
177
+ });
178
+
179
+ const saved = JSON.parse(readFileSync(customVerifyRetryStatePath(session), "utf-8"));
180
+ assert.deepEqual(saved.exhausted, ["execute-task:M001/S001/T001"]);
181
+ } finally {
182
+ rmSync(dir, { recursive: true, force: true });
183
+ }
184
+ });
185
+
186
+ test("hydrateCustomVerifyRetryCounts skips hydration when exhaustedVerificationUnits is already populated", () => {
187
+ const dir = mkdtempSync(join(tmpdir(), "gsd-verify-retries-"));
188
+ try {
189
+ const session = makeSession(dir);
190
+ session.exhaustedVerificationUnits.add("pre-existing:key");
191
+ mkdirSync(join(dir, "runtime"));
192
+ writeFileSync(customVerifyRetryStatePath(session), JSON.stringify({
193
+ counts: { "execute-task/M001/S001/T001": 2 },
194
+ exhausted: ["execute-task:M001/S001/T002"],
195
+ }));
196
+
197
+ hydrateCustomVerifyRetryCounts(session, {
198
+ logFailure: () => assert.fail("logFailure should not be called"),
199
+ });
200
+
201
+ assert.deepEqual([...session.exhaustedVerificationUnits], ["pre-existing:key"]);
202
+ assert.equal(session.verificationRetryCount.size, 0);
203
+ } finally {
204
+ rmSync(dir, { recursive: true, force: true });
205
+ }
206
+ });
@@ -920,9 +920,9 @@ describe('db-writer', () => {
920
920
  decision,
921
921
  });
922
922
 
923
- test('detects deferral in scope with M###/S## pattern in choice', () => {
923
+ test('detects deferral in scope when the scope names the slice', () => {
924
924
  const result = extractDeferredSliceRef(
925
- fields('deferral of low-priority work', 'Move M001/S03 to backlog', ''),
925
+ fields('deferral of slice M001/S03', 'Move low-priority work to backlog', ''),
926
926
  );
927
927
  assert.deepStrictEqual(result, { milestoneId: 'M001', sliceId: 'S03' });
928
928
  });
@@ -950,14 +950,14 @@ describe('db-writer', () => {
950
950
 
951
951
  test('recognises "deferring" variant', () => {
952
952
  const result = extractDeferredSliceRef(
953
- fields('deferring this slice', 'M005/S02 can wait', ''),
953
+ fields('slice prioritization', 'deferring M005/S02 until later', ''),
954
954
  );
955
955
  assert.deepStrictEqual(result, { milestoneId: 'M005', sliceId: 'S02' });
956
956
  });
957
957
 
958
958
  test('recognises "defers" variant', () => {
959
959
  const result = extractDeferredSliceRef(
960
- fields('team defers slice', 'M100/S10 not urgent', ''),
960
+ fields('slice prioritization', 'team defers slice M100/S10', ''),
961
961
  );
962
962
  assert.deepStrictEqual(result, { milestoneId: 'M100', sliceId: 'S10' });
963
963
  });
@@ -969,6 +969,17 @@ describe('db-writer', () => {
969
969
  assert.deepStrictEqual(result, { milestoneId: 'M003', sliceId: 'S01' });
970
970
  });
971
971
 
972
+ test('does not treat a planning scope reference as a deferred slice', () => {
973
+ const result = extractDeferredSliceRef(
974
+ fields(
975
+ 'planning',
976
+ 'Plan S01 as the happy-path money loop only; Defer full duplicate/replay idempotency + polling reconciliation backstop (R006).',
977
+ 'M003/S01 scope boundary for the BTC money loop (which requirements land in the first slice vs deferred follow-on slices).',
978
+ ),
979
+ );
980
+ assert.strictEqual(result, null);
981
+ });
982
+
972
983
  test('returns null when no deferral keyword is present', () => {
973
984
  const result = extractDeferredSliceRef(
974
985
  fields('approved work', 'M001/S01 is ready', 'proceed with M001/S01'),
@@ -15,7 +15,7 @@ import { resolveDispatch, setResearchProjectPromptBuilderForTest } from "../auto
15
15
  import { resolveExpectedArtifactPath, verifyExpectedArtifact, writeBlockerPlaceholder } from "../auto-recovery.ts";
16
16
  import { finalizeProjectResearchTimeout } from "../project-research-policy.ts";
17
17
  import { resetRegistry } from "../rule-registry.ts";
18
- import { approvalGateIdForUnit, isAwaitingUserInput, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.ts";
18
+ import { approvalGateIdForUnit, isAwaitingUserInput, isExplicitApprovalResponse, shouldPauseForQuestion } from "../consent-question.ts";
19
19
  import {
20
20
  clearPendingAutoStart,
21
21
  checkDeepProjectSetupAfterTurn,
@@ -1402,7 +1402,7 @@ test("deep project setup: user-quoted remote question failure does not pause aut
1402
1402
  ];
1403
1403
 
1404
1404
  assert.equal(isAwaitingUserInput(messages), false);
1405
- assert.equal(shouldPauseForUserApprovalQuestion("discuss-project", messages), false);
1405
+ assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
1406
1406
  });
1407
1407
 
1408
1408
  test("deep project setup: plain-text approval wait is treated as waiting for user input", () => {
@@ -1426,7 +1426,7 @@ test("deep project setup: opening interview question does not trigger approval a
1426
1426
  ];
1427
1427
 
1428
1428
  assert.equal(isAwaitingUserInput(messages), true);
1429
- assert.equal(shouldPauseForUserApprovalQuestion("discuss-project", messages), false);
1429
+ assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
1430
1430
  });
1431
1431
 
1432
1432
  test("deep project setup: grounding interview question with requirements context does not trigger approval abort", () => {
@@ -1441,7 +1441,7 @@ test("deep project setup: grounding interview question with requirements context
1441
1441
  ];
1442
1442
 
1443
1443
  assert.equal(isAwaitingUserInput(messages), true);
1444
- assert.equal(shouldPauseForUserApprovalQuestion("discuss-project", messages), false);
1444
+ assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
1445
1445
  });
1446
1446
 
1447
1447
  test("deep project setup: persistence and anti-goals interview prompt does not trigger approval abort", () => {
@@ -1460,7 +1460,7 @@ test("deep project setup: persistence and anti-goals interview prompt does not t
1460
1460
  ];
1461
1461
 
1462
1462
  assert.equal(isAwaitingUserInput(messages), true);
1463
- assert.equal(shouldPauseForUserApprovalQuestion("discuss-project", messages), false);
1463
+ assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
1464
1464
  });
1465
1465
 
1466
1466
  test("deep project setup: discovery questions before writing PROJECT do not trigger approval abort", () => {
@@ -1479,7 +1479,7 @@ test("deep project setup: discovery questions before writing PROJECT do not trig
1479
1479
  ];
1480
1480
 
1481
1481
  assert.equal(isAwaitingUserInput(messages), true);
1482
- assert.equal(shouldPauseForUserApprovalQuestion("discuss-project", messages), false);
1482
+ assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
1483
1483
  });
1484
1484
 
1485
1485
  test("deep project setup: discovery question mentioning write intent does not trigger approval abort", () => {
@@ -1491,7 +1491,7 @@ test("deep project setup: discovery question mentioning write intent does not tr
1491
1491
  ];
1492
1492
 
1493
1493
  assert.equal(isAwaitingUserInput(messages), true);
1494
- assert.equal(shouldPauseForUserApprovalQuestion("discuss-project", messages), false);
1494
+ assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
1495
1495
  });
1496
1496
 
1497
1497
  test("deep project setup: scope discovery question mentioning add does not trigger approval abort", () => {
@@ -1503,7 +1503,7 @@ test("deep project setup: scope discovery question mentioning add does not trigg
1503
1503
  ];
1504
1504
 
1505
1505
  assert.equal(isAwaitingUserInput(messages), true);
1506
- assert.equal(shouldPauseForUserApprovalQuestion("discuss-project", messages), false);
1506
+ assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
1507
1507
  });
1508
1508
 
1509
1509
  test("deep project setup: requirements preview question from screenshot is treated as waiting", () => {
@@ -1523,12 +1523,12 @@ test("deep project setup: requirements preview question from screenshot is treat
1523
1523
  ];
1524
1524
 
1525
1525
  assert.equal(isAwaitingUserInput(messages), true);
1526
- assert.equal(shouldPauseForUserApprovalQuestion("discuss-requirements", messages), true);
1526
+ assert.equal(shouldPauseForQuestion("discuss-requirements", messages), true);
1527
1527
  });
1528
1528
 
1529
1529
  test("deep project setup: research decision question triggers approval boundary pause", () => {
1530
1530
  assert.equal(
1531
- shouldPauseForUserApprovalQuestion("research-decision", [
1531
+ shouldPauseForQuestion("research-decision", [
1532
1532
  {
1533
1533
  role: "assistant",
1534
1534
  content: "Run domain research now? (y/n)",