@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.5457a158

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 (338) 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 +7 -29
  6. package/dist/models-resolver.d.ts +3 -13
  7. package/dist/models-resolver.js +3 -22
  8. package/dist/resource-loader.js +2 -14
  9. package/dist/resources/.managed-resources-content-hash +1 -1
  10. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  11. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  12. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +35 -4
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +33 -4
  14. package/dist/resources/extensions/gsd/auto/phases.js +6 -1
  15. package/dist/resources/extensions/gsd/auto-post-unit.js +19 -8
  16. package/dist/resources/extensions/gsd/auto-prompts.js +3 -0
  17. package/dist/resources/extensions/gsd/auto-start.js +12 -14
  18. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  19. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +7 -16
  20. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  21. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  22. package/dist/resources/extensions/gsd/auto.js +8 -20
  23. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
  24. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +9 -6
  25. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +86 -6
  26. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +30 -4
  27. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  28. package/dist/resources/extensions/gsd/captures.js +5 -15
  29. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  30. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  31. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  32. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  33. package/dist/resources/extensions/gsd/db/queries.js +372 -0
  34. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  35. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  36. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  37. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  38. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  39. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  40. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  41. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  42. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
  43. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  44. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  45. package/dist/resources/extensions/gsd/git-service.js +1 -0
  46. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  47. package/dist/resources/extensions/gsd/gsd-db.js +171 -2048
  48. package/dist/resources/extensions/gsd/guidance.js +98 -0
  49. package/dist/resources/extensions/gsd/guided-flow.js +51 -5
  50. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  51. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  52. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  53. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  54. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  55. package/dist/resources/extensions/gsd/model-router.js +3 -0
  56. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  57. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  58. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  59. package/dist/resources/extensions/gsd/paths.js +37 -24
  60. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  61. package/dist/resources/extensions/gsd/preferences-models.js +12 -46
  62. package/dist/resources/extensions/gsd/preferences.js +14 -0
  63. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  64. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  65. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  66. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  67. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  68. package/dist/resources/extensions/gsd/publication.js +87 -0
  69. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  70. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  71. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  72. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  73. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  74. package/dist/resources/extensions/gsd/state.js +1 -20
  75. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  76. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  77. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  78. package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
  79. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -8
  80. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  81. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  82. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  83. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  84. package/dist/resources/extensions/gsd/undo.js +8 -7
  85. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  86. package/dist/resources/extensions/gsd/unit-context-composer.js +9 -1
  87. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  88. package/dist/resources/extensions/gsd/unit-registry.js +350 -0
  89. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  90. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  91. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  92. package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
  93. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  94. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  95. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  96. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  97. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  98. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  99. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  100. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  101. package/dist/web/standalone/.next/BUILD_ID +1 -1
  102. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  103. package/dist/web/standalone/.next/build-manifest.json +2 -2
  104. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  105. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  123. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  124. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  125. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  126. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  127. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  128. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  129. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  130. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  131. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  132. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/index.html +1 -1
  156. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  158. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  163. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  164. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  165. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  166. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  168. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  169. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  170. package/dist/worktree-cli.js +3 -6
  171. package/dist/worktree-status-banner.js +7 -11
  172. package/package.json +1 -1
  173. package/packages/cloud-mcp-gateway/package.json +2 -2
  174. package/packages/contracts/dist/workflow.d.ts +4 -0
  175. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  176. package/packages/contracts/dist/workflow.js.map +1 -1
  177. package/packages/contracts/package.json +1 -1
  178. package/packages/daemon/package.json +4 -4
  179. package/packages/gsd-agent-core/package.json +5 -5
  180. package/packages/gsd-agent-modes/package.json +7 -7
  181. package/packages/mcp-server/dist/cli.js +6 -3
  182. package/packages/mcp-server/dist/cli.js.map +1 -1
  183. package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
  184. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  185. package/packages/mcp-server/dist/workflow-tools.js +46 -21
  186. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  187. package/packages/mcp-server/package.json +3 -3
  188. package/packages/native/package.json +1 -1
  189. package/packages/pi-agent-core/package.json +1 -1
  190. package/packages/pi-ai/dist/models.generated.d.ts +294 -239
  191. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  192. package/packages/pi-ai/dist/models.generated.js +260 -256
  193. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  194. package/packages/pi-ai/package.json +1 -1
  195. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  197. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  198. package/packages/pi-coding-agent/package.json +7 -7
  199. package/packages/pi-tui/package.json +2 -2
  200. package/packages/rpc-client/package.json +2 -2
  201. package/pkg/package.json +1 -1
  202. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  203. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  204. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +37 -2
  205. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  206. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  207. package/src/resources/extensions/gsd/auto/orchestrator.ts +39 -5
  208. package/src/resources/extensions/gsd/auto/phases.ts +10 -1
  209. package/src/resources/extensions/gsd/auto-post-unit.ts +25 -7
  210. package/src/resources/extensions/gsd/auto-prompts.ts +3 -0
  211. package/src/resources/extensions/gsd/auto-start.ts +12 -15
  212. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  213. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +10 -17
  214. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  215. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  216. package/src/resources/extensions/gsd/auto.ts +20 -24
  217. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
  218. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -6
  219. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +87 -6
  220. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +29 -3
  221. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  222. package/src/resources/extensions/gsd/captures.ts +5 -16
  223. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  224. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  225. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  226. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  227. package/src/resources/extensions/gsd/db/queries.ts +453 -0
  228. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  229. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  230. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  231. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  232. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  233. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  234. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  235. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  236. package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
  237. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  238. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  239. package/src/resources/extensions/gsd/git-service.ts +1 -0
  240. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  241. package/src/resources/extensions/gsd/gsd-db.ts +173 -2373
  242. package/src/resources/extensions/gsd/guidance.ts +139 -0
  243. package/src/resources/extensions/gsd/guided-flow.ts +50 -5
  244. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  245. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  246. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  247. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  248. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  249. package/src/resources/extensions/gsd/model-router.ts +3 -0
  250. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  251. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  252. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  253. package/src/resources/extensions/gsd/paths.ts +42 -22
  254. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  255. package/src/resources/extensions/gsd/preferences-models.ts +10 -46
  256. package/src/resources/extensions/gsd/preferences.ts +18 -0
  257. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  258. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  259. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  260. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  261. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  262. package/src/resources/extensions/gsd/publication.ts +122 -0
  263. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  264. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  265. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  266. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  267. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  268. package/src/resources/extensions/gsd/state.ts +4 -21
  269. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  270. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  271. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  272. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  273. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  274. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  275. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  276. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  277. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  278. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  279. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  280. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  281. package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
  282. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +51 -4
  283. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +54 -1
  284. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  285. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  286. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  287. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  288. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  289. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  290. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  291. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  292. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
  293. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  294. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  295. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  296. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  297. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  298. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  299. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  300. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  301. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  302. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +23 -2
  303. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  304. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  305. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
  306. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  307. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  308. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  309. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  310. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  311. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  312. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  313. package/src/resources/extensions/gsd/tests/write-gate.test.ts +42 -0
  314. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  315. package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
  316. package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -8
  317. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  318. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  319. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  320. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  321. package/src/resources/extensions/gsd/undo.ts +9 -8
  322. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  323. package/src/resources/extensions/gsd/unit-context-composer.ts +12 -1
  324. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  325. package/src/resources/extensions/gsd/unit-registry.ts +425 -0
  326. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  327. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  328. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  329. package/src/resources/extensions/gsd/worktree-lifecycle.ts +10 -1
  330. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  331. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  332. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  333. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  334. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  335. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  336. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  337. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → 2p9Rv9pQflAxCBbGVI2vb}/_buildManifest.js +0 -0
  338. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → 2p9Rv9pQflAxCBbGVI2vb}/_ssgManifest.js +0 -0
