@moretea-labs/forge 1.6.0 → 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 (396) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +26 -0
  3. package/CLAUDE.md +2 -0
  4. package/README.md +2 -2
  5. package/README.zh-CN.md +1 -1
  6. package/SKILL.md +2 -2
  7. package/THIRD_PARTY_NOTICES.md +1 -1
  8. package/agents/openai.yaml +1 -1
  9. package/assets/hooks/hook-input.sh +11 -8
  10. package/assets/hooks/lib/session-state.sh +10 -7
  11. package/assets/hooks/lib/workflow-state.sh +13 -177
  12. package/assets/hooks/post-tool-observer.sh +8 -2
  13. package/assets/hooks/prompt-guard.sh +5 -81
  14. package/assets/hooks/session-start-context.sh +56 -1
  15. package/assets/partials/05-workflow.partial.md +1 -1
  16. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  17. package/assets/plugin-registry.v1.json +1 -1
  18. package/assets/reference-configs/document-generation.md +1 -1
  19. package/assets/reference-configs/harness-overview.md +1 -1
  20. package/assets/reference-configs/sprint-contracts.md +3 -3
  21. package/assets/skill-version.json +2 -2
  22. package/assets/templates/contract.template.md +2 -7
  23. package/assets/templates/helpers/capture-plan.sh +2 -2
  24. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  25. package/assets/templates/helpers/contract-worktree.sh +1 -21
  26. package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
  27. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  28. package/assets/templates/helpers/new-plan.sh +1 -1
  29. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  30. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  31. package/assets/templates/helpers/verify-contract.sh +1 -111
  32. package/assets/templates/helpers/verify-sprint.sh +3 -180
  33. package/assets/templates/plan.template.md +1 -1
  34. package/assets/templates/review.template.md +9 -34
  35. package/assets/workflow-contract.v1.json +10 -19
  36. package/docs/README.md +10 -10
  37. package/docs/architecture/CURRENT.md +170 -0
  38. package/docs/architecture/EVOLUTION.md +42 -0
  39. package/docs/architecture/current/README.md +4 -156
  40. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  41. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  42. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  43. package/docs/architecture/history/README.md +7 -0
  44. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  45. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  46. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  47. package/docs/architecture/history.md +3 -34
  48. package/docs/architecture/index.md +15 -98
  49. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  50. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  51. package/docs/architecture/versions/1.6.md +38 -0
  52. package/docs/architecture/versions/1.7.md +41 -0
  53. package/docs/forge-chatgpt-browser-engine.md +2 -2
  54. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  55. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  56. package/docs/forge-github-issue-launcher.md +1 -1
  57. package/docs/forge-runtime-self-healing-loop.md +1 -1
  58. package/docs/operations/controller-browser-plugin.md +26 -6
  59. package/docs/operations/controller-performance-and-502.md +124 -0
  60. package/docs/operations/controller-reliability-runbook.md +1 -1
  61. package/docs/operations/features.md +2 -2
  62. package/docs/operations/github-repository.md +1 -1
  63. package/docs/operations/homebrew.md +2 -2
  64. package/docs/operations/mcp-tool-exposure.md +5 -3
  65. package/docs/wiki/Architecture.md +6 -6
  66. package/docs/wiki/Implementation.md +2 -2
  67. package/docs/wiki/Integrations.md +2 -2
  68. package/docs/wiki/Work-Lifecycle.md +1 -1
  69. package/package.json +29 -10
  70. package/scripts/activate-source-baseline.ts +17 -13
  71. package/scripts/benchmark-background-check-overlap.ts +228 -0
  72. package/scripts/benchmark-mcp-host.sh +117 -0
  73. package/scripts/benchmark-mcp-transport.ts +170 -0
  74. package/scripts/benchmark-quality-harness.ts +146 -0
  75. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  76. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  77. package/scripts/benchmark-typescript-navigation.ts +186 -0
  78. package/scripts/benchmark-work-efficiency.ts +334 -0
  79. package/scripts/capture-plan.sh +3 -3
  80. package/scripts/check-agent-tooling.sh +8 -35
  81. package/scripts/check-architecture-sync.sh +17 -86
  82. package/scripts/check-mcp-compatibility.ts +14 -0
  83. package/scripts/check-runtime-architecture.mjs +107 -64
  84. package/scripts/check-stable-baseline.ts +92 -0
  85. package/scripts/check-task-workflow.sh +4 -4
  86. package/scripts/contract-worktree.sh +1 -21
  87. package/scripts/ensure-task-workflow.sh +22 -55
  88. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  89. package/scripts/install-standalone-recovery.ts +24 -0
  90. package/scripts/lib/project-init-lib.sh +15 -44
  91. package/scripts/migrate-project-template.sh +23 -1179
  92. package/scripts/new-plan.sh +1 -1
  93. package/scripts/plan-to-todo.sh +11 -36
  94. package/scripts/run-governed-gate.ts +2 -1
  95. package/scripts/ship-worktrees.sh +2 -29
  96. package/scripts/smoke-ios-physical-device.ts +4 -2
  97. package/scripts/smoke-runtime-recovery.ts +1 -35
  98. package/scripts/smoke-schedule-engine.ts +1 -20
  99. package/scripts/verify-contract.sh +1 -111
  100. package/scripts/verify-forge-runtime.sh +0 -1
  101. package/scripts/verify-sprint.sh +3 -180
  102. package/scripts/workflow-contract.ts +1 -5
  103. package/src/cli/commands/init-hook.ts +3 -3
  104. package/src/cli/commands/mcp.ts +9 -5
  105. package/src/cli/commands/plugin.ts +1 -1
  106. package/src/cli/commands/recovery.ts +25 -3
  107. package/src/cli/commands/runtime.ts +55 -3
  108. package/src/cli/commands/security.ts +12 -1
  109. package/src/cli/commands/setup-profile.ts +31 -21
  110. package/src/cli/controller/check-runner.ts +106 -3
  111. package/src/cli/controller/composite-result.ts +1 -1
  112. package/src/cli/controller/context/focus.ts +51 -0
  113. package/src/cli/controller/context/instruction-context.ts +114 -0
  114. package/src/cli/controller/context/known-paths.ts +76 -0
  115. package/src/cli/controller/context/query-planning.ts +110 -0
  116. package/src/cli/controller/context/rule-resolution.ts +532 -0
  117. package/src/cli/controller/context/source-materializer.ts +278 -0
  118. package/src/cli/controller/context/structural.ts +16 -0
  119. package/src/cli/controller/context/types.ts +286 -0
  120. package/src/cli/controller/context-pack.ts +785 -469
  121. package/src/cli/controller/launch-agents.ts +77 -2
  122. package/src/cli/controller/operational-plan.ts +2 -2
  123. package/src/cli/controller/work-mode.ts +6 -4
  124. package/src/cli/editing/edit-session.ts +60 -7
  125. package/src/cli/github/github.ts +133 -0
  126. package/src/cli/installer/managed-entries.ts +15 -1
  127. package/src/cli/local-bridge/console-automations.ts +54 -78
  128. package/src/cli/local-bridge/console-view-models.ts +1 -35
  129. package/src/cli/local-bridge/facade-api.ts +0 -217
  130. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  131. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
  132. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  133. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
  134. package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
  135. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  136. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
  137. package/src/cli/local-bridge/frontend/src/styles.css +1 -1
  138. package/src/cli/local-bridge/frontend/src/types.ts +5 -8
  139. package/src/cli/local-bridge/job-store.ts +1 -490
  140. package/src/cli/local-bridge/server.ts +0 -513
  141. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  142. package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
  143. package/src/cli/mcp/auth.ts +5 -5
  144. package/src/cli/mcp/instructions.ts +3 -2
  145. package/src/cli/mcp/legacy-tool-service.ts +0 -189
  146. package/src/cli/mcp/multi-repository.ts +16 -5
  147. package/src/cli/mcp/oauth.ts +175 -26
  148. package/src/cli/mcp/repository-tools.ts +247 -107
  149. package/src/cli/mcp/server.ts +537 -111
  150. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  151. package/src/cli/mcp/toolset-selection.ts +1 -1
  152. package/src/cli/mcp/toolset.ts +42 -5
  153. package/src/cli/mcp/transports/http.ts +101 -14
  154. package/src/cli/mcp/transports/session-registry.ts +43 -5
  155. package/src/cli/mcp/types.ts +3 -3
  156. package/src/cli/repositories/command-classifier.ts +101 -19
  157. package/src/cli/repositories/command-executor.ts +55 -521
  158. package/src/cli/repositories/command-process.ts +108 -0
  159. package/src/cli/repositories/command-scope.ts +99 -41
  160. package/src/cli/repositories/controller-home.ts +7 -8
  161. package/src/cli/repositories/git-command-executor.ts +2 -0
  162. package/src/cli/repositories/locks.ts +53 -16
  163. package/src/cli/repositories/repository-snapshot.ts +121 -0
  164. package/src/cli/repositories/selected-path-actions.ts +17 -9
  165. package/src/cli/repositories/structured-git.ts +61 -3
  166. package/src/cli/repository/inspector.ts +553 -63
  167. package/src/cli/repository/session-cache.ts +58 -17
  168. package/src/cli/v81-entry.ts +1 -4
  169. package/src/effects/fs-transaction.ts +85 -17
  170. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  171. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  172. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  173. package/src/runtime/context/lsp-client.ts +283 -0
  174. package/src/runtime/context/semantic-navigation.ts +275 -0
  175. package/src/runtime/context/swift-navigation.ts +565 -0
  176. package/src/runtime/context/typescript-navigation.ts +226 -0
  177. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  178. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +47 -8
  179. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  180. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  181. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  182. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  183. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  184. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  185. package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
  186. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +143 -8
  187. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
  188. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +85 -8
  189. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  190. package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
  191. package/src/runtime/control-plane/facade/controller-session-store.ts +132 -1
  192. package/src/runtime/control-plane/facade/goal-workloop-access.ts +2 -0
  193. package/src/runtime/control-plane/facade/goal-workloop.ts +686 -129
  194. package/src/runtime/control-plane/facade/index.ts +1 -0
  195. package/src/runtime/control-plane/facade/plan-contract-store.ts +185 -20
  196. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  197. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  198. package/src/runtime/control-plane/facade/types.ts +22 -5
  199. package/src/runtime/control-plane/facade/work-contract-store.ts +175 -73
  200. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  201. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  202. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  203. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  204. package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
  205. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  206. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  207. package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
  208. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  209. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  210. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  211. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  212. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  213. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  214. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  215. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  216. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  217. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  218. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
  219. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +355 -116
  220. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
  221. package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
  222. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  223. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  224. package/src/runtime/control-plane/release-retention.ts +62 -2
  225. package/src/runtime/control-plane/routing/route-policy.ts +7 -16
  226. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  227. package/src/runtime/diagnostics/mcp-timing.ts +13 -0
  228. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  229. package/src/runtime/diagnostics/performance.ts +24 -1
  230. package/src/runtime/evidence/event-ledger.ts +1 -1
  231. package/src/runtime/execution/jobs/store.ts +58 -4
  232. package/src/runtime/execution/jobs/types.ts +1 -1
  233. package/src/runtime/execution/managed-workspace.ts +203 -1
  234. package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
  235. package/src/runtime/execution/process-runtime/check-result.ts +53 -0
  236. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  237. package/src/runtime/execution/process-runtime/command-facade.ts +345 -40
  238. package/src/runtime/execution/process-runtime/gc.ts +38 -6
  239. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
  240. package/src/runtime/execution/process-runtime/persisted-check.ts +47 -4
  241. package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
  242. package/src/runtime/execution/process-runtime/runtime.ts +43 -3
  243. package/src/runtime/execution/process-runtime/store.ts +1 -0
  244. package/src/runtime/execution/process-runtime/types.ts +2 -0
  245. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  246. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  247. package/src/runtime/execution/workers/executor.ts +0 -48
  248. package/src/runtime/gateway/mcp/execution-tools.ts +1192 -114
  249. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  250. package/src/runtime/gateway/mcp/router.ts +184 -82
  251. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
  252. package/src/runtime/gateway/mcp/runtime-tools.ts +2224 -1589
  253. package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
  254. package/src/runtime/plugins/browser-adapter.ts +2901 -241
  255. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  256. package/src/runtime/plugins/browser-handoff.ts +92 -2
  257. package/src/runtime/plugins/browser-macos-bridge.ts +582 -49
  258. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  259. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  260. package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
  261. package/src/runtime/plugins/browser-runtime.ts +183 -0
  262. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  263. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  264. package/src/runtime/plugins/desktop-operator-registration.ts +8 -2
  265. package/src/runtime/plugins/external-adapter.ts +324 -3
  266. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  267. package/src/runtime/plugins/first-party-registry.ts +2 -0
  268. package/src/runtime/plugins/github-adapter.ts +125 -0
  269. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  270. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  271. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  272. package/src/runtime/plugins/ios-adapter.ts +106 -16
  273. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  274. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  275. package/src/runtime/plugins/lightweight-action.ts +153 -0
  276. package/src/runtime/plugins/local-system-adapter.ts +123 -6
  277. package/src/runtime/plugins/macos-capability-broker.ts +55 -9
  278. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  279. package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
  280. package/src/runtime/plugins/resend-adapter.ts +1 -1
  281. package/src/runtime/plugins/store.ts +269 -29
  282. package/src/runtime/plugins/types.ts +35 -2
  283. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  284. package/src/runtime/projections/git-status-sampler.ts +16 -16
  285. package/src/runtime/projections/materialized-view.ts +28 -10
  286. package/src/runtime/recovery/maintenance-executor.ts +393 -28
  287. package/src/runtime/root/mcp-transport.ts +180 -10
  288. package/src/runtime/root/package-connector-service.ts +186 -8
  289. package/src/runtime/root/package-runtime-release.ts +143 -17
  290. package/src/runtime/root/package-runtime-service.ts +430 -22
  291. package/src/runtime/root/release-manifest.ts +7 -2
  292. package/src/runtime/root/release-materialize.ts +19 -0
  293. package/src/runtime/root/release-store.ts +48 -11
  294. package/src/runtime/root/runtime.ts +23 -5
  295. package/src/runtime/root/service.ts +100 -29
  296. package/src/runtime/root/types.ts +2 -0
  297. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  298. package/src/runtime/shared/trusted-executable.ts +62 -0
  299. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  300. package/src/runtime/standalone-recovery/core.ts +700 -92
  301. package/src/runtime/standalone-recovery/entry.ts +99 -23
  302. package/src/runtime/standalone-recovery/installer.ts +19 -3
  303. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  304. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  305. package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
  306. package/src/runtime/workflow/schedules/engine.ts +287 -151
  307. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  308. package/src/runtime/workflow/schedules/settlement.ts +48 -4
  309. package/src/runtime/workflow/schedules/store.ts +131 -10
  310. package/src/runtime/workflow/schedules/types.ts +2 -4
  311. package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
  312. package/src/testing/test-governance.ts +8 -40
  313. package/assets/reference-configs/heartbeat-triage.md +0 -57
  314. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  315. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  316. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  317. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  318. package/docs/architecture/current/architecture-invariants.md +0 -331
  319. package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
  320. package/docs/architecture/current/codegraph-context-provider.md +0 -238
  321. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  322. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  323. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
  324. package/docs/architecture/current/entity-model.md +0 -612
  325. package/docs/architecture/current/external-plugin-governance.md +0 -396
  326. package/docs/architecture/current/failure-recovery.md +0 -447
  327. package/docs/architecture/current/governance.md +0 -213
  328. package/docs/architecture/current/human-interaction-plane.md +0 -87
  329. package/docs/architecture/current/implementation-status.md +0 -128
  330. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  331. package/docs/architecture/current/legacy-governance.md +0 -58
  332. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  333. package/docs/architecture/current/migration-roadmap.md +0 -105
  334. package/docs/architecture/current/multi-repository-execution.md +0 -371
  335. package/docs/architecture/current/operations-runbook.md +0 -45
  336. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  337. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  338. package/docs/architecture/current/repository-access-modes.md +0 -102
  339. package/docs/architecture/current/route-policy.md +0 -15
  340. package/docs/architecture/current/route-session-concurrency.md +0 -85
  341. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  342. package/docs/architecture/current/runtime-directory-map.md +0 -49
  343. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  344. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  345. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  346. package/docs/architecture/current/system-overview.md +0 -169
  347. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  348. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  349. package/docs/architecture/current/thin-harness-v1.md +0 -321
  350. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  351. package/docs/forge-autonomous-goal-loop.md +0 -9
  352. package/docs/forge-provider-configuration.md +0 -7
  353. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
  354. package/docs/operations/gmail-assistant-routines.md +0 -186
  355. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  356. package/docs/operations/provider-configuration.md +0 -31
  357. package/scripts/harness-trace-grade.sh +0 -150
  358. package/scripts/heartbeat-triage.sh +0 -361
  359. package/scripts/maintenance-triage.sh +0 -167
  360. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  361. package/src/cli/repositories/goal-registry.ts +0 -239
  362. package/src/runtime/assistant/action-proposals.ts +0 -279
  363. package/src/runtime/assistant/intent.ts +0 -395
  364. package/src/runtime/assistant/model-provider.ts +0 -460
  365. package/src/runtime/assistant/openapi.ts +0 -223
  366. package/src/runtime/assistant/policy.ts +0 -89
  367. package/src/runtime/assistant/readiness.ts +0 -258
  368. package/src/runtime/assistant/routine-runtime.ts +0 -477
  369. package/src/runtime/assistant/schedule-binding.ts +0 -171
  370. package/src/runtime/assistant/standing-grants.ts +0 -375
  371. package/src/runtime/assistant/store.ts +0 -243
  372. package/src/runtime/assistant/types.ts +0 -135
  373. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  374. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  375. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  376. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  377. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  378. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  379. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  380. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  381. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  382. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  383. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  384. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  385. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  386. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  387. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  388. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  389. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  390. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  391. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  392. package/src/runtime/workflow/findings/store.ts +0 -204
  393. package/src/runtime/workflow/findings/types.ts +0 -58
  394. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  395. package/src/runtime/workflow/portfolio/store.ts +0 -185
  396. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -0,0 +1,44 @@
