gsd-pi 2.78.1-dev.b0759e59b → 2.78.1-dev.d8826a445

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 (300) hide show
  1. package/README.md +8 -5
  2. package/dist/headless-recover.d.ts +23 -0
  3. package/dist/headless-recover.js +93 -0
  4. package/dist/headless.js +9 -0
  5. package/dist/help-text.js +1 -0
  6. package/dist/resources/.managed-resources-content-hash +1 -1
  7. package/dist/resources/extensions/browser-tools/tools/intent.js +8 -1
  8. package/dist/resources/extensions/gsd/auto/phases.js +7 -2
  9. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  10. package/dist/resources/extensions/gsd/auto-dispatch.js +7 -58
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +14 -28
  12. package/dist/resources/extensions/gsd/auto-start.js +1 -8
  13. package/dist/resources/extensions/gsd/auto-worktree.js +244 -216
  14. package/dist/resources/extensions/gsd/auto.js +86 -7
  15. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +1 -1
  16. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +9 -77
  17. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -16
  18. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -55
  19. package/dist/resources/extensions/gsd/commands-codebase.js +2 -2
  20. package/dist/resources/extensions/gsd/commands-handlers.js +5 -5
  21. package/dist/resources/extensions/gsd/commands-logs.js +2 -2
  22. package/dist/resources/extensions/gsd/commands-scan.js +2 -2
  23. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  24. package/dist/resources/extensions/gsd/commands-workflow-templates.js +5 -5
  25. package/dist/resources/extensions/gsd/db-writer.js +106 -95
  26. package/dist/resources/extensions/gsd/delegation-policy.js +155 -0
  27. package/dist/resources/extensions/gsd/dispatch-guard.js +6 -10
  28. package/dist/resources/extensions/gsd/doctor-engine-checks.js +2 -2
  29. package/dist/resources/extensions/gsd/gsd-db.js +268 -8
  30. package/dist/resources/extensions/gsd/guided-flow-queue.js +1 -1
  31. package/dist/resources/extensions/gsd/guided-flow.js +141 -32
  32. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -51
  33. package/dist/resources/extensions/gsd/metrics.js +287 -1
  34. package/dist/resources/extensions/gsd/parallel-merge.js +14 -13
  35. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +5 -2
  36. package/dist/resources/extensions/gsd/paths.js +114 -9
  37. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  38. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -3
  39. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +8 -1
  40. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +22 -7
  41. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +6 -2
  42. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -1
  43. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -0
  44. package/dist/resources/extensions/gsd/queue-order.js +6 -1
  45. package/dist/resources/extensions/gsd/rethink.js +2 -2
  46. package/dist/resources/extensions/gsd/state.js +91 -372
  47. package/dist/resources/extensions/gsd/templates/project.md +10 -0
  48. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -5
  49. package/dist/resources/extensions/gsd/tools/complete-slice.js +7 -12
  50. package/dist/resources/extensions/gsd/tools/complete-task.js +19 -31
  51. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -5
  52. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -1
  53. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -21
  54. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  55. package/dist/resources/extensions/gsd/workflow-reconcile.js +3 -3
  56. package/dist/resources/extensions/gsd/workspace.js +59 -0
  57. package/dist/resources/extensions/gsd/worktree-command.js +4 -3
  58. package/dist/resources/extensions/gsd/worktree-resolver.js +15 -2
  59. package/dist/resources/extensions/gsd/write-intercept.js +3 -3
  60. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  61. package/dist/web/standalone/.next/BUILD_ID +1 -1
  62. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  63. package/dist/web/standalone/.next/build-manifest.json +2 -2
  64. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  65. package/dist/web/standalone/.next/required-server-files.json +1 -1
  66. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  67. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  75. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  83. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  84. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  85. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  86. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  87. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  88. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  89. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  90. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  91. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  92. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  93. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  94. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  95. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  96. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  97. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  98. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  99. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  100. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  101. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  102. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  103. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  104. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  105. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  106. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  107. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  108. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  109. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  110. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  111. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  112. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  113. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  114. package/dist/web/standalone/.next/server/app/index.html +1 -1
  115. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  122. package/dist/web/standalone/.next/server/chunks/6336.js +1 -0
  123. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  124. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  126. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  127. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  128. package/dist/web/standalone/server.js +1 -1
  129. package/package.json +1 -1
  130. package/packages/mcp-server/README.md +2 -11
  131. package/packages/mcp-server/dist/remote-questions.d.ts +27 -0
  132. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
  133. package/packages/mcp-server/dist/remote-questions.js +28 -0
  134. package/packages/mcp-server/dist/remote-questions.js.map +1 -1
  135. package/packages/mcp-server/dist/server.d.ts +28 -0
  136. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  137. package/packages/mcp-server/dist/server.js +94 -4
  138. package/packages/mcp-server/dist/server.js.map +1 -1
  139. package/packages/mcp-server/dist/workflow-tools.d.ts +6 -0
  140. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  141. package/packages/mcp-server/dist/workflow-tools.js +56 -2
  142. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  143. package/packages/mcp-server/src/mcp-server.test.ts +226 -0
  144. package/packages/mcp-server/src/parse-workflow-args.test.ts +80 -0
  145. package/packages/mcp-server/src/remote-questions.test.ts +103 -0
  146. package/packages/mcp-server/src/remote-questions.ts +35 -0
  147. package/packages/mcp-server/src/server.ts +129 -6
  148. package/packages/mcp-server/src/workflow-tools.ts +62 -3
  149. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  150. package/src/resources/extensions/browser-tools/tools/intent.ts +13 -2
  151. package/src/resources/extensions/gsd/auto/phases.ts +8 -2
  152. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  153. package/src/resources/extensions/gsd/auto-dispatch.ts +14 -62
  154. package/src/resources/extensions/gsd/auto-post-unit.ts +15 -27
  155. package/src/resources/extensions/gsd/auto-start.ts +1 -8
  156. package/src/resources/extensions/gsd/auto-worktree.ts +286 -251
  157. package/src/resources/extensions/gsd/auto.ts +102 -7
  158. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +1 -1
  159. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +9 -84
  160. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +17 -17
  161. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +103 -0
  162. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +80 -55
  163. package/src/resources/extensions/gsd/commands-codebase.ts +2 -2
  164. package/src/resources/extensions/gsd/commands-handlers.ts +5 -5
  165. package/src/resources/extensions/gsd/commands-logs.ts +2 -2
  166. package/src/resources/extensions/gsd/commands-scan.ts +2 -2
  167. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  168. package/src/resources/extensions/gsd/commands-workflow-templates.ts +5 -5
  169. package/src/resources/extensions/gsd/db-writer.ts +123 -94
  170. package/src/resources/extensions/gsd/delegation-policy.ts +197 -0
  171. package/src/resources/extensions/gsd/dispatch-guard.ts +6 -11
  172. package/src/resources/extensions/gsd/doctor-engine-checks.ts +2 -2
  173. package/src/resources/extensions/gsd/gsd-db.ts +269 -8
  174. package/src/resources/extensions/gsd/guided-flow-queue.ts +1 -1
  175. package/src/resources/extensions/gsd/guided-flow.ts +181 -32
  176. package/src/resources/extensions/gsd/markdown-renderer.ts +13 -64
  177. package/src/resources/extensions/gsd/metrics.ts +321 -1
  178. package/src/resources/extensions/gsd/parallel-merge.ts +14 -13
  179. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +5 -2
  180. package/src/resources/extensions/gsd/paths.ts +122 -9
  181. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  182. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -3
  183. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +8 -1
  184. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +22 -7
  185. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +6 -2
  186. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -1
  187. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -0
  188. package/src/resources/extensions/gsd/queue-order.ts +6 -1
  189. package/src/resources/extensions/gsd/rethink.ts +2 -2
  190. package/src/resources/extensions/gsd/state.ts +91 -389
  191. package/src/resources/extensions/gsd/templates/project.md +10 -0
  192. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +1 -0
  193. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +14 -14
  194. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +6 -0
  195. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +21 -34
  196. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +331 -0
  197. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +176 -0
  198. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +6 -7
  199. package/src/resources/extensions/gsd/tests/complete-task.test.ts +8 -6
  200. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +12 -27
  201. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +18 -5
  202. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
  203. package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +152 -0
  204. package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +221 -0
  205. package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +230 -0
  206. package/src/resources/extensions/gsd/tests/db-writer.test.ts +14 -16
  207. package/src/resources/extensions/gsd/tests/delegation-policy.test.ts +151 -0
  208. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +6 -5
  209. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +10 -38
  210. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +136 -56
  211. package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +3 -0
  212. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +119 -61
  213. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -0
  214. package/src/resources/extensions/gsd/tests/dispatch-backgroundable-annotation.test.ts +55 -0
  215. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +6 -20
  216. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +4 -5
  217. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +14 -15
  218. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +3 -23
  219. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +11 -16
  220. package/src/resources/extensions/gsd/tests/escalation.test.ts +2 -1
  221. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +193 -0
  222. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +246 -0
  223. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +218 -0
  224. package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +117 -0
  225. package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +226 -0
  226. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +2 -1
  227. package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +66 -0
  228. package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +68 -5
  229. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +15 -36
  230. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +4 -4
  231. package/src/resources/extensions/gsd/tests/handler-worktree-write-isolation.test.ts +57 -0
  232. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +15 -15
  233. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +15 -5
  234. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +371 -0
  235. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +14 -8
  236. package/src/resources/extensions/gsd/tests/md-importer.test.ts +2 -1
  237. package/src/resources/extensions/gsd/tests/memory-store.test.ts +3 -2
  238. package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +222 -0
  239. package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +400 -0
  240. package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +141 -0
  241. package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +287 -0
  242. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +149 -0
  243. package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +378 -0
  244. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +329 -0
  245. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +2 -0
  246. package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +209 -0
  247. package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +175 -0
  248. package/src/resources/extensions/gsd/tests/paths-cache.test.ts +170 -0
  249. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +120 -0
  250. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +25 -16
  251. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +1 -0
  252. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +150 -7
  253. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +184 -0
  254. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +6 -1
  255. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +28 -16
  256. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +3 -0
  257. package/src/resources/extensions/gsd/tests/resolve-ts.mjs +4 -0
  258. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +209 -0
  259. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +3 -4
  260. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +10 -56
  261. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +15 -16
  262. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  263. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +23 -27
  264. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +13 -14
  265. package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +4 -3
  266. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +453 -0
  267. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +10 -33
  268. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +162 -0
  269. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +102 -0
  270. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +186 -0
  271. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +1 -1
  272. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +7 -8
  273. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -15
  274. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +239 -0
  275. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +12 -7
  276. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +4 -4
  277. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +26 -3
  278. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +9 -15
  279. package/src/resources/extensions/gsd/tests/workspace.test.ts +190 -0
  280. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +13 -0
  281. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +65 -71
  282. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +26 -151
  283. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +35 -35
  284. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -52
  285. package/src/resources/extensions/gsd/tests/write-intercept.test.ts +1 -1
  286. package/src/resources/extensions/gsd/tools/complete-milestone.ts +7 -5
  287. package/src/resources/extensions/gsd/tools/complete-slice.ts +7 -14
  288. package/src/resources/extensions/gsd/tools/complete-task.ts +19 -34
  289. package/src/resources/extensions/gsd/tools/validate-milestone.ts +7 -5
  290. package/src/resources/extensions/gsd/workflow-manifest.ts +4 -1
  291. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -18
  292. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  293. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  294. package/src/resources/extensions/gsd/workspace.ts +95 -0
  295. package/src/resources/extensions/gsd/worktree-command.ts +4 -3
  296. package/src/resources/extensions/gsd/worktree-resolver.ts +16 -2
  297. package/src/resources/extensions/gsd/write-intercept.ts +3 -3
  298. package/dist/web/standalone/.next/server/chunks/8527.js +0 -1
  299. /package/dist/web/standalone/.next/static/{rk1EN3FQTE6Z1yalkW_GE → AT5qi39nKXkdmQIOIoh0f}/_buildManifest.js +0 -0
  300. /package/dist/web/standalone/.next/static/{rk1EN3FQTE6Z1yalkW_GE → AT5qi39nKXkdmQIOIoh0f}/_ssgManifest.js +0 -0
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * complete-task handler — the core operation behind gsd_complete_task.
3
3
  *