@@ -12,15 +12,10 @@
12
12
  // Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
13
13
 
14
14
  import {
15
- getMilestone,
16
- getSlice,
17
15
  getSliceTasks,
18
- updateSliceStatus,
19
- updateTaskStatus,
20
- transaction,
16
+ reopenSliceCascade,
21
17
  } from "../gsd-db.js";
22
18
  import { invalidateStateCache } from "../state.js";
23
- import { isClosedStatus } from "../status-guards.js";
24
19
  import { renderAllProjections } from "../workflow-projections.js";
25
20
  import { writeManifest } from "../workflow-manifest.js";
26
21
  import { appendEvent } from "../workflow-events.js";
@@ -57,44 +52,21 @@ export async function handleReopenSlice(
57
52
  return { error: "milestoneId is required and must be a non-empty string" };
58
53
  }
59
54
 
60
- // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
61
- let guardError: string | null = null;
62
- let tasksResetCount = 0;
63
-
64
- transaction(() => {
65
- const milestone = getMilestone(params.milestoneId);
66
- if (!milestone) {
67
- guardError = `milestone not found: ${params.milestoneId}`;
68
- return;
69
- }
70
- if (isClosedStatus(milestone.status)) {
71
- guardError = `cannot reopen slice in a closed milestone: ${params.milestoneId} (status: ${milestone.status})`;
72
- return;
73
- }
74
-
75
- const slice = getSlice(params.milestoneId, params.sliceId);
76
- if (!slice) {
77
- guardError = `slice not found: ${params.milestoneId}/${params.sliceId}`;
78
- return;
79
- }
80
- if (!isClosedStatus(slice.status)) {
81
- guardError = `slice ${params.sliceId} is not complete (status: ${slice.status}) — nothing to reopen`;
82
- return;
55
+ // ── Atomic reopen cascade (guards + writes in one transaction) ───────────
56
+ const outcome = reopenSliceCascade(params.milestoneId, params.sliceId);
57
+ if (!outcome.ok) {
58
+ switch (outcome.reason) {
59
+ case "milestone-not-found":
60
+ return { error: `milestone not found: ${params.milestoneId}` };
61
+ case "milestone-closed":
62
+ return { error: `cannot reopen slice in a closed milestone: ${params.milestoneId} (status: ${outcome.status})` };
63
+ case "slice-not-found":
64
+ return { error: `slice not found: ${params.milestoneId}/${params.sliceId}` };
65
+ case "slice-not-complete":
66
+ return { error: `slice ${params.sliceId} is not complete (status: ${outcome.status}) — nothing to reopen` };
83
67
  }
84
-
85
- // Fetch tasks inside txn so the list is consistent with the slice status check
86
- const tasks = getSliceTasks(params.milestoneId, params.sliceId);
87
- tasksResetCount = tasks.length;
88
-
89
- updateSliceStatus(params.milestoneId, params.sliceId, "in_progress");
90
- for (const task of tasks) {
91
- updateTaskStatus(params.milestoneId, params.sliceId, task.id, "pending");
92
- }
93
- });
94
-
95
- if (guardError) {
96
- return { error: guardError };
97
68
  }
69
+ const tasksResetCount = outcome.tasksReset;
98
70
 
99
71
  // ── Invalidate caches ────────────────────────────────────────────────────
100
72
  invalidateStateCache();
@@ -11,14 +11,9 @@
11
11
  */
12
12
 
13
13
  import {
14
- getSlice,
15
- getSliceTasks,
16
14
  isDbAvailable,
17
- transaction,
18
- updateSliceStatus,
19
- updateTaskStatus,
15
+ skipSliceCascade,
20
16
  } from "../gsd-db.js";
21
- import { isClosedStatus } from "../status-guards.js";
22
17
 
23
18
  /**
24
19
  * Input parameters for {@link handleSkipSlice}.
@@ -90,44 +85,23 @@ export function handleSkipSlice(params: SkipSliceParams): SkipSliceResult {
90
85
  throw new Error("handleSkipSlice: GSD database is not available");
91
86
  }
92
87
 
93
- // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ────
94
- let guardError: string | null = null;
95
- let guardCode: SkipSliceErrorCode | null = null;
96
- let wasAlreadySkipped = false;
97
- let tasksSkipped = 0;
98
-
99
- transaction(() => {
100
- const slice = getSlice(params.milestoneId, params.sliceId);
101
- if (!slice) {
102
- guardError = `Slice ${params.sliceId} not found in milestone ${params.milestoneId}`;
103
- guardCode = "slice_not_found";
104
- return;
105
- }
106
- if (slice.status === "complete" || slice.status === "done") {
107
- guardError = `Slice ${params.sliceId} is already complete — cannot skip.`;
108
- guardCode = "already_complete";
109
- return;
110
- }
111
-
112
- wasAlreadySkipped = slice.status === "skipped";
113
- if (!wasAlreadySkipped) {
114
- updateSliceStatus(params.milestoneId, params.sliceId, "skipped");
88
+ // ── Atomic skip cascade (guards + writes in one transaction) ────────────
89
+ const outcome = skipSliceCascade(params.milestoneId, params.sliceId);
90
+ if (!outcome.ok) {
91
+ switch (outcome.reason) {
92
+ case "slice-not-found":
93
+ return {
94
+ ...base,
95
+ error: `Slice ${params.sliceId} not found in milestone ${params.milestoneId}`,
96
+ errorCode: "slice_not_found" as SkipSliceErrorCode,
97
+ };
98
+ case "slice-already-complete":
99
+ return {
100
+ ...base,
101
+ error: `Slice ${params.sliceId} is already complete cannot skip.`,
102
+ errorCode: "already_complete" as SkipSliceErrorCode,
103
+ };
115
104
  }
116
-
117
- // Cascade: mark every non-closed task as skipped so milestone completion
118
- // doesn't trip the deep-task guard (#4375). Closed tasks (complete/done/
119
- // skipped) are left untouched — we never downgrade.
120
- const tasks = getSliceTasks(params.milestoneId, params.sliceId);
121
- for (const task of tasks) {
122
- if (!isClosedStatus(task.status)) {
123
- updateTaskStatus(params.milestoneId, params.sliceId, task.id, "skipped");
124
- tasksSkipped++;
125
- }
126
- }
127
- });
128
-
129
- if (guardError) {
130
- return { ...base, error: guardError, errorCode: guardCode ?? undefined };
131
105
  }
132
- return { ...base, tasksSkipped, wasAlreadySkipped };
106
+ return { ...base, tasksSkipped: outcome.tasksSkipped, wasAlreadySkipped: outcome.wasAlreadySkipped };
133
107
  }
@@ -13,7 +13,7 @@ import { deriveState } from "./state.js";
13
13
  import { invalidateAllCaches } from "./cache.js";
14
14
  import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
15
15
  import { sendDesktopNotification } from "./notifications.js";
16
- import { getTask, getSlice, getSliceTasks, updateTaskStatus, updateSliceStatus } from "./gsd-db.js";
16
+ import { getTask, getSlice, getSliceTasks, updateTaskStatus, resetSliceCascade } from "./gsd-db.js";
17
17
  import { renderPlanCheckboxes, renderRoadmapCheckboxes } from "./markdown-renderer.js";
18
18
 
19
19
  /**
@@ -330,12 +330,16 @@ export async function handleResetSlice(
330
330
  return;
331
331
  }
332
332
 
333
- // Reset all tasks
334
- let tasksReset = 0;
333
+ // Reset all task statuses to "pending" and the slice to "active" in one
334
+ // atomic commit (DB is source of truth). Previously a per-task updateTaskStatus
335
+ // loop + a separate updateSliceStatus, which could leave a partial reset if
336
+ // interrupted mid-loop.
337
+ resetSliceCascade(mid, sid);
338
+
339
+ // Delete task summary files — projection cleanup, separate from the DB reset.
340
+ const tasksReset = tasks.length;
335
341
  let summariesDeleted = 0;
336
342
  for (const t of tasks) {
337
- updateTaskStatus(mid, sid, t.id, "pending");
338
- tasksReset++;
339
343
  const summaryPath = resolveTaskFile(basePath, mid, sid, t.id, "SUMMARY");
340
344
  if (summaryPath && existsSync(summaryPath)) {
341
345
  unlinkSync(summaryPath);
@@ -343,9 +347,6 @@ export async function handleResetSlice(
343
347
  }
344
348
  }
345
349
 
346
- // Reset slice status
347
- updateSliceStatus(mid, sid, "active");
348
-
349
350
  // Delete slice summary and UAT files
350
351
  let sliceFilesDeleted = 0;
351
352
  const slicePath = resolveSlicePath(basePath, mid, sid);
@@ -0,0 +1,201 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Unit Closeout module — durable completion pipeline behind one seam (ADR-032).
3
+ //
4
+ // `closeUnit` owns what makes a Unit's completion durable. This pass ships the
5
+ // **Interactive Closeout adapter** path: commit the work and compute the
6
+ // Closeout Git Verdict, failing closed (loudly) instead of silently when a
7
+ // non-`none` `git.isolation` preference was never honoured by the session.
8
+ // Motivating failure (2026-06-10): an interactive session under
9
+ // `git.isolation: worktree` completed a milestone with every source file
10
+ // untracked on the integration branch — no commit, no merge, no warning.
11
+ //
12
+ // The interactive adapter only fires on milestone boundaries — the durability
13
+ // gap is the milestone close, and committing at every task/slice would sweep a
14
+ // developer's unrelated working-tree changes. `closeUnit` itself stays general
15
+ // over all boundaries for the pending Auto Closeout adapter re-seat.
16
+ //
17
+ // The auto loop keeps its existing closeout pipeline for now (the Auto
18
+ // Closeout adapter re-seat is the documented next step in ADR-032); the
19
+ // interactive trigger in bootstrap/register-hooks.ts is a no-op while
20
+ // `isAutoActive()`, so auto-mode behaviour is untouched.
21
+ //
22
+ // Re-entrancy is naturally safe: a re-fired completion commits an already-clean
23
+ // tree, which yields `nothing-to-commit`, and `appendNotification` carries its
24
+ // own dedup window — so `closeUnit` keeps no result cache of its own.
25
+
26
+ import { appendNotification, type NotifySeverity } from "./notification-store.js";
27
+ import { readStringField } from "./auto-unit-tool-scope.js";
28
+ import { MILESTONE_BRANCH_PREFIX } from "./branch-patterns.js";
29
+ import { nativeGetCurrentBranch } from "./native-git-bridge.js";
30
+ import { getIsolationMode } from "./preferences.js";
31
+ import { autoCommitCurrentBranch } from "./worktree.js";
32
+ import { logWarning } from "./workflow-logger.js";
33
+
34
+ export type CloseoutBoundary = "task" | "slice" | "milestone";
35
+ export type CloseoutOutcome = "complete" | "failed" | "skipped";
36
+
37
+ /**
38
+ * What git state the closeout found and did.
39
+ *
40
+ * - `committed` — work committed on the current branch (expected under
41
+ * `isolation: none`, and for task/slice boundaries).
42
+ * - `nothing-to-commit` — working tree was already clean.
43
+ * - `milestone-branch` — milestone boundary closed on a `milestone/<MID>`
44
+ * branch; the merge stays owned by worktree tooling.
45
+ * - `isolation-bypassed` — milestone boundary closed outside a milestone
46
+ * worktree/branch while `git.isolation` is
47
+ * `worktree`/`branch`: committed where the work sits
48
+ * and surfaced a Needs Attention notice instead of
49
+ * completing silently.
50
+ * - `commit-failed` — the commit attempt threw; surfaced, never thrown.
51
+ */
52
+ export type CloseoutGitVerdict =
53
+ | "committed"
54
+ | "nothing-to-commit"
55
+ | "milestone-branch"
56
+ | "isolation-bypassed"
57
+ | "commit-failed";
58
+
59
+ export interface UnitCloseoutRequest {
60
+ basePath: string;
61
+ unitType: string;
62
+ /** "M001" | "M001/S01" | "M001/S01/T01" */
63
+ unitId: string;
64
+ boundary: CloseoutBoundary;
65
+ outcome: CloseoutOutcome;
66
+ }
67
+
68
+ export interface UnitCloseoutResult {
69
+ gitVerdict: CloseoutGitVerdict;
70
+ commitMessage: string | null;
71
+ /** The user-facing Needs Attention / status notice, when one was emitted. */
72
+ notice?: string;
73
+ }
74
+
75
+ /** Seam for tests; production callers use the defaults. */
76
+ export interface UnitCloseoutDeps {
77
+ isolationMode(basePath: string): "none" | "worktree" | "branch";
78
+ currentBranch(basePath: string): string | null;
79
+ commit(basePath: string, unitType: string, unitId: string): string | null;
80
+ notify(message: string, severity: NotifySeverity): void;
81
+ }
82
+
83
+ const defaultDeps: UnitCloseoutDeps = {
84
+ isolationMode: (basePath) => getIsolationMode(basePath),
85
+ currentBranch: (basePath) => {
86
+ try {
87
+ return nativeGetCurrentBranch(basePath);
88
+ } catch {
89
+ return null;
90
+ }
91
+ },
92
+ commit: (basePath, unitType, unitId) => autoCommitCurrentBranch(basePath, unitType, unitId),
93
+ notify: (message, severity) => appendNotification(message, severity),
94
+ };
95
+
96
+ export function closeUnit(request: UnitCloseoutRequest, deps: UnitCloseoutDeps = defaultDeps): UnitCloseoutResult {
97
+ let commitMessage: string | null = null;
98
+ let gitVerdict: CloseoutGitVerdict;
99
+ let notice: string | undefined;
100
+
101
+ try {
102
+ commitMessage = deps.commit(request.basePath, request.unitType, request.unitId);
103
+ gitVerdict = commitMessage === null ? "nothing-to-commit" : "committed";
104
+ } catch (err) {
105
+ gitVerdict = "commit-failed";
106
+ notice = `Unit closeout commit failed for ${request.unitId}: ${err instanceof Error ? err.message : String(err)}`;
107
+ logWarning("engine", notice);
108
+ deps.notify(notice, "error");
109
+ }
110
+
111
+ if (request.boundary === "milestone" && gitVerdict !== "commit-failed") {
112
+ const isolation = deps.isolationMode(request.basePath);
113
+ if (isolation !== "none") {
114
+ const branch = deps.currentBranch(request.basePath);
115
+ if (branch?.startsWith(MILESTONE_BRANCH_PREFIX)) {
116
+ gitVerdict = "milestone-branch";
117
+ notice =
118
+ `Milestone ${request.unitId} completed on ${branch}. ` +
119
+ `Merge it to the integration branch with the worktree tooling (/gsd worktree merge).`;
120
+ deps.notify(notice, "info");
121
+ } else {
122
+ gitVerdict = "isolation-bypassed";
123
+ notice =
124
+ `Needs attention: milestone ${request.unitId} completed outside a milestone worktree/branch ` +
125
+ `while git.isolation is "${isolation}" — the isolation preference was not honoured this session. ` +
126
+ (commitMessage
127
+ ? `Work was committed directly on "${branch ?? "the current branch"}".`
128
+ : `The working tree had nothing left to commit on "${branch ?? "the current branch"}".`);
129
+ logWarning("engine", notice);
130
+ deps.notify(notice, "warning");
131
+ }
132
+ }
133
+ }
134
+
135
+ return { gitVerdict, commitMessage, notice };
136
+ }
137
+
138
+ // ─── Interactive Closeout adapter (tool-observation trigger) ─────────────
139
+
140
+ // Canonical closeout tool → boundary. Aliases are canonicalized by the hook.
141
+ // Only the milestone boundary is wired interactively: it is the durability gap
142
+ // that motivated ADR-032, and committing at every task/slice would sweep a
143
+ // developer's unrelated working-tree changes. `closeUnit` still handles every
144
+ // boundary for the pending Auto Closeout adapter re-seat.
145
+ const CLOSEOUT_TOOL_BOUNDARIES: Record<string, CloseoutBoundary> = {
146
+ gsd_complete_milestone: "milestone",
147
+ };
148
+
149
+ // Commit attribution uses the canonical unit types so interactive closeout
150
+ // commits carry the same GSD-Unit evidence trailers the verification prompts
151
+ // look for.
152
+ const BOUNDARY_UNIT_TYPES: Record<CloseoutBoundary, string> = {
153
+ task: "execute-task",
154
+ slice: "complete-slice",
155
+ milestone: "complete-milestone",
156
+ };
157
+
158
+ export function isUnitCloseoutTool(canonicalToolName: string): boolean {
159
+ return canonicalToolName in CLOSEOUT_TOOL_BOUNDARIES;
160
+ }
161
+
162
+ function readId(input: unknown, camel: string, snake: string): string | undefined {
163
+ const value = readStringField(input, camel, snake);
164
+ return value && value.length > 0 ? value : undefined;
165
+ }
166
+
167
+ /**
168
+ * Interactive Closeout adapter entry, called from the host's tool-observation
169
+ * hook for successful closeout tool calls when auto-mode is NOT active.
170
+ * Returns null when the tool input doesn't identify a unit.
171
+ */
172
+ export function runInteractiveUnitCloseout(
173
+ args: { basePath: string; canonicalToolName: string; input: unknown },
174
+ deps: UnitCloseoutDeps = defaultDeps,
175
+ ): UnitCloseoutResult | null {
176
+ const boundary = CLOSEOUT_TOOL_BOUNDARIES[args.canonicalToolName];
177
+ if (!boundary) return null;
178
+
179
+ const milestoneId = readId(args.input, "milestoneId", "milestone_id");
180
+ if (!milestoneId) return null;
181
+ const sliceId = readId(args.input, "sliceId", "slice_id");
182
+ const taskId = readId(args.input, "taskId", "task_id");
183
+
184
+ let unitId = milestoneId;
185
+ if (boundary !== "milestone") {
186
+ if (!sliceId) return null;
187
+ unitId = boundary === "slice" ? `${milestoneId}/${sliceId}` : `${milestoneId}/${sliceId}/${taskId ?? ""}`;
188
+ if (boundary === "task" && !taskId) return null;
189
+ }
190
+
191
+ return closeUnit(
192
+ {
193
+ basePath: args.basePath,
194
+ unitType: BOUNDARY_UNIT_TYPES[boundary],
195
+ unitId,
196
+ boundary,
197
+ outcome: "complete",
198
+ },
199
+ deps,
200
+ );
201
+ }
@@ -133,6 +133,16 @@ const CONTEXT_MODE_GUIDANCE_BY_LANE: Record<Exclude<ContextModePolicy, "none">,
133
133
  "Use `gsd_resume` for prior context, `gsd_exec_search` for saved evidence, and `gsd_exec` for noisy doc validation commands.",
134
134
  };
135
135
 
136
+ // Per-unit overrides win over the lane default. run-uat's tool contract
137
+ // forbids `gsd_exec`/`gsd_exec_search` (acceptance evidence must flow through
138
+ // `gsd_uat_exec`) and Claude Code dispatch strips the tools entirely, so the
139
+ // shared verification-lane guidance would steer the agent into calling an
140
+ // unavailable tool.
141
+ const CONTEXT_MODE_GUIDANCE_BY_UNIT: Record<string, string> = {
142
+ "run-uat":
143
+ "Use `gsd_uat_exec` for acceptance checks so evidence is typed as UAT-owned, and `gsd_resume` after compaction or resume.",
144
+ };
145
+
136
146
  /**
137
147
  * Render the Context Mode instruction lane for a unit type. Unknown unit
138
148
  * types, disabled config, and explicit `contextMode: "none"` all omit the
@@ -147,7 +157,8 @@ export function composeContextModeInstructions(
147
157
  if (!manifest || manifest.contextMode === "none") return "";
148
158
 
149
159
  const lane = CONTEXT_MODE_LANE_LABELS[manifest.contextMode];
150
- const guidance = CONTEXT_MODE_GUIDANCE_BY_LANE[manifest.contextMode];
160
+ const guidance =
161
+ CONTEXT_MODE_GUIDANCE_BY_UNIT[unitType] ?? CONTEXT_MODE_GUIDANCE_BY_LANE[manifest.contextMode];
151
162
  if (opts.renderMode === "nested") {
152
163
  return `Context Mode (${lane} lane): ${guidance}`;
153
164
  }
@@ -343,35 +343,11 @@ const TOOLS_DOCS: ToolsPolicy = {
343
343
  * enumerates these against `UNIT_MANIFESTS` to catch manifest drift when
344
344
  * a new unit type lands.
345
345
  */
346
- export const KNOWN_UNIT_TYPES = [
347
- "research-milestone",
348
- "plan-milestone",
349
- "discuss-milestone",
350
- "validate-milestone",
351
- "complete-milestone",
352
- "research-slice",
353
- "plan-slice",
354
- "refine-slice",
355
- "replan-slice",
356
- "complete-slice",
357
- "reassess-roadmap",
358
- "execute-task",
359
- "reactive-execute",
360
- "run-uat",
361
- "gate-evaluate",
362
- "rewrite-docs",
363
- // Sidecar units (triage, quick-task)
364
- "triage-captures",
365
- "quick-task",
366
- // Deep planning mode (project-level) units
367
- "workflow-preferences",
368
- "discuss-project",
369
- "discuss-requirements",
370
- "research-decision",
371
- "research-project",
372
- ] as const;
346
+ // Unit-type vocabulary is owned by the Unit Registry (ADR-033); re-exported
347
+ // here so established import paths keep working.
348
+ import { KNOWN_UNIT_TYPES, type UnitType } from "./unit-registry.js";
373
349
 
374
- export type UnitType = typeof KNOWN_UNIT_TYPES[number];
350
+ export { KNOWN_UNIT_TYPES, type UnitType };
375
351
 
376
352
  export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
377
353
  // ─── Milestone-scoped ────────────────────────────────────────────────