gsd-pi 2.82.0 → 3.0.0-dev.2e8b124f7

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 (760) hide show
  1. package/README.md +125 -32
  2. package/dist/cli.js +20 -9
  3. package/dist/headless-ui.js +13 -6
  4. package/dist/headless.js +9 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/GSD-WORKFLOW.md +10 -1
  7. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  8. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  9. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  10. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  11. package/dist/resources/extensions/cmux/index.js +5 -0
  12. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  13. package/dist/resources/extensions/gsd/auto/loop.js +110 -37
  14. package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
  15. package/dist/resources/extensions/gsd/auto/phases.js +113 -38
  16. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  17. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  18. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +71 -20
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  25. package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
  26. package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
  27. package/dist/resources/extensions/gsd/auto-start.js +90 -14
  28. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  30. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  31. package/dist/resources/extensions/gsd/auto.js +225 -81
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +10 -4
  35. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  36. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  37. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  38. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  39. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  40. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  41. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  42. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  43. package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
  44. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  45. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  46. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  47. package/dist/resources/extensions/gsd/context-store.js +112 -0
  48. package/dist/resources/extensions/gsd/crash-recovery.js +52 -7
  49. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  50. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  51. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  52. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  53. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  54. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  55. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  56. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  57. package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
  58. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  59. package/dist/resources/extensions/gsd/doctor.js +2 -28
  60. package/dist/resources/extensions/gsd/export-html.js +27 -425
  61. package/dist/resources/extensions/gsd/forensics.js +10 -3
  62. package/dist/resources/extensions/gsd/git-service.js +138 -10
  63. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  64. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  65. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  66. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  67. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  68. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  69. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  70. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  71. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  72. package/dist/resources/extensions/gsd/markdown-renderer.js +20 -12
  73. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  74. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  75. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  76. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  77. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  78. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  79. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  80. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  81. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  82. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  83. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  84. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  85. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  86. package/dist/resources/extensions/gsd/paths.js +4 -0
  87. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  88. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  89. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  90. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  91. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  92. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  93. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  94. package/dist/resources/extensions/gsd/preferences.js +2 -0
  95. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  96. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  97. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  99. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  100. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  101. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  102. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  103. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  104. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  105. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  107. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  108. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  109. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  110. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  111. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  112. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  113. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  114. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  115. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  116. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  117. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  118. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  119. package/dist/resources/extensions/gsd/state.js +14 -4
  120. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  121. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  122. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  123. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  124. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  125. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  126. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  127. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  128. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  129. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  130. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  131. package/dist/resources/extensions/gsd/validation.js +23 -1
  132. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  133. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  134. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  135. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  136. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  137. package/dist/resources/extensions/gsd/worktree-lifecycle.js +83 -19
  138. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  139. package/dist/resources/extensions/gsd/worktree-safety.js +33 -1
  140. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  141. package/dist/resources/extensions/shared/html-shell.js +388 -0
  142. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  143. package/dist/resources/extensions/subagent/index.js +448 -78
  144. package/dist/resources/extensions/subagent/launch.js +77 -0
  145. package/dist/resources/extensions/subagent/run-store.js +148 -0
  146. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  147. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  148. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  149. package/dist/resources/extensions/visual-brief/index.js +5 -0
  150. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  151. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  152. package/dist/resources/skills/forensics/SKILL.md +1 -1
  153. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  154. package/dist/web/standalone/.next/BUILD_ID +1 -1
  155. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  156. package/dist/web/standalone/.next/build-manifest.json +4 -4
  157. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  158. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  159. package/dist/web/standalone/.next/required-server-files.json +4 -4
  160. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  161. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  171. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  178. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  181. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  188. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  200. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  220. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  230. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  236. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  252. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  256. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/app/index.html +1 -1
  266. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  267. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  268. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  269. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  270. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  271. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  272. package/dist/web/standalone/.next/server/app/page.js +2 -2
  273. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  274. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  276. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  277. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  278. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  279. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  281. package/dist/web/standalone/.next/server/middleware.js +2 -2
  282. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  283. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  284. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  285. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  286. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  287. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  288. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  289. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  291. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  292. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  293. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  294. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  295. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  296. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  297. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  298. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  299. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  300. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  301. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  302. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  303. package/dist/web/standalone/server.js +1 -1
  304. package/package.json +6 -5
  305. package/packages/contracts/dist/rpc.test.js +7 -0
  306. package/packages/contracts/dist/rpc.test.js.map +1 -1
  307. package/packages/contracts/dist/workflow.d.ts +21 -0
  308. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  309. package/packages/contracts/dist/workflow.js +24 -0
  310. package/packages/contracts/dist/workflow.js.map +1 -1
  311. package/packages/contracts/src/rpc.test.ts +8 -0
  312. package/packages/contracts/src/workflow.ts +24 -0
  313. package/packages/daemon/package.json +2 -2
  314. package/packages/mcp-server/README.md +14 -3
  315. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  316. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  317. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  318. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  319. package/packages/mcp-server/package.json +2 -2
  320. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  321. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  322. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  323. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  324. package/packages/native/package.json +1 -1
  325. package/packages/native/tsconfig.json +2 -1
  326. package/packages/native/tsconfig.tsbuildinfo +1 -1
  327. package/packages/pi-agent-core/package.json +1 -1
  328. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  329. package/packages/pi-ai/dist/index.d.ts +2 -2
  330. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  331. package/packages/pi-ai/dist/index.js +1 -1
  332. package/packages/pi-ai/dist/index.js.map +1 -1
  333. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  334. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  335. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  336. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  337. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  338. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  339. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  340. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  341. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  342. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  343. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  344. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  345. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  346. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  347. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  348. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  349. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  350. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  351. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  352. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  353. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  354. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  355. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  356. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  357. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  358. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  359. package/packages/pi-ai/package.json +1 -1
  360. package/packages/pi-ai/src/index.ts +7 -2
  361. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  362. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  363. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  364. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  365. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  366. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  367. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  368. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  369. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  370. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  371. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  372. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  373. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  374. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  376. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  378. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  380. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  382. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  384. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  386. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  388. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  390. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  391. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  392. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  396. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  398. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  400. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  402. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  404. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  406. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  408. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  409. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  410. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  411. package/packages/pi-coding-agent/package.json +1 -1
  412. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  413. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  414. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  415. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  416. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  417. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  418. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  419. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  420. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  421. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  422. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  423. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  424. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  425. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  426. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  427. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  428. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  429. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  430. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  431. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  432. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  433. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  434. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  435. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  436. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  437. package/packages/pi-tui/dist/terminal.js +12 -0
  438. package/packages/pi-tui/dist/terminal.js.map +1 -1
  439. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  440. package/packages/pi-tui/dist/tui.js +108 -24
  441. package/packages/pi-tui/dist/tui.js.map +1 -1
  442. package/packages/pi-tui/package.json +1 -1
  443. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  444. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  445. package/packages/pi-tui/src/terminal.ts +11 -0
  446. package/packages/pi-tui/src/tui.ts +111 -24
  447. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  448. package/packages/rpc-client/package.json +1 -1
  449. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  450. package/pkg/package.json +1 -1
  451. package/src/resources/GSD-WORKFLOW.md +10 -1
  452. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  453. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  454. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  455. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  456. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  457. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  458. package/src/resources/extensions/cmux/index.ts +6 -0
  459. package/src/resources/extensions/gsd/auto/contracts.ts +62 -16
  460. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  461. package/src/resources/extensions/gsd/auto/loop.ts +111 -38
  462. package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
  463. package/src/resources/extensions/gsd/auto/phases.ts +141 -49
  464. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  465. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  466. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  467. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  468. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  469. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  470. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  471. package/src/resources/extensions/gsd/auto-dispatch.ts +74 -20
  472. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  473. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  474. package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
  475. package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
  476. package/src/resources/extensions/gsd/auto-start.ts +99 -12
  477. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  478. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  479. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  480. package/src/resources/extensions/gsd/auto.ts +226 -70
  481. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  482. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  483. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -4
  484. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  485. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  486. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  487. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  488. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  489. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  490. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  491. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  492. package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
  493. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  494. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  495. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  496. package/src/resources/extensions/gsd/context-store.ts +120 -1
  497. package/src/resources/extensions/gsd/crash-recovery.ts +52 -6
  498. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  499. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  500. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  501. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  502. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  503. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  504. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  505. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  506. package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
  507. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  508. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  509. package/src/resources/extensions/gsd/doctor.ts +2 -27
  510. package/src/resources/extensions/gsd/export-html.ts +27 -427
  511. package/src/resources/extensions/gsd/forensics.ts +9 -3
  512. package/src/resources/extensions/gsd/git-service.ts +166 -11
  513. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  514. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  515. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  516. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  517. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  518. package/src/resources/extensions/gsd/journal.ts +8 -1
  519. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  520. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  521. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  522. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  523. package/src/resources/extensions/gsd/markdown-renderer.ts +20 -12
  524. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  525. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  526. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  527. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  528. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  529. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  530. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  531. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  532. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  533. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  534. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  535. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  536. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  537. package/src/resources/extensions/gsd/paths.ts +5 -0
  538. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  539. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  540. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  541. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  542. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  543. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  544. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  545. package/src/resources/extensions/gsd/preferences.ts +5 -0
  546. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  547. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  548. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  549. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  550. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  551. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  552. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  553. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  554. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  555. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  556. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  557. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  558. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  559. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  560. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  561. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  562. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  563. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  564. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  565. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  566. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  567. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  568. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  569. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  570. package/src/resources/extensions/gsd/state.ts +15 -4
  571. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  572. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  573. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  574. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  575. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  576. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  577. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  578. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +375 -1
  579. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +598 -8
  580. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  581. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  582. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  583. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
  584. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  585. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  586. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  587. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  588. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  589. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  590. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  591. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  592. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  593. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  594. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  595. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  596. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  597. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  598. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  599. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  600. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  601. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  602. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  603. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  604. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  605. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  606. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  607. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  608. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  609. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  610. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  611. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  612. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  613. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  614. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  615. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  616. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  617. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  618. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  619. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  620. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  621. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  622. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  623. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  624. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  625. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  626. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  627. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  628. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  629. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  630. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  631. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  632. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  633. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  634. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  635. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  636. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  637. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  638. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  639. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  640. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  641. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  642. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  643. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  644. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  645. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  646. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  647. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  648. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  649. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  650. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  651. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  652. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  653. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  654. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  655. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  656. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  657. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  658. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  659. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  660. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  661. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  662. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  663. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  664. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  665. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  666. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  667. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  668. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +78 -0
  669. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  670. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  671. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  672. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  673. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  674. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  675. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  676. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  677. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  678. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  679. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +21 -1
  680. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  681. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  682. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +86 -2
  683. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  684. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  685. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  686. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  687. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  688. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  689. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  690. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  691. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  692. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  693. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  694. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  695. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  696. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  697. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  698. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  699. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  700. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  701. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  702. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +57 -2
  703. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  704. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +46 -0
  705. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  706. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  707. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  708. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  709. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  710. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  711. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  712. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  713. package/src/resources/extensions/gsd/types.ts +1 -1
  714. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  715. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  716. package/src/resources/extensions/gsd/validation.ts +23 -1
  717. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  718. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  719. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  720. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  721. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  722. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  723. package/src/resources/extensions/gsd/worktree-lifecycle.ts +93 -20
  724. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  725. package/src/resources/extensions/gsd/worktree-safety.ts +45 -6
  726. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  727. package/src/resources/extensions/shared/html-shell.ts +412 -0
  728. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  729. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  730. package/src/resources/extensions/subagent/index.ts +567 -103
  731. package/src/resources/extensions/subagent/launch.ts +131 -0
  732. package/src/resources/extensions/subagent/run-store.ts +218 -0
  733. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  734. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  735. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  736. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  737. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  738. package/src/resources/extensions/visual-brief/index.ts +8 -0
  739. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  740. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  741. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  742. package/src/resources/skills/forensics/SKILL.md +1 -1
  743. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  744. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  745. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  746. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  747. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  748. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  749. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  750. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  751. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  752. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  753. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  754. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  755. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  756. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  757. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  758. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  759. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → zCegwxH2e6vLp1vEZLLuZ}/_buildManifest.js +0 -0
  760. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → zCegwxH2e6vLp1vEZLLuZ}/_ssgManifest.js +0 -0
