gsd-pi 2.77.0-dev.eaa4973bc → 2.78.0-dev.aeeb2ca00

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 (545) hide show
  1. package/README.md +53 -17
  2. package/dist/claude-cli-check.js +46 -10
  3. package/dist/headless.js +49 -4
  4. package/dist/resource-loader.d.ts +40 -0
  5. package/dist/resource-loader.js +32 -13
  6. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  7. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  8. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  9. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  10. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  11. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  12. package/dist/resources/extensions/claude-code-cli/readiness.js +72 -16
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +481 -17
  14. package/dist/resources/extensions/github-sync/templates.js +103 -0
  15. package/dist/resources/extensions/google-search/index.js +3 -2
  16. package/dist/resources/extensions/gsd/auto/loop.js +124 -2
  17. package/dist/resources/extensions/gsd/auto/phases.js +57 -39
  18. package/dist/resources/extensions/gsd/auto/session.js +6 -2
  19. package/dist/resources/extensions/gsd/auto-dispatch.js +142 -29
  20. package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
  21. package/dist/resources/extensions/gsd/auto-post-unit.js +150 -64
  22. package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
  23. package/dist/resources/extensions/gsd/auto-recovery.js +197 -48
  24. package/dist/resources/extensions/gsd/auto-start.js +107 -29
  25. package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
  26. package/dist/resources/extensions/gsd/auto-worktree.js +122 -26
  27. package/dist/resources/extensions/gsd/auto.js +76 -21
  28. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
  29. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
  30. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +3 -6
  31. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
  32. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
  33. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  34. package/dist/resources/extensions/gsd/component-types.js +69 -0
  35. package/dist/resources/extensions/gsd/context-store.js +23 -7
  36. package/dist/resources/extensions/gsd/detection.js +49 -1
  37. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -17
  38. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  39. package/dist/resources/extensions/gsd/forensics.js +106 -0
  40. package/dist/resources/extensions/gsd/gate-registry.js +2 -2
  41. package/dist/resources/extensions/gsd/git-constants.js +28 -1
  42. package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
  43. package/dist/resources/extensions/gsd/git-service.js +126 -2
  44. package/dist/resources/extensions/gsd/gsd-db.js +6 -3
  45. package/dist/resources/extensions/gsd/guided-flow.js +39 -13
  46. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  47. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  48. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  49. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  50. package/dist/resources/extensions/gsd/model-router.js +6 -0
  51. package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
  52. package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
  53. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  54. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  55. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  56. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  57. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  58. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
  59. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  60. package/dist/resources/extensions/gsd/session-lock.js +19 -10
  61. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  62. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  63. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
  64. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  65. package/dist/resources/extensions/gsd/state.js +69 -58
  66. package/dist/resources/extensions/gsd/sync-lock.js +98 -42
  67. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  68. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  69. package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
  70. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  71. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  72. package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
  73. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  74. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  75. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  76. package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
  77. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  78. package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
  79. package/dist/resources/extensions/gsd/worktree-manager.js +85 -8
  80. package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
  81. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  82. package/dist/resources/extensions/mcp-client/index.js +3 -1
  83. package/dist/resources/extensions/ollama/index.js +5 -1
  84. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  85. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  86. package/dist/web/standalone/.next/BUILD_ID +1 -1
  87. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  88. package/dist/web/standalone/.next/build-manifest.json +2 -2
  89. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  90. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/index.html +1 -1
  108. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  115. package/dist/web/standalone/.next/server/chunks/1926.js +1 -1
  116. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  117. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  119. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  120. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  121. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  122. package/package.json +2 -3
  123. package/packages/daemon/package.json +2 -2
  124. package/packages/daemon/src/logger.ts +4 -3
  125. package/packages/mcp-server/dist/server.d.ts +24 -0
  126. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  127. package/packages/mcp-server/dist/server.js +88 -87
  128. package/packages/mcp-server/dist/server.js.map +1 -1
  129. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  130. package/packages/mcp-server/dist/workflow-tools.js +15 -6
  131. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  132. package/packages/mcp-server/package.json +2 -2
  133. package/packages/mcp-server/src/mcp-server.test.ts +25 -3
  134. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  135. package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
  136. package/packages/mcp-server/src/server.ts +131 -105
  137. package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
  138. package/packages/mcp-server/src/workflow-tools.ts +19 -6
  139. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  140. package/packages/native/package.json +2 -2
  141. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  142. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  143. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  144. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  145. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  146. package/packages/pi-agent-core/package.json +1 -1
  147. package/packages/pi-agent-core/src/agent-loop.test.ts +5 -15
  148. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  149. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  150. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  151. package/packages/pi-ai/dist/models/capability-patches.js +9 -2
  152. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  153. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  154. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  155. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  156. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  157. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  158. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  159. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  160. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  161. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  162. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  163. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  164. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  165. package/packages/pi-ai/dist/models.test.js +36 -11
  166. package/packages/pi-ai/dist/models.test.js.map +1 -1
  167. package/packages/pi-ai/package.json +1 -1
  168. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  169. package/packages/pi-ai/src/models/capability-patches.ts +10 -2
  170. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  171. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  172. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  173. package/packages/pi-ai/src/models.test.ts +48 -11
  174. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  175. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
  176. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  177. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  178. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  180. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  181. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  182. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/extensions/loader.js +61 -0
  184. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +30 -4
  186. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +17 -0
  188. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  190. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  192. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  193. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  194. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  195. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  197. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  198. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  199. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  200. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  201. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -2
  203. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  204. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  205. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  206. package/packages/pi-coding-agent/dist/index.js +1 -0
  207. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  209. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  210. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  211. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  212. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  214. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  216. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
  217. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  218. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +125 -0
  219. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
  221. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  224. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  225. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
  226. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  227. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  228. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  229. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  230. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  231. package/packages/pi-coding-agent/package.json +1 -1
  232. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
  233. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  234. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  235. package/packages/pi-coding-agent/src/core/extensions/loader.ts +58 -0
  236. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +35 -4
  237. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +20 -0
  238. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  239. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  240. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  241. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  242. package/packages/pi-coding-agent/src/core/system-prompt.ts +35 -1
  243. package/packages/pi-coding-agent/src/index.ts +1 -0
  244. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  245. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  246. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  247. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +146 -1
  248. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
  249. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
  250. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
  251. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  252. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  253. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +18 -8
  254. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  255. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  256. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  257. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +37 -11
  258. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  259. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  260. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  261. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  262. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  263. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  264. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  265. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  266. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  267. package/packages/pi-tui/dist/components/editor.d.ts +14 -0
  268. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  269. package/packages/pi-tui/dist/components/editor.js +19 -0
  270. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  271. package/packages/pi-tui/dist/components/image.test.js +6 -5
  272. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  273. package/packages/pi-tui/dist/editor-component.d.ts +2 -0
  274. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
  275. package/packages/pi-tui/dist/editor-component.js.map +1 -1
  276. package/packages/pi-tui/package.json +1 -1
  277. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +24 -8
  278. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  279. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +42 -11
  280. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  281. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  282. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  283. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  284. package/packages/pi-tui/src/components/editor.ts +22 -0
  285. package/packages/pi-tui/src/components/image.test.ts +10 -5
  286. package/packages/pi-tui/src/editor-component.ts +3 -0
  287. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  288. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  289. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  290. package/packages/rpc-client/package.json +1 -1
  291. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  292. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  293. package/pkg/package.json +1 -1
  294. package/scripts/install.js +15 -1
  295. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  296. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  297. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  298. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  299. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  300. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  301. package/src/resources/extensions/claude-code-cli/readiness.ts +75 -16
  302. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +518 -19
  303. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +919 -75
  304. package/src/resources/extensions/github-sync/templates.ts +151 -0
  305. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  306. package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
  307. package/src/resources/extensions/google-search/index.ts +3 -2
  308. package/src/resources/extensions/gsd/auto/loop.ts +142 -2
  309. package/src/resources/extensions/gsd/auto/phases.ts +62 -38
  310. package/src/resources/extensions/gsd/auto/session.ts +7 -2
  311. package/src/resources/extensions/gsd/auto-dispatch.ts +156 -29
  312. package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
  313. package/src/resources/extensions/gsd/auto-post-unit.ts +163 -73
  314. package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
  315. package/src/resources/extensions/gsd/auto-recovery.ts +230 -51
  316. package/src/resources/extensions/gsd/auto-start.ts +127 -9
  317. package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
  318. package/src/resources/extensions/gsd/auto-worktree.ts +130 -26
  319. package/src/resources/extensions/gsd/auto.ts +90 -23
  320. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
  321. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
  322. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +3 -7
  323. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
  324. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
  325. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  326. package/src/resources/extensions/gsd/component-types.ts +362 -0
  327. package/src/resources/extensions/gsd/context-store.ts +25 -8
  328. package/src/resources/extensions/gsd/detection.ts +58 -1
  329. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -20
  330. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  331. package/src/resources/extensions/gsd/forensics.ts +118 -1
  332. package/src/resources/extensions/gsd/gate-registry.ts +2 -2
  333. package/src/resources/extensions/gsd/git-constants.ts +30 -1
  334. package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
  335. package/src/resources/extensions/gsd/git-service.ts +149 -2
  336. package/src/resources/extensions/gsd/gsd-db.ts +6 -3
  337. package/src/resources/extensions/gsd/guided-flow.ts +57 -14
  338. package/src/resources/extensions/gsd/journal.ts +11 -1
  339. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  340. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  341. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  342. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  343. package/src/resources/extensions/gsd/model-router.ts +6 -0
  344. package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
  345. package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
  346. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  347. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  348. package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  349. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  350. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  351. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
  352. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  353. package/src/resources/extensions/gsd/session-lock.ts +20 -10
  354. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  355. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  356. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
  357. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  358. package/src/resources/extensions/gsd/state.ts +76 -66
  359. package/src/resources/extensions/gsd/sync-lock.ts +97 -39
  360. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
  361. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  362. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
  363. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
  364. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +133 -292
  365. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  366. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
  367. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
  368. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +93 -0
  369. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  370. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
  371. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +3 -2
  372. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  373. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  374. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  375. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
  376. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  377. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  378. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  379. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  380. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  381. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
  382. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  383. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  384. package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
  385. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  386. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  387. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  388. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  389. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
  390. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
  391. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  392. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
  393. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
  394. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
  395. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
  396. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  397. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  398. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +5 -0
  399. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  400. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  401. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
  402. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  403. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  404. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  405. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  406. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
  407. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  408. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
  409. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +14 -4
  410. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  411. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  412. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
  413. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
  414. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  415. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  416. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
  417. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
  418. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
  419. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  420. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  421. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
  422. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  423. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +8 -37
  424. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  425. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
  426. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  427. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  428. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  429. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  430. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
  431. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  432. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  433. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
  434. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  435. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
  436. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  437. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  438. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  439. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +23 -24
  440. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +32 -0
  441. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  442. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  443. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
  444. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  445. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  446. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  447. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  448. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
  449. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  450. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  451. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
  452. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  453. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  454. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  455. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  456. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  457. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  458. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  459. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
  460. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  461. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  462. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
  463. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  464. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  465. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  466. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  467. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  468. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
  469. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  470. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  471. package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
  472. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  473. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
  474. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
  475. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  476. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
  477. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  478. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  479. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
  480. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  481. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  482. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  483. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
  484. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  485. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +12 -0
  486. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
  487. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  488. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  489. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  490. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
  491. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  492. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  493. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  494. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  495. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  496. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
  497. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
  498. package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
  499. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
  500. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  501. package/src/resources/extensions/gsd/types.ts +3 -3
  502. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  503. package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
  504. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  505. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  506. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  507. package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
  508. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  509. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  510. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  511. package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
  512. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  513. package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
  514. package/src/resources/extensions/gsd/worktree-manager.ts +108 -7
  515. package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
  516. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  517. package/src/resources/extensions/mcp-client/index.ts +3 -1
  518. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  519. package/src/resources/extensions/ollama/index.ts +5 -1
  520. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  521. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  522. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  523. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  524. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  525. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  526. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
  527. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
  528. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
  529. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
  530. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
  531. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
  532. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -157
  533. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  534. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  535. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  536. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  537. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  538. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
  539. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  540. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  541. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  542. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  543. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
  544. /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → cAJH99yNS1UPbeSEiNRrV}/_buildManifest.js +0 -0
  545. /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → cAJH99yNS1UPbeSEiNRrV}/_ssgManifest.js +0 -0
