@moretea-labs/forge 1.8.0 → 1.8.2

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 (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -1,6 +1,6 @@
1
1
  import type { RepositoryRecord } from '../../../cli/repositories/types';
2
2
  import { cleanupRuntimeComputerInteractionTargets } from '../../root/computer-target-composition';
3
- import { cleanupControllerHomeBrowserArtifacts, cleanupGeneratedRepositoryCaches, cleanupIdleXCTestDevices } from '../generated-cache-retention';
3
+ import { cleanupControllerHomeBrowserArtifacts, cleanupGeneratedRepositoryCheckoutCaches, cleanupIdleXCTestDevices } from '../generated-cache-retention';
4
4
  import {
5
5
  cleanupRuntimeBrowserSessionTombstones,
6
6
  closeRuntimeBrowserSessionLegacyImportCutover,
@@ -8,18 +8,105 @@ import {
8
8
  import type { cleanupControllerRuntimeState } from '../runtime-cleanup';
9
9
  import type { reconcileTerminalWorkCleanups } from '../execution/work-terminal-cleanup';
10
10
  import type { gcTerminalProcesses } from '../../execution/process-runtime/gc';
11
+ import { assertRuntimeMayWrite } from '../../root/write-fence';
11
12
  import { cleanupPersistedCheckResults } from '../../execution/process-runtime/check-result-retention';
12
13
  import { cleanupRetiredExecutionJobs } from '../../execution/jobs/store';
13
14
  import type { reconcilePendingWorkValidations } from '../execution/work-validation-reconciler';
14
15
  import type { reconcilePendingEditValidations } from '../execution/edit-validation-coordinator';
15
16
  import {
16
- claimStalledControllerRoundRelays,
17
- finishControllerRoundRelayDispatch,
17
+ controllerRoundBlockerClass,
18
+ listCurrentControllerRoundRelays,
18
19
  } from '../../../../packages/kernel/controller/api/index';
19
- import { assertAutomatedOperationAllowed } from '../governance/external-effects';
20
- import { runWorkChatgptContinuation } from '../launcher/chatgpt-work-continuation';
20
+ import { settleWorkChatgptAutomationTab } from '../launcher/chatgpt-work-continuation';
21
21
  import { getChatgptWorkConversationBinding } from '../../../../adapters/chatgpt/work-conversation-binding-store';
22
- import { renderChatgptControllerRoundPrompt } from '../../root/controller-round-composition';
22
+ import {
23
+ chatgptControllerRoundSettlementAttemptIdentity,
24
+ getChatgptControllerRoundSettlement,
25
+ } from '../../../../adapters/chatgpt/controller-round-settlement-store';
26
+ import { recordChatgptControllerRoundTabSettlement } from '../../root/controller-round-composition';
27
+ import { deriveForgeActionableFailureCode, maybeRegisterFailedReleaseSessionRepairs, maybeRegisterForgeActionableFailureRepair } from '../../diagnostics/incident-repair';
28
+
29
+ const PERIODIC_RETENTION_INTERVAL_MS = 5 * 60_000;
30
+ const PERIODIC_DEEP_RETENTION_INTERVAL_MS = 15 * 60_000;
31
+ // A provider-ambiguous ControllerRound remains durable and claimable, but its
32
+ // Forge-owned Chrome tab is not durable authority. Give an in-flight ChatGPT
33
+ // turn a bounded claim window, then release the ephemeral resource without
34
+ // replaying or clearing the semantic outcome-unknown fence.
35
+ const CHATGPT_OUTCOME_UNKNOWN_TAB_SETTLEMENT_GRACE_MS = 5 * 60_000;
36
+ // Retention is a fallback GC path, not the primary ControllerRound settlement path.
37
+ // Keep its external-effect volume deliberately small so one stale repository set
38
+ // cannot create a provider burst or hold a maintenance worker for hours.
39
+ const CHATGPT_TAB_SETTLEMENT_EFFECT_BUDGET_PER_PASS = 4;
40
+
41
+ function runtimeMaintenanceAuthorityCurrent(controllerHome: string): boolean {
42
+ const fence = assertRuntimeMayWrite('cleanup', controllerHome);
43
+ if (fence.allowed) return true;
44
+ console.error(`[forge cleanup] stale periodic cleanup worker fenced: ${fence.reason ?? 'denied'}`);
45
+ return false;
46
+ }
47
+
48
+ function registerSchedulerFailure(input: {
49
+ controllerHome: string;
50
+ source: 'progression' | 'maintenance';
51
+ prefix: string;
52
+ message: string;
53
+ observationId: string;
54
+ repoId?: string;
55
+ workId?: string;
56
+ atMs?: number;
57
+ }): void {
58
+ try {
59
+ maybeRegisterForgeActionableFailureRepair({
60
+ controllerHome: input.controllerHome,
61
+ observation: {
62
+ observationId: input.observationId,
63
+ source: input.source,
64
+ code: deriveForgeActionableFailureCode(input.prefix, input.message),
65
+ message: input.message,
66
+ at: new Date(input.atMs ?? Date.now()).toISOString(),
67
+ repoId: input.repoId,
68
+ workId: input.workId,
69
+ },
70
+ });
71
+ } catch {
72
+ // Repair promotion is evidence-side reconciliation, not the owning maintenance result.
73
+ }
74
+ }
75
+
76
+ export function planSchedulerPeriodicMaintenance(input: {
77
+ nowMs: number;
78
+ cleanupIntervalMs: number;
79
+ repositoryCount: number;
80
+ }): {
81
+ periodicSequence: number;
82
+ deepRetentionSequence: number;
83
+ generatedCacheRepositoryIndex?: number;
84
+ generatedCacheRootStartIndex: number;
85
+ runRetention: boolean;
86
+ runDeepRetention: boolean;
87
+ processGcRepositoryIndex?: number;
88
+ deepRetentionRepositoryIndex?: number;
89
+ } {
90
+ const cleanupIntervalMs = Math.max(1, input.cleanupIntervalMs);
91
+ const periodicSequence = Math.floor(input.nowMs / cleanupIntervalMs);
92
+ const retentionEvery = Math.max(1, Math.ceil(PERIODIC_RETENTION_INTERVAL_MS / cleanupIntervalMs));
93
+ const deepRetentionEvery = Math.max(retentionEvery, Math.ceil(PERIODIC_DEEP_RETENTION_INTERVAL_MS / cleanupIntervalMs));
94
+ const repositoryCount = Math.max(0, Math.trunc(input.repositoryCount));
95
+ const deepRetentionSequence = Math.floor(periodicSequence / deepRetentionEvery);
96
+ return {
97
+ periodicSequence,
98
+ deepRetentionSequence,
99
+ generatedCacheRepositoryIndex: repositoryCount > 0 && periodicSequence % retentionEvery === 0
100
+ ? Math.floor(periodicSequence / retentionEvery) % repositoryCount : undefined,
101
+ generatedCacheRootStartIndex: repositoryCount > 0 ? Math.floor(periodicSequence / retentionEvery / repositoryCount) : 0,
102
+ runRetention: periodicSequence % retentionEvery === 0,
103
+ runDeepRetention: periodicSequence % deepRetentionEvery === 0,
104
+ processGcRepositoryIndex: repositoryCount > 0 ? periodicSequence % repositoryCount : undefined,
105
+ deepRetentionRepositoryIndex: repositoryCount > 0 && periodicSequence % deepRetentionEvery === 0
106
+ ? deepRetentionSequence % repositoryCount
107
+ : undefined,
108
+ };
109
+ }
23
110
 
24
111
  export async function runSchedulerPeriodicCleanup(input: {
25
112
  controllerHome: string;
@@ -30,59 +117,194 @@ export async function runSchedulerPeriodicCleanup(input: {
30
117
  runtimeCleanup: typeof cleanupControllerRuntimeState;
31
118
  terminalWorkCleanup: typeof reconcileTerminalWorkCleanups;
32
119
  processGc: typeof gcTerminalProcesses;
120
+ settleBrowserTab?: typeof settleWorkChatgptAutomationTab;
33
121
  }): Promise<void> {
122
+ const plan = planSchedulerPeriodicMaintenance({
123
+ nowMs: input.nowMs,
124
+ cleanupIntervalMs: input.cleanupIntervalMs,
125
+ repositoryCount: input.repositories.length,
126
+ });
127
+ // The cleanup process inherits the spawning Runtime's exact write claim. Re-check
128
+ // that claim throughout a long pass so a detached child cannot survive a Runtime
129
+ // rollover and continue producing effects under retired authority.
130
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
131
+ // Runtime-state phase rotation and terminal Work cleanup are lifecycle
132
+ // reconciliation, not retention. Keep them at the base cleanup cadence.
34
133
  try {
35
134
  input.runtimeCleanup(input.controllerHome, {
36
135
  reason: 'periodic',
37
136
  nowMs: input.nowMs,
38
- periodicSequence: Math.floor(input.nowMs / input.cleanupIntervalMs),
137
+ periodicSequence: plan.periodicSequence,
39
138
  protectedControllerPid: input.controllerPid,
40
139
  });
41
140
  } catch (error) {
141
+ const reason = error instanceof Error ? error.message : String(error);
142
+ registerSchedulerFailure({
143
+ controllerHome: input.controllerHome,
144
+ source: 'maintenance',
145
+ prefix: 'RUNTIME_CLEANUP_FAILED',
146
+ message: reason,
147
+ observationId: `maintenance:runtime-cleanup:${plan.periodicSequence}`,
148
+ atMs: input.nowMs,
149
+ });
42
150
  console.error('[forge cleanup] periodic cleanup failed:', error);
43
151
  }
152
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
44
153
  try {
45
154
  await input.terminalWorkCleanup(input.controllerHome, { nowMs: input.nowMs });
46
155
  } catch (error) {
156
+ const reason = error instanceof Error ? error.message : String(error);
157
+ registerSchedulerFailure({
158
+ controllerHome: input.controllerHome,
159
+ source: 'maintenance',
160
+ prefix: 'TERMINAL_WORK_CLEANUP_FAILED',
161
+ message: reason,
162
+ observationId: `maintenance:terminal-work-cleanup:${plan.periodicSequence}`,
163
+ atMs: input.nowMs,
164
+ });
47
165
  console.error('[forge cleanup] terminal Work cleanup failed:', error);
48
166
  }
167
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
168
+
49
169
  try {
50
- const xctestCleanup = cleanupIdleXCTestDevices(input.controllerHome);
51
- if (xctestCleanup.error) console.error('[forge cleanup] XCTest device cleanup failed:', xctestCleanup.error);
170
+ maybeRegisterFailedReleaseSessionRepairs({ controllerHome: input.controllerHome, now: () => input.nowMs });
52
171
  } catch (error) {
53
- console.error('[forge cleanup] XCTest device cleanup failed:', error);
172
+ console.error('[forge cleanup] release failure repair reconciliation failed:', error);
54
173
  }
55
- try {
56
- closeRuntimeBrowserSessionLegacyImportCutover(
57
- input.controllerHome,
58
- input.repositories.map((repository) => ({ repoId: repository.repoId, repoRoot: repository.canonicalRoot })),
59
- );
60
- const browserSessions = cleanupRuntimeBrowserSessionTombstones(input.controllerHome, { nowMs: input.nowMs });
61
- if (browserSessions.blockers.length > 0 || browserSessions.budgetExhausted) {
62
- console.error('[forge cleanup] Browser session retention reported bounded blockers');
174
+
175
+ // Browser/computer tombstones are retention state. Their lifecycle truth is
176
+ // written synchronously by their owning authorities, so a five-minute sweep
177
+ // is sufficient and avoids repeating controller-wide scans every minute.
178
+ if (plan.runRetention) {
179
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
180
+ try {
181
+ closeRuntimeBrowserSessionLegacyImportCutover(
182
+ input.controllerHome,
183
+ input.repositories.map((repository) => ({ repoId: repository.repoId, repoRoot: repository.canonicalRoot })),
184
+ );
185
+ const browserSessions = cleanupRuntimeBrowserSessionTombstones(input.controllerHome, { nowMs: input.nowMs });
186
+ if (browserSessions.blockers.length > 0 || browserSessions.budgetExhausted) {
187
+ console.error('[forge cleanup] Browser session retention reported bounded blockers');
188
+ }
189
+ } catch (error) {
190
+ console.error('[forge cleanup] Browser session retention failed:', error);
191
+ }
192
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
193
+ try {
194
+ const computerTargets = await cleanupRuntimeComputerInteractionTargets(input.controllerHome, { nowMs: input.nowMs });
195
+ if (computerTargets.blockers.length > 0 || computerTargets.overCapacity || computerTargets.budgetExhausted) {
196
+ console.error('[forge cleanup] Computer interaction-target retention reported bounded blockers');
197
+ }
198
+ } catch (error) {
199
+ console.error('[forge cleanup] Computer interaction-target retention failed:', error);
200
+ }
201
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
202
+ let chatgptTabSettlementEffects = 0;
203
+ chatgptTabSettlementSweep:
204
+ for (const repository of input.repositories) {
205
+ const store = { controllerHome: input.controllerHome, repoId: repository.repoId };
206
+ for (const relay of listCurrentControllerRoundRelays(store, 100)) {
207
+ const blocker = controllerRoundBlockerClass(relay);
208
+ const outcomeUnknown = blocker === 'provider_dispatch_outcome_unknown';
209
+ const durableInactiveRound = ['waiting', 'waiting_for_user', 'goal_complete', 'failed'].includes(relay.status)
210
+ || (relay.status === 'blocked' && !outcomeUnknown);
211
+ if (!durableInactiveRound && !outcomeUnknown) continue;
212
+ if (outcomeUnknown) {
213
+ const blockedAtMs = Date.parse(relay.updatedAt);
214
+ if (!Number.isFinite(blockedAtMs) || input.nowMs - blockedAtMs < CHATGPT_OUTCOME_UNKNOWN_TAB_SETTLEMENT_GRACE_MS) continue;
215
+ }
216
+ const existingSettlement = getChatgptControllerRoundSettlement(store, {
217
+ workId: relay.originWorkId,
218
+ relayScopeId: relay.relayScopeId,
219
+ });
220
+ if (existingSettlement && ['closed', 'preserved_user_owned', 'session_closed'].includes(existingSettlement.status)) continue;
221
+ const binding = getChatgptWorkConversationBinding(store, relay.originWorkId);
222
+ if (!binding?.latestBrowserSessionId) continue;
223
+ const attemptIdentity = chatgptControllerRoundSettlementAttemptIdentity({
224
+ browserSessionId: binding.latestBrowserSessionId,
225
+ authorizationGrantRefs: binding.authorizationGrantRefs,
226
+ });
227
+ // Failed close_page calls are commonly authorization failures. Retrying
228
+ // the same browser/grant tuple on every retention pass only creates
229
+ // provider traffic and audit churn; a changed resource or grant set is a
230
+ // distinct attempt and remains eligible for recovery.
231
+ if (existingSettlement?.status === 'failed' && existingSettlement.attemptIdentity === attemptIdentity) continue;
232
+ if (chatgptTabSettlementEffects >= CHATGPT_TAB_SETTLEMENT_EFFECT_BUDGET_PER_PASS) {
233
+ console.error('[forge cleanup] ChatGPT tab settlement reached bounded effect budget');
234
+ break chatgptTabSettlementSweep;
235
+ }
236
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
237
+ chatgptTabSettlementEffects += 1;
238
+ const settlement = await (input.settleBrowserTab ?? settleWorkChatgptAutomationTab)({
239
+ controllerHome: input.controllerHome,
240
+ workId: relay.originWorkId,
241
+ browserSessionId: binding.latestBrowserSessionId,
242
+ authorizationGrantRefs: binding.authorizationGrantRefs,
243
+ });
244
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
245
+ recordChatgptControllerRoundTabSettlement(store, {
246
+ workId: relay.originWorkId,
247
+ relayScopeId: relay.relayScopeId,
248
+ status: settlement.status,
249
+ error: settlement.error?.message,
250
+ attemptIdentity,
251
+ });
252
+ }
63
253
  }
64
- } catch (error) {
65
- console.error('[forge cleanup] Browser session retention failed:', error);
66
254
  }
67
- try {
68
- const computerTargets = await cleanupRuntimeComputerInteractionTargets(input.controllerHome, { nowMs: input.nowMs });
69
- if (computerTargets.blockers.length > 0 || computerTargets.overCapacity || computerTargets.budgetExhausted) {
70
- console.error('[forge cleanup] Computer interaction-target retention reported bounded blockers');
255
+
256
+ // Process GC includes stale-active reconciliation with a five-minute minimum
257
+ // age. Preserve the existing one-repository-per-base-pass round robin so that
258
+ // recovery remains smooth instead of concentrating all repositories in one
259
+ // periodic spike.
260
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
261
+ if (plan.processGcRepositoryIndex !== undefined) {
262
+ const processRepo = input.repositories[plan.processGcRepositoryIndex]!;
263
+ const result = input.processGc({ controllerHome: input.controllerHome, repoId: processRepo.repoId });
264
+ if (!result.ok) {
265
+ const reason = result.error ?? 'unknown error';
266
+ registerSchedulerFailure({
267
+ controllerHome: input.controllerHome,
268
+ source: 'maintenance',
269
+ prefix: 'PROCESS_GC_FAILED',
270
+ message: reason,
271
+ observationId: `maintenance:process-gc:${processRepo.repoId}:${plan.periodicSequence}`,
272
+ repoId: processRepo.repoId,
273
+ atMs: input.nowMs,
274
+ });
275
+ console.error('[forge cleanup] Process GC failed:', reason);
71
276
  }
72
- } catch (error) {
73
- console.error('[forge cleanup] Computer interaction-target retention failed:', error);
74
277
  }
75
- if (input.repositories.length === 0) return;
76
- const slot = Math.floor(input.nowMs / input.cleanupIntervalMs) % input.repositories.length;
77
- const repo = input.repositories[slot]!;
78
- try {
79
- const generated = cleanupGeneratedRepositoryCaches(repo.canonicalRoot, { nowMs: input.nowMs });
80
- if (generated.errors.length > 0) {
81
- console.error(`[forge cleanup] generated-cache retention reported ${generated.errors.length} error(s) for ${repo.repoId}`);
278
+
279
+ // Cache production is much faster than evidence retention. Reuse the existing
280
+ // five-minute pass, one repository and one bounded budget per pass. The root
281
+ // ordinal advances per repository visit, not by the correlated global index.
282
+ if (plan.generatedCacheRepositoryIndex !== undefined) {
283
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
284
+ const cacheRepo = input.repositories[plan.generatedCacheRepositoryIndex]!;
285
+ try {
286
+ const generated = cleanupGeneratedRepositoryCheckoutCaches(cacheRepo, {
287
+ nowMs: input.nowMs, rootStartIndex: plan.generatedCacheRootStartIndex,
288
+ });
289
+ if (generated.errors.length > 0) console.error(`[forge cleanup] generated-cache retention reported ${generated.errors.length} error(s) for ${cacheRepo.repoId}`);
290
+ } catch (error) {
291
+ console.error(`[forge cleanup] generated-cache retention failed for ${cacheRepo.repoId}:`, error);
82
292
  }
293
+ }
294
+ if (!plan.runDeepRetention) return;
295
+ if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
296
+
297
+ // Generated caches and persisted artifacts have hour/day-scale retention
298
+ // thresholds. Run one repository per deep-retention pass, and rotate the
299
+ // repository index on the deep cadence rather than the one-minute sequence.
300
+ try {
301
+ const xctestCleanup = cleanupIdleXCTestDevices(input.controllerHome);
302
+ if (xctestCleanup.error) console.error('[forge cleanup] XCTest device cleanup failed:', xctestCleanup.error);
83
303
  } catch (error) {
84
- console.error(`[forge cleanup] generated-cache retention failed for ${repo.repoId}:`, error);
304
+ console.error('[forge cleanup] XCTest device cleanup failed:', error);
85
305
  }
306
+ if (plan.deepRetentionRepositoryIndex === undefined) return;
307
+ const repo = input.repositories[plan.deepRetentionRepositoryIndex]!;
86
308
  try {
87
309
  const browserArtifacts = cleanupControllerHomeBrowserArtifacts(input.controllerHome, repo.repoId, { nowMs: input.nowMs });
88
310
  if (browserArtifacts.errors.length > 0 || Object.values(browserArtifacts.classes).some((item) => item.overCapacity)) {
@@ -91,8 +313,6 @@ export async function runSchedulerPeriodicCleanup(input: {
91
313
  } catch (error) {
92
314
  console.error(`[forge cleanup] Browser artifact retention failed for ${repo.repoId}:`, error);
93
315
  }
94
- const result = input.processGc({ controllerHome: input.controllerHome, repoId: repo.repoId });
95
- if (!result.ok) console.error('[forge cleanup] Process GC failed:', result.error ?? 'unknown error');
96
316
  try {
97
317
  const checkResults = cleanupPersistedCheckResults(input.controllerHome, repo.repoId, { nowMs: input.nowMs });
98
318
  if (checkResults.blockers.length > 0 || checkResults.budgetExhausted) {
@@ -132,84 +352,3 @@ export async function runSchedulerValidationReconciliation(input: {
132
352
  }
133
353
  }
134
354
  }
135
-
136
- export async function runSchedulerControllerRoundRecovery(input: {
137
- controllerHome: string;
138
- nowMs: number;
139
- repositories: readonly Pick<RepositoryRecord, 'repoId' | 'canonicalRoot' | 'localRoot'>[];
140
- graceMs?: number;
141
- maxRecoveries?: number;
142
- dispatchPrompt?: typeof runWorkChatgptContinuation;
143
- authorizeWake?: typeof assertAutomatedOperationAllowed;
144
- }): Promise<{ claimed: number; dispatched: number; failed: number }> {
145
- const dispatchPrompt = input.dispatchPrompt ?? runWorkChatgptContinuation;
146
- const authorizeWake = input.authorizeWake ?? assertAutomatedOperationAllowed;
147
- const maxRecoveries = Math.max(1, Math.min(Math.trunc(input.maxRecoveries ?? 2), 8));
148
- let claimed = 0;
149
- let dispatched = 0;
150
- let failed = 0;
151
-
152
- for (const repository of input.repositories) {
153
- if (claimed >= maxRecoveries) break;
154
- const store = { controllerHome: input.controllerHome, repoId: repository.repoId };
155
- let records: ReturnType<typeof claimStalledControllerRoundRelays>;
156
- try {
157
- records = claimStalledControllerRoundRelays(store, {
158
- nowMs: input.nowMs,
159
- graceMs: input.graceMs,
160
- limit: maxRecoveries - claimed,
161
- controllerTypes: ['chatgpt'],
162
- });
163
- } catch (error) {
164
- const reason = error instanceof Error ? error.message : String(error);
165
- failed += 1;
166
- console.error(`[forge controller relay] stalled round scan failed for ${repository.repoId}:`, reason);
167
- continue;
168
- }
169
- claimed += records.length;
170
- for (const record of records) {
171
- try {
172
- authorizeWake('external_controller_wake', {
173
- work_id: record.originWorkId,
174
- controller_type: 'chatgpt',
175
- relay_scope_id: record.relayScopeId,
176
- recovery_reason: 'unclosed_dispatched_round',
177
- });
178
- const binding = getChatgptWorkConversationBinding(store, record.originWorkId);
179
- const result = await dispatchPrompt({
180
- controllerHome: input.controllerHome,
181
- repoId: repository.repoId,
182
- repoRoot: repository.canonicalRoot ?? repository.localRoot,
183
- workId: record.originWorkId,
184
- prompt: renderChatgptControllerRoundPrompt(store, record, { exactOriginWork: !record.requirementId }),
185
- browserSessionId: binding?.latestBrowserSessionId,
186
- conversationUrl: binding?.conversationUrl,
187
- model: 'gpt-5.6',
188
- reasoning: 'high',
189
- tabPolicy: 'auto',
190
- timeoutMs: 30_000,
191
- });
192
- if (result.status === 'failed') throw new Error(result.error?.message ?? 'CHATGPT_CONTROLLER_RELAY_RECOVERY_FAILED');
193
- const updatedBinding = getChatgptWorkConversationBinding(store, record.originWorkId);
194
- finishControllerRoundRelayDispatch(store, {
195
- workId: record.originWorkId,
196
- ok: true,
197
- bindingId: updatedBinding?.bindingId,
198
- });
199
- dispatched += 1;
200
- } catch (error) {
201
- const reason = error instanceof Error ? error.message : String(error);
202
- finishControllerRoundRelayDispatch(store, {
203
- workId: record.originWorkId,
204
- ok: false,
205
- error: reason,
206
- recovery: true,
207
- nowMs: input.nowMs,
208
- });
209
- failed += 1;
210
- console.error(`[forge controller relay] stalled round recovery failed for ${record.relayScopeId}:`, reason);
211
- }
212
- }
213
- }
214
- return { claimed, dispatched, failed };
215
- }
@@ -8,7 +8,7 @@ import {
8
8
  childReferenceFromJob,
9
9
  childReferenceFromReceipt,
10
10
  hasDurableChildReference,
11
- isAgentDelegationOperation,
11
+ isAgentDelegationJob,
12
12
  mergeChildReferences,
13
13
  buildDelegatedExecutionResult,
14
14
  } from '../../execution/jobs/child-reference';
@@ -17,6 +17,7 @@ import { operationReceiptMatchesJobOwnership, readOperationReceipt } from '../..
17
17
  import { releaseExecutionLeases, renewExecutionLeases } from '../../resources/leases/store';
18
18
  import { isProcessAlive, terminateProcessTree, terminateProcessTreeSync, type ProcessTreeTerminationResult } from '../../shared/process-tree';
19
19
  import { settleScheduledExecution } from '../../../../packages/kernel/scheduler/api/index';
20
+ import { isRuntimeWriteFenceError } from '../../root/write-fence';
20
21
 
21
22
  const WORKER_HEARTBEAT_STALE_MS = 45_000;
22
23
 
@@ -33,16 +34,6 @@ function canAutomaticallyReplay(job: ExecutionJob): boolean {
33
34
  return !hasPotentialSideEffects(job);
34
35
  }
35
36
 
36
- function isAgentDelegationJob(job: ExecutionJob): boolean {
37
- return isAgentDelegationOperation(job.payload.operation)
38
- || job.type === 'agent-run'
39
- || job.type === 'dispatch-task'
40
- || job.payload.arguments?.agentDelegation === true
41
- || (job.payload.operation === 'legacy-local-job'
42
- && typeof job.payload.arguments?.localAction === 'string'
43
- && ['launch-task', 'quick-agent-session'].includes(String(job.payload.arguments.localAction)));
44
- }
45
-
46
37
  function ambiguousStartedOperation(controllerHome: string, job: ExecutionJob): boolean {
47
38
  const receipt = readOperationReceipt(controllerHome, job.repoId, job.jobId);
48
39
  if (!receipt || !operationReceiptMatchesJobOwnership(receipt, job)) return false;
@@ -64,7 +55,7 @@ function recordIsolatedReconciliationFailure(job: ExecutionJob, error: unknown):
64
55
  // Losing the canonical write fence is a Runtime-wide invariant violation,
65
56
  // not corrupt state owned by one historical Job. Preserve the Scheduler's
66
57
  // fatal path so Runtime Root can stop the complete Runtime.
67
- if (message.startsWith('WRITER_FENCED:')) throw error;
58
+ if (isRuntimeWriteFenceError(error)) throw error;
68
59
  process.stderr.write(`${JSON.stringify({
69
60
  event: 'forge_scheduler_execution_job_reconciliation_isolated',
70
61
  repoId: job.repoId,
@@ -23,16 +23,15 @@ import { reconcileTerminalWorkCleanups } from '../execution/work-terminal-cleanu
23
23
  import { gcTerminalProcesses } from '../../execution/process-runtime/gc';
24
24
  import { reconcilePendingWorkValidations } from '../execution/work-validation-reconciler';
25
25
  import { reconcilePendingEditValidations } from '../execution/edit-validation-coordinator';
26
- import { schedulerDispatchAllowed } from '../facade/work-admission-policy';
27
26
  import {
28
- runSchedulerControllerRoundRecovery,
29
27
  runSchedulerPeriodicCleanup,
30
28
  runSchedulerValidationReconciliation,
31
29
  } from './maintenance';
32
30
  import { planSchedulerSourceSampling } from './source-scan';
31
+ import { runSchedulerAutonomousContinuationReconciliation } from './autonomous-continuation';
33
32
  import {
34
33
  runSchedulerDurableAdmission,
35
- schedulerDurableAdmissionRequiresPolicy,
34
+ SCHEDULE_TICK_INTERVAL_MS,
36
35
  } from './durable-admission';
37
36
  import { sampleRepositoryGitStatusForRepositories } from '../../projections/git-status-sampler';
38
37
  import { selectExecutionJobDispatchRepositories } from '../dispatch-priority';
@@ -98,7 +97,43 @@ export type { SchedulerWorkerCommand, SchedulerWorkerLaunchDescriptor } from './
98
97
  export { selectSchedulerSourceScanRepositories } from './source-scan';
99
98
 
100
99
  const DARWIN_MEMORY_SAMPLE_TTL_MS = 5_000;
100
+ export const SCHEDULER_RECONCILIATION_INTERVAL_MS = 5_000;
101
101
  const RUNTIME_CLEANUP_INTERVAL_MS = Math.max(30_000, Number(process.env.FORGE_RUNTIME_CLEANUP_INTERVAL_MS ?? 60_000));
102
+
103
+ function remainingRecurringDeadlineMs(nowMs: number, lastRanAt: number, intervalMs: number): number {
104
+ if (lastRanAt <= 0) return intervalMs;
105
+ const elapsed = Math.max(0, nowMs - lastRanAt);
106
+ return elapsed < intervalMs ? intervalMs - elapsed : intervalMs;
107
+ }
108
+
109
+ export function schedulerIdleWaitDelayMs(input: {
110
+ nowMs: number;
111
+ lastScheduleTickAt: number;
112
+ }): number {
113
+ // Idle execution is event-driven. ExecutionJob/lease/policy mutations and
114
+ // check Process terminal persistence wake the scheduler immediately through
115
+ // the existing notification revision. The 30-second schedule cadence is the
116
+ // bounded idle lost-event safety deadline.
117
+ return remainingRecurringDeadlineMs(
118
+ input.nowMs,
119
+ input.lastScheduleTickAt,
120
+ SCHEDULE_TICK_INTERVAL_MS,
121
+ );
122
+ }
123
+
124
+ export function schedulerActiveWaitDelayMs(input: {
125
+ nowMs: number;
126
+ lastReconcileAt: number;
127
+ }): number {
128
+ // Active execution uses the same canonical wake notifications as idle
129
+ // execution. A full scheduler tick is only the lost-event safety net, bounded
130
+ // by the existing reconciliation cadence instead of the legacy 250ms poll.
131
+ return remainingRecurringDeadlineMs(
132
+ input.nowMs,
133
+ input.lastReconcileAt,
134
+ SCHEDULER_RECONCILIATION_INTERVAL_MS,
135
+ );
136
+ }
102
137
  const DARWIN_RECLAIMABLE_PAGE_LABELS = new Set([
103
138
  'Pages free',
104
139
  'Pages inactive',
@@ -510,7 +545,7 @@ export class GlobalScheduler {
510
545
  this.lastTickAt = this.lastHeartbeatAt;
511
546
  this.persistState();
512
547
  const repositories = this.repositoryList(this.controllerHome).filter((repo) => repo.enabled && !repo.removedAt);
513
- let periodicCleanupRan = false;
548
+ let reconciliationRan = false;
514
549
  if (now - this.lastCleanupAt >= RUNTIME_CLEANUP_INTERVAL_MS) {
515
550
  // Advance the interval before cleanup so a failing pass cannot create a
516
551
  // tight retry loop on every scheduler tick. Canonical Runtime launches the
@@ -531,9 +566,8 @@ export class GlobalScheduler {
531
566
  processGc: this.processGc,
532
567
  });
533
568
  }
534
- periodicCleanupRan = true;
535
569
  }
536
- if (now - this.lastReconcile >= 5_000) {
570
+ if (now - this.lastReconcile >= SCHEDULER_RECONCILIATION_INTERVAL_MS) {
537
571
  await reconcileExecutionJobsAsync(this.controllerHome);
538
572
  for (const repository of repositories) {
539
573
  try {
@@ -551,6 +585,7 @@ export class GlobalScheduler {
551
585
  });
552
586
  this.lastReconcile = now;
553
587
  this.lastReconcileAt = new Date(now).toISOString();
588
+ reconciliationRan = true;
554
589
  }
555
590
  const activeJobSnapshot = listActiveExecutionJobs(this.controllerHome);
556
591
  const activeSourceRepoIds = new Set(activeJobSnapshot.map((job) => job.repoId));
@@ -587,34 +622,17 @@ export class GlobalScheduler {
587
622
  .map((repository) => [repository.repoId, repository] as const),
588
623
  ).values());
589
624
  this.sourceScansAvoided += sourceSampling.avoidedRepositoryCount;
590
- // Phase 0 reuses one durable Work admission policy. Exclusive-Work mode stops
591
- // ordinary schedule/workflow advancement and Worker dispatch while preserving
592
- // cleanup and projections. Convergence mode remains dispatchable because new
593
- // Work creation is independently fenced at the Work contract authority, so
594
- // existing Work continuations can keep draining the backlog.
595
- const admissionPolicyRequired = periodicCleanupRan || schedulerDurableAdmissionRequiresPolicy({
596
- activeJobs: activeJobSnapshot,
597
- nowMs: now,
598
- lastScheduleTickAt: this.lastScheduleTick,
599
- });
600
- if (admissionPolicyRequired && !schedulerDispatchAllowed(this.controllerHome)) {
601
- refreshSchedulerRepositoryProjections({
602
- controllerHome: this.controllerHome,
603
- repositories,
604
- sourceScanRepositories: projectionMaintenanceRepositories,
605
- projectionRefreshRepoIds: [],
606
- controllerPid: this.controllerPid,
607
- });
608
- this.lastHeartbeatAt = new Date().toISOString();
609
- this.persistState(true);
610
- return { activeJobs: activeJobSnapshot.length };
611
- }
612
- if (periodicCleanupRan) {
613
- await runSchedulerControllerRoundRecovery({
625
+ // Migration-era global Work admission gates are retired. Scheduler dispatch
626
+ // is constrained by durable admission, placement and concrete resource authority.
627
+ if (reconciliationRan) {
628
+ const liveness = await runSchedulerAutonomousContinuationReconciliation({
614
629
  controllerHome: this.controllerHome,
615
630
  nowMs: now,
616
631
  repositories,
617
632
  });
633
+ if (liveness.failed > 0) {
634
+ console.error('[forge liveness] controller progression reconciliation reported ' + liveness.failed + ' failure(s)');
635
+ }
618
636
  }
619
637
  const durableAdmission = await runSchedulerDurableAdmission({
620
638
  controllerHome: this.controllerHome,
@@ -731,30 +749,38 @@ export class GlobalScheduler {
731
749
  this.persistState(true);
732
750
  }, this.config.heartbeatIntervalMs);
733
751
  heartbeatTimer.unref?.();
734
- let idleStreak = 0;
735
752
  let activeJobs = 0;
736
753
  try {
737
754
  while (!signal?.aborted) {
755
+ let tickFailed = false;
738
756
  try {
739
757
  activeJobs = (await this.tick()).activeJobs;
740
- idleStreak = activeJobs === 0 ? idleStreak + 1 : 0;
741
758
  } catch (error) {
742
759
  if (this.fatalOnTickError) throw error;
743
- idleStreak = 0;
760
+ tickFailed = true;
744
761
  this.lastHeartbeatAt = new Date().toISOString();
745
762
  this.lastTickAt = this.lastHeartbeatAt;
746
763
  this.persistState(true);
747
764
  console.error('[forge scheduler] tick failed:', error);
748
765
  }
749
- const delayMs = idleStreak > 0
750
- ? Math.min(
751
- this.config.idleBackoffMaxMs,
752
- this.config.pollIntervalMs * (2 ** Math.min(idleStreak, 6)),
753
- )
754
- : this.config.pollIntervalMs;
766
+ const now = Date.now();
767
+ const delayMs = tickFailed
768
+ ? this.config.pollIntervalMs
769
+ : activeJobs > 0
770
+ ? schedulerActiveWaitDelayMs({
771
+ nowMs: now,
772
+ lastReconcileAt: this.lastReconcile,
773
+ })
774
+ : schedulerIdleWaitDelayMs({
775
+ nowMs: now,
776
+ lastScheduleTickAt: this.lastScheduleTick,
777
+ });
755
778
  const wakeRevision = readSchedulerWakeSignal(this.controllerHome).revision;
756
779
  const waitResult = await waitForSchedulerWakeSignal(this.controllerHome, wakeRevision, delayMs, signal, {
757
- fallbackPollMs: activeJobs > 0 ? 250 : Math.min(1_000, Math.max(500, delayMs)),
780
+ // fs.watch is authoritative for ordinary wakeups. Polling is only a
781
+ // lost-event safety net, so active execution must not regress to a
782
+ // 250ms JSON-read loop after removing the full-tick poll.
783
+ fallbackPollMs: Math.min(5_000, Math.max(1_000, delayMs)),
758
784
  });
759
785
  if (waitResult === 'aborted') break;
760
786
  }