@moretea-labs/forge 1.5.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +46 -0
  3. package/CLAUDE.md +2 -0
  4. package/DESIGN.md +7 -2
  5. package/README.md +4 -4
  6. package/README.zh-CN.md +2 -2
  7. package/SKILL.md +2 -2
  8. package/THIRD_PARTY_NOTICES.md +1 -1
  9. package/agents/openai.yaml +1 -1
  10. package/assets/hooks/hook-input.sh +11 -8
  11. package/assets/hooks/lib/session-state.sh +10 -7
  12. package/assets/hooks/lib/workflow-state.sh +13 -177
  13. package/assets/hooks/post-tool-observer.sh +8 -2
  14. package/assets/hooks/pre-edit-guard.sh +8 -39
  15. package/assets/hooks/prompt-guard.sh +7 -83
  16. package/assets/hooks/session-start-context.sh +56 -1
  17. package/assets/partials/05-workflow.partial.md +1 -1
  18. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  19. package/assets/plugin-registry.v1.json +54 -3
  20. package/assets/reference-configs/document-generation.md +1 -1
  21. package/assets/reference-configs/harness-overview.md +1 -1
  22. package/assets/reference-configs/hook-operations.md +1 -1
  23. package/assets/reference-configs/sprint-contracts.md +3 -3
  24. package/assets/skill-version.json +2 -2
  25. package/assets/templates/contract.template.md +2 -7
  26. package/assets/templates/helpers/capture-plan.sh +2 -2
  27. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  28. package/assets/templates/helpers/contract-worktree.sh +1 -21
  29. package/assets/templates/helpers/ensure-task-workflow.sh +13 -38
  30. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  31. package/assets/templates/helpers/new-plan.sh +1 -1
  32. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  33. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  34. package/assets/templates/helpers/sprint-backlog.sh +6 -6
  35. package/assets/templates/helpers/verify-contract.sh +1 -111
  36. package/assets/templates/helpers/verify-sprint.sh +3 -180
  37. package/assets/templates/plan.template.md +1 -1
  38. package/assets/templates/review.template.md +9 -34
  39. package/assets/workflow-contract.v1.json +10 -19
  40. package/docs/README.md +10 -10
  41. package/docs/architecture/CURRENT.md +170 -0
  42. package/docs/architecture/EVOLUTION.md +42 -0
  43. package/docs/architecture/current/README.md +4 -156
  44. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  45. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  46. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  47. package/docs/architecture/history/README.md +7 -0
  48. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  49. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  50. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  51. package/docs/architecture/history.md +3 -34
  52. package/docs/architecture/index.md +15 -98
  53. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  54. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  55. package/docs/architecture/versions/1.6.md +38 -0
  56. package/docs/architecture/versions/1.7.md +41 -0
  57. package/docs/forge-chatgpt-browser-engine.md +2 -2
  58. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  59. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  60. package/docs/forge-github-issue-launcher.md +1 -1
  61. package/docs/forge-runtime-self-healing-loop.md +1 -1
  62. package/docs/operations/controller-browser-plugin.md +38 -22
  63. package/docs/operations/controller-performance-and-502.md +124 -0
  64. package/docs/operations/controller-reliability-runbook.md +1 -1
  65. package/docs/operations/features.md +3 -3
  66. package/docs/operations/github-repository.md +1 -1
  67. package/docs/operations/homebrew.md +2 -2
  68. package/docs/operations/mcp-tool-exposure.md +5 -3
  69. package/docs/tutorials/01-install-and-start.md +1 -1
  70. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  71. package/docs/wiki/Architecture.md +6 -6
  72. package/docs/wiki/Implementation.md +2 -2
  73. package/docs/wiki/Installation.md +1 -1
  74. package/docs/wiki/Integrations.md +2 -2
  75. package/docs/wiki/Quick-Start.md +1 -1
  76. package/docs/wiki/Work-Lifecycle.md +1 -1
  77. package/package.json +29 -10
  78. package/scripts/activate-source-baseline.ts +17 -13
  79. package/scripts/benchmark-background-check-overlap.ts +228 -0
  80. package/scripts/benchmark-mcp-host.sh +117 -0
  81. package/scripts/benchmark-mcp-transport.ts +170 -0
  82. package/scripts/benchmark-quality-harness.ts +146 -0
  83. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  84. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  85. package/scripts/benchmark-typescript-navigation.ts +186 -0
  86. package/scripts/benchmark-work-efficiency.ts +334 -0
  87. package/scripts/capture-plan.sh +3 -3
  88. package/scripts/check-agent-tooling.sh +8 -35
  89. package/scripts/check-architecture-sync.sh +17 -86
  90. package/scripts/check-mcp-compatibility.ts +14 -0
  91. package/scripts/check-public-docs.sh +14 -1
  92. package/scripts/check-runtime-architecture.mjs +107 -64
  93. package/scripts/check-stable-baseline.ts +92 -0
  94. package/scripts/check-task-workflow.sh +4 -4
  95. package/scripts/contract-worktree.sh +1 -21
  96. package/scripts/ensure-task-workflow.sh +22 -55
  97. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  98. package/scripts/install-standalone-recovery.ts +24 -0
  99. package/scripts/lib/project-init-lib.sh +15 -44
  100. package/scripts/migrate-chatgpt-automation-schedules.ts +64 -0
  101. package/scripts/migrate-project-template.sh +23 -1179
  102. package/scripts/new-plan.sh +1 -1
  103. package/scripts/plan-to-todo.sh +11 -36
  104. package/scripts/run-governed-gate.ts +2 -1
  105. package/scripts/ship-worktrees.sh +2 -29
  106. package/scripts/smoke-ios-physical-device.ts +4 -2
  107. package/scripts/smoke-runtime-recovery.ts +1 -35
  108. package/scripts/smoke-schedule-engine.ts +1 -20
  109. package/scripts/sprint-backlog.sh +1 -1
  110. package/scripts/verify-contract.sh +1 -111
  111. package/scripts/verify-forge-runtime.sh +0 -1
  112. package/scripts/verify-sprint.sh +3 -180
  113. package/scripts/workflow-contract.ts +1 -5
  114. package/src/cli/commands/chatgpt.ts +31 -2
  115. package/src/cli/commands/init-hook.ts +3 -3
  116. package/src/cli/commands/mcp.ts +9 -5
  117. package/src/cli/commands/plugin.ts +37 -10
  118. package/src/cli/commands/recovery.ts +25 -3
  119. package/src/cli/commands/runtime.ts +55 -3
  120. package/src/cli/commands/security.ts +12 -1
  121. package/src/cli/commands/setup-profile.ts +31 -21
  122. package/src/cli/controller/check-runner.ts +106 -3
  123. package/src/cli/controller/composite-result.ts +1 -1
  124. package/src/cli/controller/context/focus.ts +51 -0
  125. package/src/cli/controller/context/instruction-context.ts +114 -0
  126. package/src/cli/controller/context/known-paths.ts +76 -0
  127. package/src/cli/controller/context/query-planning.ts +110 -0
  128. package/src/cli/controller/context/rule-resolution.ts +532 -0
  129. package/src/cli/controller/context/source-materializer.ts +278 -0
  130. package/src/cli/controller/context/structural.ts +16 -0
  131. package/src/cli/controller/context/types.ts +286 -0
  132. package/src/cli/controller/context-pack.ts +898 -430
  133. package/src/cli/controller/launch-agents.ts +77 -2
  134. package/src/cli/controller/operational-plan.ts +2 -2
  135. package/src/cli/controller/work-mode.ts +6 -4
  136. package/src/cli/editing/edit-session.ts +60 -7
  137. package/src/cli/github/github.ts +133 -0
  138. package/src/cli/hook/prompt-guard-decision.ts +17 -18
  139. package/src/cli/hook/prompt-intents.ts +1 -1
  140. package/src/cli/installer/managed-entries.ts +15 -1
  141. package/src/cli/local-bridge/console-automations.ts +225 -67
  142. package/src/cli/local-bridge/console-view-models.ts +3 -35
  143. package/src/cli/local-bridge/facade-api.ts +2 -217
  144. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  145. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +153 -3
  146. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  147. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +183 -3
  148. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +1 -1
  149. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +4 -3
  150. package/src/cli/local-bridge/frontend/src/lib/api.ts +18 -11
  151. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  152. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +1 -1
  153. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +4 -3
  154. package/src/cli/local-bridge/frontend/src/styles.css +27 -11
  155. package/src/cli/local-bridge/frontend/src/types.ts +8 -7
  156. package/src/cli/local-bridge/job-store.ts +1 -490
  157. package/src/cli/local-bridge/server.ts +29 -532
  158. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  159. package/src/cli/local-bridge/ui-dist/app.js +5101 -4967
  160. package/src/cli/mcp/auth.ts +5 -5
  161. package/src/cli/mcp/instructions.ts +3 -2
  162. package/src/cli/mcp/legacy-tool-service.ts +0 -189
  163. package/src/cli/mcp/multi-repository.ts +16 -5
  164. package/src/cli/mcp/oauth.ts +175 -26
  165. package/src/cli/mcp/paths.ts +8 -2
  166. package/src/cli/mcp/repository-tools.ts +356 -101
  167. package/src/cli/mcp/server.ts +625 -54
  168. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  169. package/src/cli/mcp/toolset-selection.ts +1 -1
  170. package/src/cli/mcp/toolset.ts +42 -5
  171. package/src/cli/mcp/transports/http.ts +125 -15
  172. package/src/cli/mcp/transports/session-registry.ts +67 -5
  173. package/src/cli/mcp/types.ts +3 -3
  174. package/src/cli/repositories/command-classifier.ts +209 -14
  175. package/src/cli/repositories/command-executor.ts +55 -521
  176. package/src/cli/repositories/command-process.ts +108 -0
  177. package/src/cli/repositories/command-scope.ts +99 -41
  178. package/src/cli/repositories/controller-home.ts +7 -8
  179. package/src/cli/repositories/git-command-executor.ts +2 -0
  180. package/src/cli/repositories/locks.ts +53 -16
  181. package/src/cli/repositories/repository-snapshot.ts +121 -0
  182. package/src/cli/repositories/safe-patch.ts +6 -4
  183. package/src/cli/repositories/selected-path-actions.ts +17 -9
  184. package/src/cli/repositories/structured-git.ts +110 -10
  185. package/src/cli/repository/inspector.ts +565 -62
  186. package/src/cli/repository/session-cache.ts +58 -17
  187. package/src/cli/v81-entry.ts +1 -4
  188. package/src/effects/fs-transaction.ts +85 -17
  189. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  190. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  191. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  192. package/src/runtime/context/lsp-client.ts +283 -0
  193. package/src/runtime/context/semantic-navigation.ts +275 -0
  194. package/src/runtime/context/swift-navigation.ts +565 -0
  195. package/src/runtime/context/typescript-navigation.ts +226 -0
  196. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  197. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +196 -2
  198. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  199. package/src/runtime/control-plane/execution/execution-identity.ts +65 -14
  200. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  201. package/src/runtime/control-plane/execution/validation.ts +15 -2
  202. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  203. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  204. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  205. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  206. package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
  207. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +175 -8
  208. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -21
  209. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +87 -9
  210. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  211. package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
  212. package/src/runtime/control-plane/facade/controller-session-store.ts +144 -14
  213. package/src/runtime/control-plane/facade/goal-workloop-access.ts +9 -2
  214. package/src/runtime/control-plane/facade/goal-workloop.ts +885 -105
  215. package/src/runtime/control-plane/facade/index.ts +1 -0
  216. package/src/runtime/control-plane/facade/plan-contract-store.ts +211 -26
  217. package/src/runtime/control-plane/facade/requirement-board.ts +24 -8
  218. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  219. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  220. package/src/runtime/control-plane/facade/types.ts +55 -11
  221. package/src/runtime/control-plane/facade/work-contract-store.ts +204 -73
  222. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  223. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  224. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  225. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  226. package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
  227. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  228. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  229. package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
  230. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  231. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  232. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  233. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  234. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  235. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  236. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  237. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  238. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  239. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  240. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
  241. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +642 -51
  242. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
  243. package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
  244. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  245. package/src/runtime/control-plane/persistence/requirement-store.ts +15 -11
  246. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  247. package/src/runtime/control-plane/release-retention.ts +62 -2
  248. package/src/runtime/control-plane/routing/route-policy.ts +7 -16
  249. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  250. package/src/runtime/diagnostics/mcp-timing.ts +19 -0
  251. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  252. package/src/runtime/diagnostics/performance.ts +24 -1
  253. package/src/runtime/evidence/event-ledger.ts +1 -1
  254. package/src/runtime/execution/jobs/store.ts +58 -4
  255. package/src/runtime/execution/jobs/types.ts +1 -1
  256. package/src/runtime/execution/managed-workspace.ts +203 -1
  257. package/src/runtime/execution/process-runtime/check-facade.ts +52 -14
  258. package/src/runtime/execution/process-runtime/check-result.ts +63 -2
  259. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  260. package/src/runtime/execution/process-runtime/command-facade.ts +346 -40
  261. package/src/runtime/execution/process-runtime/gc.ts +98 -12
  262. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
  263. package/src/runtime/execution/process-runtime/persisted-check.ts +57 -6
  264. package/src/runtime/execution/process-runtime/resource-claims.ts +97 -8
  265. package/src/runtime/execution/process-runtime/runtime.ts +59 -4
  266. package/src/runtime/execution/process-runtime/store.ts +7 -0
  267. package/src/runtime/execution/process-runtime/types.ts +2 -0
  268. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  269. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  270. package/src/runtime/execution/workers/executor.ts +0 -48
  271. package/src/runtime/gateway/mcp/execution-tools.ts +1219 -126
  272. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  273. package/src/runtime/gateway/mcp/router.ts +185 -83
  274. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
  275. package/src/runtime/gateway/mcp/runtime-tools.ts +2555 -1616
  276. package/src/runtime/model-clients/deepseek-adapter.ts +0 -32
  277. package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
  278. package/src/runtime/plugins/browser-adapter.ts +2925 -318
  279. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  280. package/src/runtime/plugins/browser-handoff-host.ts +6 -31
  281. package/src/runtime/plugins/browser-handoff.ts +92 -5
  282. package/src/runtime/plugins/browser-macos-bridge.ts +586 -45
  283. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  284. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  285. package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
  286. package/src/runtime/plugins/browser-runtime.ts +183 -0
  287. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  288. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  289. package/src/runtime/plugins/desktop-operator-registration.ts +15 -12
  290. package/src/runtime/plugins/external-adapter.ts +324 -3
  291. package/src/runtime/plugins/external-registration.ts +84 -5
  292. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  293. package/src/runtime/plugins/first-party-registry.ts +4 -2
  294. package/src/runtime/plugins/github-adapter.ts +125 -0
  295. package/src/runtime/plugins/gmail-adapter.ts +28 -2
  296. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  297. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  298. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  299. package/src/runtime/plugins/ios-adapter.ts +106 -16
  300. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  301. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  302. package/src/runtime/plugins/lightweight-action.ts +153 -0
  303. package/src/runtime/plugins/local-system-adapter.ts +125 -8
  304. package/src/runtime/plugins/macos-capability-broker.ts +55 -9
  305. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  306. package/src/runtime/plugins/plugin-management-adapter.ts +181 -0
  307. package/src/runtime/plugins/resend-adapter.ts +1 -1
  308. package/src/runtime/plugins/store.ts +366 -24
  309. package/src/runtime/plugins/types.ts +39 -2
  310. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  311. package/src/runtime/projections/git-status-sampler.ts +16 -16
  312. package/src/runtime/projections/materialized-view.ts +28 -10
  313. package/src/runtime/recovery/actions.ts +0 -10
  314. package/src/runtime/recovery/classifier.ts +0 -9
  315. package/src/runtime/recovery/maintenance-executor.ts +415 -18
  316. package/src/runtime/recovery/probe.ts +0 -1
  317. package/src/runtime/recovery/types.ts +0 -1
  318. package/src/runtime/root/mcp-transport.ts +180 -10
  319. package/src/runtime/root/package-connector-service.ts +186 -8
  320. package/src/runtime/root/package-runtime-release.ts +143 -17
  321. package/src/runtime/root/package-runtime-service.ts +430 -22
  322. package/src/runtime/root/release-manifest.ts +7 -2
  323. package/src/runtime/root/release-materialize.ts +162 -19
  324. package/src/runtime/root/release-store.ts +48 -11
  325. package/src/runtime/root/runtime.ts +23 -5
  326. package/src/runtime/root/service.ts +100 -27
  327. package/src/runtime/root/types.ts +2 -0
  328. package/src/runtime/safe-tooling/index.ts +0 -1
  329. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  330. package/src/runtime/safe-tooling/types.ts +0 -30
  331. package/src/runtime/shared/trusted-executable.ts +62 -0
  332. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  333. package/src/runtime/standalone-recovery/core.ts +702 -94
  334. package/src/runtime/standalone-recovery/entry.ts +99 -23
  335. package/src/runtime/standalone-recovery/installer.ts +19 -3
  336. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  337. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  338. package/src/runtime/workflow/schedules/browser-probe.ts +258 -0
  339. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +40 -0
  340. package/src/runtime/workflow/schedules/engine.ts +509 -80
  341. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  342. package/src/runtime/workflow/schedules/settlement.ts +48 -4
  343. package/src/runtime/workflow/schedules/store.ts +131 -10
  344. package/src/runtime/workflow/schedules/types.ts +6 -3
  345. package/src/runtime/workflow/schedules/work-continuation.ts +120 -34
  346. package/src/testing/test-governance.ts +8 -40
  347. package/assets/reference-configs/heartbeat-triage.md +0 -57
  348. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  349. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  350. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  351. package/bin/forge-desktop-helper.mjs +0 -204
  352. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  353. package/docs/architecture/current/architecture-invariants.md +0 -331
  354. package/docs/architecture/current/automation-and-schedule-engine.md +0 -453
  355. package/docs/architecture/current/codegraph-context-provider.md +0 -226
  356. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  357. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  358. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -354
  359. package/docs/architecture/current/entity-model.md +0 -592
  360. package/docs/architecture/current/external-plugin-governance.md +0 -396
  361. package/docs/architecture/current/failure-recovery.md +0 -447
  362. package/docs/architecture/current/governance.md +0 -213
  363. package/docs/architecture/current/human-interaction-plane.md +0 -87
  364. package/docs/architecture/current/implementation-status.md +0 -128
  365. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  366. package/docs/architecture/current/legacy-governance.md +0 -58
  367. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  368. package/docs/architecture/current/migration-roadmap.md +0 -105
  369. package/docs/architecture/current/multi-repository-execution.md +0 -371
  370. package/docs/architecture/current/operations-runbook.md +0 -45
  371. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  372. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  373. package/docs/architecture/current/repository-access-modes.md +0 -102
  374. package/docs/architecture/current/route-policy.md +0 -15
  375. package/docs/architecture/current/route-session-concurrency.md +0 -85
  376. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  377. package/docs/architecture/current/runtime-directory-map.md +0 -49
  378. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  379. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  380. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  381. package/docs/architecture/current/system-overview.md +0 -144
  382. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  383. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  384. package/docs/architecture/current/thin-harness-v1.md +0 -311
  385. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  386. package/docs/forge-autonomous-goal-loop.md +0 -9
  387. package/docs/forge-provider-configuration.md +0 -7
  388. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -83
  389. package/docs/operations/controller-desktop-plugin.md +0 -112
  390. package/docs/operations/gmail-assistant-routines.md +0 -186
  391. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  392. package/docs/operations/provider-configuration.md +0 -31
  393. package/scripts/harness-trace-grade.sh +0 -150
  394. package/scripts/heartbeat-triage.sh +0 -361
  395. package/scripts/maintenance-triage.sh +0 -167
  396. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  397. package/src/cli/repositories/goal-registry.ts +0 -239
  398. package/src/runtime/assistant/action-proposals.ts +0 -279
  399. package/src/runtime/assistant/intent.ts +0 -395
  400. package/src/runtime/assistant/model-provider.ts +0 -460
  401. package/src/runtime/assistant/openapi.ts +0 -223
  402. package/src/runtime/assistant/policy.ts +0 -89
  403. package/src/runtime/assistant/readiness.ts +0 -258
  404. package/src/runtime/assistant/routine-runtime.ts +0 -477
  405. package/src/runtime/assistant/schedule-binding.ts +0 -171
  406. package/src/runtime/assistant/standing-grants.ts +0 -375
  407. package/src/runtime/assistant/store.ts +0 -243
  408. package/src/runtime/assistant/types.ts +0 -135
  409. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  410. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  411. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  412. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  413. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  414. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  415. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  416. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  417. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  418. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  419. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  420. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  421. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  422. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  423. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  424. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  425. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  426. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  427. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  428. package/src/runtime/plugins/desktop-adapter.ts +0 -374
  429. package/src/runtime/safe-tooling/browser-safe.ts +0 -133
  430. package/src/runtime/workflow/findings/store.ts +0 -204
  431. package/src/runtime/workflow/findings/types.ts +0 -58
  432. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  433. package/src/runtime/workflow/portfolio/store.ts +0 -185
  434. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -1,453 +0,0 @@