@@ -0,0 +1,574 @@
1
+ // GSD-2 — UnitContextManifest (#4782 phase 1).
2
+ //
3
+ // Declarative description of what context each auto-mode unit type needs
4
+ // in its system prompt. Establishes the contract that later phases will
5
+ // use to drive a single composeSystemPromptForUnit() — replacing the
6
+ // per-unit-type branching currently spread across `auto-prompts.ts`.
7
+ //
8
+ // **Phase 1 ships the type + the data + a CI coverage guard.** It adds
9
+ // zero wiring — no caller reads a manifest yet. Every unit type gets a
10
+ // manifest that describes today's behavior as faithfully as possible, so
11
+ // when the composer lands in phase 2 the migration can proceed manifest-
12
+ // by-manifest without behavior change.
13
+ //
14
+ // Phased rollout tracking:
15
+ // - Phase 1 (this PR): schema + manifests + coverage test.
16
+ // - Phase 2: add composeSystemPromptForUnit(); migrate one low-risk
17
+ // unit type (e.g. reassess-roadmap) as the pilot.
18
+ // - Phase 3: migrate remaining unit types, tighten manifests per
19
+ // empirical usage, introduce skipWhen predicates absorbing the
20
+ // reassess opt-in gate from #4778.
21
+ // - Phase 4: introduce pipeline variants as declared sequences,
22
+ // absorbing the scope-classifier gates from #4781.
23
+ //
24
+ // Naming:
25
+ // - Artifact keys are STABLE strings (not paths). Path resolution is
26
+ // the composer's job; manifests describe intent, not disk layout.
27
+ // - Char budgets are nominal — blown budgets log a telemetry event,
28
+ // they do not truncate or error (the composer decides fallback).
29
+
30
+ // ─── Artifact registry ────────────────────────────────────────────────────
31
+
32
+ /**
33
+ * Stable identifiers for every artifact class a unit might inline, excerpt,
34
+ * or reference on-demand. Adding a new artifact class requires (a) a key
35
+ * here, (b) path/body resolution in the composer, and (c) updates to any
36
+ * manifest that should surface it.
37
+ */
38
+ export const ARTIFACT_KEYS = [
39
+ // Milestone-scoped
40
+ "roadmap",
41
+ "milestone-context",
42
+ "milestone-summary",
43
+ "milestone-validation",
44
+ "milestone-research",
45
+ "milestone-plan",
46
+ // Slice-scoped
47
+ "slice-context",
48
+ "slice-research",
49
+ "slice-plan",
50
+ "slice-summary",
51
+ "slice-uat",
52
+ "slice-assessment",
53
+ // Task-scoped
54
+ "task-plan",
55
+ "task-summary",
56
+ "prior-task-summaries",
57
+ "dependency-summaries",
58
+ // Project-scoped
59
+ "requirements",
60
+ "decisions",
61
+ "project",
62
+ "templates",
63
+ ] as const;
64
+
65
+ export type ArtifactKey = typeof ARTIFACT_KEYS[number];
66
+
67
+ // ─── Policy types ─────────────────────────────────────────────────────────
68
+
69
+ /**
70
+ * Skill catalog policy. `all` preserves today's default: the full catalog
71
+ * is stamped into the prompt. `allowlist` narrows to the named skills.
72
+ * `none` suppresses the catalog entirely.
73
+ *
74
+ * The allowlist mode pairs with `skill-manifest.ts` (#4779) — entries
75
+ * there are the source of truth for "which skills are dispatched for a
76
+ * unit type"; this manifest carries the policy shape so the composer
77
+ * can unify the two surfaces in phase 2.
78
+ */
79
+ export type SkillsPolicy =
80
+ | { readonly mode: "none" }
81
+ | { readonly mode: "all" }
82
+ | { readonly mode: "allowlist"; readonly skills: readonly string[] };
83
+
84
+ /** Knowledge block policy — see `bootstrap/system-context.ts` loadKnowledgeBlock. */
85
+ export type KnowledgePolicy = "none" | "critical-only" | "scoped" | "full";
86
+
87
+ /** Memory store policy — see `bootstrap/system-context.ts` loadMemoryBlock. */
88
+ export type MemoryPolicy = "none" | "critical-only" | "prompt-relevant";
89
+
90
+ /** Preferences block policy. */
91
+ export type PreferencesPolicy = "none" | "active-only" | "full";
92
+
93
+ /**
94
+ * Tool-access policy per unit type (#4934).
95
+ *
96
+ * Declarative-only in this PR — runtime enforcement (write-gate.ts predicate
97
+ * + dispatch-time isolation) lands in follow-up PRs. The shape is the
98
+ * agreement between manifest authors and enforcement; surfacing it now lets
99
+ * reviewers ratify per-unit policy intent before any blocking logic ships.
100
+ *
101
+ * Modes:
102
+ * - "all" — Read + Edit/Write/MultiEdit/NotebookEdit + Bash + Task.
103
+ * The unit may modify any file in the working tree.
104
+ * Reserved for execute-task / reactive-execute, which run
105
+ * in worktrees today and whose writes are committed.
106
+ * - "read-only" — Read tools only. No file mutation. No shell. No subagent
107
+ * dispatch. Reserved for future units that should be
108
+ * strictly observational (none today).
109
+ * - "planning" — Read tools always; writes restricted to .gsd/** under
110
+ * basePath; Bash limited to a per-unit safe allowlist;
111
+ * Task subagent dispatch denied. Catches the bug class
112
+ * where a discuss-milestone turn modifies user source
113
+ * files (forensics: ~/Github/test-apps/b23, #4934).
114
+ * - "docs" — Read tools always; writes restricted to .gsd/** AND
115
+ * the explicit `allowedPathGlobs` set; Bash safe-allowlist;
116
+ * no subagents. Reserved for rewrite-docs, which legitimately
117
+ * edits project markdown outside .gsd/.
118
+ *
119
+ * The allowlist for "docs" is declared per-manifest rather than hardcoded so
120
+ * projects with non-standard doc layouts can extend it without forking the
121
+ * enforcement code (open question for the wiring PR — exact representation
122
+ * may shift). Globs are interpreted relative to the project basePath.
123
+ */
124
+ export type ToolsPolicy =
125
+ | { readonly mode: "all" }
126
+ | { readonly mode: "read-only" }
127
+ | { readonly mode: "planning" }
128
+ | { readonly mode: "docs"; readonly allowedPathGlobs: readonly string[] };
129
+
130
+ // ─── Computed-artifact registry (#4924 v2 contract) ───────────────────────
131
+
132
+ /**
133
+ * Typed registry of computed-artifact ids → their per-call input shape.
134
+ *
135
+ * **This is the core anti-`extra: Record<string, unknown>` surface.** Each
136
+ * computed block a unit may emit is registered here with an explicit input
137
+ * type. Adding a new computed block requires extending this interface — a
138
+ * deliberate, reviewable change rather than a silent ad-hoc field.
139
+ *
140
+ * Consumers extend via module augmentation if a downstream package needs to
141
+ * register new computed ids (rare in-tree; no public API today). The repo's
142
+ * own computed blocks are declared inline below.
143
+ *
144
+ * Invariant: the value type for each id MUST be a plain serializable shape.
145
+ * No closures, no class instances, no `any`. If a builder needs framework
146
+ * state, declare the specific fields it needs — don't smuggle objects.
147
+ */
148
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
149
+ export interface ComputedArtifactInputs {
150
+ // Phase 3.5 (v2 contract PR — #4924): no computed ids are registered yet.
151
+ // Each follow-up batch (slice prompt, replan-slice, gate-evaluate, etc.)
152
+ // adds the ids it needs as part of its migration commit.
153
+ //
154
+ // Example shape an upcoming batch will register:
155
+ // "slice-handoff-anchors": { sliceId: string; phase: string };
156
+ // "roadmap-excerpt": { milestoneId: string; aroundSlice: string };
157
+ // "graph-subgraph": { rootArtifact: ArtifactKey };
158
+ // "blocker-task-summary": { sliceId: string };
159
+ // "overrides-banner": { /* basePath via BaseResolverContext */ };
160
+ }
161
+
162
+ /** Stable string ids for registered computed artifacts. */
163
+ export type ComputedArtifactId = keyof ComputedArtifactInputs & string;
164
+
165
+ /**
166
+ * Always-present context the composer hands every computed-artifact builder.
167
+ * Carries unit-shape fields that don't belong in per-id input types because
168
+ * every builder needs them (path resolution, dispatch identity).
169
+ */
170
+ export interface BaseResolverContext {
171
+ readonly unitType: string;
172
+ readonly basePath: string;
173
+ readonly milestoneId?: string;
174
+ readonly sliceId?: string;
175
+ readonly taskId?: string;
176
+ }
177
+
178
+ /**
179
+ * Builder signature for one computed artifact id. Returns the rendered
180
+ * block body (joined into the composed prompt at the manifest-declared
181
+ * position) or `null` to omit the block entirely.
182
+ */
183
+ export type ComputedArtifactBuilder<K extends ComputedArtifactId> = (
184
+ inputs: ComputedArtifactInputs[K],
185
+ base: BaseResolverContext,
186
+ ) => Promise<string | null>;
187
+
188
+ /**
189
+ * Per-call registry: for each computed id the manifest declares, the
190
+ * caller supplies the matching builder + the input value for this call.
191
+ *
192
+ * Runtime shape: `{ [id]: { build, inputs } }`. Type narrowing per key is
193
+ * handled inside the composer via the `ComputedArtifactInputs` map — calls
194
+ * stay type-safe across the registration boundary.
195
+ */
196
+ export type ComputedArtifactRegistry = {
197
+ readonly [K in ComputedArtifactId]?: {
198
+ readonly build: ComputedArtifactBuilder<K>;
199
+ readonly inputs: ComputedArtifactInputs[K];
200
+ };
201
+ };
202
+
203
+ // ─── Manifest ─────────────────────────────────────────────────────────────
204
+
205
+ export interface UnitContextManifest {
206
+ /** Skills catalog shape to surface. */
207
+ readonly skills: SkillsPolicy;
208
+ /** Knowledge block policy. */
209
+ readonly knowledge: KnowledgePolicy;
210
+ /** Memory store policy. */
211
+ readonly memory: MemoryPolicy;
212
+ /** Whether CODEBASE.md is inlined. */
213
+ readonly codebaseMap: boolean;
214
+ /** Preferences block policy. */
215
+ readonly preferences: PreferencesPolicy;
216
+ /**
217
+ * Tool-access policy (#4934). Declarative in this PR; runtime enforcement
218
+ * (path-scoped write blocking + subagent denial + bash allowlist) lands
219
+ * in follow-ups. Required on every manifest so missing entries fail loud
220
+ * via the CI invariant test rather than defaulting to "all" silently.
221
+ */
222
+ readonly tools: ToolsPolicy;
223
+ /** Artifact handling: inline (full body), excerpt (compact), or on-demand (path only). */
224
+ readonly artifacts: {
225
+ readonly inline: readonly ArtifactKey[];
226
+ readonly excerpt: readonly ArtifactKey[];
227
+ readonly onDemand: readonly ArtifactKey[];
228
+ /**
229
+ * Ordered list of computed-block ids emitted in the inline position
230
+ * (interleaved with `inline` in declared order — see composer for the
231
+ * exact merge rule). v2 contract addition (#4924). Unknown ids fail
232
+ * the manifest validator; absent registry entries are skipped silently.
233
+ */
234
+ readonly computed?: readonly ComputedArtifactId[];
235
+ };
236
+ /**
237
+ * Ordered list of computed-block ids emitted ABOVE the main inlined
238
+ * context block. Models the existing pattern of overrides / banners
239
+ * that some builders prepend with `inlined.unshift(...)`. v2 contract
240
+ * addition (#4924).
241
+ */
242
+ readonly prepend?: readonly ComputedArtifactId[];
243
+ /**
244
+ * Nominal upper bound for composer-generated system prompt size, in
245
+ * characters. Phase 2 composer logs telemetry when a unit exceeds its
246
+ * budget; truncation is not enforced. Set conservatively — today's
247
+ * observed maxima come from `complete-milestone` (~1.2M tokens cached;
248
+ * ~4.8M chars) and `validate-milestone` (~300K tokens; ~1.2M chars).
249
+ */
250
+ readonly maxSystemPromptChars: number;
251
+ }
252
+
253
+ // ─── Manifests ────────────────────────────────────────────────────────────
254
+
255
+ // Phase 1 policy: every manifest encodes today's behavior. Skills = "all"
256
+ // unless the unit type was already narrowed via the existing skill-manifest
257
+ // resolver (#4779). Memory/knowledge policies reflect the defaults in
258
+ // `bootstrap/system-context.ts`. Artifact classifications follow what
259
+ // `auto-prompts.ts` inlines today for each unit type.
260
+
261
+ const COMMON_BUDGET_LARGE = 1_500_000; // ~400K tokens
262
+ const COMMON_BUDGET_MEDIUM = 750_000; // ~200K tokens
263
+ const COMMON_BUDGET_SMALL = 250_000; // ~65K tokens
264
+
265
+ // ─── Tool policy constants (#4934) ────────────────────────────────────────
266
+ // Reused across manifests so per-unit assignment stays declarative and the
267
+ // allowed-path set for the docs policy lives in one reviewable place.
268
+
269
+ const TOOLS_ALL: ToolsPolicy = { mode: "all" };
270
+ const TOOLS_PLANNING: ToolsPolicy = { mode: "planning" };
271
+ const TOOLS_DOCS: ToolsPolicy = {
272
+ mode: "docs",
273
+ // Globs are resolved relative to project basePath. The set is intentionally
274
+ // narrow: top-level docs/, README, CHANGELOG, and any markdown at the
275
+ // project root. Projects with non-standard layouts (e.g. mintlify-docs/)
276
+ // will need this list extended in a follow-up; landed conservative now,
277
+ // expand on demand.
278
+ allowedPathGlobs: [
279
+ "docs/**",
280
+ "README.md",
281
+ "README.*.md",
282
+ "CHANGELOG.md",
283
+ "*.md",
284
+ ],
285
+ };
286
+
287
+ /**
288
+ * Canonical unit types handled by auto-mode dispatch. The coverage test
289
+ * enumerates these against `UNIT_MANIFESTS` to catch manifest drift when
290
+ * a new unit type lands.
291
+ */
292
+ export const KNOWN_UNIT_TYPES = [
293
+ "research-milestone",
294
+ "plan-milestone",
295
+ "discuss-milestone",
296
+ "validate-milestone",
297
+ "complete-milestone",
298
+ "research-slice",
299
+ "plan-slice",
300
+ "refine-slice",
301
+ "replan-slice",
302
+ "complete-slice",
303
+ "reassess-roadmap",
304
+ "execute-task",
305
+ "reactive-execute",
306
+ "run-uat",
307
+ "gate-evaluate",
308
+ "rewrite-docs",
309
+ ] as const;
310
+
311
+ export type UnitType = typeof KNOWN_UNIT_TYPES[number];
312
+
313
+ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
314
+ // ─── Milestone-scoped ────────────────────────────────────────────────
315
+ "research-milestone": {
316
+ skills: { mode: "all" },
317
+ knowledge: "full",
318
+ memory: "prompt-relevant",
319
+ codebaseMap: true,
320
+ preferences: "active-only",
321
+ tools: TOOLS_PLANNING,
322
+ artifacts: {
323
+ // Phase 3 migration (#4782): matches today's actual
324
+ // buildResearchMilestonePrompt inlining order.
325
+ inline: ["milestone-context", "project", "requirements", "decisions", "templates"],
326
+ excerpt: [],
327
+ onDemand: [],
328
+ },
329
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
330
+ },
331
+ "plan-milestone": {
332
+ skills: { mode: "all" },
333
+ knowledge: "full",
334
+ memory: "prompt-relevant",
335
+ codebaseMap: true,
336
+ preferences: "active-only",
337
+ tools: TOOLS_PLANNING,
338
+ artifacts: {
339
+ inline: ["project", "requirements", "decisions", "milestone-research", "templates"],
340
+ excerpt: [],
341
+ onDemand: [],
342
+ },
343
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
344
+ },
345
+ "discuss-milestone": {
346
+ skills: { mode: "all" },
347
+ knowledge: "full",
348
+ memory: "prompt-relevant",
349
+ codebaseMap: true,
350
+ preferences: "active-only",
351
+ tools: TOOLS_PLANNING,
352
+ artifacts: {
353
+ inline: ["project", "requirements", "decisions", "milestone-context", "templates"],
354
+ excerpt: [],
355
+ onDemand: [],
356
+ },
357
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
358
+ },
359
+ "validate-milestone": {
360
+ skills: { mode: "all" },
361
+ knowledge: "scoped",
362
+ memory: "prompt-relevant",
363
+ codebaseMap: false,
364
+ preferences: "active-only",
365
+ tools: TOOLS_PLANNING,
366
+ artifacts: {
367
+ inline: ["roadmap", "slice-summary", "slice-uat", "requirements", "decisions", "templates"],
368
+ excerpt: [],
369
+ onDemand: [],
370
+ },
371
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
372
+ },
373
+ "complete-milestone": {
374
+ skills: { mode: "all" },
375
+ knowledge: "scoped",
376
+ memory: "prompt-relevant",
377
+ codebaseMap: false,
378
+ preferences: "active-only",
379
+ tools: TOOLS_PLANNING,
380
+ artifacts: {
381
+ // #4780 landed slice-summary as excerpt for this unit; phase 2 of
382
+ // the architecture will read this manifest as the source of truth
383
+ // and retire the special-case wiring in auto-prompts.ts.
384
+ inline: ["roadmap", "milestone-context", "requirements", "decisions", "project", "templates"],
385
+ excerpt: ["slice-summary"],
386
+ onDemand: ["slice-summary"],
387
+ },
388
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
389
+ },
390
+
391
+ // ─── Slice-scoped ────────────────────────────────────────────────────
392
+ "research-slice": {
393
+ skills: { mode: "all" },
394
+ knowledge: "full",
395
+ memory: "prompt-relevant",
396
+ codebaseMap: true,
397
+ preferences: "active-only",
398
+ tools: TOOLS_PLANNING,
399
+ artifacts: {
400
+ inline: ["roadmap", "milestone-research", "dependency-summaries", "templates"],
401
+ excerpt: [],
402
+ onDemand: [],
403
+ },
404
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
405
+ },
406
+ "plan-slice": {
407
+ skills: { mode: "all" },
408
+ knowledge: "full",
409
+ memory: "prompt-relevant",
410
+ codebaseMap: true,
411
+ preferences: "active-only",
412
+ tools: TOOLS_PLANNING,
413
+ artifacts: {
414
+ inline: ["roadmap", "slice-research", "dependency-summaries", "requirements", "decisions", "templates"],
415
+ excerpt: [],
416
+ onDemand: [],
417
+ },
418
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
419
+ },
420
+ "refine-slice": {
421
+ skills: { mode: "all" },
422
+ knowledge: "scoped",
423
+ memory: "prompt-relevant",
424
+ codebaseMap: true,
425
+ preferences: "active-only",
426
+ tools: TOOLS_PLANNING,
427
+ artifacts: {
428
+ inline: ["slice-plan", "slice-research", "dependency-summaries", "templates"],
429
+ excerpt: [],
430
+ onDemand: [],
431
+ },
432
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
433
+ },
434
+ "replan-slice": {
435
+ skills: { mode: "all" },
436
+ knowledge: "scoped",
437
+ memory: "prompt-relevant",
438
+ codebaseMap: true,
439
+ preferences: "active-only",
440
+ tools: TOOLS_PLANNING,
441
+ artifacts: {
442
+ inline: ["slice-plan", "slice-research", "dependency-summaries", "prior-task-summaries", "templates"],
443
+ excerpt: [],
444
+ onDemand: [],
445
+ },
446
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
447
+ },
448
+ "complete-slice": {
449
+ skills: { mode: "all" },
450
+ knowledge: "scoped",
451
+ memory: "prompt-relevant",
452
+ codebaseMap: false,
453
+ preferences: "active-only",
454
+ tools: TOOLS_PLANNING,
455
+ artifacts: {
456
+ // Phase 3 migration (#4782): matches today's actual
457
+ // buildCompleteSlicePrompt inlining order. Overrides prepend +
458
+ // knowledge splice stay in the builder imperatively (see RFC
459
+ // #4924 — computed/prepend blocks are phase-4 composer work).
460
+ inline: ["roadmap", "slice-context", "slice-plan", "requirements", "prior-task-summaries", "templates"],
461
+ excerpt: [],
462
+ onDemand: [],
463
+ },
464
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
465
+ },
466
+ "reassess-roadmap": {
467
+ skills: { mode: "all" },
468
+ knowledge: "scoped",
469
+ memory: "critical-only",
470
+ codebaseMap: false,
471
+ preferences: "none",
472
+ tools: TOOLS_PLANNING,
473
+ artifacts: {
474
+ // Phase 2 pilot (#4782): manifest now matches today's actual
475
+ // buildReassessRoadmapPrompt behavior for equivalence. Phase 3
476
+ // will tighten this list once the composer reports real telemetry.
477
+ inline: ["roadmap", "slice-context", "slice-summary", "project", "requirements", "decisions"],
478
+ excerpt: [],
479
+ onDemand: [],
480
+ },
481
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
482
+ },
483
+
484
+ // ─── Task-scoped ─────────────────────────────────────────────────────
485
+ "execute-task": {
486
+ skills: { mode: "all" },
487
+ knowledge: "scoped",
488
+ memory: "prompt-relevant",
489
+ codebaseMap: true,
490
+ preferences: "active-only",
491
+ tools: TOOLS_ALL,
492
+ artifacts: {
493
+ inline: ["task-plan", "slice-plan", "prior-task-summaries", "templates"],
494
+ excerpt: [],
495
+ onDemand: ["slice-research"],
496
+ },
497
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
498
+ },
499
+ "reactive-execute": {
500
+ skills: { mode: "all" },
501
+ knowledge: "scoped",
502
+ memory: "prompt-relevant",
503
+ codebaseMap: true,
504
+ preferences: "active-only",
505
+ tools: TOOLS_ALL,
506
+ artifacts: {
507
+ inline: ["slice-plan", "prior-task-summaries", "templates"],
508
+ excerpt: [],
509
+ onDemand: ["slice-research"],
510
+ },
511
+ maxSystemPromptChars: COMMON_BUDGET_LARGE,
512
+ },
513
+
514
+ // ─── Ancillary units ─────────────────────────────────────────────────
515
+ "run-uat": {
516
+ skills: { mode: "all" },
517
+ knowledge: "critical-only",
518
+ memory: "critical-only",
519
+ codebaseMap: false,
520
+ preferences: "active-only",
521
+ tools: TOOLS_PLANNING,
522
+ artifacts: {
523
+ // Phase 3 migration (#4782): manifest matches today's actual
524
+ // buildRunUatPrompt inlining. Prior phase-1 entry listed
525
+ // `slice-plan` aspirationally — the real builder inlines the UAT
526
+ // file, the slice SUMMARY (optional), and the project row.
527
+ inline: ["slice-uat", "slice-summary", "project"],
528
+ excerpt: [],
529
+ onDemand: [],
530
+ },
531
+ maxSystemPromptChars: COMMON_BUDGET_SMALL,
532
+ },
533
+ "gate-evaluate": {
534
+ skills: { mode: "all" },
535
+ knowledge: "critical-only",
536
+ memory: "critical-only",
537
+ codebaseMap: false,
538
+ preferences: "active-only",
539
+ tools: TOOLS_PLANNING,
540
+ artifacts: {
541
+ inline: ["slice-plan", "prior-task-summaries"],
542
+ excerpt: [],
543
+ onDemand: [],
544
+ },
545
+ maxSystemPromptChars: COMMON_BUDGET_SMALL,
546
+ },
547
+ "rewrite-docs": {
548
+ skills: { mode: "all" },
549
+ knowledge: "scoped",
550
+ memory: "prompt-relevant",
551
+ codebaseMap: true,
552
+ preferences: "active-only",
553
+ tools: TOOLS_DOCS,
554
+ artifacts: {
555
+ inline: ["project", "requirements", "decisions", "templates"],
556
+ excerpt: [],
557
+ onDemand: [],
558
+ },
559
+ maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
560
+ },
561
+ };
562
+
563
+ // ─── Lookup helper ────────────────────────────────────────────────────────
564
+
565
+ /**
566
+ * Return the manifest for a unit type, or null when the type is unknown.
567
+ *
568
+ * Callers MUST treat null as "fall through to today's default behavior"
569
+ * rather than erroring — unknown unit types may be experimental and
570
+ * should not crash the composer.
571
+ */
572
+ export function resolveManifest(unitType: string): UnitContextManifest | null {
573
+ return (UNIT_MANIFESTS as Record<string, UnitContextManifest>)[unitType] ?? null;
574
+ }
@@ -13,6 +13,15 @@ export type FailureClass =
13
13
 
