gsd-pi 2.79.0 → 2.80.0-dev.c2213c771

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 (634) hide show
  1. package/README.md +94 -47
  2. package/dist/loader.js +0 -0
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/extensions/github-sync/templates.js +55 -70
  5. package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
  6. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
  7. package/dist/resources/extensions/gsd/auto/loop.js +359 -523
  8. package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
  9. package/dist/resources/extensions/gsd/auto/phases.js +61 -7
  10. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  11. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
  21. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
  23. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
  24. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
  26. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
  27. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
  29. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
  30. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  31. package/dist/resources/extensions/gsd/auto-dashboard.js +3 -0
  32. package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
  33. package/dist/resources/extensions/gsd/auto-prompts.js +220 -32
  34. package/dist/resources/extensions/gsd/auto-recovery.js +63 -55
  35. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
  36. package/dist/resources/extensions/gsd/auto-start.js +3 -2
  37. package/dist/resources/extensions/gsd/auto-verification.js +2 -11
  38. package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
  39. package/dist/resources/extensions/gsd/auto.js +159 -2
  40. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
  41. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  42. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  43. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +52 -50
  44. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +8 -8
  45. package/dist/resources/extensions/gsd/commands/context.js +1 -1
  46. package/dist/resources/extensions/gsd/commands-ship.js +23 -46
  47. package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
  48. package/dist/resources/extensions/gsd/component-loader.js +5 -11
  49. package/dist/resources/extensions/gsd/custom-workflow-engine.js +4 -0
  50. package/dist/resources/extensions/gsd/db-adapter.js +47 -0
  51. package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
  52. package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
  53. package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
  54. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
  55. package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
  56. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
  57. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
  58. package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
  59. package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
  60. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
  61. package/dist/resources/extensions/gsd/db-open-state.js +32 -0
  62. package/dist/resources/extensions/gsd/db-provider.js +108 -0
  63. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
  64. package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
  65. package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
  66. package/dist/resources/extensions/gsd/db-transaction.js +63 -0
  67. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
  68. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
  69. package/dist/resources/extensions/gsd/escalation.js +2 -0
  70. package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
  71. package/dist/resources/extensions/gsd/guided-flow.js +40 -0
  72. package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
  73. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
  74. package/dist/resources/extensions/gsd/model-router.js +9 -6
  75. package/dist/resources/extensions/gsd/notification-widget.js +21 -3
  76. package/dist/resources/extensions/gsd/paths.js +5 -1
  77. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
  78. package/dist/resources/extensions/gsd/pr-evidence.js +76 -0
  79. package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
  80. package/dist/resources/extensions/gsd/preferences-types.js +20 -2
  81. package/dist/resources/extensions/gsd/preferences-validation.js +3 -3
  82. package/dist/resources/extensions/gsd/process-task-path.js +61 -0
  83. package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
  84. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  85. package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  86. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  87. package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
  88. package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
  89. package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
  90. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  91. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  92. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  93. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  94. package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  95. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  96. package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  97. package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
  98. package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  99. package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
  100. package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
  101. package/dist/resources/extensions/gsd/prompts/system.md +65 -107
  102. package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  103. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  104. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  105. package/dist/resources/extensions/gsd/state.js +4 -0
  106. package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
  107. package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
  108. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +88 -3
  109. package/dist/resources/extensions/gsd/unit-context-composer.js +32 -0
  110. package/dist/resources/extensions/gsd/unit-context-manifest.js +21 -0
  111. package/dist/resources/extensions/gsd/uok/audit.js +23 -9
  112. package/dist/resources/extensions/gsd/uok/contracts.js +69 -1
  113. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +3 -0
  114. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  115. package/dist/resources/extensions/gsd/uok/loop-adapter.js +48 -33
  116. package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
  117. package/dist/resources/extensions/gsd/uok/timeline.js +125 -0
  118. package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
  119. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  120. package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
  121. package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
  122. package/dist/resources/extensions/shared/gsd-phase-state.js +45 -3
  123. package/dist/resources/extensions/shared/interview-ui.js +15 -4
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  125. package/dist/web/standalone/.next/BUILD_ID +1 -1
  126. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  127. package/dist/web/standalone/.next/build-manifest.json +3 -3
  128. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  129. package/dist/web/standalone/.next/required-server-files.json +4 -4
  130. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  131. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  141. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  160. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  176. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  219. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  227. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  249. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  254. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  265. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/index.html +1 -1
  267. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  268. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  269. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  270. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  271. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  272. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  273. package/dist/web/standalone/.next/server/app/page.js +2 -2
  274. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  276. package/dist/web/standalone/.next/server/chunks/167.js +2 -0
  277. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  278. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  279. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/middleware.js +2 -2
  281. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  282. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  283. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  284. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  285. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  286. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  287. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  288. package/dist/web/standalone/.next/static/chunks/app/page-fab3ebb85b006001.js +1 -0
  289. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  291. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  292. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  293. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  294. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  295. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  296. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  297. package/dist/web/standalone/package.json +1 -0
  298. package/dist/web/standalone/server.js +1 -1
  299. package/package.json +12 -5
  300. package/packages/contracts/dist/index.d.ts +3 -0
  301. package/packages/contracts/dist/index.d.ts.map +1 -0
  302. package/packages/contracts/dist/index.js +5 -0
  303. package/packages/contracts/dist/index.js.map +1 -0
  304. package/packages/contracts/dist/rpc.d.ts +549 -0
  305. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  306. package/packages/contracts/dist/rpc.js +53 -0
  307. package/packages/contracts/dist/rpc.js.map +1 -0
  308. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  309. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  310. package/packages/contracts/dist/rpc.test.js +47 -0
  311. package/packages/contracts/dist/rpc.test.js.map +1 -0
  312. package/packages/contracts/dist/workflow.d.ts +180 -0
  313. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  314. package/packages/contracts/dist/workflow.js +201 -0
  315. package/packages/contracts/dist/workflow.js.map +1 -0
  316. package/packages/contracts/package.json +39 -0
  317. package/packages/contracts/src/index.ts +5 -0
  318. package/packages/contracts/src/rpc.test.ts +72 -0
  319. package/packages/contracts/src/rpc.ts +286 -0
  320. package/packages/contracts/src/workflow.ts +213 -0
  321. package/packages/contracts/tsconfig.json +25 -0
  322. package/packages/daemon/package.json +3 -2
  323. package/packages/daemon/src/event-bridge.test.ts +2 -1
  324. package/packages/daemon/src/event-bridge.ts +1 -1
  325. package/packages/daemon/src/event-formatter.test.ts +1 -2
  326. package/packages/daemon/src/event-formatter.ts +1 -2
  327. package/packages/daemon/src/session-manager.ts +2 -2
  328. package/packages/daemon/src/types.ts +3 -18
  329. package/packages/mcp-server/dist/server.d.ts +13 -0
  330. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  331. package/packages/mcp-server/dist/server.js +77 -0
  332. package/packages/mcp-server/dist/server.js.map +1 -1
  333. package/packages/mcp-server/dist/session-manager.js +1 -1
  334. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  335. package/packages/mcp-server/dist/types.d.ts +3 -11
  336. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  337. package/packages/mcp-server/dist/types.js.map +1 -1
  338. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  339. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  340. package/packages/mcp-server/dist/workflow-tools.js +52 -37
  341. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  342. package/packages/mcp-server/package.json +3 -2
  343. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  344. package/packages/mcp-server/src/server.ts +99 -1
  345. package/packages/mcp-server/src/session-manager.ts +2 -2
  346. package/packages/mcp-server/src/types.ts +7 -18
  347. package/packages/mcp-server/src/workflow-tools.test.ts +129 -2
  348. package/packages/mcp-server/src/workflow-tools.ts +80 -37
  349. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  350. package/packages/native/package.json +1 -1
  351. package/packages/pi-agent-core/package.json +1 -1
  352. package/packages/pi-ai/package.json +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +14 -0
  354. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +20 -0
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +6 -1
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +9 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -10
  363. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  365. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  367. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  368. package/packages/pi-coding-agent/package.json +2 -1
  369. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +23 -2
  370. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
  371. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +6 -1
  372. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -9
  373. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  374. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  375. package/packages/pi-tui/dist/tui.d.ts +1 -0
  376. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  377. package/packages/pi-tui/dist/tui.js +8 -2
  378. package/packages/pi-tui/dist/tui.js.map +1 -1
  379. package/packages/pi-tui/package.json +1 -1
  380. package/packages/pi-tui/src/tui.ts +8 -2
  381. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  382. package/packages/rpc-client/README.md +3 -3
  383. package/packages/rpc-client/dist/index.d.ts +1 -1
  384. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  385. package/packages/rpc-client/dist/index.js.map +1 -1
  386. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  387. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  388. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  389. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  390. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  391. package/packages/rpc-client/dist/rpc-types.js +3 -11
  392. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  393. package/packages/rpc-client/package.json +4 -1
  394. package/packages/rpc-client/src/index.ts +1 -1
  395. package/packages/rpc-client/src/rpc-client.ts +3 -6
  396. package/packages/rpc-client/src/rpc-types.ts +3 -398
  397. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  398. package/pkg/package.json +1 -1
  399. package/src/resources/extensions/github-sync/templates.ts +59 -84
  400. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  401. package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
  402. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  403. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
  404. package/src/resources/extensions/gsd/auto/loop.ts +411 -598
  405. package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
  406. package/src/resources/extensions/gsd/auto/phases.ts +88 -9
  407. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  408. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  409. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  410. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  411. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  412. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  413. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  414. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
  415. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  416. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  417. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  418. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  419. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  420. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  421. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  422. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  423. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  424. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  425. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  426. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
  427. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  428. package/src/resources/extensions/gsd/auto-dashboard.ts +4 -0
  429. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
  430. package/src/resources/extensions/gsd/auto-prompts.ts +276 -31
  431. package/src/resources/extensions/gsd/auto-recovery.ts +59 -53
  432. package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
  433. package/src/resources/extensions/gsd/auto-start.ts +3 -2
  434. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  435. package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
  436. package/src/resources/extensions/gsd/auto.ts +167 -1
  437. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +14 -1
  438. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
  439. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  440. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +62 -51
  441. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
  442. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +8 -4
  443. package/src/resources/extensions/gsd/commands/context.ts +1 -1
  444. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  445. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  446. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  447. package/src/resources/extensions/gsd/custom-workflow-engine.ts +6 -0
  448. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  449. package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
  450. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  451. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  452. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  453. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  454. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  455. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  456. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  457. package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
  458. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  459. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  460. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  461. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  462. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  463. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  464. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  465. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  466. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  467. package/src/resources/extensions/gsd/escalation.ts +3 -1
  468. package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
  469. package/src/resources/extensions/gsd/guided-flow.ts +47 -0
  470. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  471. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  472. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  473. package/src/resources/extensions/gsd/model-router.ts +10 -6
  474. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  475. package/src/resources/extensions/gsd/paths.ts +6 -1
  476. package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
  477. package/src/resources/extensions/gsd/pr-evidence.ts +124 -0
  478. package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
  479. package/src/resources/extensions/gsd/preferences-types.ts +23 -4
  480. package/src/resources/extensions/gsd/preferences-validation.ts +3 -3
  481. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  482. package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
  483. package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  484. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  485. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  486. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  487. package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
  488. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  489. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  490. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  491. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  492. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  493. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  494. package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  495. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  496. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  497. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  498. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  499. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  500. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  501. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  502. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  503. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  504. package/src/resources/extensions/gsd/state.ts +6 -3
  505. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +32 -0
  506. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +65 -0
  507. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +38 -0
  508. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
  509. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
  510. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +108 -1
  511. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
  512. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
  513. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -2
  514. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
  515. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
  516. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  517. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  518. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  519. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
  520. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  521. package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
  522. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +38 -0
  523. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  524. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +12 -0
  525. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
  526. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  527. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  528. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  529. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  530. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  531. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  532. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  533. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  534. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  535. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  536. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  537. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  538. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  539. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  540. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  541. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  542. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  543. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  544. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +42 -0
  545. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +63 -2
  546. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  547. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
  548. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
  549. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  550. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
  551. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  552. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  553. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  554. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +14 -0
  555. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
  556. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
  557. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  558. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
  559. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  560. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  561. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
  562. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  563. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  564. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  565. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +8 -0
  566. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
  567. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  568. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  569. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
  570. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
  571. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  572. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +3 -0
  573. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  574. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
  575. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  576. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +85 -0
  577. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +2 -0
  578. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +59 -0
  579. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  580. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +42 -4
  581. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +32 -0
  582. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +109 -1
  583. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  584. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +98 -0
  585. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  586. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  587. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  588. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  589. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  590. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  591. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
  592. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  593. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  594. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  595. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  596. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  597. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  598. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  599. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  600. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  601. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  602. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  603. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +164 -3
  604. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  605. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  606. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
  607. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +3 -0
  608. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  609. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  610. package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
  611. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +90 -2
  612. package/src/resources/extensions/gsd/unit-context-composer.ts +49 -0
  613. package/src/resources/extensions/gsd/unit-context-manifest.ts +34 -0
  614. package/src/resources/extensions/gsd/uok/audit.ts +25 -9
  615. package/src/resources/extensions/gsd/uok/contracts.ts +105 -0
  616. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +4 -0
  617. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  618. package/src/resources/extensions/gsd/uok/loop-adapter.ts +60 -45
  619. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  620. package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
  621. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  622. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  623. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  624. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  625. package/src/resources/extensions/shared/gsd-phase-state.ts +56 -3
  626. package/src/resources/extensions/shared/interview-ui.ts +18 -5
  627. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +43 -1
  628. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
  629. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  630. package/dist/web/standalone/.next/static/chunks/app/page-ff639266d978f2a0.js +0 -1
  631. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  632. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  633. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → HZXiuIbWQmvXjo4Tl3_zk}/_buildManifest.js +0 -0
  634. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → HZXiuIbWQmvXjo4Tl3_zk}/_ssgManifest.js +0 -0
