gsd-pi 2.82.0 → 3.0.0

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 (555) hide show
  1. package/README.md +51 -32
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/GSD-WORKFLOW.md +10 -1
  4. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  5. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  6. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +1 -1
  8. package/dist/resources/extensions/cmux/index.js +5 -0
  9. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  10. package/dist/resources/extensions/gsd/auto/loop.js +19 -6
  11. package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
  12. package/dist/resources/extensions/gsd/auto/phases.js +90 -31
  13. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  16. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  17. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +246 -133
  21. package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
  22. package/dist/resources/extensions/gsd/auto-recovery.js +71 -14
  23. package/dist/resources/extensions/gsd/auto-start.js +87 -14
  24. package/dist/resources/extensions/gsd/auto-verification.js +45 -26
  25. package/dist/resources/extensions/gsd/auto-worktree.js +176 -10
  26. package/dist/resources/extensions/gsd/auto.js +178 -63
  27. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  28. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  29. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +9 -2
  30. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  31. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  32. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +17 -3
  33. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  34. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  35. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  36. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  37. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  38. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  39. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
  40. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  41. package/dist/resources/extensions/gsd/context-store.js +112 -0
  42. package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
  43. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  44. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  45. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  46. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
  47. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  48. package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
  49. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  50. package/dist/resources/extensions/gsd/doctor.js +2 -28
  51. package/dist/resources/extensions/gsd/export-html.js +27 -425
  52. package/dist/resources/extensions/gsd/forensics.js +3 -3
  53. package/dist/resources/extensions/gsd/git-service.js +45 -3
  54. package/dist/resources/extensions/gsd/gsd-db.js +21 -6
  55. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  56. package/dist/resources/extensions/gsd/guided-flow.js +101 -116
  57. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  58. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  59. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  60. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  61. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  62. package/dist/resources/extensions/gsd/markdown-renderer.js +16 -9
  63. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  64. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  65. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  66. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  67. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  68. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  69. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  70. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  72. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +48 -12
  74. package/dist/resources/extensions/gsd/paths.js +4 -0
  75. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  76. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
  77. package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
  78. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  79. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  80. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  82. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  83. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  84. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  86. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  87. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  88. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  89. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  90. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  91. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  92. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  93. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  94. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  95. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  96. package/dist/resources/extensions/gsd/state.js +3 -3
  97. package/dist/resources/extensions/gsd/status-guards.js +11 -0
  98. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  99. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  100. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  101. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  102. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  103. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  104. package/dist/resources/extensions/gsd/tools/plan-slice.js +87 -14
  105. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  106. package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
  107. package/dist/resources/extensions/gsd/validation.js +23 -1
  108. package/dist/resources/extensions/gsd/verification-gate.js +68 -7
  109. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  110. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  111. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  112. package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
  113. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  114. package/dist/resources/extensions/shared/html-shell.js +388 -0
  115. package/dist/resources/extensions/subagent/index.js +448 -78
  116. package/dist/resources/extensions/subagent/launch.js +77 -0
  117. package/dist/resources/extensions/subagent/run-store.js +148 -0
  118. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  119. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  120. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  121. package/dist/resources/extensions/visual-brief/index.js +5 -0
  122. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  123. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  125. package/dist/web/standalone/.next/BUILD_ID +1 -1
  126. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  127. package/dist/web/standalone/.next/build-manifest.json +3 -3
  128. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  129. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  130. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  140. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  150. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/index.html +1 -1
  153. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  154. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  156. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  158. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  159. package/dist/web/standalone/.next/server/app/page.js +2 -2
  160. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  163. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  164. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  168. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  169. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  170. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  171. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  172. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  173. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  174. package/dist/web/standalone/.next/static/chunks/app/layout-b23b3f6858dc6dc8.js +1 -0
  175. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  176. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  177. package/package.json +6 -5
  178. package/packages/contracts/dist/rpc.test.js +7 -0
  179. package/packages/contracts/dist/rpc.test.js.map +1 -1
  180. package/packages/contracts/dist/workflow.d.ts +21 -0
  181. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  182. package/packages/contracts/dist/workflow.js +24 -0
  183. package/packages/contracts/dist/workflow.js.map +1 -1
  184. package/packages/contracts/src/rpc.test.ts +8 -0
  185. package/packages/contracts/src/workflow.ts +24 -0
  186. package/packages/daemon/package.json +2 -2
  187. package/packages/mcp-server/README.md +14 -3
  188. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  189. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  190. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  191. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  192. package/packages/mcp-server/package.json +2 -2
  193. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  194. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  195. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  196. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  197. package/packages/native/package.json +1 -1
  198. package/packages/native/tsconfig.json +2 -1
  199. package/packages/native/tsconfig.tsbuildinfo +1 -1
  200. package/packages/pi-agent-core/package.json +1 -1
  201. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  202. package/packages/pi-ai/dist/index.d.ts +2 -2
  203. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  204. package/packages/pi-ai/dist/index.js +1 -1
  205. package/packages/pi-ai/dist/index.js.map +1 -1
  206. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  207. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  208. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  209. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  210. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  212. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  213. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  214. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  215. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  216. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  217. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  218. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  219. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  220. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  221. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  222. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  223. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  224. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  225. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  226. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  227. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  228. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  229. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  230. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  231. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  232. package/packages/pi-ai/package.json +1 -1
  233. package/packages/pi-ai/src/index.ts +7 -2
  234. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  235. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  236. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  237. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  238. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  239. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  240. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  241. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  242. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  243. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  245. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  247. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  249. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  251. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  253. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  255. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  256. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  257. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  259. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  263. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  264. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  265. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  266. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  267. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  268. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  269. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  270. package/packages/pi-coding-agent/package.json +1 -1
  271. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  272. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  273. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  274. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  275. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  276. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  277. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  278. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  279. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  280. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  281. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  282. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  283. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  284. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  285. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  286. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  287. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  288. package/packages/pi-tui/dist/terminal.js +12 -0
  289. package/packages/pi-tui/dist/terminal.js.map +1 -1
  290. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  291. package/packages/pi-tui/dist/tui.js +5 -0
  292. package/packages/pi-tui/dist/tui.js.map +1 -1
  293. package/packages/pi-tui/package.json +1 -1
  294. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  295. package/packages/pi-tui/src/terminal.ts +11 -0
  296. package/packages/pi-tui/src/tui.ts +6 -0
  297. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  298. package/packages/rpc-client/package.json +1 -1
  299. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  300. package/pkg/package.json +1 -1
  301. package/src/resources/GSD-WORKFLOW.md +10 -1
  302. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  303. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  304. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  305. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1 -1
  306. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  307. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +9 -0
  308. package/src/resources/extensions/cmux/index.ts +6 -0
  309. package/src/resources/extensions/gsd/auto/contracts.ts +59 -16
  310. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  311. package/src/resources/extensions/gsd/auto/loop.ts +22 -6
  312. package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
  313. package/src/resources/extensions/gsd/auto/phases.ts +104 -38
  314. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  315. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  316. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  317. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  318. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  319. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
  320. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  321. package/src/resources/extensions/gsd/auto-post-unit.ts +279 -144
  322. package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
  323. package/src/resources/extensions/gsd/auto-recovery.ts +74 -11
  324. package/src/resources/extensions/gsd/auto-start.ts +94 -12
  325. package/src/resources/extensions/gsd/auto-verification.ts +58 -36
  326. package/src/resources/extensions/gsd/auto-worktree.ts +193 -10
  327. package/src/resources/extensions/gsd/auto.ts +187 -61
  328. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  329. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  330. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +10 -2
  331. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  332. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  333. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +20 -4
  334. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  335. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  336. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  337. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  338. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  339. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  340. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
  341. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  342. package/src/resources/extensions/gsd/context-store.ts +120 -1
  343. package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
  344. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  345. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  346. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  347. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
  348. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  349. package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
  350. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  351. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  352. package/src/resources/extensions/gsd/doctor.ts +2 -27
  353. package/src/resources/extensions/gsd/export-html.ts +27 -427
  354. package/src/resources/extensions/gsd/forensics.ts +3 -3
  355. package/src/resources/extensions/gsd/git-service.ts +51 -4
  356. package/src/resources/extensions/gsd/gsd-db.ts +21 -6
  357. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  358. package/src/resources/extensions/gsd/guided-flow.ts +134 -133
  359. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  360. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  361. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  362. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  363. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  364. package/src/resources/extensions/gsd/markdown-renderer.ts +16 -9
  365. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  366. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  367. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  368. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  369. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  370. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  371. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  372. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  373. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  374. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  375. package/src/resources/extensions/gsd/native-git-bridge.ts +54 -12
  376. package/src/resources/extensions/gsd/paths.ts +5 -0
  377. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  378. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
  379. package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
  380. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  381. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  382. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  383. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  384. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  385. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  386. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  387. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  388. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  389. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  390. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  391. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  392. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  393. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  394. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  395. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  396. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  397. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  398. package/src/resources/extensions/gsd/state.ts +3 -3
  399. package/src/resources/extensions/gsd/status-guards.ts +13 -0
  400. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  401. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  402. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  403. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  404. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  405. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -0
  406. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +487 -4
  407. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  408. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  409. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  410. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +91 -6
  411. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  412. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  413. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  414. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  415. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  416. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  417. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  418. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  419. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
  420. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  421. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  422. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  423. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  424. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  425. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  426. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
  427. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  428. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  429. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  430. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  431. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  432. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +59 -2
  433. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
  434. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
  435. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  436. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
  437. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  438. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  439. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +11 -0
  440. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  441. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  442. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  443. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  444. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  445. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  446. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  447. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  448. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  449. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  450. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  451. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  452. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  453. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +112 -1
  454. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  455. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  456. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  457. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +46 -0
  458. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  459. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  460. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  461. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  462. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  463. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  464. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  465. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  466. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  467. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  468. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
  469. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  470. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  471. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  472. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  473. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  474. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  475. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  476. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +251 -2
  477. package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
  478. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  479. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
  480. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  481. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  482. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
  483. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +59 -0
  484. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  485. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  486. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  487. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  488. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  489. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  490. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  491. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  492. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  493. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
  494. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  495. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  496. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  497. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  498. package/src/resources/extensions/gsd/tests/status-guards.test.ts +13 -1
  499. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  500. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  501. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +103 -7
  502. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  503. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
  504. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  505. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  506. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  507. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  508. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  509. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  510. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  511. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
  512. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +54 -0
  513. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  514. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  515. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  516. package/src/resources/extensions/gsd/tools/plan-slice.ts +97 -12
  517. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  518. package/src/resources/extensions/gsd/types.ts +1 -1
  519. package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
  520. package/src/resources/extensions/gsd/validation.ts +23 -1
  521. package/src/resources/extensions/gsd/verification-gate.ts +78 -6
  522. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  523. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  524. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  525. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  526. package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
  527. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  528. package/src/resources/extensions/shared/html-shell.ts +412 -0
  529. package/src/resources/extensions/subagent/index.ts +567 -103
  530. package/src/resources/extensions/subagent/launch.ts +131 -0
  531. package/src/resources/extensions/subagent/run-store.ts +218 -0
  532. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  533. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  534. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  535. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  536. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  537. package/src/resources/extensions/visual-brief/index.ts +8 -0
  538. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  539. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  540. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  541. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  542. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  544. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  545. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  546. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  547. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  548. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  549. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  550. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  551. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  552. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  553. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  554. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → qoMxZh-xuwuvpFW0x0k01}/_buildManifest.js +0 -0
  555. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → qoMxZh-xuwuvpFW0x0k01}/_ssgManifest.js +0 -0
