@opengsd/gsd-pi 1.8.1 → 1.9.0-dev.5c1a3ff2

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 (546) hide show
  1. package/README.md +10 -8
  2. package/dist/cli.js +5 -1
  3. package/dist/headless-events.d.ts +2 -1
  4. package/dist/headless-events.js +11 -3
  5. package/dist/headless-milestone-readiness.d.ts +29 -0
  6. package/dist/headless-milestone-readiness.js +161 -0
  7. package/dist/headless.js +25 -2
  8. package/dist/print-mode-exit.d.ts +12 -0
  9. package/dist/print-mode-exit.js +14 -0
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +18 -49
  12. package/dist/resources/extensions/browser-tools/capture.js +2 -77
  13. package/dist/resources/extensions/browser-tools/screenshot-constraints.js +83 -0
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +17 -2
  15. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +30 -2
  16. package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
  17. package/dist/resources/extensions/gsd/auto-artifact-paths.js +16 -10
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +74 -19
  19. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
  20. package/dist/resources/extensions/gsd/auto-prompts.js +125 -18
  21. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  22. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
  23. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
  24. package/dist/resources/extensions/gsd/auto.js +5 -1
  25. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
  26. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -5
  27. package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
  28. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -50
  29. package/dist/resources/extensions/gsd/command-feedback.js +16 -12
  30. package/dist/resources/extensions/gsd/compat/compat-marker.js +19 -2
  31. package/dist/resources/extensions/gsd/constants.js +12 -13
  32. package/dist/resources/extensions/gsd/context-masker.js +97 -21
  33. package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
  34. package/dist/resources/extensions/gsd/db/engine.js +51 -16
  35. package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
  36. package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
  37. package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
  38. package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
  39. package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
  40. package/dist/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  41. package/dist/resources/extensions/gsd/doctor-engine-checks.js +3 -6
  42. package/dist/resources/extensions/gsd/flat-phase-migration.js +156 -21
  43. package/dist/resources/extensions/gsd/git-service.js +19 -7
  44. package/dist/resources/extensions/gsd/gsd-db.js +187 -45
  45. package/dist/resources/extensions/gsd/guided-flow.js +38 -13
  46. package/dist/resources/extensions/gsd/markdown-renderer.js +17 -13
  47. package/dist/resources/extensions/gsd/md-importer.js +107 -20
  48. package/dist/resources/extensions/gsd/migrate/command.js +19 -162
  49. package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
  50. package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
  51. package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
  52. package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
  53. package/dist/resources/extensions/gsd/model-cost-table.js +2 -0
  54. package/dist/resources/extensions/gsd/model-router.js +11 -0
  55. package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
  56. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
  57. package/dist/resources/extensions/gsd/paths.js +55 -11
  58. package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
  59. package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
  60. package/dist/resources/extensions/gsd/planning-subagent-registry.js +25 -0
  61. package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
  62. package/dist/resources/extensions/gsd/preferences-types.js +5 -0
  63. package/dist/resources/extensions/gsd/preferences-validation.js +48 -1
  64. package/dist/resources/extensions/gsd/preferences.js +17 -0
  65. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  66. package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
  67. package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
  68. package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
  69. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
  70. package/dist/resources/extensions/gsd/skill-activation.js +17 -3
  71. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +27 -13
  72. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +13 -3
  73. package/dist/resources/extensions/gsd/stop-notice.js +15 -1
  74. package/dist/resources/extensions/gsd/sync-lock.js +13 -7
  75. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  76. package/dist/resources/extensions/gsd/tools/complete-task.js +94 -6
  77. package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
  78. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
  79. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
  80. package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
  81. package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
  82. package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
  83. package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
  84. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
  85. package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
  86. package/dist/resources/extensions/gsd/unit-registry.js +4 -0
  87. package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
  88. package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
  89. package/dist/resources/extensions/gsd/workspace.js +2 -1
  90. package/dist/resources/extensions/gsd/worktree-state-projection.js +6 -0
  91. package/dist/resources/extensions/mac-tools/index.js +31 -9
  92. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  93. package/dist/web/standalone/.next/BUILD_ID +1 -1
  94. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  95. package/dist/web/standalone/.next/build-manifest.json +3 -3
  96. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  97. package/dist/web/standalone/.next/required-server-files.json +3 -3
  98. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  99. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  109. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  112. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  118. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  125. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  137. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  159. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  169. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  175. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  191. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  195. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/index.html +1 -1
  205. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  206. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  207. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  208. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  209. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  210. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  211. package/dist/web/standalone/.next/server/app/page.js +2 -2
  212. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  214. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  215. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  216. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/middleware.js +3 -3
  218. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  219. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  220. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  221. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  223. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  225. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  226. package/dist/web/standalone/.next/static/css/3b1ceb7abfb9a230.css +1 -0
  227. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  228. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  229. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  230. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  231. package/dist/web/standalone/package.json +0 -1
  232. package/dist/web/standalone/server.js +1 -1
  233. package/dist/web-mode.js +31 -3
  234. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  235. package/integrations/hermes/pyproject.toml +1 -1
  236. package/package.json +12 -10
  237. package/packages/cloud-mcp-gateway/package.json +2 -2
  238. package/packages/contracts/dist/workflow.d.ts +14 -0
  239. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  240. package/packages/contracts/dist/workflow.js +16 -0
  241. package/packages/contracts/dist/workflow.js.map +1 -1
  242. package/packages/contracts/package.json +1 -1
  243. package/packages/daemon/dist/cloud-config.d.ts +1 -1
  244. package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
  245. package/packages/daemon/dist/cloud-config.js +5 -1
  246. package/packages/daemon/dist/cloud-config.js.map +1 -1
  247. package/packages/daemon/dist/cloud-config.test.js +51 -1
  248. package/packages/daemon/dist/cloud-config.test.js.map +1 -1
  249. package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
  250. package/packages/daemon/dist/local-tool-executor.js +2 -0
  251. package/packages/daemon/dist/local-tool-executor.js.map +1 -1
  252. package/packages/daemon/package.json +6 -6
  253. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  254. package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
  255. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  256. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  257. package/packages/gsd-agent-core/dist/sdk.js +1 -0
  258. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  259. package/packages/gsd-agent-core/package.json +5 -5
  260. package/packages/gsd-agent-modes/package.json +7 -7
  261. package/packages/gsd-cloud/dist/cli.d.ts +5 -0
  262. package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
  263. package/packages/gsd-cloud/dist/cli.js +160 -0
  264. package/packages/gsd-cloud/dist/cli.js.map +1 -0
  265. package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
  266. package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
  267. package/packages/gsd-cloud/dist/cloud-config.js +231 -0
  268. package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
  269. package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
  270. package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
  271. package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
  272. package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
  273. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
  274. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
  275. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
  276. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
  277. package/packages/gsd-cloud/dist/cloud-runtime.d.ts +35 -0
  278. package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
  279. package/packages/gsd-cloud/dist/cloud-runtime.js +258 -0
  280. package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
  281. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
  282. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
  283. package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
  284. package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
  285. package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
  286. package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
  287. package/packages/gsd-cloud/dist/cloud-token.js +37 -0
  288. package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
  289. package/packages/gsd-cloud/dist/config.d.ts +17 -0
  290. package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
  291. package/packages/gsd-cloud/dist/config.js +146 -0
  292. package/packages/gsd-cloud/dist/config.js.map +1 -0
  293. package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
  294. package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
  295. package/packages/gsd-cloud/dist/device-flow.js +128 -0
  296. package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
  297. package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
  298. package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
  299. package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
  300. package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
  301. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
  302. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
  303. package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
  304. package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
  305. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
  306. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
  307. package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
  308. package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
  309. package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
  310. package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
  311. package/packages/gsd-cloud/dist/executors/executor.js +11 -0
  312. package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
  313. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
  314. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
  315. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
  316. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
  317. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
  318. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
  319. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
  320. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
  321. package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
  322. package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
  323. package/packages/gsd-cloud/dist/executors/index.js +29 -0
  324. package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
  325. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
  326. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
  327. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
  328. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
  329. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
  330. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
  331. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
  332. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
  333. package/packages/gsd-cloud/dist/index.d.ts +7 -0
  334. package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
  335. package/packages/gsd-cloud/dist/index.js +8 -0
  336. package/packages/gsd-cloud/dist/index.js.map +1 -0
  337. package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
  338. package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
  339. package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
  340. package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
  341. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
  342. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
  343. package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
  344. package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
  345. package/packages/gsd-cloud/dist/logger.d.ts +25 -0
  346. package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
  347. package/packages/gsd-cloud/dist/logger.js +72 -0
  348. package/packages/gsd-cloud/dist/logger.js.map +1 -0
  349. package/packages/gsd-cloud/dist/types.d.ts +51 -0
  350. package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
  351. package/packages/gsd-cloud/dist/types.js +9 -0
  352. package/packages/gsd-cloud/dist/types.js.map +1 -0
  353. package/packages/gsd-cloud/package.json +3 -3
  354. package/packages/mcp-server/README.md +15 -2
  355. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  356. package/packages/mcp-server/dist/server.js +5 -5
  357. package/packages/mcp-server/dist/server.js.map +1 -1
  358. package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
  359. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  360. package/packages/mcp-server/dist/workflow-tools.js +64 -2
  361. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  362. package/packages/mcp-server/package.json +4 -4
  363. package/packages/native/package.json +1 -1
  364. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  365. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  366. package/packages/pi-agent-core/dist/agent.js +2 -0
  367. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  368. package/packages/pi-agent-core/package.json +1 -1
  369. package/packages/pi-ai/dist/models.generated.d.ts +119 -0
  370. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  371. package/packages/pi-ai/dist/models.generated.js +107 -0
  372. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  373. package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
  374. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  375. package/packages/pi-ai/dist/providers/anthropic.js +25 -1
  376. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  377. package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
  378. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  379. package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
  380. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  381. package/packages/pi-ai/package.json +1 -1
  382. package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
  383. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
  385. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  386. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +11 -1
  387. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  388. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  389. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  390. package/packages/pi-coding-agent/package.json +7 -7
  391. package/packages/pi-tui/package.json +2 -2
  392. package/packages/rpc-client/package.json +2 -2
  393. package/pkg/package.json +1 -1
  394. package/src/resources/GSD-WORKFLOW.md +18 -49
  395. package/src/resources/extensions/browser-tools/capture.ts +2 -86
  396. package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
  397. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
  398. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
  399. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
  400. package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
  401. package/src/resources/extensions/gsd/auto-artifact-paths.ts +16 -9
  402. package/src/resources/extensions/gsd/auto-dispatch.ts +86 -19
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
  404. package/src/resources/extensions/gsd/auto-prompts.ts +142 -16
  405. package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
  406. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
  407. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
  408. package/src/resources/extensions/gsd/auto.ts +5 -1
  409. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
  410. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +39 -10
  411. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
  412. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +87 -53
  413. package/src/resources/extensions/gsd/command-feedback.ts +19 -12
  414. package/src/resources/extensions/gsd/compat/compat-marker.ts +21 -4
  415. package/src/resources/extensions/gsd/constants.ts +14 -13
  416. package/src/resources/extensions/gsd/context-masker.ts +98 -2
  417. package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
  418. package/src/resources/extensions/gsd/db/engine.ts +53 -17
  419. package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
  420. package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
  421. package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
  422. package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
  423. package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
  424. package/src/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  425. package/src/resources/extensions/gsd/doctor-engine-checks.ts +3 -5
  426. package/src/resources/extensions/gsd/flat-phase-migration.ts +160 -19
  427. package/src/resources/extensions/gsd/git-service.ts +19 -6
  428. package/src/resources/extensions/gsd/gsd-db.ts +255 -52
  429. package/src/resources/extensions/gsd/guided-flow.ts +48 -12
  430. package/src/resources/extensions/gsd/markdown-renderer.ts +25 -21
  431. package/src/resources/extensions/gsd/md-importer.ts +114 -16
  432. package/src/resources/extensions/gsd/migrate/command.ts +21 -227
  433. package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
  434. package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
  435. package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
  436. package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
  437. package/src/resources/extensions/gsd/model-cost-table.ts +2 -0
  438. package/src/resources/extensions/gsd/model-router.ts +12 -0
  439. package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
  440. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
  441. package/src/resources/extensions/gsd/paths.ts +62 -11
  442. package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
  443. package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
  444. package/src/resources/extensions/gsd/planning-subagent-registry.ts +31 -0
  445. package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
  446. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  447. package/src/resources/extensions/gsd/preferences-validation.ts +62 -0
  448. package/src/resources/extensions/gsd/preferences.ts +25 -0
  449. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  450. package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
  451. package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
  452. package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
  453. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
  454. package/src/resources/extensions/gsd/skill-activation.ts +17 -3
  455. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +30 -13
  456. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +16 -3
  457. package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
  458. package/src/resources/extensions/gsd/stop-notice.ts +18 -1
  459. package/src/resources/extensions/gsd/sync-lock.ts +14 -6
  460. package/src/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  461. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
  462. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
  463. package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
  464. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
  465. package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
  466. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +104 -0
  467. package/src/resources/extensions/gsd/tests/complete-task.test.ts +362 -1
  468. package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
  469. package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
  470. package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
  471. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
  472. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
  473. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
  474. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
  475. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
  476. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
  477. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
  478. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
  479. package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
  480. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +202 -0
  481. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
  482. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +25 -0
  483. package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
  484. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
  485. package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
  486. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
  487. package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
  488. package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
  489. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
  490. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
  491. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  492. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  493. package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
  494. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
  495. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
  496. package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
  497. package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
  498. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
  499. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
  500. package/src/resources/extensions/gsd/tests/preferences.test.ts +84 -0
  501. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +4 -0
  502. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +66 -0
  503. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
  504. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
  505. package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
  506. package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
  507. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  508. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
  509. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
  510. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
  511. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +17 -0
  512. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
  513. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
  514. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
  515. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +73 -0
  516. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
  517. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
  518. package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
  519. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
  520. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
  521. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
  522. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
  523. package/src/resources/extensions/gsd/tools/complete-task.ts +140 -5
  524. package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
  525. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
  526. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
  527. package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
  528. package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
  529. package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
  530. package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
  531. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
  532. package/src/resources/extensions/gsd/types.ts +11 -0
  533. package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
  534. package/src/resources/extensions/gsd/unit-registry.ts +4 -0
  535. package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
  536. package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
  537. package/src/resources/extensions/gsd/workspace.ts +2 -1
  538. package/src/resources/extensions/gsd/worktree-state-projection.ts +12 -0
  539. package/src/resources/extensions/mac-tools/index.ts +52 -9
  540. package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
  541. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  544. package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
  545. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → 6YWV7VAPg-jqjfPswrKZb}/_buildManifest.js +0 -0
  546. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → 6YWV7VAPg-jqjfPswrKZb}/_ssgManifest.js +0 -0