14
14
  export type GateOutcome = "pass" | "fail" | "retry" | "manual-attention";
15
15
 
16
+ export type DispatchReasonCode =
17
+ | "policy"
18
+ | "state"
19
+ | "recovery"
20
+ | "manual"
21
+ | "dependency"
22
+ | "conflict"
23
+ | "retry";
24
+
16
25
  export interface GateResult {
17
26
  gateId: string;
18
27
  gateType: string;
@@ -88,6 +97,38 @@ export interface TurnResult {
88
97
  finishedAt: string;
89
98
  }
90
99
 
100
+ export interface DispatchExplanation {
101
+ reasonCode: DispatchReasonCode;
102
+ summary: string;
103
+ evidence?: Record<string, unknown>;
104
+ blockedBy?: Array<{
105
+ kind: "gate" | "state" | "dependency" | "conflict" | "policy" | "manual";
106
+ id: string;
107
+ detail?: string;
108
+ }>;
109
+ }
110
+
111
+ export interface UokDispatchEnvelope {
112
+ action: "dispatch" | "stop" | "skip";
113
+ nodeKind?: UokNodeKind;
114
+ unitType?: string;
115
+ unitId?: string;
116
+ prompt?: string;
117
+ reason: DispatchExplanation;
118
+ gateVerdict?: GateResult;
119
+ constraints?: {
120
+ reads?: string[];
121
+ writes?: string[];
122
+ dependsOn?: string[];
123
+ maxWorkers?: number;
124
+ };
125
+ trace?: {
126
+ traceId?: string;
127
+ turnId?: string;
128
+ causedBy?: string;
129
+ };
130
+ }
131
+
91
132
  export interface AuditEventEnvelope {
92
133
  eventId: string;
93
134
  traceId: string;
@@ -125,6 +166,30 @@ export interface UokGraphNode {
125
166
  metadata?: Record<string, unknown>;
126
167
  }
127
168
 
169
+ export interface WriterToken {
170
+ tokenId: string;
171
+ traceId: string;
172
+ turnId: string;
173
+ acquiredAt: string;
174
+ owner: "uok" | "legacy-compat" | "manual";
175
+ }
176
+
177
+ export interface WriteSequence {
178
+ traceId: string;
179
+ turnId: string;
180
+ sequence: number;
181
+ }
182
+
183
+ export interface WriteRecord {
184
+ writerToken: WriterToken;
185
+ sequence: WriteSequence;
186
+ category: "state" | "audit" | "gitops" | "gate" | "artifact" | "other";
187
+ path?: string;
188
+ operation: "append" | "replace" | "insert" | "update" | "delete" | "noop";
189
+ ts: string;
190
+ metadata?: Record<string, unknown>;
191
+ }
192
+
128
193
  export interface UokTurnObserver {
129
194
  onTurnStart(contract: TurnContract): void;
130
195
  onPhaseResult(