4
- * Validates inputs, writes task row to DB in a transaction, then (outside
5
- * the transaction) renders SUMMARY.md to disk, toggles the plan checkbox,
6
- * stores the rendered markdown in the DB for D004 recovery, and invalidates
7
- * caches.
4
+ * Validates inputs, writes task row and rendered SUMMARY.md to DB in a
5
+ * transaction, then renders projections to disk and invalidates caches.
6
+ * Projection write failures are reported as stale projections and do not roll
7
+ * back committed DB state.
8
8
  */
9
9
 
10
10
  import { join } from "node:path";
@@ -22,13 +22,12 @@ import {
22
22
  getSlice,
23
23
  getTask,
24
24
  updateTaskStatus,
25
- setTaskSummaryMd,
26
25
  deleteVerificationEvidence,
27
26
  saveGateResult,
28
27
  getPendingGatesForTurn,
29
28
  } from "../gsd-db.js";
30
29
  import { getGatesForTurn } from "../gate-registry.js";
31
- import { resolveSliceFile, resolveTasksDir, clearPathCache } from "../paths.js";
30
+ import { resolveTasksDir, clearPathCache } from "../paths.js";
32
31
  import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
33
32
  import { saveFile, clearParseCache } from "../files.js";
34
33
  import { invalidateStateCache } from "../state.js";