@@ -0,0 +1,312 @@
1
+ // ADR-013 Phase 6 cutover (Stage 1) — queryDecisionsFromMemories parity test.
2
+ //
3
+ // Verifies that reading active decisions from the `memories` table returns
4
+ // the same Decision[] shape and content as the legacy `queryDecisions` read
5
+ // from the `decisions` table, once Phase 5 dual-write has populated both
6
+ // surfaces. Lock-in regression for the prompt-inline read path which was
7
+ // switched to the memories source in auto-prompts.ts:inlineDecisionsFromDb.
8
+ //
9
+ // Scope of parity: ACTIVE decisions only. Superseded rows are intentionally
10
+ // skipped by the existing backfill, so this test does not assert parity for
11
+ // the supersedes-chain — that gap is acknowledged in
12
+ // queryDecisionsFromMemories' contract and tracked for Stage 2/3.
13
+
14
+ import test from "node:test";
15
+ import assert from "node:assert/strict";
16
+ import { mkdtempSync, mkdirSync, rmSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { tmpdir } from "node:os";
19
+
20
+ import {
21
+ closeDatabase,
22
+ insertDecision,
23
+ openDatabase,
24
+ } from "../gsd-db.ts";
25
+ import { saveDecisionToDb } from "../db-writer.ts";
26
+ import {
27
+ queryDecisions,
28
+ queryDecisionsFromMemories,
29
+ } from "../context-store.ts";
30
+
31
+ function makeTmpBase(): string {
32
+ const base = mkdtempSync(join(tmpdir(), "gsd-decisions-memories-"));
33
+ mkdirSync(join(base, ".gsd"), { recursive: true });
34
+ openDatabase(join(base, ".gsd", "gsd.db"));
35
+ return base;
36
+ }
37
+
38
+ function cleanup(base: string): void {
39
+ try {
40
+ closeDatabase();
41
+ } catch {
42
+ /* noop */
43
+ }
44
+ try {
45
+ rmSync(base, { recursive: true, force: true });
46
+ } catch {
47
+ /* noop */
48
+ }
49
+ }
50
+
51
+ async function seedDecision(
52
+ base: string,
53
+ fields: {
54
+ when_context: string;
55
+ scope: string;
56
+ decision: string;
57
+ choice: string;
58
+ rationale: string;
59
+ revisable?: string;
60
+ made_by?: "human" | "agent" | "collaborative";
61
+ },
62
+ ): Promise<string> {
63
+ // saveDecisionToDb writes ONLY to memories post-Stage-3. For parity tests
64
+ // comparing the legacy `queryDecisions` against `queryDecisionsFromMemories`,
65
+ // mirror the same row into the legacy decisions table directly so both
66
+ // surfaces hold the same data and the parity assertion is well-defined.
67
+ const result = await saveDecisionToDb(
68
+ {
69
+ when_context: fields.when_context,
70
+ scope: fields.scope,
71
+ decision: fields.decision,
72
+ choice: fields.choice,
73
+ rationale: fields.rationale,
74
+ revisable: fields.revisable ?? "Yes",
75
+ made_by: fields.made_by ?? "agent",
76
+ },
77
+ base,
78
+ );
79
+ insertDecision({
80
+ id: result.id,
81
+ when_context: fields.when_context,
82
+ scope: fields.scope,
83
+ decision: fields.decision,
84
+ choice: fields.choice,
85
+ rationale: fields.rationale,
86
+ revisable: fields.revisable ?? "Yes",
87
+ made_by: fields.made_by ?? "agent",
88
+ superseded_by: null,
89
+ });
90
+ return result.id;
91
+ }
92
+
93
+ test("queryDecisionsFromMemories returns empty when no decisions exist", () => {
94
+ const base = makeTmpBase();
95
+ try {
96
+ assert.deepEqual(queryDecisionsFromMemories(), []);
97
+ assert.deepEqual(queryDecisionsFromMemories({ milestoneId: "M001" }), []);
98
+ } finally {
99
+ cleanup(base);
100
+ }
101
+ });
102
+
103
+ test("queryDecisionsFromMemories matches queryDecisions for a single active decision", async () => {
104
+ const base = makeTmpBase();
105
+ try {
106
+ await seedDecision(base, {
107
+ when_context: "M001 discuss phase",
108
+ scope: "M001",
109
+ decision: "Adopt SQLite for persistence",
110
+ choice: "better-sqlite3",
111
+ rationale: "Native, synchronous, well-supported",
112
+ });
113
+
114
+ const fromDecisions = queryDecisions();
115
+ const fromMemories = queryDecisionsFromMemories();
116
+
117
+ assert.equal(fromDecisions.length, 1);
118
+ assert.equal(fromMemories.length, 1);
119
+
120
+ // Compare the user-visible Decision fields. seq differs across tables
121
+ // (memories.seq vs decisions.seq) so it's intentionally excluded.
122
+ const { seq: _seq1, ...d1 } = fromDecisions[0]!;
123
+ const { seq: _seq2, ...d2 } = fromMemories[0]!;
124
+ assert.deepEqual(d1, d2);
125
+ } finally {
126
+ cleanup(base);
127
+ }
128
+ });
129
+
130
+ test("queryDecisionsFromMemories preserves decision order across multiple writes", async () => {
131
+ const base = makeTmpBase();
132
+ try {
133
+ const id1 = await seedDecision(base, {
134
+ when_context: "M001 discuss",
135
+ scope: "M001",
136
+ decision: "First decision",
137
+ choice: "A",
138
+ rationale: "first",
139
+ });
140
+ const id2 = await seedDecision(base, {
141
+ when_context: "M001 plan",
142
+ scope: "M001",
143
+ decision: "Second decision",
144
+ choice: "B",
145
+ rationale: "second",
146
+ });
147
+ const id3 = await seedDecision(base, {
148
+ when_context: "M002 discuss",
149
+ scope: "M002",
150
+ decision: "Third decision",
151
+ choice: "C",
152
+ rationale: "third",
153
+ });
154
+
155
+ const fromMemories = queryDecisionsFromMemories();
156
+ assert.equal(fromMemories.length, 3);
157
+ assert.deepEqual(
158
+ fromMemories.map((d) => d.id),
159
+ [id1, id2, id3],
160
+ );
161
+ } finally {
162
+ cleanup(base);
163
+ }
164
+ });
165
+
166
+ test("queryDecisionsFromMemories filters by milestoneId (substring match on when_context)", async () => {
167
+ const base = makeTmpBase();
168
+ try {
169
+ await seedDecision(base, {
170
+ when_context: "M001 discuss",
171
+ scope: "M001",
172
+ decision: "M001 decision",
173
+ choice: "A",
174
+ rationale: "x",
175
+ });
176
+ await seedDecision(base, {
177
+ when_context: "M002 plan",
178
+ scope: "M002",
179
+ decision: "M002 decision",
180
+ choice: "B",
181
+ rationale: "y",
182
+ });
183
+ await seedDecision(base, {
184
+ when_context: "M001 execute",
185
+ scope: "M001-S01",
186
+ decision: "M001 follow-up",
187
+ choice: "C",
188
+ rationale: "z",
189
+ });
190
+ await seedDecision(base, {
191
+ when_context: "M003 plan",
192
+ scope: "M003",
193
+ decision: "Use M001 as precedent",
194
+ choice: "D",
195
+ rationale: "Mentions M001 outside when_context",
196
+ });
197
+
198
+ const m001 = queryDecisionsFromMemories({ milestoneId: "M001" });
199
+ assert.equal(m001.length, 2, "two decisions reference M001 in when_context");
200
+ assert.ok(m001.every((d) => d.when_context.includes("M001")));
201
+
202
+ const m002 = queryDecisionsFromMemories({ milestoneId: "M002" });
203
+ assert.equal(m002.length, 1);
204
+ assert.equal(m002[0]?.decision, "M002 decision");
205
+ } finally {
206
+ cleanup(base);
207
+ }
208
+ });
209
+
210
+ test("queryDecisionsFromMemories filters by scope (exact match, no prefix collisions)", async () => {
211
+ const base = makeTmpBase();
212
+ try {
213
+ await seedDecision(base, {
214
+ when_context: "M001 discuss",
215
+ scope: "M001",
216
+ decision: "Milestone-level",
217
+ choice: "A",
218
+ rationale: "x",
219
+ });
220
+ await seedDecision(base, {
221
+ when_context: "M001 plan",
222
+ scope: "M001-S01",
223
+ decision: "Slice-level",
224
+ choice: "B",
225
+ rationale: "y",
226
+ });
227
+ await seedDecision(base, {
228
+ when_context: "M001 plan",
229
+ scope: "M001-S02",
230
+ decision: "Different slice",
231
+ choice: "C",
232
+ rationale: "z",
233
+ });
234
+
235
+ // Exact-scope filter must not match prefix-similar values.
236
+ const milestoneScope = queryDecisionsFromMemories({ scope: "M001" });
237
+ assert.equal(milestoneScope.length, 1, "scope=M001 must not match M001-S01 / M001-S02");
238
+ assert.equal(milestoneScope[0]?.scope, "M001");
239
+
240
+ const sliceScope = queryDecisionsFromMemories({ scope: "M001-S01" });
241
+ assert.equal(sliceScope.length, 1);
242
+ assert.equal(sliceScope[0]?.scope, "M001-S01");
243
+ } finally {
244
+ cleanup(base);
245
+ }
246
+ });
247
+
248
+ test("queryDecisionsFromMemories matches queryDecisions for combined milestoneId + scope filters", async () => {
249
+ const base = makeTmpBase();
250
+ try {
251
+ await seedDecision(base, {
252
+ when_context: "M001 discuss",
253
+ scope: "M001",
254
+ decision: "A",
255
+ choice: "1",
256
+ rationale: "x",
257
+ });
258
+ await seedDecision(base, {
259
+ when_context: "M001 plan",
260
+ scope: "M001-S01",
261
+ decision: "B",
262
+ choice: "2",
263
+ rationale: "y",
264
+ });
265
+ await seedDecision(base, {
266
+ when_context: "M002 discuss",
267
+ scope: "M002",
268
+ decision: "C",
269
+ choice: "3",
270
+ rationale: "z",
271
+ });
272
+
273
+ const opts = { milestoneId: "M001", scope: "M001-S01" };
274
+ const fromDecisions = queryDecisions(opts);
275
+ const fromMemories = queryDecisionsFromMemories(opts);
276
+
277
+ assert.equal(fromDecisions.length, fromMemories.length);
278
+ assert.equal(fromMemories.length, 1);
279
+ assert.equal(fromMemories[0]?.id, fromDecisions[0]?.id);
280
+ assert.equal(fromMemories[0]?.scope, "M001-S01");
281
+ } finally {
282
+ cleanup(base);
283
+ }
284
+ });
285
+
286
+ test("queryDecisionsFromMemories ignores memories without a sourceDecisionId marker", async () => {
287
+ const base = makeTmpBase();
288
+ try {
289
+ // Insert a user-authored memory (no sourceDecisionId) — must not appear in
290
+ // the decisions-from-memories projection.
291
+ const { createMemory } = await import("../memory-store.ts");
292
+ createMemory({
293
+ category: "architecture",
294
+ content: "User-authored architecture note, not derived from a decision",
295
+ scope: "project",
296
+ });
297
+
298
+ await seedDecision(base, {
299
+ when_context: "M001 discuss",
300
+ scope: "M001",
301
+ decision: "Real decision",
302
+ choice: "A",
303
+ rationale: "x",
304
+ });
305
+
306
+ const fromMemories = queryDecisionsFromMemories();
307
+ assert.equal(fromMemories.length, 1, "user-authored memory must not appear as a decision");
308
+ assert.equal(fromMemories[0]?.decision, "Real decision");
309
+ } finally {
310
+ cleanup(base);
311
+ }
312
+ });
@@ -19,14 +19,15 @@ import {
19
19
  insertMilestone,
20
20
  _getAdapter,
21
21
  } from "../gsd-db.ts";
22
- import { registerAutoWorker } from "../db/auto-workers.ts";
22
+ import { getAutoWorker, registerAutoWorker } from "../db/auto-workers.ts";
23
23
  import { claimMilestoneLease } from "../db/milestone-leases.ts";
24
- import { recordDispatchClaim } from "../db/unit-dispatches.ts";
24
+ import { getLatestForUnit, markRunning, recordDispatchClaim } from "../db/unit-dispatches.ts";
25
25
  import { setRuntimeKv, getRuntimeKv } from "../db/runtime-kv.ts";
26
26
  import {
27
27
  writeLock,
28
28
  readCrashLock,
29
29
  clearLock,
30
+ clearStaleWorkerLock,
30
31
  isLockProcessAlive,
31
32
  } from "../crash-recovery.ts";
32
33
  import { normalizeRealPath } from "../paths.ts";
@@ -223,3 +224,86 @@ test("clearLock removes the session_file row for the active worker", (t) => {
223
224
  assert.equal(getRuntimeKv("worker", workerId, "session_file"), null,
224
225
  "session_file row deleted by clearLock");
225
226
  });
227
+
228
+ test("clearLock marks stale worker crashed when no current-process worker matches", (t) => {
229
+ const base = makeBase();
230
+ t.after(() => cleanup(base));
231
+ openDatabase(join(base, ".gsd", "gsd.db"));
232
+ const projectRoot = normalizeRealPath(base);
233
+ const workerId = registerAutoWorker({ projectRootRealpath: projectRoot });
234
+
235
+ setRuntimeKv("worker", workerId, "session_file", "/tmp/stale-session.jsonl");
236
+ setWorkerPid(workerId, 99999);
237
+ expireWorker(workerId);
238
+ assert.ok(readCrashLock(base), "stale worker is detected before clearLock");
239
+
240
+ clearLock(base);
241
+
242
+ assert.equal(getAutoWorker(workerId)?.status, "crashed");
243
+ assert.equal(getRuntimeKv("worker", workerId, "session_file"), null);
244
+ assert.equal(readCrashLock(base), null);
245
+ });
246
+
247
+ test("clearStaleWorkerLock crashes stale worker and cancels latest active dispatch", (t) => {
248
+ const base = makeBase();
249
+ t.after(() => cleanup(base));
250
+ openDatabase(join(base, ".gsd", "gsd.db"));
251
+ insertMilestone({ id: "M001", title: "T", status: "active" });
252
+ const projectRoot = normalizeRealPath(base);
253
+ const workerId = registerAutoWorker({ projectRootRealpath: projectRoot });
254
+ const lease = claimMilestoneLease(workerId, "M001");
255
+ assert.equal(lease.ok, true);
256
+ if (!lease.ok) return;
257
+ const claim = recordDispatchClaim({
258
+ traceId: "t1",
259
+ workerId,
260
+ milestoneLeaseToken: lease.token,
261
+ milestoneId: "M001",
262
+ sliceId: "S01",
263
+ taskId: "T02",
264
+ unitType: "hook/codex-review",
265
+ unitId: "M001/S01/T02",
266
+ });
267
+ assert.equal(claim.ok, true);
268
+ if (!claim.ok) return;
269
+ markRunning(claim.dispatchId);
270
+ setRuntimeKv("worker", workerId, "session_file", "/tmp/pi-session-hook.jsonl");
271
+ setWorkerPid(workerId, 99999);
272
+ expireWorker(workerId);
273
+
274
+ assert.ok(readCrashLock(base), "stale worker is detected before cleanup");
275
+
276
+ clearStaleWorkerLock(base);
277
+
278
+ assert.equal(getAutoWorker(workerId)?.status, "crashed");
279
+ const dispatch = getLatestForUnit("M001/S01/T02");
280
+ assert.ok(dispatch);
281
+ assert.equal(dispatch!.status, "canceled");
282
+ assert.equal(dispatch!.exit_reason, "crash-recovered");
283
+ assert.equal(getRuntimeKv("worker", workerId, "session_file"), null);
284
+ assert.equal(readCrashLock(base), null);
285
+ });
286
+
287
+ test("clearLock marks stale worker crashed and releases held milestone lease", (t) => {
288
+ const base = makeBase();
289
+ t.after(() => cleanup(base));
290
+ openDatabase(join(base, ".gsd", "gsd.db"));
291
+ insertMilestone({ id: "M001", title: "T", status: "active" });
292
+ const projectRoot = normalizeRealPath(base);
293
+ const workerId = registerAutoWorker({ projectRootRealpath: projectRoot });
294
+ const lease = claimMilestoneLease(workerId, "M001");
295
+ assert.equal(lease.ok, true);
296
+ if (!lease.ok) return;
297
+
298
+ setWorkerPid(workerId, 99999);
299
+ expireWorker(workerId);
300
+ assert.ok(readCrashLock(base), "stale worker is detected before clearLock");
301
+
302
+ clearLock(base);
303
+
304
+ assert.equal(getAutoWorker(workerId)?.status, "crashed");
305
+ const leaseRow = _getAdapter()!.prepare(
306
+ `SELECT status FROM milestone_leases WHERE milestone_id = :m`,
307
+ ).get({ ":m": "M001" }) as { status: string } | undefined;
308
+ assert.equal(leaseRow?.status, "released");
309
+ });
@@ -98,6 +98,8 @@ function makeMockPi() {
98
98
  sendMessage: (...args: unknown[]) => {
99
99
  calls.push(args);
100
100
  },
101
+ getThinkingLevel: () => "off",
102
+ setThinkingLevel: () => {},
101
103
  calls,
102
104
  } as any;
103
105
  }