1
- # Automation and Schedule Engine
2
-
3
- > Status: **Runtime Authority**
4
-
5
- ## 1. Objective
6
-
7
- The Schedule Engine enables recurring discovery, repair, verification, reporting, and release-readiness workflows without creating an unbounded autonomous Agent.
8
-
9
- The central rule is:
10
-
11
- > A Schedule is policy. An Occurrence is one bounded execution window.
12
-
13
- The system must be able to conclude that nothing should be done.
14
-
15
- ## 2. Non-Goals
16
-
17
- The Schedule Engine is not:
18
-
19
- - a forever-running Agent process;
20
- - permission to bypass repository conflict rules;
21
- - permission to create unlimited Issues;
22
- - permission to auto-publish or deploy;
23
- - a replacement for repository-owned CI;
24
- - an excuse to retry external failures indefinitely;
25
- - a global lock across selected repositories.
26
-
27
- ## 3. Schedule Entity
28
-
29
- A Schedule stores:
30
-
31
- ```text
32
- scheduleId
33
- title
34
- enabled
35
- repositorySelector or portfolioSelector
36
- trigger
37
- workTemplate
38
- triagePolicy
39
- executionPolicy
40
- budget
41
- retryPolicy
42
- backoffPolicy
43
- notificationPolicy
44
- stopConditions
45
- createdBy
46
- createdAt
47
- updatedAt
48
- ```
49
-
50
- ### Trigger Types
51
-
52
- Implemented trigger classes:
53
-
54
- - fixed interval;
55
- - cron/calendar expression;
56
- - condition watch;
57
- - repository event;
58
- - dependency checkpoint;
59
- - manual run-now.
60
-
61
- Trigger delivery creates an Occurrence request. It does not directly start an Agent.
62
-
63
- ## 4. Occurrence Identity
64
-
65
- One trigger window produces at most one Occurrence per repository.
66
-
67
- ```text
68
- occurrenceKey = scheduleId + repoId + normalizedWindow
69
- requestId = occurrenceKey
70
- ```
71
-
72
- The normalized window is deterministic for the trigger type. Repeated delivery, reconnect, or scheduler restart returns the same Occurrence.
73
-
74
- ## 5. Occurrence State Machine
75
-
76
- ```text
77
- created
78
- -> triaging
79
- -> nothing_to_do
80
- -> candidate_recorded
81
- -> waiting_for_resource
82
- -> work_dispatched
83
- -> verifying
84
- -> completed
85
-
86
- created/triaging/waiting_for_resource/work_dispatched/verifying
87
- -> failed
88
- -> timed_out
89
- -> budget_exhausted
90
- -> human_attention_required
91
- -> external_blocker
92
- -> cancelled
93
- ```
94
-
95
- An Occurrence reaches terminal state. A later trigger creates a new Occurrence rather than reviving the old one.
96
-
97
- ## 6. Trigger Processing
98
-
99
- ```text
100
- 1. receive trigger delivery
101
- 2. resolve selected repositories
102
- 3. deduplicate occurrence window
103
- 4. acquire short Schedule admission lock
104
- 5. persist Occurrence
105
- 6. submit repository-scoped triage command to Repo Actor
106
- 7. release admission lock
107
- 8. triage from compact snapshot
108
- 9. persist Decision
109
- 10. dispatch bounded Jobs or finish with no-op outcome
110
- ```
111
-
112
- The trigger handler must return quickly and must not wait for implementation or checks.
113
-
114
- ## 7. Triage Before Execution
115
-
116
- Every automated Occurrence begins with triage.
117
-
118
- Triage inputs should be bounded:
119
-
120
- ```text
121
- repository health
122
- active Jobs and Runs
123
- current Requirement/Work queue
124
- recent failed checks
125
- recent accepted work
126
- Git summary and dirty ownership
127
- release state
128
- existing Candidate Findings
129
- Schedule history and budget
130
- ```
131
-
132
- Triage produces one normalized Decision:
133
-
134
- ```text
135
- nothing_to_do
136
- continue_existing_task
137
- retry_infrastructure_failure
138
- create_candidate_finding
139
- promote_existing_finding
140
- run_readonly_check
141
- run_repair_task
142
- release_ready
143
- external_blocker
144
- human_attention_required
145
- ```
146
-
147
- The Decision and evidence are persisted before any write Job is dispatched.
148
-
149
- ## 8. Deterministic vs Agent Triage
150
-
151
- Deterministic rules are preferred for:
152
-
153
- - active conflict detection;
154
- - known failed checks;
155
- - stale/orphan reconciliation;
156
- - duplicate Issue or Finding detection;
157
- - budget and cooldown enforcement;
158
- - release gate status;
159
- - repository disabled/frozen state.
160
-
161
- Semantic analysis remains external-controller-owned. Forge does not invent the next product or code decision inside the Schedule Engine. A Schedule may use the deterministic `external_controller_wake` action to resume an already bounded Work through Thin Launcher. The wake operation only transports the persisted Work/Handoff context to an external Controller; it does not interpret the model response inside the Kernel.
162
-
163
- `external_controller_wake` accepts a `work_id`, `controller_type`, and optional launcher/session metadata. For ChatGPT, Thin Launcher prefers a saved Forge browser session (`browser_session_id`), then an explicit `https://chatgpt.com/...` conversation URL, then a new browser consult. Codex/Claude remain external CLI controllers. If the Work already has an active Controller lease, the Occurrence is a deterministic no-op rather than spawning a competing controller.
164
-
165
- The stable ChatGPT tool surface manages this policy through `rh_work` rather than exposing another Schedule tool. `rh_work.schedule_create/list/get/pause/resume/trigger` binds only an existing non-terminal Work to `external_controller_wake`; callers cannot use the facade to schedule an arbitrary MCP or repository operation. Creation is idempotent by a stable schedule request identity, defaults to `shadow_mode=true`, limits active occurrences to one, and carries explicit failure/cooldown/daily-budget/backoff policy.
166
-
167
- A Work continuation Schedule is acceptance-driven, not perpetual. Before every wake, Forge re-reads the bound Work. A missing Work pauses the Schedule; a terminal Work (`completed`, `cancelled`, or another terminal Work state) deterministically disables the Schedule and returns `nothing_to_do`. An active Controller lease also returns `nothing_to_do`. Therefore the recurring trigger is only a wake policy for unfinished bounded Work, never a forever-running agent.
168
-
169
- Thin Launcher does not pre-claim Controller ownership. It records a short Controller-Home launch reservation (configured with `launch_reservation_ms`) only to fence duplicate spawns while the provider starts. The external provider must connect to Forge MCP and call `rh_work continue` with its authenticated transport identity; that authenticated principal/session becomes the Work owner. This separation prevents the scheduler from impersonating ChatGPT/Codex/Claude and preserves the Controller-session identity fence. Detached CLI providers also use their non-interactive execution contracts (`codex ... exec` and `claude --print`) instead of launching interactive TUIs with ignored stdio.
170
-
171
- For Codex, Thin Launcher injects the currently ready Canonical Runtime MCP endpoint per invocation instead of mutating `~/.codex/config.toml`. The Runtime bearer token is passed only through the child environment (`FORGE_RUNTIME_MCP_TOKEN`); the temporary Codex MCP configuration references that environment variable and sends non-secret forwarded principal/session headers derived from the launch reservation. This makes a scheduled Codex self-contained while keeping authentication material out of argv, logs, and durable provider config. CLI providers without a safe Forge MCP bootstrap must fail closed rather than launch detached work that cannot report ownership/evidence back to Runtime.
172
-
173
- ## 9. Candidate Finding Governance
174
-
175
- Automation does not immediately convert every observation into an Issue.
176
-
177
- A Candidate Finding records:
178
-
179
- ```text
180
- semanticKey
181
- category
182
- evidence
183
- confidence
184
- firstSeenAt
185
- lastSeenAt
186
- occurrenceCount
187
- existingIssueIds
188
- recommendedAction
189
- status
190
- ```
191
-
192
- Promotion policy may require one or more:
193
-
194
- - reproducible failure;
195
- - named check failure;
196
- - explicit policy violation;
197
- - repeated observation across multiple Occurrences;
198
- - high-confidence static diagnosis with evidence;
199
- - user-configured auto-promotion category;
200
- - human approval.
201
-
202
- Speculative “could be improved” observations remain candidates and deduplicate by semantic key.
203
-
204
- ## 10. Existing Work First
205
-
206
- Before creating new work, triage checks:
207
-
208
- 1. Is an equivalent Issue active?
209
- 2. Is an equivalent Task ready, running, under review, or blocked?
210
- 3. Is an equivalent Job active?
211
- 4. Did a recent terminal attempt fail and require explicit retry?
212
- 5. Is the finding already resolved by the current Revision?
213
- 6. Is another Schedule responsible for the same semantic key?
214
-
215
- Default priority is to continue or repair existing accepted work rather than create duplicates.
216
-
217
- ## 11. Budget Contract
218
-
219
- Each Schedule defines bounded budgets, for example:
220
-
221
- ```text
222
- maxActiveOccurrences
223
- maxJobsPerOccurrence
224
- maxAgentRunsPerOccurrence
225
- maxRetriesPerOccurrence
226
- maxWallClockPerOccurrence
227
- maxDailyWallClock
228
- maxDailyAgentRuns
229
- maxChangedFiles
230
- maxChangedLines
231
- optional token/cost budget
232
- ```
233
-
234
- Budget is reserved before dispatch and settled from actual usage.
235
-
236
- Budget exhaustion is a valid terminal outcome. It may notify or defer to the next eligible window; it must not silently expand.
237
-
238
- ## 12. Concurrency Policy
239
-
240
- Default:
241
-
242
- ```text
243
- maxActiveOccurrences per schedule + repo = 1
244
- ```
245
-
246
- If a trigger arrives while one is active:
247
-
248
- - return the existing Occurrence;
249
- - coalesce the trigger into a pending signal;
250
- - or skip according to Schedule policy.
251
-
252
- It must not create parallel duplicate loops.
253
-
254
- Cross-repository Schedules create independent repository Occurrences and use Global Scheduler fairness.
255
-
256
- ## 13. Backoff and Cooldown
257
-
258
- Retry policy distinguishes failure classes.
259
-
260
- ### Infrastructure failure
261
-
262
- May retry with bounded exponential backoff:
263
-
264
- ```text
265
- baseDelay * 2^attempt, capped by maxDelay
266
- ```
267
-
268
- ### Scope or resource conflict
269
-
270
- Waits for resource or next eligibility; does not consume implementation retry count unless deadline expires.
271
-
272
- ### Implementation or acceptance failure
273
-
274
- Creates or updates durable Task state and normally stops the Occurrence for review or a separately authorized retry.
275
-
276
- ### External blocker
277
-
278
- Enters cooldown and notifies only when meaningful state changes or the configured reminder interval passes.
279
-
280
- ### Repeated no-op
281
-
282
- May reduce frequency through quiet backoff when the Schedule repeatedly returns `nothing_to_do`.
283
-
284
- ## 14. Stop Conditions
285
-
286
- A Schedule or Occurrence stops dispatching mutation work when any configured condition is true:
287
-
288
- ```text
289
- release_ready
290
- human_review_required
291
- external_blocker
292
- budget_exhausted
293
- maximum_failures_reached
294
- repository_disabled
295
- release_freeze
296
- user_paused
297
- end_date or occurrence_count reached
298
- ```
299
-
300
- A stop condition may disable the Schedule, pause it, or only terminate the current Occurrence according to policy.
301
-
302
- ## 15. Dirty Workspace Policy
303
-
304
- Automation must not treat a dirty Workspace as disposable.
305
-
306
- Before mutation:
307
-
308
- - identify whether changes belong to an active Controller entity;
309
- - preserve unrelated user changes;
310
- - use a Worktree when isolation is safe;
311
- - otherwise record `human_attention_required` or wait.
312
-
313
- Automatic `git reset`, `git clean`, stash mutation, or overwrite is forbidden.
314
-
315
- ## 16. Release Freeze Policy
316
-
317
- During Release Freeze:
318
-
319
- - read-only triage may run;
320
- - release checks may run;
321
- - Candidate Findings may be recorded;
322
- - new mutation Jobs are not dispatched;
323
- - existing approved release workflow continues according to the release contract.
324
-
325
- ## 17. Notification Policy
326
-
327
- Schedules should be quiet by default.
328
-
329
- Notify on:
330
-
331
- - material progress;
332
- - new confirmed failure;
333
- - external blocker requiring action;
334
- - human review requirement;
335
- - release readiness;
336
- - budget exhaustion that changes expected outcome;
337
- - newly promoted Requirement/Work.
338
-
339
- Do not notify repeatedly for unchanged no-op or unchanged blocker state.
340
-
341
- Every notification links to durable Occurrence, Job, Task, or Finding identities.
342
-
343
- ## 18. Shadow Mode
344
-
345
- New mutation-capable Schedule policies should first run in Shadow Mode.
346
-
347
- Shadow Mode:
348
-
349
- - performs trigger, snapshot, triage, deduplication, budget, and policy decisions;
350
- - records what Jobs it would have dispatched;
351
- - does not create mutation Jobs;
352
- - may run explicitly safe read-only checks;
353
- - produces divergence and usefulness reports.
354
-
355
- Recommended graduation evidence:
356
-
357
- - sufficient number of Occurrences or time window;
358
- - no critical unsafe dispatch decisions;
359
- - acceptable duplicate and false-positive rate;
360
- - useful human adoption of findings;
361
- - bounded cost and latency;
362
- - explicit user enablement.
363
-
364
- ## 19. Schedule Types
365
-
366
- ### Health and Availability Watch
367
-
368
- Checks Controller/Gateway/Worker health and creates incidents only for confirmed changes.
369
-
370
- ### Repair Loop
371
-
372
- Continues a known Issue through one bounded Task or retry per Occurrence until release-ready, blocked, or budget-exhausted.
373
-
374
- ### Bug Discovery
375
-
376
- Runs deterministic scans and creates Candidate Findings. Promotion threshold should be strict.
377
-
378
- ### Dependency or Release Watch
379
-
380
- Monitors an external condition and notifies or unlocks a Task when it changes.
381
-
382
- ### Report Schedule
383
-
384
- Builds compact summaries without mutation.
385
-
386
- Each type uses the same Occurrence and Job model rather than a custom forever loop.
387
-
388
- ## 20. Self-Improvement Limits
389
-
390
- A Schedule may propose changes to its own policy only as a Candidate Finding or Governance Issue. It cannot silently:
391
-
392
- - increase its budget;
393
- - shorten its interval;
394
- - broaden repository selection;
395
- - broaden write scope;
396
- - remove human stop conditions;
397
- - enable destructive or remote actions;
398
- - modify acceptance criteria to make itself pass.
399
-
400
- ## 21. Recovery
401
-
402
- After Controller restart:
403
-
404
- 1. reload enabled Schedules;
405
- 2. rebuild active Occurrence index;
406
- 3. deduplicate due trigger windows;
407
- 4. reconcile active child Jobs;
408
- 5. terminalize expired or orphaned Occurrences when appropriate;
409
- 6. preserve completed Decisions and outcomes;
410
- 7. resume only from durable boundaries.
411
-
412
- In-memory timers are delivery optimizations, not Schedule truth.
413
-
414
- ## 22. Audit and Metrics
415
-
416
- Track:
417
-
418
- ```text
419
- occurrences by outcome
420
- no-op rate
421
- candidate promotion rate
422
- duplicate suppression
423
- jobs and runs per occurrence
424
- retry classifications
425
- budget usage
426
- mean wait and execution time
427
- human adoption rate
428
- false-positive or rollback rate
429
- ```
430
-
431
- The purpose is to remove unhelpful automation, not merely prove it is active.
432
-
433
- ## 23. Current Implementation
434
-
435
- The runtime implements first-class `RepositorySchedule`, `ScheduleDecision` and `ScheduleOccurrence` records under `src/runtime/workflow/schedules/`. Supported triggers are interval, manual, five-field UTC cron, one-shot calendar timestamp, condition watch, repository event and dependency checkpoint.
436
-
437
- Every due trigger uses a deterministic window or event identity. The Decision is persisted before executable work is admitted. Occurrences are indexed, Shadow Mode defaults on, one Occurrence creates at most one durable Job, and repeated trigger delivery returns the existing Occurrence.
438
-
439
- Budgets, cooldown, maximum active Occurrences, consecutive-failure circuit breaking and exponential backoff are persisted. Dirty Workspaces, release barriers, repository disablement, human-attention state and recent external/infrastructure failures suppress unattended writes. Candidate Findings deduplicate observations and require explicit human promotion before Issue creation.
440
-
441
- The in-process Scheduler owned by the Canonical Runtime ticks timer/condition/dependency triggers and resumes from durable state after a whole-Runtime restart. Repository events and manual triggers enter through the same idempotent path. Worker and Reconciler settlement keep Job, Occurrence and Schedule failure state consistent.
442
-
443
- ## 24. Safety Boundary
444
-
445
- Schedules may perform bounded repository work but cannot push, merge, publish, deploy, close remote Issues, remove repositories, or run arbitrary repository commands. The policy is checked at creation and again in the Worker.
446
-
447
- ## 25. Rollout Rule
448
-
449
- New mutation Schedules begin in Shadow Mode until their decisions are reviewed. This is an operational rollout rule, not an implementation gap.
450
-
451
- ### Deferred activation across a natural Runtime restart
452
-
453
- A continuation Schedule may be deliberately created with `shadowMode=true` while the currently running immutable Runtime predates the Controller-wake implementation required by that Schedule. Forge can persist a one-time pending continuation activation marker in Controller Home. Old Runtime releases do not read this marker. The first naturally restarted Runtime containing the pending-activation implementation consumes the marker before starting its sole Scheduler, verifies that the Schedule is still enabled and still targets the same `external_controller_wake` Work, flips only `shadowMode` to `false`, and removes the marker. If the Schedule was explicitly disabled in the meantime, the marker is cancelled instead. This preserves one Scheduler authority and avoids introducing a second cron/LaunchAgent or forcing a rollout solely to enable continuation.
@@ -1,226 +0,0 @@
1
- # CodeGraph Context Provider
2
-
3
- Status: reviewed for Phase 1 implementation
4
- Source baseline: `a49465096c4e2532da37ab2f9d10dca2238217ac`
5
- Scope: Controller Context Plane only
6
-
7
- ## Problem
8
-
9
- Forge already installs and diagnoses `@colbymchenry/codegraph`, and the repository already has a local `.codegraph/codegraph.db`. However, ChatGPT/Controller planning still relies on token search plus bounded raw file reads. CodeGraph is not available as a policy-bounded Controller read capability, so `-plan` and `-debug` cannot use symbol, call-graph, dependency, or impact data directly.
10
-
11
- The missing capability is not another top-level MCP tool. It is a Context Plane provider that can add structural evidence to the existing `rh_context` / `controller_context_pack` path.
12
-
13
- ## Constraints
14
-
15
- 1. The default workflow remains unchanged. No explicit mode directive still uses the existing automatic Direct-first routing.
16
- 2. `-plan` and `-debug` are opt-in routing instructions. CodeGraph must not add latency to ordinary Direct edits by default.
17
- 3. Forge continues to support Node.js `>=20.10.0`.
18
- 4. CodeGraph's embedded SDK requires Node.js `>=22.5` to open its SQLite database through `node:sqlite`.
19
- 5. CodeGraph's CLI/MCP server uses its own bundled runtime and may auto-sync the index. Planning must not silently mutate source files or silently refresh derived indexes.
20
- 6. Source reads remain governed by the existing repository/path policy. A graph hit is discovery evidence, not permission to read a denied path.
21
- 7. The existing five facade tools remain the preferred host surface. Do not add a `codegraph_*` top-level Forge tool family.
22
- 8. If CodeGraph is absent, stale, incompatible, or unavailable, Context Pack must fail open to the existing bounded text search when structural context is optional, and fail clearly when structural context was explicitly required.
23
-
24
- ## Decision
25
-
26
- Add a `CodeGraphReadProvider` to the Context Plane, backed by a self-contained CodeGraph sidecar running on CodeGraph's bundled Node runtime.
27
-
28
- The Forge Controller process never imports and opens CodeGraph directly on Node 20. Instead it launches a small packaged sidecar with the matching platform bundle runtime and communicates through a bounded JSON protocol.
29
-
30
- The sidecar opens CodeGraph with:
31
-
32
- ```text
33
- CodeGraph.open(projectRoot, { sync: false, readOnly: true })
34
- ```
35
-
36
- It never calls:
37
-
38
- - `init` / `initSync`
39
- - `indexAll` / `indexFiles`
40
- - `sync`
41
- - `watch`
42
- - `optimize`
43
- - `clear`
44
- - `uninitialize`
45
-
46
- This keeps structural planning read-only with respect to both the repository and the derived CodeGraph index.
47
-
48
- ## Runtime layout
49
-
50
- ```text
51
- ChatGPT
52
- -> rh_context / controller_context_pack
53
- -> Context Pack builder
54
- -> bounded text search + raw repository reads
55
- -> CodeGraphReadProvider (only when requested)
56
- -> CodeGraph sidecar
57
- -> bundled CodeGraph Node runtime
58
- -> CodeGraph.open(... readOnly=true, sync=false)
59
- -> .codegraph/codegraph.db
60
- ```
61
-
62
- The sidecar is a provider implementation detail. It is not a second Forge Runtime and does not own Controller state, Work, scheduling, repository mutation, or recovery.
63
-
64
- ## Provider contract
65
-
66
- Phase 1 provider operations:
67
-
68
- - `status`
69
- - initialized
70
- - provider/runtime availability
71
- - index last indexed time
72
- - index build version/extraction version
73
- - stale-engine signal
74
- - changed-file signal from CodeGraph when available
75
- - `search`
76
- - symbol/name search
77
- - bounded node metadata only
78
- - `context`
79
- - task/query relevant subgraph via CodeGraph structural context
80
- - bounded nodes and edges
81
- - `impact`
82
- - impact radius from a resolved node
83
- - `file_dependencies`
84
- - dependencies and dependents for explicit files
85
-
86
- Later operations may add callers/callees/usages and affected-test calculation, but Phase 1 should not expand before the Context Pack integration is proven useful.
87
-
88
- Every request includes the canonical repository root chosen by Repository Registry. The sidecar must reject attempts to substitute an arbitrary root after startup.
89
-
90
- ## Context Pack integration
91
-
92
- Extend `ControllerContextPackOptions` with a structural context policy:
93
-
94
- ```text
95
- structuralContext = off | auto | required
96
- ```
97
-
98
- Default is `off` to preserve current Direct performance and behavior.
99
-
100
- Expected mode usage:
101
-
102
- - ordinary Direct: `off`
103
- - explicit `-debug`: `auto`
104
- - explicit `-plan`: `required` when a CodeGraph index is present; otherwise return a clear degraded-plan warning and use bounded text search
105
- - Goal/Plan planning and review: `auto` or `required` when structural evidence materially improves the decision
106
-
107
- When enabled, graph results augment candidate ranking. They do not replace raw source reads. Important files selected through CodeGraph still pass through `resolveMcpPath` and `readRepositoryRange` before implementation.
108
-
109
- Context Pack gains a bounded `structuralContext` section containing:
110
-
111
- - provider: `codegraph`
112
- - requested mode
113
- - status: `ready | unavailable | stale | degraded`
114
- - index freshness/build metadata
115
- - query terms used
116
- - selected structural entry points
117
- - related/impact file paths
118
- - graph truncation metadata
119
- - fallback reason when graph data was not used
120
-
121
- Candidate reasons should distinguish graph evidence, for example:
122
-
123
- - `codegraph:search:<symbol>`
124
- - `codegraph:context`
125
- - `codegraph:impact:<node-id>`
126
- - `codegraph:dependent:<path>`
127
-
128
- ## Freshness policy
129
-
130
- Read-only planning never auto-syncs CodeGraph.
131
-
132
- If the provider reports changed files, stale extraction, or an index built by an older extraction engine:
133
-
134
- 1. mark structural context stale/degraded;
135
- 2. do not silently run `sync` or `index`;
136
- 3. use direct repository reads for affected files;
137
- 4. optionally recommend an explicit CodeGraph refresh action outside the read-only planning step.
138
-
139
- A later typed maintenance action may perform refresh. That action is separate from planning and may write only derived `.codegraph` state, never source files.
140
-
141
- ## Packaging and platform behavior
142
-
143
- The provider locates the matching optional platform package:
144
-
145
- ```text
146
- @colbymchenry/codegraph-<platform>-<arch>
147
- ```
148
-
149
- and uses its bundled `node` / `node.exe` to launch the packaged sidecar.
150
-
151
- If the platform package is missing, provider status is `unavailable` with remediation to reinstall CodeGraph with optional dependencies enabled. Forge must remain usable without CodeGraph.
152
-
153
- The sidecar code ships inside Forge's existing published `src/` or `scripts/` package surface; no new external service or daemon is required for Phase 1.
154
-
155
- ## Security and policy
156
-
157
- - Structural queries are repository-scoped and read-only.
158
- - Sidecar stdin accepts typed JSON requests, not shell commands.
159
- - Sidecar output is bounded before returning to the host.
160
- - Telemetry is disabled for provider subprocesses (`CODEGRAPH_TELEMETRY=0`, `DO_NOT_TRACK=1`).
161
- - No network capability is required.
162
- - No arbitrary executable path is accepted from the user.
163
- - No arbitrary repository root is accepted from the user after Controller selection.
164
- - Graph-selected paths are rechecked through Forge read policy before raw code is returned.
165
- - Errors return bounded diagnostics and never dump database contents.
166
-
167
- ## Performance policy
168
-
169
- Phase 1 uses an on-demand sidecar request path and records timing for:
170
-
171
- - process startup
172
- - CodeGraph open
173
- - graph query
174
- - Context Pack merge
175
-
176
- Do not introduce a persistent sidecar pool until measurements show startup/open dominates p95 planning latency. If pooling is later justified, use bounded per-repository LRU instances with explicit close/eviction and no file watcher.
177
-
178
- This avoids adding a new always-running process before benchmark evidence exists.
179
-
180
- ## Phase 1 implementation steps
181
-
182
- 1. Add the read-only sidecar and host provider with availability/freshness reporting.
183
- 2. Add unit tests proving no mutation operations are exposed by the provider protocol.
184
- 3. Add `structural_context` to `controller_context_pack`; default remains `off`.
185
- 4. Merge CodeGraph structural candidates with existing text-search candidates while retaining policy checks and raw snippets.
186
- 5. Update `SKILL.md` so explicit `-plan` requests structural context and explicit `-debug` prefers it when available. Do not change automatic Direct routing.
187
- 6. Add focused tests for unavailable provider fallback, stale-index warnings, graph candidate ranking, denied-path rechecks, and output bounds.
188
- 7. Run a live Forge CodeGraph query and record evidence before declaring CodeGraph integration ready.
189
-
190
- ## Acceptance criteria
191
-
192
- Phase 1 is accepted only when all of the following are true:
193
-
194
- - Node.js 20.10 remains the public Forge baseline.
195
- - Default Direct workflow and Route Policy are unchanged.
196
- - `controller_context_pack` with no structural option performs no CodeGraph process work.
197
- - `structural_context=auto` degrades cleanly when CodeGraph is unavailable.
198
- - `structural_context=required` reports a clear blocker/degraded state instead of silently pretending structural evidence exists.
199
- - Sidecar opens the index read-only with sync disabled.
200
- - A query cannot invoke CodeGraph mutation APIs.
201
- - CodeGraph-selected files still obey Forge path policy before raw source is returned.
202
- - Context Pack output remains bounded.
203
- - Typecheck and targeted Context Pack/provider tests pass.
204
- - A real query against Forge's `.codegraph` index returns structural evidence.
205
- - No second Forge Runtime, rollout slot, or hidden managed browser/process authority is introduced.
206
-
207
- ## Architecture review
208
-
209
- Review result: approved for Phase 1.
210
-
211
- Reasons:
212
-
213
- - Reuses the existing Context Plane instead of widening the top-level tool surface.
214
- - Preserves the Node 20 public contract by isolating the SDK runtime requirement.
215
- - Separates derived-index maintenance from read-only planning.
216
- - Keeps Direct fast by making structural context opt-in.
217
- - Preserves Forge path policy as the final authority for raw code access.
218
- - Provides a measurable migration path: on-demand sidecar first, pooling only after benchmark evidence.
219
-
220
- Rejected alternatives:
221
-
222
- 1. Import CodeGraph directly into Controller: rejected because it raises the effective Node runtime requirement to 22.5+.
223
- 2. Use `codegraph serve --mcp` directly for Plan reads: rejected for Phase 1 because its normal lifecycle includes connect-time catch-up and watcher/auto-sync behavior, which blurs the read-only planning boundary.
224
- 3. Add new Forge top-level `codegraph_*` MCP tools: rejected because the existing five-facade architecture should remain the preferred host surface.
225
- 4. Parse CodeGraph CLI human-readable output: rejected because the SDK provides a typed API and CLI text is a weaker protocol contract.
226
- 5. Auto-sync before every Plan: rejected because derived-state mutation must be explicit and should not inflate planning latency without evidence.