@@ -168,6 +167,7 @@ export async function handleCompleteTask(
168
167
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
169
168
  const completedAt = new Date().toISOString();
170
169
  let guardError: string | null = null;
170
+ let summaryMd = "";
171
171
 
172
172
  // ── ADR-011 Phase 2: validate escalation payload BEFORE any side effects ─
173
173
  // Building the artifact runs the full shape validation (2-4 options, unique
@@ -237,6 +237,9 @@ export async function handleCompleteTask(
237
237
  }
238
238
 
239
239
  // All guards passed — perform writes
240
+ const taskRow = paramsToTaskRow(params, completedAt);
241
+ summaryMd = renderSummaryContent(taskRow, params.sliceId, params.milestoneId, params.verificationEvidence ?? []);
242
+
240
243
  insertMilestone({ id: params.milestoneId, title: params.milestoneId });
241
244
  insertSlice({ id: params.sliceId, milestoneId: params.milestoneId, title: params.sliceId });
242
245
  insertTask({
@@ -254,6 +257,7 @@ export async function handleCompleteTask(
254
257
  knownIssues: params.knownIssues ?? "None.",
255
258
  keyFiles: params.keyFiles ?? [],
256
259
  keyDecisions: params.keyDecisions ?? [],
260
+ fullSummaryMd: summaryMd,
257
261
  });
258
262
 
259
263
  for (const evidence of (params.verificationEvidence ?? [])) {
@@ -301,13 +305,7 @@ export async function handleCompleteTask(
301
305
  return { error: guardError };
302
306
  }
303
307
 
304
- // ── Filesystem operations (outside transaction) ─────────────────────────
305
- // If disk render fails, roll back the DB status so deriveState() and
306
- // verifyExpectedArtifact() stay consistent (both say "not done").
307
-
308
- // Render summary markdown via the single source of truth (#2720)
309
- const taskRow = paramsToTaskRow(params, completedAt);
310
- const summaryMd = renderSummaryContent(taskRow, params.sliceId, params.milestoneId, params.verificationEvidence ?? []);
308
+ let projectionStale = false;
311
309
 
312
310
  // Resolve and write summary to disk
313
311
  let summaryPath: string;
@@ -325,30 +323,16 @@ export async function handleCompleteTask(
325
323
  try {
326
324
  await saveFile(summaryPath, summaryMd);
327
325
 
328
- // Toggle plan checkbox via renderer module
329
- const planPath = resolveSliceFile(basePath, params.milestoneId, params.sliceId, "PLAN");
330
- if (planPath) {
331
- await renderPlanCheckboxes(basePath, params.milestoneId, params.sliceId);
332
- } else {
333
- process.stderr.write(
334
- `gsd-db: complete_task — could not find plan file for ${params.sliceId}/${params.milestoneId}, skipping checkbox toggle\n`,
335
- );
336
- }
326
+ // Toggle or regenerate the plan projection from DB. Missing projection
327
+ // files are rebuilt by the renderer instead of being skipped.
328
+ await renderPlanCheckboxes(basePath, params.milestoneId, params.sliceId);
337
329
  } catch (renderErr) {
338
- // Disk render failed — roll back DB status so state stays consistent
339
- logWarning("tool", `complete_task disk render failed, rolling back DB status: ${(renderErr as Error).message}`);
340
- // Delete orphaned verification_evidence rows first (FK constraint
341
- // references tasks, so evidence must go before status change).
342
- // Without this, retries accumulate duplicate evidence rows (#2724).
343
- deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
344
- updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
345
- invalidateStateCache();
346
- return { error: `disk render failed: ${(renderErr as Error).message}` };
330
+ projectionStale = true;
331
+ logWarning("projection", `complete_task projection write failed for ${params.milestoneId}/${params.sliceId}/${params.taskId}; DB completion remains committed`, {
332
+ error: (renderErr as Error).message,
333
+ });
347
334
  }
348
335
 
349
- // Store rendered markdown in DB for D004 recovery
350
- setTaskSummaryMd(params.milestoneId, params.sliceId, params.taskId, summaryMd);
351
-
352
336
  // ── Close gates owned by execute-task (Q5/Q6/Q7) for this task ────────
353
337
  // Each gate id maps to a specific params field via taskGateFieldForId.
354
338
  // When the model populates the field, record `pass`; when it's empty,
@@ -471,5 +455,6 @@ export async function handleCompleteTask(
471
455
  sliceId: params.sliceId,
472
456
  milestoneId: params.milestoneId,
473
457
  summaryPath,
458
+ ...(projectionStale ? { stale: true } : {}),
474
459
  };
475
460
  }
@@ -14,7 +14,6 @@ import { join } from "node:path";
14
14
  import {
15
15
  transaction,
16
16
  insertAssessment,
17
- deleteAssessmentByScope,
18
17
  getMilestoneSlices,
19
18
  } from "../gsd-db.js";
20
19
  import { resolveMilestonePath, clearPathCache } from "../paths.js";
@@ -45,6 +44,7 @@ export interface ValidateMilestoneResult {
45
44
  milestoneId: string;
46
45
  verdict: string;
47
46
  validationPath: string;
47
+ stale?: boolean;
48
48
  }
49
49
 
50
50
  export interface ValidateMilestoneOptions {
@@ -150,13 +150,14 @@ export async function handleValidateMilestone(
150
150
  });
151
151
 
152
152
  // ── Filesystem render (outside transaction) ────────────────────────────
153
- // If disk render fails, roll back the DB row so state stays consistent.
153
+ let projectionStale = false;
154
154
  try {
155
155
  await saveFile(validationPath, validationMd);
156
156
  } catch (renderErr) {
157
- logWarning("tool", `validate_milestone — disk render failed, rolling back DB row: ${(renderErr as Error).message}`);
158
- deleteAssessmentByScope(params.milestoneId, 'milestone-validation');
159
- return { error: `disk render failed: ${(renderErr as Error).message}` };
157
+ projectionStale = true;
158
+ logWarning("projection", `validate_milestone projection write failed for ${params.milestoneId}; DB validation remains committed`, {
159
+ error: (renderErr as Error).message,
160
+ });
160
161
  }
161
162
 
162
163
  invalidateStateCache();
@@ -202,5 +203,6 @@ export async function handleValidateMilestone(
202
203
  milestoneId: params.milestoneId,
203
204
  verdict: params.verdict,
204
205
  validationPath,
206
+ ...(projectionStale ? { stale: true } : {}),
205
207
  };
206
208
  }
@@ -76,7 +76,9 @@ export function snapshotState(): StateManifest {
76
76
  // Wrap all reads in a deferred transaction so the snapshot is consistent
77
77
  // (all SELECTs see the same DB state even if a concurrent write lands between them).
78
78
  return readTransaction(() => {
79
- const rawMilestones = db.prepare("SELECT * FROM milestones ORDER BY id").all() as Record<string, unknown>[];
79
+ const rawMilestones = db.prepare(
80
+ "SELECT * FROM milestones ORDER BY CASE WHEN sequence > 0 THEN 0 ELSE 1 END, sequence, id",
81
+ ).all() as Record<string, unknown>[];
80
82
  const milestones: MilestoneRow[] = rawMilestones.map((r) => ({
81
83
  id: r["id"] as string,
82
84
  title: r["title"] as string,
@@ -95,6 +97,7 @@ export function snapshotState(): StateManifest {
95
97
  definition_of_done: JSON.parse((r["definition_of_done"] as string) || "[]"),
96
98
  requirement_coverage: (r["requirement_coverage"] as string) ?? "",
97
99
  boundary_map_markdown: (r["boundary_map_markdown"] as string) ?? "",
100
+ sequence: Number(r["sequence"] ?? 0),
98
101
  }));
99
102
 
100
103
  const rawSlices = db.prepare("SELECT * FROM slices ORDER BY milestone_id, sequence, id").all() as Record<string, unknown>[];
@@ -29,29 +29,13 @@ function getAuthModeSafe(
29
29
  }
30
30
  }
31
31
 
32
- function hasClaudeCodeProvider(ctx: WorkflowMcpAutoPrepContext): boolean {
33
- return getAuthModeSafe(ctx, "claude-code") === "externalCli";
34
- }
35
-
36
- function isClaudeCodeProviderReady(ctx: WorkflowMcpAutoPrepContext): boolean {
37
- const readyCheck = ctx.modelRegistry?.isProviderRequestReady;
38
- if (typeof readyCheck !== "function") return false;
39
- try {
40
- return readyCheck("claude-code");
41
- } catch {
42
- return false;
43
- }
44
- }
45
-
46
32
  export function shouldAutoPrepareWorkflowMcp(ctx: WorkflowMcpAutoPrepContext): boolean {
47
33
  const provider = ctx.model?.provider;
48
34
  const baseUrl = ctx.model?.baseUrl;
49
35
  const authMode = getAuthModeSafe(ctx, provider);
50
36
 
51
- if (usesWorkflowMcpTransport(authMode as any, baseUrl)) return true;
52
- if (provider === "claude-code") return true;
53
- if (hasClaudeCodeProvider(ctx)) return true;
54
- return isClaudeCodeProviderReady(ctx);
37
+ if (provider !== "claude-code") return false;
38
+ return usesWorkflowMcpTransport(authMode as any, baseUrl) || authMode === "externalCli";
55
39
  }
56
40
 
57
41
  export function prepareWorkflowMcpForProject(
@@ -349,9 +349,9 @@ export function getRequiredWorkflowToolsForAutoUnit(unitType: string): string[]
349
349
  case "execute-task":
350
350
  case "execute-task-simple":
351
351
  case "reactive-execute":
352
- return ["gsd_complete_task"];
352
+ return ["gsd_task_complete"];
353
353
  case "complete-slice":
354
- return ["gsd_complete_slice"];
354
+ return ["gsd_slice_complete"];
355
355
  case "replan-slice":
356
356
  return ["gsd_replan_slice"];
357
357
  case "reassess-roadmap":
@@ -20,7 +20,7 @@ import {
20
20
  } from "./gsd-db.js";
21
21
  import { isClosedStatus } from "./status-guards.js";
22
22
  import { invalidateStateCache } from "./state.js";
23
- import { clearPathCache } from "./paths.js";
23
+ import { clearPathCache, resolveGsdPathContract } from "./paths.js";
24
24
  import { clearParseCache } from "./files.js";
25
25
  import { writeManifest } from "./workflow-manifest.js";
26
26
  import { atomicWriteSync } from "./atomic-write.js";
@@ -492,7 +492,7 @@ function _reconcileWorktreeLogsInner(
492
492
  atomicWriteSync(join(mainBasePath, ".gsd", "event-log.jsonl"), logContent);
493
493
 
494
494
  // Step 8: Replay into DB (wrapped in a transaction by replayEvents)
495
- openDatabase(join(mainBasePath, ".gsd", "gsd.db"));
495
+ openDatabase(resolveGsdPathContract(mainBasePath).projectDb);
496
496
  replayEvents(merged);
497
497
 
498
498
  // Step 9: Write manifest
@@ -647,7 +647,7 @@ export function resolveConflict(
647
647
  writeEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
648
648
 
649
649
  // Replay resolved events through the DB (updates DB state)
650
- openDatabase(join(basePath, ".gsd", "gsd.db"));
650
+ openDatabase(resolveGsdPathContract(basePath).projectDb);
651
651
  replayEvents(eventsToReplay);
652
652
  invalidateStateCache();
653
653
  clearPathCache();
@@ -0,0 +1,95 @@
1
+ // GSD-2 + Workspace handle: single source of truth for path resolution per milestone
2
+
3
+ import { join, resolve } from "node:path";
4
+ import { type GsdPathContract, resolveGsdPathContract, normalizeRealPath } from "./paths.js";
5
+ import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
6
+
7
+ export type GsdWorkspaceMode = "project" | "worktree";
8
+
9
+ export interface GsdWorkspace {
10
+ readonly projectRoot: string; // realpath-normalized absolute
11
+ readonly worktreeRoot: string | null; // realpath-normalized absolute, null when no worktree
12
+ readonly mode: GsdWorkspaceMode;
13
+ readonly contract: GsdPathContract; // pre-resolved, frozen
14
+ readonly identityKey: string; // canonical key (realpath of projectRoot) for dedup/cache
15
+ readonly lockRoot: string; // where auto.lock and {MID}-META.json live (always projectRoot)
16
+ }
17
+
18
+ export interface MilestoneScope {
19
+ readonly workspace: GsdWorkspace;
20
+ readonly milestoneId: string;
21
+ // path methods:
22
+ readonly contextFile: () => string;
23
+ readonly roadmapFile: () => string;
24
+ readonly stateFile: () => string;
25
+ readonly dbPath: () => string;
26
+ readonly milestoneDir: () => string;
27
+ readonly metaJson: () => string; // {MID}-META.json on lockRoot
28
+ }
29
+
30
+ function tryRealpath(p: string): string {
31
+ return normalizeRealPath(p);
32
+ }
33
+
34
+ /**
35
+ * Create an immutable GsdWorkspace handle from a raw base path.
36
+ * Resolves both the project root and (when applicable) the worktree root,
37
+ * normalizes them via realpath, and freezes the result.
38
+ */
39
+ export function createWorkspace(rawBasePath: string): GsdWorkspace {
40
+ const resolvedBase = resolve(rawBasePath);
41
+ const isWorktree = isGsdWorktreePath(resolvedBase);
42
+
43
+ const projectRootRaw = resolveWorktreeProjectRoot(resolvedBase);
44
+ const projectRoot = tryRealpath(resolve(projectRootRaw));
45
+
46
+ const worktreeRoot = isWorktree ? tryRealpath(resolvedBase) : null;
47
+
48
+ // Derive a canonical base from the already-realpath-normalized paths so that
49
+ // resolveGsdPathContract always receives a canonical path. Using the raw
50
+ // resolvedBase here can produce a non-canonical projectGsd when the input
51
+ // path contains symlinks, causing contract.projectGsd to diverge from the
52
+ // realpath-normalized projectRoot / identityKey.
53
+ const canonicalBase = isWorktree ? (worktreeRoot ?? resolvedBase) : projectRoot;
54
+ const contract = Object.freeze(resolveGsdPathContract(canonicalBase));
55
+
56
+ const identityKey = tryRealpath(projectRoot);
57
+
58
+ const mode: GsdWorkspaceMode = isWorktree ? "worktree" : "project";
59
+
60
+ const workspace: GsdWorkspace = Object.freeze({
61
+ projectRoot,
62
+ worktreeRoot,
63
+ mode,
64
+ contract,
65
+ identityKey,
66
+ lockRoot: projectRoot,
67
+ });
68
+
69
+ return workspace;
70
+ }
71
+
72
+ /**
73
+ * Bind a milestoneId to a workspace, producing an immutable MilestoneScope
74
+ * with path-returning closures that resolve via the authoritative projectGsd.
75
+ *
76
+ * All milestone-content paths route to contract.projectGsd (canonical),
77
+ * since that is the authoritative source of truth regardless of worktree mode.
78
+ */
79
+ export function scopeMilestone(workspace: GsdWorkspace, milestoneId: string): MilestoneScope {
80
+ const { contract } = workspace;
81
+ const gsd = contract.projectGsd;
82
+
83
+ const scope: MilestoneScope = Object.freeze({
84
+ workspace,
85
+ milestoneId,
86
+ contextFile: () => join(gsd, "milestones", milestoneId, `${milestoneId}-CONTEXT.md`),
87
+ roadmapFile: () => join(gsd, "milestones", milestoneId, `${milestoneId}-ROADMAP.md`),
88
+ stateFile: () => join(gsd, "STATE.md"),
89
+ dbPath: () => contract.projectDb,
90
+ milestoneDir: () => join(gsd, "milestones", milestoneId),
91
+ metaJson: () => join(gsd, `${milestoneId}-META.json`),
92
+ });
93
+
94
+ return scope;
95
+ }
@@ -15,7 +15,7 @@ import { loadPrompt } from "./prompt-loader.js";
15
15
  import { autoCommitCurrentBranch, getMainBranch, resolveGitHeadPath, nudgeGitBranchCache } from "./worktree.js";
16
16
  import { runWorktreePostCreateHook } from "./auto-worktree.js";
17
17
  import { showConfirm } from "../shared/tui.js";
18
- import { gsdRoot, milestonesDir } from "./paths.js";
18
+ import { gsdRoot, milestonesDir, resolveGsdPathContract } from "./paths.js";
19
19
  import {
20
20
  createWorktree,
21
21
  listWorktrees,
@@ -651,8 +651,9 @@ async function handleMerge(
651
651
  const commitMessage = `${commitType}: merge worktree ${name}\n\nGSD-Worktree: ${name}`;
652
652
 
653
653
  // Reconcile worktree DB into main DB before squash merge
654
- const wtDbPath = join(worktreePath(basePath, name), ".gsd", "gsd.db");
655
- const mainDbPath = join(basePath, ".gsd", "gsd.db");
654
+ const contract = resolveGsdPathContract(worktreePath(basePath, name), basePath);
655
+ const wtDbPath = join(contract.worktreeGsd ?? join(contract.workRoot, ".gsd"), "gsd.db");
656
+ const mainDbPath = contract.projectDb;
656
657
  if (existsSync(wtDbPath) && existsSync(mainDbPath)) {
657
658
  try {
658
659
  const { reconcileWorktreeDb } = await import("./gsd-db.js");
@@ -1,3 +1,4 @@
1
+ // GSD-2 — WorktreeResolver: encapsulates worktree path state and merge/exit lifecycle.
1
2
  /**
2
3
  * WorktreeResolver — encapsulates worktree path state and merge/exit lifecycle.
3
4
  *
@@ -23,7 +24,20 @@ import { emitJournalEvent } from "./journal.js";
23
24
  import { emitWorktreeCreated, emitWorktreeMerged } from "./worktree-telemetry.js";
24
25
  import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain } from "./slice-cadence.js";
25
26
  import { loadEffectiveGSDPreferences } from "./preferences.js";
26
- import { resolveWorktreeProjectRoot } from "./worktree-root.js";
27
+ import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "./worktree-root.js";
28
+
29
+ // ─── Path Comparison Helper ────────────────────────────────────────────────
30
+ /**
31
+ * Compare two paths for physical identity, tolerating trailing slashes,
32
+ * symlink differences, and case variations on case-insensitive volumes.
33
+ *
34
+ * Used in place of string `===` / `!==` wherever one operand may be
35
+ * realpath-normalised (e.g. from the workspace registry) and the other
36
+ * may not be (e.g. a raw caller-supplied basePath).
37
+ */
38
+ function isSamePath(a: string, b: string): boolean {
39
+ return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
40
+ }
27
41
 
28
42
  // ─── Dependency Interface ──────────────────────────────────────────────────
29
43
 
@@ -589,7 +603,7 @@ export class WorktreeResolver {
589
603
  milestoneId,
590
604
  "ROADMAP",
591
605
  );
592
- if (!roadmapPath && this.s.basePath !== originalBase) {
606
+ if (!roadmapPath && !isSamePath(this.s.basePath, originalBase)) {
593
607
  roadmapPath = this.deps.resolveMilestoneFile(
594
608
  this.s.basePath,
595
609
  milestoneId,
@@ -91,9 +91,9 @@ function matchesBlockedPattern(path: string): boolean {
91
91
  * Directs the agent to use engine tool calls instead.
92
92
  */
93
93
  export const BLOCKED_WRITE_ERROR = `Direct writes to .gsd/STATE.md and .gsd/gsd.db are blocked. Use engine tool calls instead:
94
- - To complete a task: call gsd_complete_task(milestone_id, slice_id, task_id, summary)
95
- - To complete a slice: call gsd_complete_slice(milestone_id, slice_id, summary, uat_result)
96
- - To save a decision: call gsd_save_decision(scope, decision, choice, rationale)
94
+ - To complete a task: call gsd_task_complete(milestone_id, slice_id, task_id, summary)
95
+ - To complete a slice: call gsd_slice_complete(milestone_id, slice_id, summary, uat_result)
96
+ - To save a decision: call gsd_decision_save(scope, decision, choice, rationale)
97
97
  - To start a task: call gsd_start_task(milestone_id, slice_id, task_id)
98
98
  - To record verification: call gsd_record_verification(milestone_id, slice_id, task_id, evidence)
99
99
  - To report a blocker: call gsd_report_blocker(milestone_id, slice_id, task_id, description)`;
@@ -1 +0,0 @@
1
- exports.id=8527,exports.ids=[8527],exports.modules={18527:(a,b,c)=>{"use strict";c.d(b,{isOnboardingComplete:()=>l,readOnboardingRecord:()=>k});var d=c(73024),e=c(76760);c(77598);var f=c(16698),g=c(48161);c(31421),process.env.GSD_ENABLE_NATIVE_GSD_PARSER,Symbol("native-unavailable"),new f.AsyncLocalStorage,c(89134),Object.values({Q3:{id:"Q3",scope:"slice",ownerTurn:"gate-evaluate",question:"How can this be exploited?",guidance:"Identify abuse scenarios: parameter tampering, replay attacks, privilege escalation.\nMap data exposure risks: PII, tokens, secrets accessible through this slice.\nDefine input trust boundaries: untrusted user input reaching DB, API, or filesystem.\nIf none apply, return verdict 'omitted' with rationale explaining why.",promptSection:"Abuse Surface"},Q4:{id:"Q4",scope:"slice",ownerTurn:"gate-evaluate",question:"Which existing requirements (R-IDs) does this slice touch, and which must be re-tested?",guidance:"List the R-IDs (e.g. R001, R003) touched by this slice; see the milestone requirements artifact at .gsd/milestones/<id>/REQUIREMENTS.md.\nIdentify what must be re-tested after shipping.\nFlag decisions that should be revisited given the new scope.\nIf no existing requirements are affected, return verdict 'omitted'.",promptSection:"Broken Promises"},Q5:{id:"Q5",scope:"task",ownerTurn:"execute-task",question:"What breaks when dependencies fail?",guidance:"Enumerate the task's external dependencies (APIs, filesystem, network, subprocesses).\nDescribe the failure path for each: timeout, malformed response, connection loss.\nVerify the implementation handles each failure or explicitly bubbles the error.\nReturn verdict 'omitted' only if the task has no external dependencies.",promptSection:"Failure Modes"},Q6:{id:"Q6",scope:"task",ownerTurn:"execute-task",question:"What is the 10x load breakpoint?",guidance:"Identify the resource that saturates first at 10x the expected load.\nDescribe the protection applied (pool sizing, rate limiting, pagination, caching).\nReturn verdict 'omitted' if the task has no runtime load dimension.",promptSection:"Load Profile"},Q7:{id:"Q7",scope:"task",ownerTurn:"execute-task",question:"What negative tests protect this task?",guidance:"List malformed inputs, error paths, and boundary conditions the tests cover.\nPoint to the specific test files or cases that assert each negative scenario.\nReturn verdict 'omitted' only if the task has no meaningful negative surface.",promptSection:"Negative Tests"},Q8:{id:"Q8",scope:"slice",ownerTurn:"complete-slice",question:"How will ops know this slice is healthy or broken?",guidance:"Describe the health signal (metric, log line, dashboard) that proves the slice works.\nDescribe the failure signal that triggers an alert or paging.\nDocument the recovery procedure and any monitoring gaps.\nReturn verdict 'omitted' only for slices with no runtime behavior at all.",promptSection:"Operational Readiness"},MV01:{id:"MV01",scope:"milestone",ownerTurn:"validate-milestone",question:"Is every success criterion in the milestone roadmap satisfied?",guidance:"Walk the success-criteria checklist from the milestone roadmap.\nFor each criterion, point to the slice / assessment / verification evidence that proves it.\nReturn verdict 'flag' if any criterion is unmet or unverifiable.",promptSection:"Success Criteria Checklist"},MV02:{id:"MV02",scope:"milestone",ownerTurn:"validate-milestone",question:"Does every slice have a SUMMARY.md and a passing assessment?",guidance:"Confirm every slice listed in the roadmap has a SUMMARY.md.\nConfirm each slice has an ASSESSMENT verdict of 'pass' (or justified 'omitted').\nFlag missing artifacts and slices with outstanding follow-ups or known limitations.",promptSection:"Slice Delivery Audit"},MV03:{id:"MV03",scope:"milestone",ownerTurn:"validate-milestone",question:"Do the slices integrate end-to-end?",guidance:"Trace at least one cross-slice flow proving the pieces compose.\nFlag gaps where two slices were built in isolation with no integration evidence.",promptSection:"Cross-Slice Integration"},MV04:{id:"MV04",scope:"milestone",ownerTurn:"validate-milestone",question:"Are all touched requirements covered and still coherent?",guidance:"For each requirement advanced, validated, surfaced, or invalidated across the milestone's slices, confirm the milestone-level evidence matches.\nFlag requirements that slices claim to advance but no artifact proves.",promptSection:"Requirement Coverage"}});let h=process.env.GSD_CODING_AGENT_DIR||(0,e.join)(process.env.GSD_HOME?(0,e.resolve)(process.env.GSD_HOME):(0,e.join)((0,g.homedir)(),".gsd"),"agent"),i=(0,e.join)(h,"onboarding.json"),j={version:1,flowVersion:1,completedAt:null,completedSteps:[],skippedSteps:[],lastResumePoint:null};function k(){if(!(0,d.existsSync)(i))return{...j};try{let a=JSON.parse((0,d.readFileSync)(i,"utf-8"));return{version:"number"==typeof a.version?a.version:1,flowVersion:"number"==typeof a.flowVersion?a.flowVersion:0,completedAt:"string"==typeof a.completedAt?a.completedAt:null,completedSteps:Array.isArray(a.completedSteps)?a.completedSteps.filter(a=>"string"==typeof a):[],skippedSteps:Array.isArray(a.skippedSteps)?a.skippedSteps.filter(a=>"string"==typeof a):[],lastResumePoint:"string"==typeof a.lastResumePoint?a.lastResumePoint:null}}catch{return{...j}}}function l(){let a=k();return null!==a.completedAt&&1===a.flowVersion}},65168:a=>{function b(a){var b=Error("Cannot find module '"+a+"'");throw b.code="MODULE_NOT_FOUND",b}b.keys=()=>[],b.resolve=b,b.id=65168,a.exports=b},89134:(a,b,c)=>{"use strict";c.d(b,{DZ:()=>e,rs:()=>d});let d="GSD_GIT_ERROR";class e extends Error{constructor(a,b,c){super(b,c),this.name="GSDError",this.code=a}}}};