1
+ export interface SchedulerConfig {
2
+ maxWorkers: number;
3
+ maxConcurrentRepositories: number;
4
+ pollIntervalMs: number;
5
+ idleBackoffMaxMs: number;
6
+ heartbeatIntervalMs: number;
7
+ heartbeatTimeoutMs: number;
8
+ maxHeavyChecks: number;
9
+ maxAgentProcesses: number;
10
+ maxCodexProcesses: number;
11
+ maxClaudeProcesses: number;
12
+ maxGitHubProcesses: number;
13
+ minFreeMemoryMb: number;
14
+ maxLoadPerCpu: number;
15
+ }
16
+
17
+ export function normalizeSchedulerConfig(
18
+ config: Partial<SchedulerConfig> = {},
19
+ env: NodeJS.ProcessEnv = process.env,
20
+ ): SchedulerConfig {
21
+ const pollIntervalMs = Math.max(50, config.pollIntervalMs ?? 250);
22
+ const idleBackoffMaxMs = Math.max(250, config.idleBackoffMaxMs ?? Number(env.FORGE_IDLE_BACKOFF_MAX_MS ?? 2_000));
23
+ const heartbeatIntervalMs = Math.max(25, config.heartbeatIntervalMs ?? Number(env.FORGE_SCHEDULER_HEARTBEAT_INTERVAL_MS ?? 1_000));
24
+ const heartbeatTimeoutMs = Math.max(
25
+ heartbeatIntervalMs * 4,
26
+ idleBackoffMaxMs * 4,
27
+ config.heartbeatTimeoutMs ?? Number(env.FORGE_SCHEDULER_HEARTBEAT_TIMEOUT_MS ?? 60_000),
28
+ );
29
+ return {
30
+ maxWorkers: Math.max(1, config.maxWorkers ?? Number(env.FORGE_MAX_WORKERS ?? 4)),
31
+ maxConcurrentRepositories: Math.max(1, config.maxConcurrentRepositories ?? Number(env.FORGE_MAX_ACTIVE_REPOS ?? 4)),
32
+ pollIntervalMs,
33
+ idleBackoffMaxMs,
34
+ heartbeatIntervalMs,
35
+ heartbeatTimeoutMs,
36
+ maxHeavyChecks: Math.max(1, config.maxHeavyChecks ?? Number(env.FORGE_MAX_HEAVY_CHECKS ?? 2)),
37
+ maxAgentProcesses: Math.max(1, config.maxAgentProcesses ?? Number(env.FORGE_MAX_AGENT_PROCESSES ?? 4)),
38
+ maxCodexProcesses: Math.max(1, config.maxCodexProcesses ?? Number(env.FORGE_MAX_CODEX_PROCESSES ?? 3)),
39
+ maxClaudeProcesses: Math.max(1, config.maxClaudeProcesses ?? Number(env.FORGE_MAX_CLAUDE_PROCESSES ?? 2)),
40
+ maxGitHubProcesses: Math.max(1, config.maxGitHubProcesses ?? Number(env.FORGE_MAX_GITHUB_PROCESSES ?? 2)),
41
+ minFreeMemoryMb: Math.max(64, config.minFreeMemoryMb ?? Number(env.FORGE_MIN_FREE_MEMORY_MB ?? 512)),
42
+ maxLoadPerCpu: Math.max(0.25, config.maxLoadPerCpu ?? Number(env.FORGE_MAX_LOAD_PER_CPU ?? 1.5)),
43
+ };
44
+ }
@@ -0,0 +1,80 @@
1
+ import type { ExecutionJob } from '../../execution/jobs/types';
2
+
3
+ export type SchedulerAgentProvider = 'codex' | 'claude' | 'github-copilot';
4
+
5
+ export interface SchedulerDispatchLimits {
6
+ maxWorkers: number;
7
+ maxHeavyChecks: number;
8
+ maxAgentProcesses: number;
9
+ maxCodexProcesses: number;
10
+ maxClaudeProcesses: number;
11
+ maxGitHubProcesses: number;
12
+ }
13
+
14
+ export interface SchedulerDispatchCapacity {
15
+ reservedJobs: ExecutionJob[];
16
+ workers: number;
17
+ heavyChecks: number;
18
+ agents: number;
19
+ providers: Map<SchedulerAgentProvider, number>;
20
+ }
21
+
22
+ export function schedulerAgentProvider(
23
+ job: Pick<ExecutionJob, 'payload'>,
24
+ ): SchedulerAgentProvider {
25
+ const agent = job.payload.arguments?.agent;
26
+ if (agent === 'claude' || agent === 'github-copilot') return agent;
27
+ return 'codex';
28
+ }
29
+
30
+ export function createSchedulerDispatchCapacity(
31
+ activeJobs: readonly ExecutionJob[],
32
+ limits: SchedulerDispatchLimits,
33
+ pressured: boolean,
34
+ ): SchedulerDispatchCapacity {
35
+ const reservedJobs = activeJobs.filter((job) => job.status === 'running' || job.status === 'dispatched');
36
+ const reservedAgents = reservedJobs.filter((job) => job.type === 'agent-run' || job.type === 'dispatch-task');
37
+ let workers = limits.maxWorkers - reservedJobs.length;
38
+ let heavyChecks = limits.maxHeavyChecks
39
+ - reservedJobs.filter((job) => job.type === 'check' || job.type === 'verify-edit').length;
40
+ let agents = limits.maxAgentProcesses - reservedAgents.length;
41
+ const providers = new Map<SchedulerAgentProvider, number>([
42
+ ['codex', limits.maxCodexProcesses - reservedAgents.filter((job) => schedulerAgentProvider(job) === 'codex').length],
43
+ ['claude', limits.maxClaudeProcesses - reservedAgents.filter((job) => schedulerAgentProvider(job) === 'claude').length],
44
+ ['github-copilot', limits.maxGitHubProcesses - reservedAgents.filter((job) => schedulerAgentProvider(job) === 'github-copilot').length],
45
+ ]);
46
+ if (pressured) {
47
+ workers = Math.min(workers, 1);
48
+ heavyChecks = Math.min(heavyChecks, 1);
49
+ agents = 0;
50
+ providers.set('codex', 0);
51
+ providers.set('claude', 0);
52
+ providers.set('github-copilot', 0);
53
+ }
54
+ return { reservedJobs, workers, heavyChecks, agents, providers };
55
+ }
56
+
57
+ export function schedulerDispatchCapacityAllows(
58
+ capacity: SchedulerDispatchCapacity,
59
+ job: Pick<ExecutionJob, 'type' | 'payload'>,
60
+ ): boolean {
61
+ if ((job.type === 'check' || job.type === 'verify-edit') && capacity.heavyChecks <= 0) return false;
62
+ if (job.type === 'agent-run' || job.type === 'dispatch-task') {
63
+ if (capacity.agents <= 0) return false;
64
+ if ((capacity.providers.get(schedulerAgentProvider(job)) ?? 0) <= 0) return false;
65
+ }
66
+ return true;
67
+ }
68
+
69
+ export function consumeSchedulerDispatchCapacity(
70
+ capacity: SchedulerDispatchCapacity,
71
+ job: Pick<ExecutionJob, 'type' | 'payload'>,
72
+ ): void {
73
+ capacity.workers -= 1;
74
+ if (job.type === 'check' || job.type === 'verify-edit') capacity.heavyChecks -= 1;
75
+ if (job.type === 'agent-run' || job.type === 'dispatch-task') {
76
+ capacity.agents -= 1;
77
+ const provider = schedulerAgentProvider(job);
78
+ capacity.providers.set(provider, (capacity.providers.get(provider) ?? 0) - 1);
79
+ }
80
+ }
@@ -0,0 +1,46 @@
1
+ import {
2
+ listActiveExecutionJobs,
3
+ markExecutionJobSchedulerObserved,
4
+ } from '../../execution/jobs/store';
5
+ import { tickSchedules } from '../../workflow/schedules/engine';
6
+
7
+ const SCHEDULE_TICK_INTERVAL_MS = 30_000;
8
+
9
+ export interface SchedulerDurableAdmissionDependencies {
10
+ listActiveJobs: typeof listActiveExecutionJobs;
11
+ markSchedulerObserved: typeof markExecutionJobSchedulerObserved;
12
+ tickSchedules: typeof tickSchedules;
13
+ }
14
+
15
+ const DEFAULT_DEPENDENCIES: SchedulerDurableAdmissionDependencies = {
16
+ listActiveJobs: listActiveExecutionJobs,
17
+ markSchedulerObserved: markExecutionJobSchedulerObserved,
18
+ tickSchedules,
19
+ };
20
+
21
+ export async function runSchedulerDurableAdmission(input: {
22
+ controllerHome: string;
23
+ repositoryIds: readonly string[];
24
+ nowMs: number;
25
+ lastScheduleTickAt: number;
26
+ }, dependencies: SchedulerDurableAdmissionDependencies = DEFAULT_DEPENDENCIES): Promise<{
27
+ scheduleTicked: boolean;
28
+ }> {
29
+ // Observation closes the admission phase for durable Jobs and starts their
30
+ // independent queue budget. Each Job owns its own atomic state transition,
31
+ // so this intentionally remains outside the global dispatch reservation lock.
32
+ for (const job of dependencies.listActiveJobs(input.controllerHome)) {
33
+ if (job.status === 'running' || job.timings?.schedulerObservedAt) continue;
34
+ try {
35
+ dependencies.markSchedulerObserved(input.controllerHome, job.repoId, job.jobId);
36
+ } catch {
37
+ // Another Scheduler instance or a terminal transition won the Job-local race.
38
+ }
39
+ }
40
+
41
+ if (input.nowMs - input.lastScheduleTickAt < SCHEDULE_TICK_INTERVAL_MS) {
42
+ return { scheduleTicked: false };
43
+ }
44
+ await dependencies.tickSchedules(input.controllerHome, [...input.repositoryIds]);
45
+ return { scheduleTicked: true };
46
+ }
@@ -0,0 +1,145 @@
1
+ import type { RepositoryRecord } from '../../../cli/repositories/types';
2
+ import { cleanupGeneratedRepositoryCaches, cleanupIdleXCTestDevices } from '../generated-cache-retention';
3
+ import type { cleanupControllerRuntimeState } from '../runtime-cleanup';
4
+ import type { reconcileTerminalWorkCleanups } from '../execution/work-terminal-cleanup';
5
+ import type { gcTerminalProcesses } from '../../execution/process-runtime/gc';
6
+ import type { reconcilePendingWorkValidations } from '../execution/work-validation-reconciler';
7
+ import type { reconcilePendingEditValidations } from '../execution/edit-validation-coordinator';
8
+ import {
9
+ buildControllerRoundRelayPrompt,
10
+ claimStalledControllerRoundRelays,
11
+ finishControllerRoundRelayDispatch,
12
+ } from '../facade/controller-round-relay';
13
+ import { assertAutomatedOperationAllowed } from '../governance/external-effects';
14
+ import { runStandaloneChatgptPrompt } from '../launcher/chatgpt-work-continuation';
15
+
16
+ export async function runSchedulerPeriodicCleanup(input: {
17
+ controllerHome: string;
18
+ controllerPid: number;
19
+ nowMs: number;
20
+ cleanupIntervalMs: number;
21
+ repositories: readonly RepositoryRecord[];
22
+ runtimeCleanup: typeof cleanupControllerRuntimeState;
23
+ terminalWorkCleanup: typeof reconcileTerminalWorkCleanups;
24
+ processGc: typeof gcTerminalProcesses;
25
+ }): Promise<void> {
26
+ try {
27
+ input.runtimeCleanup(input.controllerHome, {
28
+ reason: 'periodic',
29
+ nowMs: input.nowMs,
30
+ protectedControllerPid: input.controllerPid,
31
+ });
32
+ } catch (error) {
33
+ console.error('[forge cleanup] periodic cleanup failed:', error);
34
+ }
35
+ try {
36
+ await input.terminalWorkCleanup(input.controllerHome, { nowMs: input.nowMs });
37
+ } catch (error) {
38
+ console.error('[forge cleanup] terminal Work cleanup failed:', error);
39
+ }
40
+ try {
41
+ const xctestCleanup = cleanupIdleXCTestDevices(input.controllerHome);
42
+ if (xctestCleanup.error) console.error('[forge cleanup] XCTest device cleanup failed:', xctestCleanup.error);
43
+ } catch (error) {
44
+ console.error('[forge cleanup] XCTest device cleanup failed:', error);
45
+ }
46
+ if (input.repositories.length === 0) return;
47
+ const slot = Math.floor(input.nowMs / input.cleanupIntervalMs) % input.repositories.length;
48
+ const repo = input.repositories[slot]!;
49
+ try {
50
+ const generated = cleanupGeneratedRepositoryCaches(repo.canonicalRoot, { nowMs: input.nowMs });
51
+ if (generated.errors.length > 0) {
52
+ console.error(`[forge cleanup] generated-cache retention reported ${generated.errors.length} error(s) for ${repo.repoId}`);
53
+ }
54
+ } catch (error) {
55
+ console.error(`[forge cleanup] generated-cache retention failed for ${repo.repoId}:`, error);
56
+ }
57
+ const result = input.processGc({ controllerHome: input.controllerHome, repoId: repo.repoId });
58
+ if (!result.ok) console.error('[forge cleanup] Process GC failed:', result.error ?? 'unknown error');
59
+ }
60
+
61
+ export async function runSchedulerValidationReconciliation(input: {
62
+ controllerHome: string;
63
+ repositories: readonly RepositoryRecord[];
64
+ workValidationReconcile: typeof reconcilePendingWorkValidations;
65
+ editValidationReconcile: typeof reconcilePendingEditValidations;
66
+ }): Promise<void> {
67
+ for (const repository of input.repositories) {
68
+ const validation = input.workValidationReconcile(input.controllerHome, repository.repoId, 500);
69
+ if (validation.errors.length > 0) {
70
+ console.error(
71
+ `[forge validation] background Work reconciliation reported ${validation.errors.length} error(s) for ${repository.repoId}`,
72
+ );
73
+ }
74
+ const editValidation = await input.editValidationReconcile(input.controllerHome, repository, 200);
75
+ if (editValidation.errors.length > 0) {
76
+ console.error(
77
+ `[forge validation] background EditSession reconciliation reported ${editValidation.errors.length} error(s) for ${repository.repoId}`,
78
+ );
79
+ }
80
+ }
81
+ }
82
+
83
+ export async function runSchedulerControllerRoundRecovery(input: {
84
+ controllerHome: string;
85
+ nowMs: number;
86
+ repositories: readonly Pick<RepositoryRecord, 'repoId'>[];
87
+ graceMs?: number;
88
+ maxRecoveries?: number;
89
+ dispatchPrompt?: typeof runStandaloneChatgptPrompt;
90
+ authorizeWake?: typeof assertAutomatedOperationAllowed;
91
+ }): Promise<{ claimed: number; dispatched: number; failed: number }> {
92
+ const dispatchPrompt = input.dispatchPrompt ?? runStandaloneChatgptPrompt;
93
+ const authorizeWake = input.authorizeWake ?? assertAutomatedOperationAllowed;
94
+ const maxRecoveries = Math.max(1, Math.min(Math.trunc(input.maxRecoveries ?? 2), 8));
95
+ let claimed = 0;
96
+ let dispatched = 0;
97
+ let failed = 0;
98
+
99
+ for (const repository of input.repositories) {
100
+ if (claimed >= maxRecoveries) break;
101
+ const store = { controllerHome: input.controllerHome, repoId: repository.repoId };
102
+ const records = claimStalledControllerRoundRelays(store, {
103
+ nowMs: input.nowMs,
104
+ graceMs: input.graceMs,
105
+ limit: maxRecoveries - claimed,
106
+ });
107
+ claimed += records.length;
108
+ for (const record of records) {
109
+ try {
110
+ authorizeWake('external_controller_wake', {
111
+ work_id: record.originWorkId,
112
+ controller_type: 'chatgpt',
113
+ relay_scope_id: record.relayScopeId,
114
+ recovery_reason: 'unclosed_dispatched_round',
115
+ });
116
+ const result = await dispatchPrompt({
117
+ controllerHome: input.controllerHome,
118
+ repoId: repository.repoId,
119
+ scopeId: `controller-relay:${record.relayScopeId}`,
120
+ prompt: buildControllerRoundRelayPrompt(store, record),
121
+ browserSessionId: record.browserSessionId,
122
+ conversationUrl: record.conversationUrl,
123
+ model: 'gpt-5.6',
124
+ reasoning: 'high',
125
+ tabPolicy: 'auto',
126
+ timeoutMs: 30_000,
127
+ });
128
+ if (result.status === 'failed') throw new Error(result.error?.message ?? 'CHATGPT_CONTROLLER_RELAY_RECOVERY_FAILED');
129
+ finishControllerRoundRelayDispatch(store, {
130
+ workId: record.originWorkId,
131
+ ok: true,
132
+ browserSessionId: result.browserSessionId,
133
+ conversationUrl: result.conversationUrl,
134
+ });
135
+ dispatched += 1;
136
+ } catch (error) {
137
+ const reason = error instanceof Error ? error.message : String(error);
138
+ finishControllerRoundRelayDispatch(store, { workId: record.originWorkId, ok: false, error: reason });
139
+ failed += 1;
140
+ console.error(`[forge controller relay] stalled round recovery failed for ${record.relayScopeId}:`, reason);
141
+ }
142
+ }
143
+ }
144
+ return { claimed, dispatched, failed };
145
+ }
@@ -0,0 +1,84 @@
1
+ import type { RepositoryRecord } from '../../../cli/repositories/types';
2
+ import { getRuntimeWriteClaim } from '../../root/write-fence';
3
+ import { rebuildRepositoryProjection, refreshRepositoryProjectionForRepository } from '../../projections/materialized-view';
4
+ import { readRepositoryProjectionDirty } from '../../projections/invalidation';
5
+ import { readRepositoryGitStatusSample } from '../../projections/git-status-sampler';
6
+
7
+ export interface SchedulerProjectionRefreshTargets {
8
+ repositories: RepositoryRecord[];
9
+ rebuildRepoIds: string[];
10
+ }
11
+
12
+ export function selectSchedulerDirtyProjectionRepositories(
13
+ controllerHome: string,
14
+ repositories: readonly RepositoryRecord[],
15
+ ): RepositoryRecord[] {
16
+ return repositories.filter((repository) => readRepositoryProjectionDirty(controllerHome, repository.repoId) !== undefined);
17
+ }
18
+
19
+ export function selectSchedulerProjectionRefreshTargets(
20
+ repositories: readonly RepositoryRecord[],
21
+ sourceScanRepositories: readonly RepositoryRecord[],
22
+ projectionRefreshRepoIds: Iterable<string>,
23
+ ): SchedulerProjectionRefreshTargets {
24
+ const candidates = new Map(sourceScanRepositories.map((repository) => [repository.repoId, repository]));
25
+ const repositoryById = new Map(repositories.map((repository) => [repository.repoId, repository]));
26
+ const rebuildRepoIds: string[] = [];
27
+ const rebuildSeen = new Set<string>();
28
+ for (const repoId of projectionRefreshRepoIds) {
29
+ const repository = repositoryById.get(repoId);
30
+ if (repository) {
31
+ candidates.set(repoId, repository);
32
+ continue;
33
+ }
34
+ if (!rebuildSeen.has(repoId)) {
35
+ rebuildSeen.add(repoId);
36
+ rebuildRepoIds.push(repoId);
37
+ }
38
+ }
39
+ return {
40
+ repositories: [...candidates.values()],
41
+ rebuildRepoIds,
42
+ };
43
+ }
44
+
45
+ export function refreshSchedulerRepositoryProjections(input: {
46
+ controllerHome: string;
47
+ repositories: readonly RepositoryRecord[];
48
+ sourceScanRepositories: readonly RepositoryRecord[];
49
+ projectionRefreshRepoIds: Iterable<string>;
50
+ controllerPid: number;
51
+ }): void {
52
+ const targets = selectSchedulerProjectionRefreshTargets(
53
+ input.repositories,
54
+ input.sourceScanRepositories,
55
+ input.projectionRefreshRepoIds,
56
+ );
57
+ for (const repoId of targets.rebuildRepoIds) {
58
+ try {
59
+ rebuildRepositoryProjection(input.controllerHome, repoId);
60
+ } catch (error) {
61
+ console.error('[forge scheduler] projection refresh failed:', error);
62
+ }
63
+ }
64
+ for (const repository of targets.repositories) {
65
+ try {
66
+ const sample = readRepositoryGitStatusSample(
67
+ input.controllerHome,
68
+ repository.repoId,
69
+ repository.activeCheckoutId,
70
+ );
71
+ const runtimeInstanceId = getRuntimeWriteClaim()?.runtimeInstanceId;
72
+ refreshRepositoryProjectionForRepository(input.controllerHome, repository, {
73
+ sourceRevision: sample?.head ?? undefined,
74
+ reason: 'scheduler-source-scan',
75
+ owner: {
76
+ pid: input.controllerPid,
77
+ ...(runtimeInstanceId ? { runtimeInstanceId } : {}),
78
+ },
79
+ });
80
+ } catch (error) {
81
+ console.error('[forge scheduler] projection refresh failed:', error);
82
+ }
83
+ }
84
+ }
@@ -1,4 +1,4 @@
1
- import { listActiveExecutionJobs, transitionExecutionJob } from '../../execution/jobs/store';
1
+ import { reconcileActiveExecutionJobIndex, transitionExecutionJob } from '../../execution/jobs/store';
2
2
  import type { ExecutionJob } from '../../execution/jobs/types';
3
3
  import {
4
4
  executionTimeoutDecision,
@@ -142,7 +142,7 @@ function reconcileExecutionJobsWith(
142
142
  terminateWorker: (pid: number | undefined) => ProcessTreeTerminationResult,
143
143
  repoId?: string,
144
144
  ): ReconcileSummary {
145
- const jobs = listActiveExecutionJobs(controllerHome, repoId);
145
+ const jobs = reconcileActiveExecutionJobIndex(controllerHome, repoId);
146
146
  let requeued = 0;
147
147
  let terminal = 0;
148
148
  let recovered = 0;
@@ -200,7 +200,7 @@ async function reconcileExecutionJobsAsyncWith(
200
200
  terminateWorker: (pid: number | undefined) => Promise<ProcessTreeTerminationResult>,
201
201
  repoId?: string,
202
202
  ): Promise<ReconcileSummary> {
203
- const jobs = listActiveExecutionJobs(controllerHome, repoId);
203
+ const jobs = reconcileActiveExecutionJobIndex(controllerHome, repoId);
204
204
  let requeued = 0;
205
205
  let terminal = 0;
206
206
  let recovered = 0;