@@ -211,6 +211,14 @@ test("buildReactiveExecutePrompt: output contains model string when subagentMode
211
211
  prompt.includes('model: "claude-opus-4-6"'),
212
212
  `Prompt should contain model instruction. Got:\n${prompt.slice(0, 500)}`,
213
213
  );
214
+ assert.ok(
215
+ prompt.includes("Context Mode (execution lane):"),
216
+ "embedded reactive-execute task prompt should use nested Context Mode guidance",
217
+ );
218
+ assert.ok(
219
+ prompt.includes("## Context Mode"),
220
+ "reactive-execute parent prompt should include standalone Context Mode guidance",
221
+ );
214
222
  });
215
223
 
216
224
  test("buildReactiveExecutePrompt: no model instruction when subagentModel omitted", async (t) => {
@@ -266,3 +274,54 @@ test("buildReactiveExecutePrompt: no model instruction when subagentModel omitte
266
274
  "Prompt should not contain model instruction when subagentModel is omitted",
267
275
  );
268
276
  });
277
+
278
+ test("buildGateEvaluatePrompt: embedded gate prompts use nested Context Mode guidance", async (t) => {
279
+ const { buildGateEvaluatePrompt } = await import("../auto-prompts.ts");
280
+ const { closeDatabase, insertGateRow, insertMilestone, insertSlice, openDatabase } = await import("../gsd-db.ts");
281
+ const repo = mkdtempSync(join(tmpdir(), "gsd-subagent-model-gate-"));
282
+ t.after(() => {
283
+ try { closeDatabase(); } catch { /* noop */ }
284
+ rmSync(repo, { recursive: true, force: true });
285
+ });
286
+
287
+ const sliceDir = join(repo, ".gsd", "milestones", "M001", "slices", "S01");
288
+ mkdirSync(sliceDir, { recursive: true });
289
+ writeFileSync(join(sliceDir, "S01-PLAN.md"), "# S01 Plan\n\n## Verification\n- Run checks.\n");
290
+ openDatabase(join(repo, ".gsd", "gsd.db"));
291
+ insertMilestone({ id: "M001", title: "Test Milestone", status: "active", depends_on: [] });
292
+ insertSlice({
293
+ id: "S01",
294
+ milestoneId: "M001",
295
+ title: "Test Slice",
296
+ status: "planned",
297
+ risk: "low",
298
+ depends: [],
299
+ demo: "",
300
+ sequence: 1,
301
+ });
302
+ insertGateRow({
303
+ milestoneId: "M001",
304
+ sliceId: "S01",
305
+ gateId: "Q3",
306
+ scope: "slice",
307
+ });
308
+
309
+ const prompt = await buildGateEvaluatePrompt(
310
+ "M001",
311
+ "Test Milestone",
312
+ "S01",
313
+ "Test Slice",
314
+ repo,
315
+ "claude-opus-4-6",
316
+ );
317
+
318
+ assert.ok(
319
+ prompt.includes("Context Mode (verification lane):"),
320
+ "embedded gate-evaluate prompt should use nested Context Mode guidance",
321
+ );
322
+ assert.ok(
323
+ prompt.includes("## Context Mode"),
324
+ "gate-evaluate parent prompt should include standalone Context Mode guidance",
325
+ );
326
+ assert.ok(prompt.includes('model: "claude-opus-4-6"'), "gate subagent prompt should preserve model instruction");
327
+ });
@@ -1,12 +1,10 @@
1
- // tool-naming — Verifies canonical + alias tool registration for GSD DB tools.
2
- //
3
- // Each DB tool must register under its canonical gsd_concept_action name
4
- // AND under a backward-compatible alias name.
5
- // The alias must share the exact same execute function reference as the canonical tool.
1
+ // Project/App: GSD-2
2
+ // File Purpose: Verifies canonical and alias DB tool registration plus legacy alias telemetry.
6
3
 