@@ -13,6 +13,7 @@ import { tmpdir } from "node:os";
13
13
  import { fileURLToPath } from "node:url";
14
14
 
15
15
  import { buildExecuteTaskPrompt, buildPlanSlicePrompt, buildReactiveExecutePrompt, buildResearchSlicePrompt, inlineDependencySummaries } from "../auto-prompts.js";
16
+ import { buildDiscussSlicePrompt } from "../guided-flow.js";
16
17
  import { computeBudgets, truncateAtSectionBoundary } from "../context-budget.js";
17
18
 
18
19
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -735,3 +736,68 @@ describe("prompt-budget: modelRegistry + sessionContextWindow behavior", () => {
735
736
  }
736
737
  });
737
738
  });
739
+
740
+ // ─── execute-task + discuss-slice inline caps (plan 039) ──────────────────────
741
+
742
+ describe("prompt-budget: execute-task inline cap (039)", () => {
743
+ it("keeps the authoritative task plan whole but drops trailing templates when the plan alone exceeds the inline budget", async () => {
744
+ const base = createFixtureBase();
745
+ try {
746
+ const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
747
+ const taskDir = join(sliceDir, "tasks");
748
+ mkdirSync(taskDir, { recursive: true });
749
+ writeFileSync(join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# Roadmap\n");
750
+ writeFileSync(join(sliceDir, "S01-PLAN.md"), "# Slice Plan\n");
751
+ // Oversized task plan (~60K) — well past the 20K inline ceiling.
752
+ const bigPlan = "# Task Plan\n\nMARKER_TASKPLAN_HEAD\n\n" + Array.from({ length: 30 }, (_, i) =>
753
+ `### Step ${i}\n\n${"Implementation detail. ".repeat(90)}`
754
+ ).join("\n\n");
755
+ writeFileSync(join(taskDir, "T01-PLAN.md"), bigPlan);
756
+
757
+ const prompt = await buildExecuteTaskPrompt("M001", "S01", "Slice", "T01", "Task", base, {
758
+ level: "standard",
759
+ sessionContextWindow: 32_000,
760
+ });
761
+
762
+ // The task plan is the authoritative execution contract — never truncated;
763
+ // its content survives whole even when it alone exceeds the inline budget.
764
+ assert.match(prompt, /MARKER_TASKPLAN_HEAD/);
765
+ assert.match(prompt, /### Step 29/);
766
+ // Trailing lower-priority templates are dropped — the on-demand decisions
767
+ // template that "standard" normally inlines is gone because the task plan
768
+ // consumed the entire inline budget. (Baseline: the tiny-plan test above
769
+ // asserts this block IS present.)
770
+ assert.doesNotMatch(prompt, /### On-demand Decisions Template/);
771
+ } finally {
772
+ cleanup(base);
773
+ }
774
+ });
775
+ });
776
+
777
+ describe("prompt-budget: discuss-slice inline cap (039)", () => {
778
+ it("caps the inlined block — roadmap survives first, the trailing decisions register truncates", async () => {
779
+ const base = createFixtureBase();
780
+ try {
781
+ const msDir = join(base, ".gsd", "milestones", "M001");
782
+ mkdirSync(join(msDir, "slices", "S01"), { recursive: true });
783
+ writeFileSync(join(msDir, "M001-ROADMAP.md"), "# Roadmap\n\nMARKER_ROADMAP\n\n- [ ] **S01: Current** `risk:low`\n");
784
+ writeFileSync(join(msDir, "M001-CONTEXT.md"), "# Context\n\nMARKER_CONTEXT\n");
785
+ // Huge decisions register (~60K) — the unbounded-growth surface the cap bounds.
786
+ const bigDecisions = "# Decisions\n\n" + Array.from({ length: 40 }, (_, i) =>
787
+ `### D${String(i).padStart(3, "0")}\n\n${"Decision rationale detail. ".repeat(60)}`
788
+ ).join("\n\n");
789
+ writeFileSync(join(base, ".gsd", "DECISIONS.md"), bigDecisions);
790
+
791
+ const prompt = await buildDiscussSlicePrompt("M001", "S01", "Current", base);
792
+
793
+ // Roadmap is first in the inlined block → survives the cap.
794
+ assert.match(prompt, /MARKER_ROADMAP/);
795
+ // The cap fired (capPreamble ceiling is 20K; the block is ~60K).
796
+ assert.match(prompt, /\[\.\.\.truncated/);
797
+ // The last decision (trailing content) is dropped.
798
+ assert.doesNotMatch(prompt, /### D039/);
799
+ } finally {
800
+ cleanup(base);
801
+ }
802
+ });
803
+ });
@@ -608,3 +608,42 @@ test("getDependencyTaskSummaryPaths handles missing dependency summaries gracefu
608
608
  rmSync(repo, { recursive: true, force: true });
609
609
  }
610
610
  });
611
+
612
+ test("#1343: getPriorTaskSummaryPaths excludes sibling-slice summaries in flat-phase", async () => {
613
+ const { getPriorTaskSummaryPaths } = await import("../auto-prompts.ts");
614
+ const repo = mkdtempSync(join(tmpdir(), "gsd-reactive-flat-prior-"));
615
+ try {
616
+ // Flat-phase: slices S01 and S02 share the phase dir and overlap task ids.
617
+ const phaseDir = join(repo, ".gsd", "phases", "01-test");
618
+ mkdirSync(phaseDir, { recursive: true });
619
+ writeFileSync(join(phaseDir, "S01-T01-SUMMARY.md"), "---\nid: T01\n---\n# S01 T01\n");
620
+ writeFileSync(join(phaseDir, "S02-T01-SUMMARY.md"), "---\nid: T01\n---\n# S02 T01\n");
621
+
622
+ // S02/T02 prior summaries must not pull the sibling S01-T01 summary.
623
+ const paths = await getPriorTaskSummaryPaths("M001", "S02", "T02", repo);
624
+ assert.equal(paths.length, 1, "Should only return the current slice's prior summary");
625
+ assert.ok(paths[0].includes("S02-T01-SUMMARY"), "Should include S02's T01");
626
+ assert.ok(!paths.some((p) => p.includes("S01-T01-SUMMARY")), "Should NOT include sibling S01's T01");
627
+ } finally {
628
+ rmSync(repo, { recursive: true, force: true });
629
+ }
630
+ });
631
+
632
+ test("#1343: getDependencyTaskSummaryPaths excludes sibling-slice summaries in flat-phase", async () => {
633
+ const { getDependencyTaskSummaryPaths } = await import("../auto-prompts.ts");
634
+ const repo = mkdtempSync(join(tmpdir(), "gsd-reactive-flat-dep-"));
635
+ try {
636
+ const phaseDir = join(repo, ".gsd", "phases", "01-test");
637
+ mkdirSync(phaseDir, { recursive: true });
638
+ writeFileSync(join(phaseDir, "S01-T01-SUMMARY.md"), "---\nid: T01\n---\n# S01 T01\n");
639
+ writeFileSync(join(phaseDir, "S02-T01-SUMMARY.md"), "---\nid: T01\n---\n# S02 T01\n");
640
+
641
+ // S02/T02 depends on T01 — must resolve S02's T01, not the sibling S01's.
642
+ const paths = await getDependencyTaskSummaryPaths("M001", "S02", "T02", ["T01"], repo);
643
+ assert.equal(paths.length, 1, "Should only return the current slice's dependency summary");
644
+ assert.ok(paths[0].includes("S02-T01-SUMMARY"), "Should include S02's T01");
645
+ assert.ok(!paths.some((p) => p.includes("S01-T01-SUMMARY")), "Should NOT include sibling S01's T01");
646
+ } finally {
647
+ rmSync(repo, { recursive: true, force: true });
648
+ }
649
+ });
@@ -210,6 +210,56 @@ test('handleReassessRoadmap succeeds when modifying only pending slices', async
210
210
  }
211
211
  });
212
212
 
213
+ test('handleReassessRoadmap writes legacy-layout reassessment to S##-ASSESSMENT.md', async () => {
214
+ const base = mkdtempSync(join(tmpdir(), 'gsd-reassess-legacy-'));
215
+ mkdirSync(join(base, '.gsd', 'milestones', 'M005-3qxqd7', 'slices', 'S04'), { recursive: true });
216
+ mkdirSync(join(base, '.gsd', 'phases', '05-3qxqd7-legacy-milestone'), { recursive: true });
217
+ openDatabase(join(base, '.gsd', 'gsd.db'));
218
+
219
+ try {
220
+ insertMilestone({ id: 'M005-3qxqd7', title: 'Legacy Milestone', status: 'active' });
221
+ insertSlice({
222
+ id: 'S04',
223
+ milestoneId: 'M005-3qxqd7',
224
+ title: 'Legacy Slice Four',
225
+ status: 'complete',
226
+ demo: 'Demo four.',
227
+ });
228
+
229
+ const result = await handleReassessRoadmap({
230
+ milestoneId: 'M005-3qxqd7',
231
+ completedSliceId: 'S04',
232
+ verdict: 'confirmed',
233
+ assessment: 'S04 completed successfully. Roadmap remains valid.',
234
+ sliceChanges: {
235
+ modified: [],
236
+ added: [],
237
+ removed: [],
238
+ },
239
+ }, base);
240
+
241
+ if ('error' in result) {
242
+ assert.fail(`unexpected error: ${result.error}`);
243
+ }
244
+
245
+ const correctPath = join(base, '.gsd', 'milestones', 'M005-3qxqd7', 'slices', 'S04', 'S04-ASSESSMENT.md');
246
+ const wrongFlatNameInLegacyDir = join(base, '.gsd', 'milestones', 'M005-3qxqd7', 'slices', 'S04', '05-04-ASSESSMENT.md');
247
+ const wrongFlatPhasePath = join(base, '.gsd', 'phases', '05-3qxqd7-legacy-milestone', '05-04-ASSESSMENT.md');
248
+ assert.match(
249
+ result.assessmentPath.replace(/\\/g, '/'),
250
+ /\/\.gsd\/milestones\/M005-3qxqd7\/slices\/S04\/S04-ASSESSMENT\.md$/,
251
+ );
252
+ assert.ok(existsSync(correctPath), 'legacy ASSESSMENT should use S## filename inside slices/S##/');
253
+ assert.equal(existsSync(wrongFlatNameInLegacyDir), false, 'legacy slice dir must not receive flat-phase assessment filename');
254
+ assert.equal(existsSync(wrongFlatPhasePath), false, 'legacy reassessment must not be diverted to a coexisting flat-phase dir');
255
+
256
+ const assessment = getAssessment('.gsd/milestones/M005-3qxqd7/slices/S04/S04-ASSESSMENT.md');
257
+ assert.ok(assessment, 'assessment row should use the legacy-layout path');
258
+ } finally {
259
+ cleanup(base);
260
+ }
261
+ });
262
+
213
263
  test('handleReassessRoadmap cache invalidation: getMilestoneSlices reflects mutations', async () => {
214
264
  const base = makeTmpBase();
215
265
  openDatabase(join(base, '.gsd', 'gsd.db'));
@@ -0,0 +1,103 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtempSync, mkdirSync, rmSync, readFileSync, existsSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+
7
+ import {
8
+ openDatabase,
9
+ closeDatabase,
10
+ insertMilestone,
11
+ insertSlice,
12
+ insertTask,
13
+ upsertTaskPlanning,
14
+ getTask,
15
+ getReplanHistory,
16
+ } from '../gsd-db.ts';
17
+ import { handleReplanTask } from '../tools/replan-task.ts';
18
+
19
+ function makeTmpBase(): string {
20
+ const base = mkdtempSync(join(tmpdir(), 'gsd-replan-task-'));
21
+ mkdirSync(join(base, '.gsd', 'phases', '01-test'), { recursive: true });
22
+ return base;
23
+ }
24
+
25
+ function cleanup(base: string): void {
26
+ try { closeDatabase(); } catch { /* noop */ }
27
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
28
+ }
29
+
30
+ function seedTask(status = 'pending'): void {
31
+ insertMilestone({ id: 'M001', title: 'Test Milestone', status: 'active' });
32
+ insertSlice({ id: 'S01', milestoneId: 'M001', title: 'Test Slice', status: 'active', demo: 'Demo.' });
33
+ insertTask({ id: 'T01', sliceId: 'S01', milestoneId: 'M001', title: 'Original Task', status });
34
+ upsertTaskPlanning('M001', 'S01', 'T01', {
35
+ description: 'Original task description.',
36
+ estimate: '30m',
37
+ files: ['src/original.ts'],
38
+ verify: 'node --test original.test.ts',
39
+ inputs: ['src/original.ts'],
40
+ expectedOutput: ['src/original.ts'],
41
+ });
42
+ }
43
+
44
+ function validReplanTaskParams() {
45
+ return {
46
+ milestoneId: 'M001',
47
+ sliceId: 'S01',
48
+ taskId: 'T01',
49
+ title: 'Replanned Task',
50
+ description: 'Updated task description with blocking rework scope.',
51
+ estimate: '45m',
52
+ files: ['src/replanned.ts'],
53
+ verify: 'node --test replanned.test.ts',
54
+ inputs: ['src/original.ts'],
55
+ expectedOutput: ['src/replanned.ts'],
56
+ reworkBriefRef: 'RB-001',
57
+ };
58
+ }
59
+
60
+ test('handleReplanTask updates one pending task plan and records a task-scoped replan history entry', async () => {
61
+ const base = makeTmpBase();
62
+ openDatabase(join(base, '.gsd', 'gsd.db'));
63
+
64
+ try {
65
+ seedTask('pending');
66
+
67
+ const result = await handleReplanTask(validReplanTaskParams(), base);
68
+ assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
69
+
70
+ const task = getTask('M001', 'S01', 'T01');
71
+ assert.ok(task, 'task should still exist');
72
+ assert.equal(task.title, 'Replanned Task');
73
+ assert.equal(task.description, 'Updated task description with blocking rework scope.');
74
+ assert.equal(task.verify, 'node --test replanned.test.ts');
75
+ assert.deepEqual(task.files, ['src/replanned.ts']);
76
+
77
+ const history = getReplanHistory('M001', 'S01');
78
+ assert.ok(history.some((row) => row['task_id'] === 'T01' && String(row['summary']).includes('RB-001')));
79
+
80
+ const planPath = join(base, '.gsd', 'phases', '01-test', '01-01-PLAN.md');
81
+ assert.ok(existsSync(planPath), 'slice plan projection should be rendered');
82
+ const planContent = readFileSync(planPath, 'utf-8');
83
+ assert.match(planContent, /Replanned Task/);
84
+ assert.match(planContent, /node --test replanned\.test\.ts/);
85
+ } finally {
86
+ cleanup(base);
87
+ }
88
+ });
89
+
90
+ test('handleReplanTask rejects completed tasks', async () => {
91
+ const base = makeTmpBase();
92
+ openDatabase(join(base, '.gsd', 'gsd.db'));
93
+
94
+ try {
95
+ seedTask('complete');
96
+
97
+ const result = await handleReplanTask(validReplanTaskParams(), base);
98
+ assert.ok('error' in result);
99
+ assert.match(result.error, /cannot replan completed task T01/i);
100
+ } finally {
101
+ cleanup(base);
102
+ }
103
+ });
@@ -0,0 +1,197 @@
1
+ import { createTestContext } from './test-helpers.ts';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import * as os from 'node:os';
5
+ import {
6
+ openDatabase,
7
+ closeDatabase,
8
+ _getAdapter,
9
+ type ReworkBriefFindingInput,
10
+ } from '../gsd-db.ts';
11
+ import { handleReworkBriefSave } from '../tools/rework-brief.ts';
12
+
13
+ const { assertEq, assertTrue, assertMatch, report } = createTestContext();
14
+
15
+ // ═══════════════════════════════════════════════════════════════════════════
16
+ // Helpers
17
+ // ═══════════════════════════════════════════════════════════════════════════
18
+
19
+ function tempDbPath(): string {
20
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-rework-brief-'));
21
+ return path.join(dir, 'test.db');
22
+ }
23
+
24
+ function cleanup(dbPath: string): void {
25
+ closeDatabase();
26
+ try {
27
+ const dir = path.dirname(dbPath);
28
+ for (const f of fs.readdirSync(dir)) fs.unlinkSync(path.join(dir, f));
29
+ fs.rmdirSync(dir);
30
+ } catch {
31
+ // best effort
32
+ }
33
+ }
34
+
35
+ function finding(overrides: Partial<ReworkBriefFindingInput> = {}): ReworkBriefFindingInput {
36
+ return {
37
+ findingId: 'F1',
38
+ severity: 'blocking',
39
+ description: 'Compile regression',
40
+ requiredFix: 'Fix compile error',
41
+ verificationCommands: ['pnpm run typecheck:extensions'],
42
+ ...overrides,
43
+ };
44
+ }
45
+
46
+ const baseParams = {
47
+ briefId: 'RB-001',
48
+ milestoneId: 'M001',
49
+ sliceId: 'S01',
50
+ taskId: 'T01',
51
+ };
52
+
53
+ function findingRow(): { status: string; evidence: string; decision_ref: string } | undefined {
54
+ return _getAdapter()!
55
+ .prepare("SELECT status, evidence, decision_ref FROM rework_brief_findings WHERE brief_id = 'RB-001' AND finding_id = 'F1'")
56
+ .get() as { status: string; evidence: string; decision_ref: string } | undefined;
57
+ }
58
+
59
+ // ═══════════════════════════════════════════════════════════════════════════
60
+ // rework-brief: a blocking finding saved as non-pending must carry the same
61
+ // justification a reworkResolution would, otherwise it bypasses the
62
+ // gsd_task_complete blocking gate (which only sees `pending` rows).
63
+ // ═══════════════════════════════════════════════════════════════════════════
64
+
65
+ console.log('\n=== rework-brief: rejects blocking resolved finding without evidence ===');
66
+ {
67
+ const dbPath = tempDbPath();
68
+ openDatabase(dbPath);
69
+
70
+ const result = await handleReworkBriefSave({
71
+ ...baseParams,
72
+ findings: [finding({ status: 'resolved' })],
73
+ });
74
+
75
+ assertTrue('error' in result, 'blocking resolved finding without evidence should be rejected');
76
+ if ('error' in result) {
77
+ assertMatch(result.error, /evidence is required/i, 'error should mention the evidence requirement');
78
+ }
79
+ const rows = _getAdapter()!.prepare('SELECT COUNT(*) AS n FROM rework_brief_findings').get() as { n: number };
80
+ assertEq(rows.n, 0, 'no finding rows should be persisted when validation fails');
81
+
82
+ cleanup(dbPath);
83
+ }
84
+
85
+ console.log('\n=== rework-brief: rejects blocking deferred-with-override without decisionRef ===');
86
+ {
87
+ const dbPath = tempDbPath();
88
+ openDatabase(dbPath);
89
+
90
+ const result = await handleReworkBriefSave({
91
+ ...baseParams,
92
+ findings: [finding({ status: 'deferred-with-override', evidence: 'Maintainer accepted temporary deferral.' })],
93
+ });
94
+
95
+ assertTrue('error' in result, 'deferred-with-override without decisionRef should be rejected');
96
+ if ('error' in result) {
97
+ assertMatch(result.error, /decisionRef is required/i, 'error should mention the decisionRef requirement');
98
+ }
99
+
100
+ cleanup(dbPath);
101
+ }
102
+
103
+ console.log('\n=== rework-brief: rejects invalid finding status ===');
104
+ {
105
+ const dbPath = tempDbPath();
106
+ openDatabase(dbPath);
107
+
108
+ const result = await handleReworkBriefSave({
109
+ ...baseParams,
110
+ findings: [finding({ status: 'bogus' as unknown as ReworkBriefFindingInput['status'] })],
111
+ });
112
+
113
+ assertTrue('error' in result, 'an unknown status value should be rejected');
114
+ if ('error' in result) {
115
+ assertMatch(result.error, /status must be/i, 'error should name the allowed statuses');
116
+ }
117
+
118
+ cleanup(dbPath);
119
+ }
120
+
121
+ // ═══════════════════════════════════════════════════════════════════════════
122
+ // rework-brief: legitimate saves still succeed.
123
+ // ═══════════════════════════════════════════════════════════════════════════
124
+
125
+ console.log('\n=== rework-brief: blocking finding defaults to pending ===');
126
+ {
127
+ const dbPath = tempDbPath();
128
+ openDatabase(dbPath);
129
+
130
+ const result = await handleReworkBriefSave({
131
+ ...baseParams,
132
+ findings: [finding()],
133
+ });
134
+
135
+ assertTrue(!('error' in result), 'a blocking finding without a status should be accepted');
136
+ assertEq(findingRow()?.status, 'pending', 'finding without status should default to pending');
137
+
138
+ cleanup(dbPath);
139
+ }
140
+
141
+ console.log('\n=== rework-brief: accepts blocking resolved finding with evidence ===');
142
+ {
143
+ const dbPath = tempDbPath();
144
+ openDatabase(dbPath);
145
+
146
+ const result = await handleReworkBriefSave({
147
+ ...baseParams,
148
+ findings: [finding({ status: 'resolved', evidence: 'Fixed compile error and reran pnpm run typecheck:extensions.' })],
149
+ });
150
+
151
+ assertTrue(!('error' in result), 'a resolved blocking finding with evidence should be accepted');
152
+ assertEq(findingRow()?.status, 'resolved', 'finding should persist as resolved when evidence is supplied');
153
+ assertMatch(findingRow()?.evidence ?? '', /Fixed compile error/, 'resolution evidence should be persisted');
154
+
155
+ cleanup(dbPath);
156
+ }
157
+
158
+ console.log('\n=== rework-brief: accepts blocking deferred-with-override with evidence and decisionRef ===');
159
+ {
160
+ const dbPath = tempDbPath();
161
+ openDatabase(dbPath);
162
+
163
+ const result = await handleReworkBriefSave({
164
+ ...baseParams,
165
+ findings: [finding({
166
+ status: 'deferred-with-override',
167
+ evidence: 'Maintainer accepted temporary deferral.',
168
+ decisionRef: 'DEC-2026-07-07-rework-deferral',
169
+ })],
170
+ });
171
+
172
+ assertTrue(!('error' in result), 'a deferred-with-override finding with evidence and decisionRef should be accepted');
173
+ assertEq(findingRow()?.status, 'deferred-with-override', 'finding should persist the override status');
174
+ assertEq(findingRow()?.decision_ref, 'DEC-2026-07-07-rework-deferral', 'decision reference should be persisted');
175
+
176
+ cleanup(dbPath);
177
+ }
178
+
179
+ console.log('\n=== rework-brief: advisory resolved finding does not require evidence ===');
180
+ {
181
+ const dbPath = tempDbPath();
182
+ openDatabase(dbPath);
183
+
184
+ // Advisory findings never gate gsd_task_complete, so pre-resolving one
185
+ // without evidence is harmless and stays permitted.
186
+ const result = await handleReworkBriefSave({
187
+ ...baseParams,
188
+ findings: [finding({ severity: 'advisory', status: 'resolved' })],
189
+ });
190
+
191
+ assertTrue(!('error' in result), 'an advisory resolved finding should be accepted without evidence');
192
+ assertEq(findingRow()?.status, 'resolved', 'advisory finding status should be preserved');
193
+
194
+ cleanup(dbPath);
195
+ }
196
+
197
+ report();
@@ -35,6 +35,10 @@ describe("supportsServiceTier", () => {
35
35
  assert.equal(supportsServiceTier("gpt-5.5"), false);
36
36
  });
37
37
 
38
+ test("returns false for gpt-5.6 until service_tier payload support is verified", () => {
39
+ assert.equal(supportsServiceTier("gpt-5.6"), false);
40
+ });
41
+
38
42
  test("returns false for provider-only identifier without gpt-5.4 model suffix", () => {
39
43
  assert.equal(supportsServiceTier("vibeproxy-openai"), false);
40
44
  });
@@ -7,8 +7,9 @@
7
7
  * self-identify (Stream 2: actor identity passthrough).
8
8
  *
9
9
  * 2. The 3 reversibility handlers (reopen-task/slice/milestone) are
10
- * registered as MCP tools with both canonical and alias names
11
- * (Stream 3: reversibility tools).
10
+ * registered as MCP tools under their canonical names, and additionally
11
+ * under their alias names when GSD_ADVERTISE_TOOL_ALIASES=1 (plan 035
12
+ * suppresses alias schemas by default) (Stream 3: reversibility tools).
12
13
  *
13
14
  * 3. The reopen tools accept the documented core params plus optional
14
15
  * reason/actorName/triggerReason without rejecting valid payloads.
@@ -36,6 +37,18 @@ function getTool(name: string) {
36
37
  return pi.tools.find((t: any) => t.name === name);
37
38
  }
38
39
 
40
+ function withEnv(name: string, value: string | undefined, fn: () => void): void {
41
+ const previous = process.env[name];
42
+ if (value === undefined) delete process.env[name];
43
+ else process.env[name] = value;
44
+ try {
45
+ fn();
46
+ } finally {
47
+ if (previous === undefined) delete process.env[name];
48
+ else process.env[name] = previous;
49
+ }
50
+ }
51
+
39
52
  function getRequiredProps(tool: any): string[] {
40
53
  return tool.parameters.required ?? [];
41
54
  }
@@ -78,7 +91,9 @@ for (const name of ACTOR_TOOLS) {
78
91
  });
79
92
  }
80
93
 
81
- // ─── Stream 3: reopen tools registered with canonical + alias names ─────────
94
+ // ─── Stream 3: reopen tools registered under canonical names ────────────────
95
+ // Plan 035 suppresses alias schemas by default; the canonical reopen tools are
96
+ // always registered, and their aliases only when GSD_ADVERTISE_TOOL_ALIASES=1.
82
97
 
83
98
  const REOPEN_TOOLS = [
84
99
  { canonical: "gsd_task_reopen", alias: "gsd_reopen_task" },
@@ -87,13 +102,24 @@ const REOPEN_TOOLS = [
87
102
  ];
88
103
 
89
104
  for (const { canonical, alias } of REOPEN_TOOLS) {
90
- test(`${canonical} — registered with alias ${alias}`, () => {
105
+ test(`${canonical} — registered under its canonical name, no alias by default`, () => {
91
106
  const canonicalTool = getTool(canonical);
92
- const aliasTool = getTool(alias);
93
107
  assert.ok(canonicalTool, `${canonical} must be registered`);
94
- assert.ok(aliasTool, `${alias} must be registered as alias`);
95
108
  assert.ok(typeof canonicalTool.execute === "function", `${canonical} must have an execute function`);
96
- assert.ok(typeof aliasTool.execute === "function", `${alias} must have an execute function`);
109
+ assert.ok(!getTool(alias), `${alias} must not be registered by default (plan 035 alias suppression)`);
110
+ });
111
+
112
+ test(`${canonical} — registered with alias ${alias} when GSD_ADVERTISE_TOOL_ALIASES=1`, () => {
113
+ withEnv("GSD_ADVERTISE_TOOL_ALIASES", "1", () => {
114
+ const aliasPi = makeMockPi();
115
+ registerDbTools(aliasPi);
116
+ const canonicalTool = aliasPi.tools.find((t: any) => t.name === canonical);
117
+ const aliasTool = aliasPi.tools.find((t: any) => t.name === alias);
118
+ assert.ok(canonicalTool, `${canonical} must be registered`);
119
+ assert.ok(aliasTool, `${alias} must be registered as alias`);
120
+ assert.ok(typeof canonicalTool.execute === "function", `${canonical} must have an execute function`);
121
+ assert.ok(typeof aliasTool.execute === "function", `${alias} must have an execute function`);
122
+ });
97
123
  });
98
124
  }
99
125