@@ -0,0 +1,208 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Regression tests for DB authority over markdown projections.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { tmpdir } from "node:os";
9
+
10
+ import {
11
+ closeDatabase,
12
+ getAllMilestones,
13
+ getSliceTasks,
14
+ insertMilestone,
15
+ insertRequirement,
16
+ insertSlice,
17
+ openDatabase,
18
+ } from "../gsd-db.ts";
19
+ import { migrateHierarchyToDb } from "../md-importer.ts";
20
+ import { checkMarkdownHierarchyAgainstDb } from "../migration-auto-check.ts";
21
+ import { queryDecisions } from "../context-store.ts";
22
+ import { deriveStateFromDb, invalidateStateCache } from "../state.ts";
23
+ import type { Requirement } from "../types.ts";
24
+
25
+ function makeBase(prefix = "gsd-db-authority-"): string {
26
+ const base = mkdtempSync(join(tmpdir(), prefix));
27
+ mkdirSync(join(base, ".gsd"), { recursive: true });
28
+ return base;
29
+ }
30
+
31
+ function cleanup(base: string): void {
32
+ try {
33
+ closeDatabase();
34
+ } catch {
35
+ /* noop */
36
+ }
37
+ rmSync(base, { recursive: true, force: true });
38
+ }
39
+
40
+ function openProjectDb(base: string): void {
41
+ openDatabase(join(base, ".gsd", "gsd.db"));
42
+ }
43
+
44
+ function activeRequirement(id: string): Requirement {
45
+ return {
46
+ id,
47
+ class: "functional",
48
+ status: "active",
49
+ description: `${id} from DB`,
50
+ why: "DB authority regression fixture",
51
+ source: "test",
52
+ primary_owner: "M999/S01",
53
+ supporting_slices: "",
54
+ validation: "derive state",
55
+ notes: "",
56
+ full_content: `${id} from DB`,
57
+ superseded_by: null,
58
+ };
59
+ }
60
+
61
+ test("DB authority: PROJECT.md and QUEUE-ORDER projections do not choose runtime milestone", async (t) => {
62
+ const base = makeBase();
63
+ t.after(() => cleanup(base));
64
+
65
+ mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
66
+ writeFileSync(
67
+ join(base, ".gsd", "PROJECT.md"),
68
+ [
69
+ "# Projection Project",
70
+ "",
71
+ "## Milestone Sequence",
72
+ "- [ ] M001: Projection Only -- should not become active",
73
+ "",
74
+ ].join("\n"),
75
+ );
76
+ writeFileSync(
77
+ join(base, ".gsd", "QUEUE-ORDER.json"),
78
+ JSON.stringify({ order: ["M001", "M999"], updatedAt: new Date().toISOString() }),
79
+ );
80
+
81
+ openProjectDb(base);
82
+ insertMilestone({ id: "M999", title: "DB Milestone", status: "active" });
83
+ insertSlice({ id: "S01", milestoneId: "M999", title: "DB Slice", status: "pending", risk: "low", depends: [], demo: "DB demo", sequence: 1 });
84
+
85
+ invalidateStateCache();
86
+ const state = await deriveStateFromDb(base);
87
+
88
+ assert.equal(state.activeMilestone?.id, "M999");
89
+ assert.equal(state.registry.some((entry) => entry.id === "M001"), false);
90
+ });
91
+
92
+ test("DB authority: REQUIREMENTS.md and DECISIONS.md projections do not populate DB reads", async (t) => {
93
+ const base = makeBase();
94
+ t.after(() => cleanup(base));
95
+
96
+ writeFileSync(
97
+ join(base, ".gsd", "REQUIREMENTS.md"),
98
+ [
99
+ "# Requirements",
100
+ "",
101
+ "## Active",
102
+ "### R001 - Projection-only requirement",
103
+ "- Class: functional",
104
+ "- Status: active",
105
+ "",
106
+ ].join("\n"),
107
+ );
108
+ writeFileSync(
109
+ join(base, ".gsd", "DECISIONS.md"),
110
+ [
111
+ "# Decisions",
112
+ "",
113
+ "| # | When / Context | Scope | Decision | Choice | Rationale | Revisable | Made By |",
114
+ "|---|----------------|-------|----------|--------|-----------|----------|---------|",
115
+ "| D001 | Now | global | Projection-only decision | Ignore | DB is authority | Yes | human |",
116
+ "",
117
+ ].join("\n"),
118
+ );
119
+
120
+ openProjectDb(base);
121
+ insertMilestone({ id: "M999", title: "DB Milestone", status: "active" });
122
+
123
+ invalidateStateCache();
124
+ const state = await deriveStateFromDb(base);
125
+
126
+ assert.deepEqual(state.requirements, {
127
+ active: 0,
128
+ validated: 0,
129
+ deferred: 0,
130
+ outOfScope: 0,
131
+ blocked: 0,
132
+ total: 0,
133
+ });
134
+ assert.deepEqual(queryDecisions(), []);
135
+ });
136
+
137
+ test("DB authority: DB requirements remain canonical when REQUIREMENTS.md disagrees", async (t) => {
138
+ const base = makeBase();
139
+ t.after(() => cleanup(base));
140
+
141
+ writeFileSync(
142
+ join(base, ".gsd", "REQUIREMENTS.md"),
143
+ [
144
+ "# Requirements",
145
+ "",
146
+ "## Active",
147
+ "### R999 - Projection-only requirement",
148
+ "- Class: functional",
149
+ "- Status: active",
150
+ "",
151
+ ].join("\n"),
152
+ );
153
+
154
+ openProjectDb(base);
155
+ insertMilestone({ id: "M999", title: "DB Milestone", status: "active" });
156
+ insertRequirement(activeRequirement("R001"));
157
+
158
+ invalidateStateCache();
159
+ const state = await deriveStateFromDb(base);
160
+
161
+ assert.ok(state.requirements);
162
+ assert.equal(state.requirements.active, 1);
163
+ assert.equal(state.requirements.total, 1);
164
+ });
165
+
166
+ test("explicit markdown import remains opt-in and is not run by startup mismatch check", async (t) => {
167
+ const base = makeBase();
168
+ t.after(() => cleanup(base));
169
+
170
+ const milestoneDir = join(base, ".gsd", "milestones", "M001");
171
+ const sliceDir = join(milestoneDir, "slices", "S01");
172
+ const tasksDir = join(sliceDir, "tasks");
173
+ mkdirSync(tasksDir, { recursive: true });
174
+ writeFileSync(
175
+ join(milestoneDir, "M001-ROADMAP.md"),
176
+ [
177
+ "# M001: Imported Explicitly",
178
+ "",
179
+ "**Vision:** Explicit recovery import only",
180
+ "",
181
+ "## Slices",
182
+ "- [ ] **S01: Slice** `risk:low` `depends:[]`",
183
+ "",
184
+ ].join("\n"),
185
+ );
186
+ writeFileSync(
187
+ join(sliceDir, "S01-PLAN.md"),
188
+ [
189
+ "# S01: Slice",
190
+ "",
191
+ "**Goal:** prove explicit import",
192
+ "",
193
+ "## Tasks",
194
+ "- [ ] **T01: Task** `est:5m`",
195
+ "",
196
+ ].join("\n"),
197
+ );
198
+
199
+ openProjectDb(base);
200
+ const check = await checkMarkdownHierarchyAgainstDb(base);
201
+ assert.equal(check.action, "recovery-required");
202
+ assert.equal(getAllMilestones().length, 0, "startup mismatch check must not import markdown");
203
+
204
+ const imported = migrateHierarchyToDb(base);
205
+ assert.deepEqual(imported, { milestones: 1, slices: 1, tasks: 1 });
206
+ assert.equal(getAllMilestones().length, 1);
207
+ assert.equal(getSliceTasks("M001", "S01").length, 1);
208
+ });
@@ -27,6 +27,7 @@ import {
27
27
  saveArtifactToDb,
28
28
  extractDeferredSliceRef,
29
29
  } from '../db-writer.ts';