7
4
  import { test } from 'node:test';
8
5
  import assert from 'node:assert/strict';
9
6
  import { registerDbTools } from '../bootstrap/db-tools.ts';
7
+ import { getLegacyTelemetry, resetLegacyTelemetry } from '../legacy-telemetry.ts';
10
8
 
11
9
 
12
10
  // ─── Mock PI ──────────────────────────────────────────────────────────────────
@@ -66,9 +64,9 @@ for (const { canonical, alias } of RENAME_MAP) {
66
64
  assert.ok(aliasTool !== undefined, `Alias tool "${alias}" should be registered`);
67
65
  }
68
66
 
69
- // ─── Execute function identity ───────────────────────────────────────────────
67
+ // ─── Execute function wrapping ───────────────────────────────────────────────
70
68
 
71
- console.log('\n── Tool naming: execute function identity (===) ──');
69
+ console.log('\n── Tool naming: alias execute wrapper ──');
72
70
 
73
71
  for (const { canonical, alias } of RENAME_MAP) {
74
72
  const canonicalTool = pi.tools.find((t: any) => t.name === canonical);
@@ -76,12 +74,37 @@ for (const { canonical, alias } of RENAME_MAP) {
76
74
 
77
75
  if (canonicalTool && aliasTool) {
78
76
  assert.ok(
79
- canonicalTool.execute === aliasTool.execute,
80
- `"${canonical}" and "${alias}" should share the same execute function reference`,
77
+ canonicalTool.execute !== aliasTool.execute,
78
+ `"${alias}" should wrap "${canonical}" so alias usage can be counted`,
81
79
  );
82
80
  }
83
81
  }
84
82
 
83
+ test("alias execute increments legacy MCP alias telemetry before delegating", async () => {
84
+ const canonicalTool = pi.tools.find((t: any) => t.name === "gsd_decision_save");
85
+ const aliasTool = pi.tools.find((t: any) => t.name === "gsd_save_decision");
86
+ assert.ok(canonicalTool);
87
+ assert.ok(aliasTool);
88
+
89
+ const originalCanonicalExecute = canonicalTool.execute;
90
+ try {
91
+ resetLegacyTelemetry();
92
+ let delegated = false;
93
+ canonicalTool.execute = async () => {
94
+ delegated = true;
95
+ return { content: [{ type: "text", text: "ok" }], details: { ok: true } };
96
+ };
97
+
98
+ await aliasTool.execute("call-1", {}, undefined, undefined, undefined);
99
+
100
+ assert.equal(delegated, true);
101
+ assert.equal(getLegacyTelemetry()["legacy.mcpAliasUsed"], 1);
102
+ } finally {
103
+ canonicalTool.execute = originalCanonicalExecute;
104
+ resetLegacyTelemetry();
105
+ }
106
+ });
107
+
85
108
  // ─── Alias descriptions include "(alias for ...)" ───────────────────────────
86
109
 
87
110
  console.log('\n── Tool naming: alias descriptions ──');
@@ -1,6 +1,5 @@
1
- // GSD-2 — #4782 phase 2 composer tests. Pure-function tests using mock
2
- // resolvers plus an integration check that reassess-roadmap's migrated
3
- // builder produces a prompt matching expectations.
1
+ // Project/App: GSD-2
2
+ // File Purpose: Tests unit context composer rendering, budgets, and reassess-roadmap prompt integration.
4
3
 
5
4
  import test from "node:test";
6
5
  import assert from "node:assert/strict";
@@ -9,6 +8,7 @@ import { join } from "node:path";
9
8
  import { tmpdir } from "node:os";
10
9
 
11
10
  import {
11
+ composeContextModeInstructions,
12
12
  composeInlinedContext,
13
13
  composeUnitContext,
14
14
  manifestBudgetChars,
@@ -101,6 +101,44 @@ test("#4782 composer: manifestBudgetChars returns declared budget", () => {
101
101
  assert.strictEqual(manifestBudgetChars("never-dispatched"), null);
102
102
  });
103
103
 
104
+ test("Context Mode composer: disabled, unknown, and none modes return empty string", () => {
105
+ assert.strictEqual(
106
+ composeContextModeInstructions("execute-task", { enabled: false, renderMode: "standalone" }),
107
+ "",
108
+ );
109
+ assert.strictEqual(
110
+ composeContextModeInstructions("never-dispatched", { enabled: true, renderMode: "standalone" }),
111
+ "",
112
+ );
113
+ assert.strictEqual(
114
+ composeContextModeInstructions("workflow-preferences", { enabled: true, renderMode: "standalone" }),
115
+ "",
116
+ );
117
+ });
118
+
119
+ test("Context Mode composer: standalone output starts with heading and includes required tools", () => {
120
+ const out = composeContextModeInstructions("execute-task", { enabled: true, renderMode: "standalone" });
121
+ assert.ok(out.startsWith("## Context Mode"));
122
+ assert.match(out, /execution lane/i);
123
+ assert.match(out, /`gsd_exec`/);
124
+ assert.match(out, /noisy commands/);
125
+ assert.match(out, /`gsd_exec_search`/);
126
+ assert.match(out, /before reruns/);
127
+ assert.match(out, /`gsd_resume`/);
128
+ assert.match(out, /after compaction or resume/);
129
+ });
130
+
131
+ test("Context Mode composer: nested output is compact single sentence", () => {
132
+ const out = composeContextModeInstructions("gate-evaluate", { enabled: true, renderMode: "nested" });
133
+ assert.ok(!out.startsWith("## Context Mode"));
134
+ assert.match(out, /^Context Mode \(verification lane\): /);
135
+ assert.strictEqual(out.split(/\n/).length, 1);
136
+ assert.match(out, /`gsd_exec`/);
137
+ assert.match(out, /`gsd_exec_search`/);
138
+ assert.match(out, /`gsd_resume`/);
139
+ assert.ok(out.length < 180, `nested guidance should stay compact, got ${out.length} chars`);
140
+ });
141
+
104
142
  // ─── Integration: migrated buildReassessRoadmapPrompt ─────────────────────
105
143
 
106
144
  function makeFixtureBase(): string {
@@ -186,7 +224,7 @@ test("#4782 phase 2: buildReassessRoadmapPrompt emits composer-shaped context wi
186
224
 
187
225
  const fakeBase: BaseResolverContext = {
188
226
  unitType: "reassess-roadmap",
189
- basePath: "/tmp/fake",
227
+ basePath: process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd(),
190
228
  milestoneId: "M001",
191
229
  sliceId: "S01",
192
230
  };
@@ -12,6 +12,7 @@ import {
12
12
  UNIT_MANIFESTS,
13
13
  resolveManifest,
14
14
  type ArtifactKey,
15
+ type ContextModePolicy,
15
16
  type SkillsPolicy,
16
17
  type UnitContextManifest,
17
18
  } from "../unit-context-manifest.ts";
@@ -105,6 +106,37 @@ test("#4782 phase 1: every manifest has a positive maxSystemPromptChars", () =>
105
106
  }
106
107
  });
107
108
 
109
+ test("Context Mode: every manifest declares the expected contextMode lane", () => {
110
+ const expected: Record<string, ContextModePolicy> = {
111
+ "workflow-preferences": "none",
112
+ "research-decision": "none",
113
+ "discuss-project": "interview",
114
+ "discuss-requirements": "interview",
115
+ "discuss-milestone": "interview",
116
+ "research-project": "research",
117
+ "research-milestone": "research",
118
+ "research-slice": "research",
119
+ "plan-milestone": "planning",
120
+ "plan-slice": "planning",
121
+ "refine-slice": "planning",
122
+ "replan-slice": "planning",
123
+ "reassess-roadmap": "planning",
124
+ "execute-task": "execution",
125
+ "reactive-execute": "execution",
126
+ "run-uat": "verification",
127
+ "gate-evaluate": "verification",
128
+ "validate-milestone": "verification",
129
+ "complete-slice": "verification",
130
+ "complete-milestone": "verification",
131
+ "rewrite-docs": "docs",
132
+ };
133
+
134
+ assert.deepEqual(Object.keys(expected).sort(), [...KNOWN_UNIT_TYPES].sort());
135
+ for (const unitType of KNOWN_UNIT_TYPES) {
136
+ assert.strictEqual(UNIT_MANIFESTS[unitType].contextMode, expected[unitType]);
137
+ }
138
+ });
139
+
108
140
  test("#4782 phase 1: skills policy shapes are valid discriminated-union members", () => {
109
141
  for (const [unitType, manifest] of Object.entries(UNIT_MANIFESTS)) {
110
142
  const p = manifest.skills as SkillsPolicy;
@@ -1,5 +1,10 @@
1
+ // GSD2 UOK Contract Versioning and DB Authority Tests
2
+
1
3
  import test from "node:test";
2
4
  import assert from "node:assert/strict";
5
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
6
+ import { tmpdir } from "node:os";
7
+ import { join } from "node:path";
3
8
 
4
9
  import type {
5
10
  AuditEventEnvelope,
@@ -11,8 +16,17 @@ import type {
11
16
  WriteRecord,
12
17
  WriterToken,
13
18
  } from "../uok/contracts.ts";
14
- import { buildAuditEnvelope } from "../uok/audit.ts";
19
+ import {
20
+ CURRENT_UOK_CONTRACT_VERSION,
21
+ normalizeAuditEvent,
22
+ validateAuditEvent,
23
+ validateDispatchEnvelope,
24
+ validateTurnResult,
25
+ } from "../uok/contracts.ts";
26
+ import { buildAuditEnvelope, emitUokAuditEvent } from "../uok/audit.ts";
15
27
  import { buildDispatchEnvelope, explainDispatch } from "../uok/dispatch-envelope.ts";
28
+ import { buildTurnTimeline } from "../uok/timeline.ts";
29
+ import { _getAdapter, closeDatabase, openDatabase } from "../gsd-db.ts";
16
30
 
17
31
  test("uok contracts serialize/deserialize turn envelopes", () => {
18
32
  const contract: TurnContract = {
@@ -37,6 +51,7 @@ test("uok contracts serialize/deserialize turn envelopes", () => {
37
51
  };
38
52
 
39
53
  const result: TurnResult = {
54
+ version: CURRENT_UOK_CONTRACT_VERSION,
40
55
  traceId: contract.traceId,
41
56
  turnId: contract.turnId,
42
57
  iteration: contract.iteration,
@@ -56,8 +71,10 @@ test("uok contracts serialize/deserialize turn envelopes", () => {
56
71
 
57
72
  const roundTrip = JSON.parse(JSON.stringify(result)) as TurnResult;
58
73
  assert.equal(roundTrip.turnId, "turn-1");
74
+ assert.equal(roundTrip.version, CURRENT_UOK_CONTRACT_VERSION);
59
75
  assert.equal(roundTrip.gateResults?.[0]?.gateId, "Q3");
60
76
  assert.equal(roundTrip.phaseResults.length, 3);
77
+ assert.equal(validateTurnResult(roundTrip).ok, true);
61
78
  });
62
79
 
63
80
  test("uok contracts include required DAG node kinds", () => {
@@ -84,9 +101,11 @@ test("uok audit envelope includes trace/turn/causality fields", () => {
84
101
  });
85
102
 
86
103
  assert.equal(event.traceId, "trace-xyz");
104
+ assert.equal(event.version, CURRENT_UOK_CONTRACT_VERSION);
87
105
  assert.equal(event.turnId, "turn-xyz");
88
106
  assert.equal(event.causedBy, "turn-start");
89
107
  assert.equal(event.payload.status, "completed");
108
+ assert.equal(validateAuditEvent(event).ok, true);
90
109
  });
91
110
 
92
111
  test("uok dispatch envelope carries scheduler reason and constraints", () => {
@@ -107,9 +126,98 @@ test("uok dispatch envelope carries scheduler reason and constraints", () => {
107
126
  });
108
127
 
109
128
  assert.equal(envelope.nodeKind, "unit");
129
+ assert.equal(envelope.version, CURRENT_UOK_CONTRACT_VERSION);
110
130
  assert.equal(envelope.reason.reasonCode, "dependency");
111
131
  assert.deepEqual(envelope.constraints?.dependsOn, ["plan-gate"]);
112
132
  assert.ok(explainDispatch(envelope).includes("execute-task M001/S01/T01"));
133
+ assert.equal(validateDispatchEnvelope(envelope).ok, true);
134
+ });
135
+
136
+ test("uok contracts normalize legacy records without losing payload fields", () => {
137
+ const legacy = {
138
+ eventId: "event-legacy",
139
+ traceId: "trace-legacy",
140
+ category: "orchestration",
141
+ type: "turn-result",
142
+ ts: new Date().toISOString(),
143
+ payload: { status: "completed", extra: "preserved" },
144
+ } as AuditEventEnvelope;
145
+
146
+ const normalized = normalizeAuditEvent(legacy);
147
+ assert.equal(normalized.version, "0");
148
+ assert.equal(normalized.payload.extra, "preserved");
149
+ assert.equal(validateAuditEvent(legacy).ok, true);
150
+ });
151
+
152
+ test("uok audit emission writes DB as authoritative before jsonl projection", (t) => {
153
+ const basePath = mkdtempSync(join(tmpdir(), "gsd-uok-db-audit-"));
154
+ mkdirSync(join(basePath, ".gsd"), { recursive: true });
155
+ t.after(() => {
156
+ closeDatabase();
157
+ rmSync(basePath, { recursive: true, force: true });
158
+ });
159
+
160
+ assert.equal(openDatabase(join(basePath, ".gsd", "gsd.db")), true);
161
+ emitUokAuditEvent(
162
+ basePath,
163
+ buildAuditEnvelope({
164
+ traceId: "trace-db",
165
+ turnId: "turn-db",
166
+ category: "orchestration",
167
+ type: "turn-start",
168
+ payload: { unitType: "execute-task" },
169
+ }),
170
+ );
171
+
172
+ const row = _getAdapter()!.prepare(
173
+ "SELECT payload_json FROM audit_events WHERE trace_id = 'trace-db' AND turn_id = 'turn-db'",
174
+ ).get() as { payload_json: string } | undefined;
175
+ assert.ok(row, "DB audit row should be written");
176
+ assert.equal(JSON.parse(row.payload_json).contractVersion, CURRENT_UOK_CONTRACT_VERSION);
177
+
178
+ const projection = readFileSync(join(basePath, ".gsd", "audit", "events.jsonl"), "utf-8");
179
+ assert.ok(projection.includes("trace-db"), "jsonl projection should still be written");
180
+ });
181
+
182
+ test("uok timeline prefers DB records over jsonl projection when DB is available", (t) => {
183
+ const basePath = mkdtempSync(join(tmpdir(), "gsd-uok-timeline-"));
184
+ const auditDir = join(basePath, ".gsd", "audit");
185
+ mkdirSync(auditDir, { recursive: true });
186
+ writeFileSync(
187
+ join(auditDir, "events.jsonl"),
188
+ `${JSON.stringify({
189
+ version: CURRENT_UOK_CONTRACT_VERSION,
190
+ eventId: "jsonl-only",
191
+ traceId: "trace-timeline",
192
+ turnId: "turn-timeline",
193
+ category: "orchestration",
194
+ type: "jsonl-projection",
195
+ ts: "2026-01-01T00:00:00.000Z",
196
+ payload: {},
197
+ })}\n`,
198
+ );
199
+ t.after(() => {
200
+ closeDatabase();
201
+ rmSync(basePath, { recursive: true, force: true });
202
+ });
203
+
204
+ assert.equal(openDatabase(join(basePath, ".gsd", "gsd.db")), true);
205
+ emitUokAuditEvent(
206
+ basePath,
207
+ buildAuditEnvelope({
208
+ traceId: "trace-timeline",
209
+ turnId: "turn-timeline",
210
+ category: "orchestration",
211
+ type: "db-authoritative",
212
+ payload: {},
213
+ }),
214
+ );
215
+
216
+ const timeline = buildTurnTimeline(basePath, { traceId: "trace-timeline", turnId: "turn-timeline" });
217
+ assert.equal(timeline.authoritative, "db");
218
+ assert.equal(timeline.degraded, false);
219
+ assert.ok(timeline.entries.some((entry) => entry.type === "db-authoritative"));
220
+ assert.equal(timeline.entries.some((entry) => entry.type === "jsonl-projection"), false);
113
221
  });
114
222
 
115
223
  test("uok writer records serialize sequence metadata", () => {
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Verifies UOK kernel path selection and legacy fallback telemetry.
1
3
  import test from "node:test";
2
4
  import assert from "node:assert/strict";
3
5
  import { mkdtempSync, readFileSync, rmSync } from "node:fs";
@@ -11,6 +13,7 @@ import type { AutoSession } from "../auto/session.ts";
11
13
  import type { LoopDeps } from "../auto/loop-deps.ts";
12
14
  import { gsdRoot } from "../paths.ts";
13
15
  import type { GSDPreferences } from "../preferences.ts";
16
+ import { getLegacyTelemetry, resetLegacyTelemetry } from "../legacy-telemetry.ts";
14
17
 
15
18
  function makeBasePath(): string {
16
19
  return mkdtempSync(join(tmpdir(), "gsd-uok-kernel-"));
@@ -86,6 +89,7 @@ function readParityEvents(basePath: string): Array<Record<string, unknown>> {
86
89
  test("runAutoLoopWithUok uses kernel path by default and records uok-kernel parity", async () => {
87
90
  const basePath = makeBasePath();
88
91
  try {
92
+ resetLegacyTelemetry();
89
93
  const args = makeArgs(basePath, {
90
94
  uok: {
91
95
  enabled: true,
@@ -109,7 +113,9 @@ test("runAutoLoopWithUok uses kernel path by default and records uok-kernel pari
109
113
  assert.equal(events[1]?.path, "uok-kernel");
110
114
  assert.equal(events[1]?.phase, "exit");
111
115
  assert.equal(events[1]?.status, "ok");
116
+ assert.equal(getLegacyTelemetry()["legacy.uokFallbackUsed"], 0);
112
117
  } finally {
118
+ resetLegacyTelemetry();
113
119
  rmSync(basePath, { recursive: true, force: true });
114
120
  }
115
121
  });
@@ -117,6 +123,7 @@ test("runAutoLoopWithUok uses kernel path by default and records uok-kernel pari
117
123
  test("runAutoLoopWithUok uses legacy path when explicit legacy fallback is enabled", async () => {
118
124
  const basePath = makeBasePath();
119
125
  try {
126
+ resetLegacyTelemetry();
120
127
  const args = makeArgs(basePath, {
121
128
  uok: {
122
129
  enabled: true,
@@ -134,7 +141,9 @@ test("runAutoLoopWithUok uses legacy path when explicit legacy fallback is enabl
134
141
  assert.equal(events[0]?.path, "legacy-fallback");
135
142
  assert.equal(events[1]?.path, "legacy-fallback");
136
143
  assert.equal(events[1]?.status, "ok");
144
+ assert.equal(getLegacyTelemetry()["legacy.uokFallbackUsed"], 1);
137
145
  } finally {
146
+ resetLegacyTelemetry();
138
147
  rmSync(basePath, { recursive: true, force: true });
139
148
  }
140
149
  });
@@ -144,6 +153,7 @@ test("runAutoLoopWithUok respects GSD_UOK_FORCE_LEGACY emergency switch", async
144
153
  const previous = process.env.GSD_UOK_FORCE_LEGACY;
145
154
  process.env.GSD_UOK_FORCE_LEGACY = "1";
146
155
  try {
156
+ resetLegacyTelemetry();
147
157
  const args = makeArgs(basePath, {
148
158
  uok: {
149
159
  enabled: true,
@@ -158,7 +168,9 @@ test("runAutoLoopWithUok respects GSD_UOK_FORCE_LEGACY emergency switch", async
158
168
  assert.equal(events.length, 2);
159
169
  assert.equal(events[0]?.path, "legacy-fallback");
160
170
  assert.equal(events[1]?.path, "legacy-fallback");
171
+ assert.equal(getLegacyTelemetry()["legacy.uokFallbackUsed"], 1);
161
172
  } finally {
173
+ resetLegacyTelemetry();
162
174
  if (previous === undefined) delete process.env.GSD_UOK_FORCE_LEGACY;
163
175
  else process.env.GSD_UOK_FORCE_LEGACY = previous;
164
176
  rmSync(basePath, { recursive: true, force: true });
@@ -63,3 +63,101 @@ test("uok turn observer adds writer sequence metadata to audit events", (t) => {
63
63
  assert.equal(payloads[1]?.writeSequence, 2);
64
64
  assert.equal(typeof payloads[0]?.writerTokenId, "string");
65
65
  });
66
+
67
+ test("uok turn observer releases writer token when validation throws", (t) => {
68
+ const basePath = mkdtempSync(join(tmpdir(), "gsd-uok-loop-writer-throw-"));
69
+ resetWriterTokensForTests();
70
+ t.after(() => {
71
+ resetWriterTokensForTests();
72
+ rmSync(basePath, { recursive: true, force: true });
73
+ });
74
+
75
+ const observer = createTurnObserver({
76
+ basePath,
77
+ gitAction: "status-only",
78
+ gitPush: false,
79
+ enableAudit: false,
80
+ enableGitops: false,
81
+ });
82
+
83
+ observer.onTurnStart({
84
+ basePath,
85
+ traceId: "trace-throw",
86
+ turnId: "turn-throw",
87
+ iteration: 1,
88
+ unitType: "execute-task",
89
+ unitId: "M001/S01/T01",
90
+ startedAt: new Date().toISOString(),
91
+ });
92
+ assert.equal(hasActiveWriterToken(basePath, "turn-throw"), true);
93
+
94
+ // Invalid payload (missing required fields like status/finishedAt) should
95
+ // trigger validateTurnResult to fail and throw.
96
+ assert.throws(() => {
97
+ observer.onTurnResult({
98
+ traceId: "trace-throw",
99
+ turnId: "turn-throw",
100
+ // @ts-expect-error intentionally invalid for test
101
+ iteration: "not-a-number",
102
+ unitType: "execute-task",
103
+ unitId: "M001/S01/T01",
104
+ status: "completed",
105
+ failureClass: "none",
106
+ phaseResults: [],
107
+ startedAt: new Date().toISOString(),
108
+ finishedAt: new Date().toISOString(),
109
+ });
110
+ }, /Invalid UOK turn result/);
111
+
112
+ // Cleanup must run in finally — token released, no leaked state.
113
+ assert.equal(hasActiveWriterToken(basePath, "turn-throw"), false);
114
+ });
115
+
116
+ test("uok turn observer falls back to cached phaseResults when result.phaseResults is missing", (t) => {
117
+ const basePath = mkdtempSync(join(tmpdir(), "gsd-uok-loop-writer-missing-"));
118
+ resetWriterTokensForTests();
119
+ t.after(() => {
120
+ resetWriterTokensForTests();
121
+ rmSync(basePath, { recursive: true, force: true });
122
+ });
123
+
124
+ const observer = createTurnObserver({
125
+ basePath,
126
+ gitAction: "status-only",
127
+ gitPush: false,
128
+ enableAudit: false,
129
+ enableGitops: false,
130
+ });
131
+
132
+ observer.onTurnStart({
133
+ basePath,
134
+ traceId: "trace-missing",
135
+ turnId: "turn-missing",
136
+ iteration: 1,
137
+ unitType: "execute-task",
138
+ unitId: "M001/S01/T01",
139
+ startedAt: new Date().toISOString(),
140
+ });
141
+
142
+ // Without the Array.isArray guard, accessing result.phaseResults.length on a
143
+ // payload where phaseResults is undefined would throw TypeError before
144
+ // validateTurnResult could surface a structured error. The guard must defer
145
+ // to the cached phaseResults fallback so the turn completes cleanly.
146
+ assert.doesNotThrow(() => {
147
+ observer.onTurnResult({
148
+ traceId: "trace-missing",
149
+ turnId: "turn-missing",
150
+ iteration: 1,
151
+ unitType: "execute-task",
152
+ unitId: "M001/S01/T01",
153
+ status: "completed",
154
+ failureClass: "none",
155
+ // @ts-expect-error intentionally missing for test
156
+ phaseResults: undefined,
157
+ startedAt: new Date().toISOString(),
158
+ finishedAt: new Date().toISOString(),
159
+ });
160
+ });
161
+
162
+ assert.equal(hasActiveWriterToken(basePath, "turn-missing"), false);
163
+ });
@@ -0,0 +1,55 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Unit tests for custom-engine dispatch outcome side-effect adapter.
3
+
4
+ import assert from "node:assert/strict";
5
+ import test from "node:test";
6
+
7
+ import { handleCustomEngineDispatchOutcome } from "../auto/workflow-custom-engine-dispatch-outcome.ts";
8
+
9
+ test("handleCustomEngineDispatchOutcome stops auto on stop decision", async () => {
10
+ const calls: unknown[] = [];
11
+
12
+ const flow = await handleCustomEngineDispatchOutcome({
13
+ decision: { action: "stop", reason: "done" },
14
+ deps: {
15
+ stopAuto: async reason => {
16
+ calls.push(["stopAuto", reason]);
17
+ },
18
+ },
19
+ });
20
+
21
+ assert.deepEqual(flow, { action: "break" });
22
+ assert.deepEqual(calls, [["stopAuto", "done"]]);
23
+ });
24
+
25
+ test("handleCustomEngineDispatchOutcome continues on skip decision", async () => {
26
+ const calls: unknown[] = [];
27
+
28
+ const flow = await handleCustomEngineDispatchOutcome({
29
+ decision: { action: "skip" },
30
+ deps: {
31
+ stopAuto: async reason => {
32
+ calls.push(["stopAuto", reason]);
33
+ },
34
+ },
35
+ });
36
+
37
+ assert.deepEqual(flow, { action: "continue" });
38
+ assert.deepEqual(calls, []);
39
+ });
40
+
41
+ test("handleCustomEngineDispatchOutcome dispatches without side effects", async () => {
42
+ const calls: unknown[] = [];
43
+
44
+ const flow = await handleCustomEngineDispatchOutcome({
45
+ decision: { action: "dispatch" },
46
+ deps: {
47
+ stopAuto: async reason => {
48
+ calls.push(["stopAuto", reason]);
49
+ },
50
+ },
51
+ });
52
+
53
+ assert.deepEqual(flow, { action: "dispatch" });
54
+ assert.deepEqual(calls, []);
55
+ });