@@ -4,9 +4,20 @@
4
4
  import test from "node:test";
5
5
  import assert from "node:assert/strict";
6
6
 
7
- import { createAutoOrchestrator } from "../auto/orchestrator.js";
7
+ import { createAutoOrchestrator, STUCK_WINDOW_SIZE } from "../auto/orchestrator.js";
8
8
  import type { AutoOrchestratorDeps } from "../auto/contracts.js";
9
9
  import type { GSDState } from "../types.js";
10
+ import { createWiredDispatchAdapter } from "../auto.js";
11
+ import { resolveDispatch, type DispatchContext } from "../auto-dispatch.js";
12
+ import { RuleRegistry, setRegistry, resetRegistry } from "../rule-registry.js";
13
+ import type { UnifiedRule } from "../rule-types.js";
14
+ import { supportsStructuredQuestions } from "../workflow-mcp.js";
15
+
16
+ function assertBlockedResult(
17
+ result: Awaited<ReturnType<ReturnType<typeof createAutoOrchestrator>["advance"]>>,
18
+ ): asserts result is Extract<typeof result, { kind: "blocked" }> {
19
+ assert.equal(result.kind, "blocked");
20
+ }
10
21
 
11
22
  function makeState(): GSDState {
12
23
  return {
@@ -62,9 +73,13 @@ function makeDeps(overrides: Partial<AutoOrchestratorDeps> = {}): { deps: AutoOr
62
73
  async cleanupOnStop() { calls.push("worktree.cleanup"); },
63
74
  },
64
75
  health: {
76
+ checkResourcesStale() {
77
+ calls.push("health.stale");
78
+ return null;
79
+ },
65
80
  async preAdvanceGate() {
66
81
  calls.push("health.pre");
67
- return { allow: true };
82
+ return { kind: "pass" };
68
83
  },
69
84
  async postAdvanceRecord() { calls.push("health.post"); },
70
85
  },
@@ -75,6 +90,9 @@ function makeDeps(overrides: Partial<AutoOrchestratorDeps> = {}): { deps: AutoOr
75
90
  notifications: {
76
91
  async notifyLifecycle(event) { calls.push(`notify:${event.name}`); },
77
92
  },
93
+ uokGate: {
94
+ async emit(input) { calls.push(`gate:${input.gateId}:${input.outcome}`); },
95
+ },
78
96
  };
79
97
 
80
98
  return { deps: { ...deps, ...overrides }, calls };
@@ -87,6 +105,7 @@ test("start() advances and records active unit", async () => {
87
105
  const result = await orchestrator.start({ basePath: "/tmp/project", trigger: "manual" });
88
106
 
89
107
  assert.equal(result.kind, "advanced");
108
+ assert.deepEqual(result.unit, { unitType: "execute-task", unitId: "T01" });
90
109
  const status = orchestrator.getStatus();
91
110
  assert.equal(status.phase, "running");
92
111
  assert.deepEqual(status.activeUnit, { unitType: "execute-task", unitId: "T01" });
@@ -95,9 +114,10 @@ test("start() advances and records active unit", async () => {
95
114
  });
96
115
 
97
116
  test("advance() returns blocked when health gate denies", async () => {
98
- const { deps } = makeDeps({
117
+ const { deps, calls } = makeDeps({
99
118
  health: {
100
- async preAdvanceGate() { return { allow: false, reason: "doctor-block" }; },
119
+ checkResourcesStale: () => null,
120
+ async preAdvanceGate() { return { kind: "fail", reason: "doctor-block" }; },
101
121
  async postAdvanceRecord() {},
102
122
  },
103
123
  });
@@ -105,8 +125,146 @@ test("advance() returns blocked when health gate denies", async () => {
105
125
 
106
126
  const result = await orchestrator.advance();
107
127
 
108
- assert.equal(result.kind, "blocked");
128
+ assertBlockedResult(result);
109
129
  assert.equal(result.reason, "doctor-block");
130
+ assert.equal(result.action, "pause");
131
+ assert.ok(calls.includes("gate:pre-dispatch-health-gate:manual-attention"));
132
+ });
133
+
134
+ test("advance() returns blocked pause when resources are stale", async () => {
135
+ const { deps, calls } = makeDeps({
136
+ health: {
137
+ checkResourcesStale: () => "resources changed since session start",
138
+ async preAdvanceGate() { return { kind: "pass" }; },
139
+ async postAdvanceRecord() {},
140
+ },
141
+ });
142
+ const orchestrator = createAutoOrchestrator(deps);
143
+
144
+ const result = await orchestrator.advance();
145
+
146
+ assertBlockedResult(result);
147
+ assert.equal(result.reason, "resources changed since session start");
148
+ assert.equal(result.action, "pause");
149
+ assert.ok(calls.includes("gate:resource-version-guard:fail"));
150
+ assert.ok(!calls.includes("health.pre"));
151
+ assert.ok(!calls.includes("state.reconcile"));
152
+ });
153
+
154
+ test("advance() pre-dispatch parity: gate emissions and control-flow action match legacy branches", async () => {
155
+ type Scenario = {
156
+ name: string;
157
+ staleMsg: string | null;
158
+ gateResult: Awaited<ReturnType<AutoOrchestratorDeps["health"]["preAdvanceGate"]>>;
159
+ expectedKind: "advanced" | "blocked";
160
+ expectedAction?: "pause" | "stop";
161
+ expectedReason?: string;
162
+ expectedGates: string[];
163
+ };
164
+ const scenarios: Scenario[] = [
165
+ {
166
+ name: "pass",
167
+ staleMsg: null,
168
+ gateResult: { kind: "pass" },
169
+ expectedKind: "advanced",
170
+ expectedGates: [
171
+ "resource-version-guard:policy:pass:none:resource version guard passed:",
172
+ "pre-dispatch-health-gate:execution:pass:none:pre-dispatch health gate passed:",
173
+ ],
174
+ },
175
+ {
176
+ name: "resource-stale",
177
+ staleMsg: "resources changed since session start",
178
+ gateResult: { kind: "pass" },
179
+ expectedKind: "blocked",
180
+ expectedAction: "pause",
181
+ expectedReason: "resources changed since session start",
182
+ expectedGates: [
183
+ "resource-version-guard:policy:fail:policy:resource version guard blocked dispatch:resources changed since session start",
184
+ ],
185
+ },
186
+ {
187
+ name: "health-gate-fail",
188
+ staleMsg: null,
189
+ gateResult: { kind: "fail", reason: "doctor-block" },
190
+ expectedKind: "blocked",
191
+ expectedAction: "pause",
192
+ expectedReason: "doctor-block",
193
+ expectedGates: [
194
+ "resource-version-guard:policy:pass:none:resource version guard passed:",
195
+ "pre-dispatch-health-gate:execution:manual-attention:manual-attention:pre-dispatch health gate blocked dispatch:doctor-block",
196
+ ],
197
+ },
198
+ ];
199
+
200
+ for (const scenario of scenarios) {
201
+ const gateEvents: string[] = [];
202
+ const { deps } = makeDeps({
203
+ health: {
204
+ checkResourcesStale: () => scenario.staleMsg,
205
+ async preAdvanceGate() { return scenario.gateResult; },
206
+ async postAdvanceRecord() {},
207
+ },
208
+ uokGate: {
209
+ async emit(input) {
210
+ gateEvents.push(
211
+ `${input.gateId}:${input.gateType}:${input.outcome}:${input.failureClass}:${input.rationale}:${input.findings ?? ""}`,
212
+ );
213
+ },
214
+ },
215
+ });
216
+ const orchestrator = createAutoOrchestrator(deps);
217
+ const result = await orchestrator.advance();
218
+
219
+ assert.equal(result.kind, scenario.expectedKind, `${scenario.name} result kind`);
220
+ if (scenario.expectedKind === "blocked") {
221
+ assertBlockedResult(result);
222
+ assert.equal(result.action, scenario.expectedAction, `${scenario.name} blocked action`);
223
+ assert.equal(result.reason, scenario.expectedReason, `${scenario.name} blocked reason`);
224
+ }
225
+ assert.deepEqual(gateEvents, scenario.expectedGates, `${scenario.name} gate parity`);
226
+ }
227
+ });
228
+
229
+ test("advance() continues past pre-dispatch health gate when it throws", async () => {
230
+ const { deps, calls } = makeDeps({
231
+ health: {
232
+ checkResourcesStale: () => null,
233
+ async preAdvanceGate() { return { kind: "threw", error: new Error("boom") }; },
234
+ async postAdvanceRecord() {},
235
+ },
236
+ });
237
+ const orchestrator = createAutoOrchestrator(deps);
238
+
239
+ const result = await orchestrator.advance();
240
+
241
+ assert.equal(result.kind, "advanced");
242
+ assert.ok(calls.includes("gate:pre-dispatch-health-gate:manual-attention"));
243
+ assert.ok(calls.includes("state.reconcile"));
244
+ assert.ok(calls.includes("dispatch.decide"));
245
+ });
246
+
247
+ test("advance() forwards fixesApplied into pre-dispatch-health-gate pass findings", async () => {
248
+ let observed = "";
249
+ const { deps } = makeDeps({
250
+ health: {
251
+ checkResourcesStale: () => null,
252
+ async preAdvanceGate() { return { kind: "pass", fixesApplied: ["fix-a", "fix-b"] }; },
253
+ async postAdvanceRecord() {},
254
+ },
255
+ uokGate: {
256
+ async emit(input) {
257
+ if (input.gateId === "pre-dispatch-health-gate" && input.outcome === "pass") {
258
+ observed = input.findings ?? "";
259
+ }
260
+ },
261
+ },
262
+ });
263
+ const orchestrator = createAutoOrchestrator(deps);
264
+
265
+ await orchestrator.advance();
266
+
267
+ assert.equal(observed, "fix-a, fix-b");
110
268
  });
111
269
 
112
270
  test("advance() follows the ADR-015 invariant sequence before journaling advance", async () => {
@@ -116,9 +274,13 @@ test("advance() follows the ADR-015 invariant sequence before journaling advance
116
274
  const result = await orchestrator.advance();
117
275
 
118
276
  assert.equal(result.kind, "advanced");
277
+ assert.deepEqual(result.unit, { unitType: "execute-task", unitId: "T01" });
119
278
  assert.deepEqual(calls, [
120
279
  "runtime.lock",
280
+ "health.stale",
281
+ "gate:resource-version-guard:pass",
121
282
  "health.pre",
283
+ "gate:pre-dispatch-health-gate:pass",
122
284
  "state.reconcile",
123
285
  "dispatch.decide",
124
286
  "tool.compile",
@@ -142,8 +304,9 @@ test("advance() blocks before dispatch when State Reconciliation blocks", async
142
304
 
143
305
  const result = await orchestrator.advance();
144
306
 
145
- assert.equal(result.kind, "blocked");
307
+ assertBlockedResult(result);
146
308
  assert.equal(result.reason, "state drift blocked");
309
+ assert.equal(result.action, "pause");
147
310
  assert.ok(!calls.includes("dispatch.decide"));
148
311
  assert.ok(calls.includes("journal:advance-blocked"));
149
312
  });
@@ -161,8 +324,9 @@ test("advance() blocks before Runtime persistence when Tool Contract fails", asy
161
324
 
162
325
  const result = await orchestrator.advance();
163
326
 
164
- assert.equal(result.kind, "blocked");
327
+ assertBlockedResult(result);
165
328
  assert.equal(result.reason, "unknown Unit");
329
+ assert.equal(result.action, "pause");
166
330
  assert.ok(!calls.includes("worktree.prepare"));
167
331
  assert.ok(!calls.includes("journal:advance"));
168
332
  assert.ok(calls.includes("journal:advance-blocked"));
@@ -183,13 +347,34 @@ test("advance() blocks before Runtime persistence when Worktree Safety fails", a
183
347
 
184
348
  const result = await orchestrator.advance();
185
349
 
186
- assert.equal(result.kind, "blocked");
350
+ assertBlockedResult(result);
187
351
  assert.equal(result.reason, "worktree invalid");
352
+ assert.equal(result.action, "pause");
188
353
  assert.ok(!calls.includes("journal:advance"));
189
354
  assert.ok(!calls.includes("worktree.sync"));
190
355
  assert.ok(calls.includes("journal:advance-blocked"));
191
356
  });
192
357
 
358
+ test("advance() allows non-worktree isolation prepare result", async () => {
359
+ const { deps, calls } = makeDeps({
360
+ worktree: {
361
+ async prepareForUnit() {
362
+ calls.push("worktree.prepare");
363
+ return { ok: true, reason: "isolation-not-worktree" };
364
+ },
365
+ async syncAfterUnit() { calls.push("worktree.sync"); },
366
+ async cleanupOnStop() { calls.push("worktree.cleanup"); },
367
+ },
368
+ });
369
+ const orchestrator = createAutoOrchestrator(deps);
370
+
371
+ const result = await orchestrator.advance();
372
+
373
+ assert.equal(result.kind, "advanced");
374
+ assert.ok(calls.includes("journal:advance"));
375
+ assert.ok(calls.includes("worktree.sync"));
376
+ });
377
+
193
378
  test("advance() stops when dispatch has no next unit", async () => {
194
379
  const { deps } = makeDeps({
195
380
  dispatch: {
@@ -204,6 +389,52 @@ test("advance() stops when dispatch has no next unit", async () => {
204
389
  assert.equal(orchestrator.getStatus().phase, "stopped");
205
390
  });
206
391
 
392
+ test("advance() surfaces dispatch blocker reason instead of generic no remaining units", async () => {
393
+ const { deps, calls } = makeDeps({
394
+ dispatch: {
395
+ async decideNextUnit() {
396
+ return {
397
+ kind: "blocked",
398
+ reason: "Milestone M001 validation verdict is needs-remediation but all slices are complete.",
399
+ action: "pause",
400
+ };
401
+ },
402
+ },
403
+ });
404
+ const orchestrator = createAutoOrchestrator(deps);
405
+
406
+ const result = await orchestrator.advance();
407
+
408
+ assert.equal(result.kind, "blocked");
409
+ if (result.kind !== "blocked") return;
410
+ assert.equal(result.reason, "Milestone M001 validation verdict is needs-remediation but all slices are complete.");
411
+ assert.equal(result.action, "pause");
412
+ assert.ok(calls.includes("journal:advance-blocked"));
413
+ assert.ok(!calls.includes("journal:advance-stopped"));
414
+ });
415
+
416
+ test("resume() returns blocked when advance detects a dispatch blocker", async () => {
417
+ const { deps } = makeDeps({
418
+ dispatch: {
419
+ async decideNextUnit() {
420
+ return {
421
+ kind: "blocked",
422
+ reason: "remediation required",
423
+ action: "pause",
424
+ };
425
+ },
426
+ },
427
+ });
428
+ const orchestrator = createAutoOrchestrator(deps);
429
+
430
+ const result = await orchestrator.resume();
431
+
432
+ assert.equal(result.kind, "blocked");
433
+ if (result.kind !== "blocked") return;
434
+ assert.equal(result.reason, "remediation required");
435
+ assert.equal(result.action, "pause");
436
+ });
437
+
207
438
  test("advance() uses recovery on error", async () => {
208
439
  const { deps, calls } = makeDeps({
209
440
  runtime: {
@@ -232,8 +463,10 @@ test("advance() is idempotent for the same active unit", async () => {
232
463
  const second = await orchestrator.advance();
233
464
 
234
465
  assert.equal(first.kind, "advanced");
466
+ assert.deepEqual(first.unit, { unitType: "execute-task", unitId: "T01" });
235
467
  assert.equal(second.kind, "blocked");
236
468
  assert.equal(second.reason, "idempotent advance: unit already active");
469
+ assert.equal(second.action, "pause");
237
470
 
238
471
  const prepareCalls = calls.filter((c) => c === "worktree.prepare").length;
239
472
  assert.equal(prepareCalls, 1);
@@ -468,3 +701,360 @@ test("stop() cleans up worktree and transitions to stopped", async () => {
468
701
  assert.ok(calls.includes("journal:stop"));
469
702
  assert.ok(calls.includes("notify:stop"));
470
703
  });
704
+
705
+ // ────────────────────────────────────────────────────────────────────────
706
+ // Stuck-loop ring buffer (issue #5787)
707
+ // ────────────────────────────────────────────────────────────────────────
708
+
709
+ test("STUCK_WINDOW_SIZE matches the legacy auto/phases.ts constant", () => {
710
+ assert.equal(STUCK_WINDOW_SIZE, 6);
711
+ });
712
+
713
+ test("stuck-loop: empty ring on a freshly constructed orchestrator advances normally", async () => {
714
+ const { deps } = makeDeps();
715
+ const orchestrator = createAutoOrchestrator(deps);
716
+
717
+ const result = await orchestrator.advance();
718
+
719
+ assert.equal(result.kind, "advanced");
720
+ });
721
+
722
+ test("stuck-loop: partial fill of mixed units does not block", async () => {
723
+ // Alternate A/B for STUCK_WINDOW_SIZE rounds. No single key saturates the
724
+ // window, so neither idempotency nor stuck-loop should fire.
725
+ let i = 0;
726
+ const sequence = ["A", "B", "A", "B", "A", "B"];
727
+ const { deps } = makeDeps({
728
+ dispatch: {
729
+ async decideNextUnit() {
730
+ const id = sequence[i++ % sequence.length];
731
+ return { unitType: "execute-task", unitId: id, reason: "ready", preconditions: [] };
732
+ },
733
+ },
734
+ });
735
+ const orchestrator = createAutoOrchestrator(deps);
736
+
737
+ for (let round = 0; round < STUCK_WINDOW_SIZE; round++) {
738
+ const result = await orchestrator.advance();
739
+ assert.equal(result.kind, "advanced", `round ${round} should advance, got ${result.kind}`);
740
+ }
741
+ });
742
+
743
+ test("stuck-loop: ring saturated with same unit blocks with action 'stop' and stuck-loop reason", async () => {
744
+ // Dispatch picks the same unit every time. The first advance succeeds.
745
+ // Calls 2..STUCK_WINDOW_SIZE-1 are idempotency-blocked while the ring fills.
746
+ // The STUCK_WINDOW_SIZE'th call sees a saturated ring and returns stuck-loop.
747
+ const { deps } = makeDeps();
748
+ const orchestrator = createAutoOrchestrator(deps);
749
+
750
+ const results: Awaited<ReturnType<typeof orchestrator.advance>>[] = [];
751
+ for (let i = 0; i < STUCK_WINDOW_SIZE; i++) {
752
+ results.push(await orchestrator.advance());
753
+ }
754
+
755
+ // First call advances.
756
+ assert.equal(results[0].kind, "advanced");
757
+
758
+ // Intermediate calls are blocked by idempotency (not stuck-loop yet).
759
+ for (let i = 1; i < STUCK_WINDOW_SIZE - 1; i++) {
760
+ const r = results[i];
761
+ assert.equal(r.kind, "blocked", `round ${i} should be blocked`);
762
+ if (r.kind !== "blocked") return;
763
+ assert.equal(r.reason, "idempotent advance: unit already active");
764
+ assert.equal(r.action, "pause");
765
+ }
766
+
767
+ // The final call (ring now holds STUCK_WINDOW_SIZE copies) returns stuck-loop.
768
+ const last = results[STUCK_WINDOW_SIZE - 1];
769
+ assert.equal(last.kind, "blocked");
770
+ if (last.kind !== "blocked") return;
771
+ assert.equal(last.action, "stop");
772
+ assert.equal(last.reason, `stuck-loop: execute-task:T01 picked ${STUCK_WINDOW_SIZE} times`);
773
+ });
774
+
775
+ test("stuck-loop: idempotency block continues to fire with its own reason before saturation", async () => {
776
+ // Two identical calls should produce idempotent (not stuck-loop). Ensures the
777
+ // existing idempotency block is not absorbed by the new check.
778
+ const { deps } = makeDeps();
779
+ const orchestrator = createAutoOrchestrator(deps);
780
+
781
+ const first = await orchestrator.advance();
782
+ const second = await orchestrator.advance();
783
+
784
+ assert.equal(first.kind, "advanced");
785
+ assert.equal(second.kind, "blocked");
786
+ assert.equal(second.reason, "idempotent advance: unit already active");
787
+ assert.equal(second.action, "pause");
788
+ });
789
+
790
+ test("stuck-loop: start() resets the ring so a fresh saturation cycle is required", async () => {
791
+ // Fill the ring to one short of saturation, then start() — the ring should
792
+ // be cleared, and the next advance must succeed instead of going stuck.
793
+ const { deps } = makeDeps();
794
+ const orchestrator = createAutoOrchestrator(deps);
795
+
796
+ for (let i = 0; i < STUCK_WINDOW_SIZE - 1; i++) {
797
+ await orchestrator.advance();
798
+ }
799
+
800
+ const restarted = await orchestrator.start({ basePath: "/tmp/project", trigger: "manual" });
801
+ assert.equal(restarted.kind, "advanced");
802
+
803
+ // Immediately after start(), the next advance is idempotent (one element in
804
+ // ring), not stuck-loop, confirming the ring was reset.
805
+ const next = await orchestrator.advance();
806
+ assert.equal(next.kind, "blocked");
807
+ assert.equal(next.reason, "idempotent advance: unit already active");
808
+ assert.equal(next.action, "pause");
809
+ });
810
+
811
+ test("stuck-loop: resume() resets the ring", async () => {
812
+ const { deps } = makeDeps();
813
+ const orchestrator = createAutoOrchestrator(deps);
814
+
815
+ for (let i = 0; i < STUCK_WINDOW_SIZE - 1; i++) {
816
+ await orchestrator.advance();
817
+ }
818
+
819
+ const resumed = await orchestrator.resume();
820
+ assert.equal(resumed.kind, "advanced");
821
+
822
+ const next = await orchestrator.advance();
823
+ assert.equal(next.kind, "blocked");
824
+ assert.equal(next.reason, "idempotent advance: unit already active");
825
+ assert.equal(next.action, "pause");
826
+ });
827
+
828
+ test("stuck-loop: stop() resets the ring", async () => {
829
+ const { deps } = makeDeps();
830
+ const orchestrator = createAutoOrchestrator(deps);
831
+
832
+ for (let i = 0; i < STUCK_WINDOW_SIZE - 1; i++) {
833
+ await orchestrator.advance();
834
+ }
835
+
836
+ const stopped = await orchestrator.stop("user-request");
837
+ assert.equal(stopped.kind, "stopped");
838
+
839
+ // Ring is cleared by stop(). A subsequent advance is a fresh first-touch.
840
+ const next = await orchestrator.advance();
841
+ assert.equal(next.kind, "advanced");
842
+ });
843
+
844
+ test("stuck-loop: journal records the stuck-loop reason on advance-blocked", async () => {
845
+ const { deps, calls } = makeDeps();
846
+ const orchestrator = createAutoOrchestrator(deps);
847
+
848
+ for (let i = 0; i < STUCK_WINDOW_SIZE; i++) {
849
+ await orchestrator.advance();
850
+ }
851
+
852
+ assert.ok(calls.includes("journal:advance-blocked"));
853
+ });
854
+
855
+ // ─── #5789 parity: wired dispatch adapter mirrors runDispatch's resolveDispatch call ───
856
+
857
+ test("wired DispatchAdapter forwards session-derived dispatch inputs identically to runDispatch", async () => {
858
+ const stateSnapshot = makeState();
859
+
860
+ // Install a capturing registry so we observe the DispatchContext both code paths
861
+ // build, and force a deterministic dispatch action so the parity assertion is
862
+ // about *inputs*, not rule evaluation.
863
+ const captured: DispatchContext[] = [];
864
+ const captureRule: UnifiedRule = {
865
+ name: "test-capture",
866
+ when: "dispatch",
867
+ evaluation: "first-match",
868
+ where: async (ctx: DispatchContext) => {
869
+ captured.push(ctx);
870
+ return {
871
+ action: "dispatch" as const,
872
+ unitType: "execute-task",
873
+ unitId: "T01",
874
+ prompt: "parity-fixture",
875
+ };
876
+ },
877
+ then: (r: unknown) => r,
878
+ };
879
+ setRegistry(new RuleRegistry([captureRule]));
880
+
881
+ try {
882
+ // Mock ExtensionContext + ExtensionAPI with the surface the wired adapter touches.
883
+ const fakeModelRegistry = {
884
+ getAll: () => [],
885
+ getProviderAuthMode: (_provider: string) => "apiKey" as const,
886
+ };
887
+ const ctx = {
888
+ model: {
889
+ provider: "anthropic",
890
+ baseUrl: "https://api.anthropic.com",
891
+ contextWindow: 200_000,
892
+ },
893
+ modelRegistry: fakeModelRegistry,
894
+ } as any;
895
+ const pi = {
896
+ getActiveTools: () => ["read_file", "write_file"],
897
+ } as any;
898
+ const basePath = "/tmp/parity-fixture";
899
+
900
+ // Path A — wired adapter (what createWiredAutoOrchestrationModule uses).
901
+ const adapter = createWiredDispatchAdapter(ctx, pi, basePath);
902
+ const adapterResult = await adapter.decideNextUnit({ stateSnapshot });
903
+
904
+ // Path B — direct resolveDispatch call mirroring phases.ts:runDispatch.
905
+ // Inline the same derivations runDispatch uses so any drift here is a parity break.
906
+ const prefs = undefined; // loadEffectiveGSDPreferences returns null for /tmp/parity-fixture.
907
+ const provider = ctx.model?.provider;
908
+ const authMode = provider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
909
+ ? ctx.modelRegistry.getProviderAuthMode(provider)
910
+ : undefined;
911
+ const activeTools = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
912
+ const structuredQuestionsAvailable: "true" | "false" =
913
+ prefs !== undefined && (prefs as { planning_depth?: string }).planning_depth === "deep"
914
+ ? "false"
915
+ : supportsStructuredQuestions(activeTools, {
916
+ authMode,
917
+ baseUrl: ctx.model?.baseUrl,
918
+ })
919
+ ? "true"
920
+ : "false";
921
+
922
+ const builtDirectCtx: DispatchContext = {
923
+ basePath,
924
+ mid: stateSnapshot.activeMilestone!.id,
925
+ midTitle: stateSnapshot.activeMilestone!.title,
926
+ state: stateSnapshot,
927
+ prefs,
928
+ structuredQuestionsAvailable,
929
+ sessionContextWindow: ctx.model?.contextWindow,
930
+ sessionProvider: ctx.model?.provider,
931
+ modelRegistry: ctx.modelRegistry,
932
+ };
933
+ const directAction = await resolveDispatch(builtDirectCtx);
934
+
935
+ // Two contexts captured: one per resolveDispatch call.
936
+ assert.equal(captured.length, 2, "expected two captured dispatch contexts");
937
+ const [adapterCtx, directCtx] = captured;
938
+
939
+ // Parity assertion: session-derived fields are identical.
940
+ assert.equal(adapterCtx.structuredQuestionsAvailable, directCtx.structuredQuestionsAvailable);
941
+ assert.equal(adapterCtx.sessionContextWindow, directCtx.sessionContextWindow);
942
+ assert.equal(adapterCtx.sessionProvider, directCtx.sessionProvider);
943
+ assert.equal(adapterCtx.modelRegistry, directCtx.modelRegistry);
944
+ assert.equal(adapterCtx.basePath, directCtx.basePath);
945
+ assert.equal(adapterCtx.mid, directCtx.mid);
946
+ assert.equal(adapterCtx.midTitle, directCtx.midTitle);
947
+
948
+ // Dispatch action equality: both flows reach the same dispatch decision.
949
+ if (!adapterResult || !("unitType" in adapterResult)) {
950
+ assert.fail("expected adapter result to be a dispatch decision");
951
+ }
952
+ assert.equal(adapterResult.unitType, "execute-task");
953
+ assert.equal(adapterResult.unitId, "T01");
954
+ assert.equal(adapterResult.reason, "test-capture");
955
+ assert.equal(directAction.action, "dispatch");
956
+ if (directAction.action === "dispatch") {
957
+ assert.equal(directAction.unitType, adapterResult.unitType);
958
+ assert.equal(directAction.unitId, adapterResult.unitId);
959
+ assert.equal(directAction.matchedRule, adapterResult.reason);
960
+ }
961
+ } finally {
962
+ resetRegistry();
963
+ }
964
+ });
965
+
966
+ test("wired DispatchAdapter prefers caller-supplied dispatch inputs over ctx-derived values", async () => {
967
+ const stateSnapshot = makeState();
968
+ const captured: DispatchContext[] = [];
969
+ const captureRule: UnifiedRule = {
970
+ name: "test-capture-overrides",
971
+ when: "dispatch",
972
+ evaluation: "first-match",
973
+ where: async (ctx: DispatchContext) => {
974
+ captured.push(ctx);
975
+ return {
976
+ action: "dispatch" as const,
977
+ unitType: "execute-task",
978
+ unitId: "T01",
979
+ prompt: "override-fixture",
980
+ };
981
+ },
982
+ then: (r: unknown) => r,
983
+ };
984
+ setRegistry(new RuleRegistry([captureRule]));
985
+
986
+ try {
987
+ const ctxModelRegistry = {
988
+ getAll: () => [],
989
+ getProviderAuthMode: (_provider: string) => "apiKey" as const,
990
+ };
991
+ const overrideModelRegistry = {
992
+ getAll: () => [],
993
+ getProviderAuthMode: (_provider: string) => "oauth" as const,
994
+ };
995
+ const ctx = {
996
+ model: {
997
+ provider: "anthropic",
998
+ baseUrl: "https://api.anthropic.com",
999
+ contextWindow: 200_000,
1000
+ },
1001
+ modelRegistry: ctxModelRegistry,
1002
+ } as any;
1003
+ const pi = {
1004
+ getActiveTools: () => [],
1005
+ } as any;
1006
+ const adapter = createWiredDispatchAdapter(ctx, pi, "/tmp/parity-fixture");
1007
+ const session = { basePath: "/tmp/session-fixture" } as any;
1008
+
1009
+ const result = await adapter.decideNextUnit({
1010
+ stateSnapshot,
1011
+ session,
1012
+ structuredQuestionsAvailable: "true",
1013
+ sessionContextWindow: 500_000,
1014
+ sessionProvider: "openai",
1015
+ modelRegistry: overrideModelRegistry,
1016
+ });
1017
+
1018
+ assert.ok(result);
1019
+ assert.equal(captured.length, 1, "expected one captured dispatch context");
1020
+ assert.equal(captured[0].structuredQuestionsAvailable, "true");
1021
+ assert.equal(captured[0].sessionContextWindow, 500_000);
1022
+ assert.equal(captured[0].sessionProvider, "openai");
1023
+ assert.equal(captured[0].modelRegistry, overrideModelRegistry);
1024
+ assert.equal(captured[0].session, session);
1025
+ } finally {
1026
+ resetRegistry();
1027
+ }
1028
+ });
1029
+
1030
+ test("wired DispatchAdapter preserves stop reason as a blocked decision", async () => {
1031
+ const stateSnapshot = makeState();
1032
+ const stopRule: UnifiedRule = {
1033
+ name: "test-stop",
1034
+ when: "dispatch",
1035
+ evaluation: "first-match",
1036
+ where: async () => ({
1037
+ action: "stop" as const,
1038
+ reason: "remediation blocker",
1039
+ level: "warning" as const,
1040
+ }),
1041
+ then: (r: unknown) => r,
1042
+ };
1043
+ setRegistry(new RuleRegistry([stopRule]));
1044
+
1045
+ try {
1046
+ const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as any;
1047
+ const pi = { getActiveTools: () => [] } as any;
1048
+ const adapter = createWiredDispatchAdapter(ctx, pi, "/tmp/parity-fixture");
1049
+
1050
+ const result = await adapter.decideNextUnit({ stateSnapshot });
1051
+
1052
+ assert.deepEqual(result, {
1053
+ kind: "blocked",
1054
+ reason: "remediation blocker",
1055
+ action: "pause",
1056
+ });
1057
+ } finally {
1058
+ resetRegistry();
1059
+ }
1060
+ });