30
+ import { getAllDecisionsFromMemories } from '../context-store.ts';
30
31
  import type { Decision, Requirement } from '../types.ts';
31
32
 
32
33
  // ═══════════════════════════════════════════════════════════════════════════
@@ -326,11 +327,14 @@ describe('db-writer', () => {
326
327
 
327
328
  assert.deepStrictEqual(result.id, 'D001', 'saveDecisionToDb returns D001 as first ID');
328
329
 
329
- // Verify DB state
330
- const dbDecision = getDecisionById('D001');
331
- assert.ok(!!dbDecision, 'decision exists in DB after save');
332
- assert.deepStrictEqual(dbDecision?.scope, 'arch', 'DB decision has correct scope');
333
- assert.deepStrictEqual(dbDecision?.choice, 'Option A', 'DB decision has correct choice');
330
+ // ADR-013 Stage 3: decisions land in memories, not the legacy table.
331
+ const memoryDecisions = getAllDecisionsFromMemories();
332
+ assert.equal(memoryDecisions.length, 1, 'one memory row exists after save');
333
+ const memDecision = memoryDecisions[0];
334
+ assert.ok(memDecision, 'memory decision exists after save');
335
+ assert.equal(memDecision.id, 'D001');
336
+ assert.equal(memDecision.scope, 'arch', 'memory decision has correct scope');
337
+ assert.equal(memDecision.choice, 'Option A', 'memory decision has correct choice');
334
338
 
335
339
  // Verify markdown file was written
336
340
  const mdPath = path.join(tmpDir, '.gsd', 'DECISIONS.md');
@@ -394,10 +398,11 @@ describe('db-writer', () => {
394
398
  assert.match(id, /^D\d{3}$/, `ID ${id} should match D### pattern`);
395
399
  }
396
400
 
397
- // Verify all 5 exist in DB
401
+ // ADR-013 Stage 3: verify all 5 exist in the memories table (decisions
402
+ // table receives no writes from saveDecisionToDb post-cutover).
403
+ const memoryIds = new Set(getAllDecisionsFromMemories().map((d) => d.id));
398
404
  for (const id of ids) {
399
- const row = getDecisionById(id);
400
- assert.ok(row, `Decision ${id} should exist in DB`);
405
+ assert.ok(memoryIds.has(id), `Decision ${id} should exist in memories`);
401
406
  }
402
407
  } finally {
403
408
  closeDatabase();