@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
@@ -8,29 +8,33 @@ import {
8
8
  rmSync,
9
9
  type Dirent,
10
10
  } from 'fs';
11
- import { join, relative, resolve } from 'path';
11
+ import { basename, dirname, join, relative, resolve } from 'path';
12
12
  import { ensureControllerHome } from '../../cli/repositories/controller-home';
13
13
  import { cleanupTerminalEditSessionRecords } from '../../cli/editing/edit-session';
14
14
  import { listRepositories } from '../../cli/repositories/registry';
15
15
  import { managedPathInside, managedWorktreeStorageRoot } from '../../cli/repositories/worktree-storage';
16
16
  import { migrateManagedWorkspacePhysicalDependenciesToCanonical } from '../execution/managed-workspace';
17
- import { cleanupStaleCodegraphLocators } from '../context/codegraph-cache-boundary';
18
17
  import { listActiveLeases } from '../resources/leases/store';
19
18
  import { cleanupScheduleOccurrenceHistory } from '../../../packages/kernel/scheduler/api/index';
20
- import { isTerminalWorkContractStatus, readWorkContractStore } from '../../../packages/kernel/work/api/index';
19
+ import { isTerminalSemanticWorkState, readWorkContractStore } from '../../../packages/kernel/work/api/index';
20
+ import { assertOwnedResourceCleanupTarget, listOwnedResources, markOwnedResourceCleaned, type OwnedResource } from '../../../packages/kernel/identity/api/index';
21
21
  import { appendJsonLine, readJsonFile, writeJsonAtomic } from '../shared/json-files';
22
22
  import { cleanupControllerReleaseHistory } from './release-retention';
23
23
  import { cleanupWorkPreservationArtifacts } from './cleanup-artifact-retention';
24
- import { cleanupCodegraphCaches, CODEGRAPH_CACHE_RETENTION_POLICY_VERSION } from './codegraph-cache-retention';
25
24
  import { cleanupRetiredRepositoryNamespaces } from './repository-namespace-retention';
26
25
  import { maintainControlPlaneDatabase, type ControlPlaneDatabaseMaintenanceReport } from './persistence/sqlite-store';
27
26
  import { cleanupExpiredExperiences } from './persistence/experience-store';
28
- import { retireTerminalPlanBoundWorkAuthorities } from './facade/plan-contract-store';
29
27
  import { reconcileOwnerlessWorkAuthorities } from './execution/work-authority-reconciler';
30
28
  import {
31
29
  measureReclaimablePath,
32
30
  RUNTIME_LIFECYCLE_RETENTION_POLICY_VERSION,
33
31
  } from './lifecycle-retention-metrics';
32
+ import {
33
+ listReleaseSessions,
34
+ releaseSessionCandidateIsRetired,
35
+ } from '../release/release-session';
36
+ import { removeRetiredCandidateExecutionLane } from '../root/runtime-lane';
37
+ import { observeRuntimeStatus } from '../root/status';
34
38
 
35
39
  function numericSetting(value: string | undefined, fallback: number, minimum: number): number {
36
40
  const parsed = Number(value);
@@ -162,8 +166,6 @@ export interface RuntimeCleanupOptions {
162
166
  editSessionMaxRetained?: number;
163
167
  /** Grace period before a non-Plan Work with no exact durable owner loses execution authority. */
164
168
  ownerlessWorkAuthorityGraceMs?: number;
165
- /** Minimum age before an unprotected Forge-owned CodeGraph cache can be rebuilt on demand and reclaimed. */
166
- codegraphCacheRetentionMs?: number;
167
169
  /** Grace before a removed repository may shed only explicit disposable Controller Home children. */
168
170
  repositoryNamespaceRetentionMs?: number;
169
171
  /** Minimum reclaimable SQLite free-page bytes before physical VACUUM is eligible. */
@@ -193,6 +195,35 @@ export interface RuntimeCleanupLifecycleMetrics {
193
195
  blockerReasons: Record<string, number>;
194
196
  }
195
197
 
198
+ export interface ReleaseSessionCandidatePhaseMetrics {
199
+ observedCount: number;
200
+ observedBytes: number;
201
+ unknownObservedByteCount: number;
202
+ retainedCount: number;
203
+ reclaimableCount: number;
204
+ removedCount: number;
205
+ reclaimedBytes: number;
206
+ unknownReclaimedByteCount: number;
207
+ }
208
+
209
+ export interface ReleaseSessionCandidateRetentionReport {
210
+ inspected: number;
211
+ observedCount: number;
212
+ observedBytes: number;
213
+ unknownObservedByteCount: number;
214
+ retainedCount: number;
215
+ eligible: number;
216
+ attempted: number;
217
+ removedPaths: string[];
218
+ reclaimedBytes: number;
219
+ unknownReclaimedByteCount: number;
220
+ orphanDirectoryCount: number;
221
+ invalidSessionFiles: string[];
222
+ byPhase: Record<string, ReleaseSessionCandidatePhaseMetrics>;
223
+ errors: string[];
224
+ truncated: boolean;
225
+ }
226
+
196
227
  export interface RuntimeCleanupReport {
197
228
  policyVersion: typeof RUNTIME_LIFECYCLE_RETENTION_POLICY_VERSION;
198
229
  at: string;
@@ -204,16 +235,13 @@ export interface RuntimeCleanupReport {
204
235
  removedTemporaryPaths: string[];
205
236
  removedCleanupArtifactPaths: string[];
206
237
  removedReleasePaths: string[];
238
+ releaseSessionCandidates: ReleaseSessionCandidateRetentionReport;
207
239
  removedScheduleOccurrencePaths: string[];
208
240
  removedScheduleDecisionPaths: string[];
209
241
  removedEditSessionPaths: string[];
210
- removedCodegraphLocatorPaths: string[];
211
- removedCodegraphCachePaths: string[];
212
242
  removedRepositoryNamespacePaths: string[];
213
243
  /** Physical SQLite checkpoint/compaction receipt; row lifecycle remains domain-owned. */
214
244
  sqliteMaintenance?: ControlPlaneDatabaseMaintenanceReport;
215
- /** Historical non-terminal Work whose owning Plan was already terminal. Records remain for retention/audit. */
216
- retiredPlanBoundWorkAuthorities: string[];
217
245
  /** Work retired only after exact per-Work liveness proved no durable continuation owner remains. */
218
246
  retiredOwnerlessWorkAuthorities: string[];
219
247
  skippedActiveWorktrees: string[];
@@ -268,14 +296,14 @@ function addReclaimMeasurement(metrics: MutableReclaimMetrics, path: string): vo
268
296
  else metrics.unknownReclaimedByteCount += 1;
269
297
  }
270
298
 
271
- type RemovalPhase = 'worktrees' | 'temporary' | 'artifacts' | 'scheduler' | 'edit_sessions' | 'caches' | 'repository_namespaces' | 'releases';
272
- const REMOVAL_PHASES: readonly RemovalPhase[] = ['worktrees', 'temporary', 'artifacts', 'scheduler', 'edit_sessions', 'caches', 'repository_namespaces', 'releases'];
299
+ type RemovalPhase = 'worktrees' | 'temporary' | 'artifacts' | 'scheduler' | 'edit_sessions' | 'repository_namespaces' | 'releases';
300
+ const REMOVAL_PHASES: readonly RemovalPhase[] = ['worktrees', 'temporary', 'artifacts', 'scheduler', 'edit_sessions', 'repository_namespaces', 'releases'];
273
301
 
274
302
  export function cleanupRemovalPhaseOrder(reason: RuntimeCleanupReport['reason'], sequence = 0): RemovalPhase[] {
275
303
  if (reason !== 'periodic') return [...REMOVAL_PHASES];
276
304
  const offset = ((Math.trunc(sequence) % REMOVAL_PHASES.length) + REMOVAL_PHASES.length) % REMOVAL_PHASES.length;
277
305
  // Periodic maintenance is a bounded shard, not a reordered full sweep.
278
- // Eight one-minute generations cover every removal class once while startup/manual
306
+ // Seven one-minute generations cover every removal class once while startup/manual
279
307
  // cleanup retains the complete all-phase contract.
280
308
  return [REMOVAL_PHASES[offset]!];
281
309
  }
@@ -456,6 +484,203 @@ function createScanBudget(maxEntries: number): ScanBudget {
456
484
  };
457
485
  }
458
486
 
487
+ function emptyReleaseSessionCandidatePhaseMetrics(): ReleaseSessionCandidatePhaseMetrics {
488
+ return {
489
+ observedCount: 0,
490
+ observedBytes: 0,
491
+ unknownObservedByteCount: 0,
492
+ retainedCount: 0,
493
+ reclaimableCount: 0,
494
+ removedCount: 0,
495
+ reclaimedBytes: 0,
496
+ unknownReclaimedByteCount: 0,
497
+ };
498
+ }
499
+
500
+ function emptyReleaseSessionCandidateRetentionReport(): ReleaseSessionCandidateRetentionReport {
501
+ return {
502
+ inspected: 0,
503
+ observedCount: 0,
504
+ observedBytes: 0,
505
+ unknownObservedByteCount: 0,
506
+ retainedCount: 0,
507
+ eligible: 0,
508
+ attempted: 0,
509
+ removedPaths: [],
510
+ reclaimedBytes: 0,
511
+ unknownReclaimedByteCount: 0,
512
+ orphanDirectoryCount: 0,
513
+ invalidSessionFiles: [],
514
+ byPhase: {},
515
+ errors: [],
516
+ truncated: false,
517
+ };
518
+ }
519
+
520
+ function candidatePhaseMetrics(
521
+ report: ReleaseSessionCandidateRetentionReport,
522
+ phase: string,
523
+ ): ReleaseSessionCandidatePhaseMetrics {
524
+ return report.byPhase[phase] ??= emptyReleaseSessionCandidatePhaseMetrics();
525
+ }
526
+
527
+ /**
528
+ * Physical retention only. ReleaseSession phase transitions and Candidate
529
+ * service retirement remain owned by standalone Recovery under its operation
530
+ * lock. Maintenance consumes durable phase evidence and the live Runtime owner
531
+ * projection, then applies the existing path-fenced Candidate removal.
532
+ */
533
+ function cleanupReleaseSessionCandidateLanes(
534
+ controllerHome: string,
535
+ input: {
536
+ maxEntries: number;
537
+ sequence: number;
538
+ removalBudget: RemovalBudget;
539
+ skippedByReason: Record<string, number>;
540
+ },
541
+ ): ReleaseSessionCandidateRetentionReport {
542
+ const report = emptyReleaseSessionCandidateRetentionReport();
543
+ const candidateRoot = resolve(dirname(controllerHome), 'candidate-runtime-lanes');
544
+ const inventory = listReleaseSessions(controllerHome, { maxEntries: input.maxEntries });
545
+ report.invalidSessionFiles = [...inventory.invalidSessionFiles].sort();
546
+ report.inspected += inventory.inspected;
547
+ report.truncated = inventory.truncated;
548
+ if (inventory.truncated) {
549
+ input.skippedByReason.release_session_candidate_inventory_truncated =
550
+ (input.skippedByReason.release_session_candidate_inventory_truncated ?? 0) + 1;
551
+ }
552
+ if (inventory.invalidSessionFiles.length > 0) {
553
+ input.skippedByReason.release_session_candidate_authority_invalid =
554
+ (input.skippedByReason.release_session_candidate_authority_invalid ?? 0) + inventory.invalidSessionFiles.length;
555
+ report.errors.push(...inventory.invalidSessionFiles.map((name) => `invalid ReleaseSession authority: ${name}`));
556
+ }
557
+
558
+ const measurementBudget = createScanBudget(input.maxEntries);
559
+ const knownCandidateHomes = new Set<string>();
560
+ const sessions = [...inventory.sessions].sort((left, right) => left.updatedAt.localeCompare(right.updatedAt));
561
+ if (sessions.length > 1) {
562
+ const offset = ((Math.trunc(input.sequence) % sessions.length) + sessions.length) % sessions.length;
563
+ sessions.push(...sessions.splice(0, offset));
564
+ }
565
+
566
+ for (const session of sessions) {
567
+ const candidateHome = resolve(session.candidate.controllerHome);
568
+ if (resolve(dirname(candidateHome)) !== candidateRoot || basename(candidateHome) !== session.sessionId) {
569
+ input.skippedByReason.release_session_candidate_path_invalid =
570
+ (input.skippedByReason.release_session_candidate_path_invalid ?? 0) + 1;
571
+ report.errors.push(`${session.sessionId}: RUNTIME_CANDIDATE_CLEANUP_PATH_INVALID`);
572
+ continue;
573
+ }
574
+ knownCandidateHomes.add(candidateHome);
575
+ if (!existsSync(candidateHome)) continue;
576
+
577
+ const phase = candidatePhaseMetrics(report, session.phase);
578
+ report.observedCount += 1;
579
+ phase.observedCount += 1;
580
+
581
+ let measuredBytes: number | undefined;
582
+ let measurementComplete = false;
583
+ if (measurementBudget.remaining > 0) {
584
+ const measurement = measureReclaimablePath(candidateHome, Math.min(256, measurementBudget.remaining));
585
+ measurementBudget.remaining = Math.max(0, measurementBudget.remaining - measurement.entries);
586
+ measurementBudget.inspected += measurement.entries;
587
+ measuredBytes = measurement.bytes;
588
+ measurementComplete = measurement.complete;
589
+ }
590
+ if (measurementComplete && measuredBytes !== undefined) {
591
+ report.observedBytes += measuredBytes;
592
+ phase.observedBytes += measuredBytes;
593
+ } else {
594
+ report.unknownObservedByteCount += 1;
595
+ phase.unknownObservedByteCount += 1;
596
+ }
597
+
598
+ if (!releaseSessionCandidateIsRetired(session)) {
599
+ report.retainedCount += 1;
600
+ phase.retainedCount += 1;
601
+ input.skippedByReason.release_session_candidate_resumable =
602
+ (input.skippedByReason.release_session_candidate_resumable ?? 0) + 1;
603
+ continue;
604
+ }
605
+
606
+ report.eligible += 1;
607
+ phase.reclaimableCount += 1;
608
+ try {
609
+ if (observeRuntimeStatus(candidateHome).running) {
610
+ report.retainedCount += 1;
611
+ phase.retainedCount += 1;
612
+ input.skippedByReason.release_session_candidate_active_owner =
613
+ (input.skippedByReason.release_session_candidate_active_owner ?? 0) + 1;
614
+ continue;
615
+ }
616
+ } catch (error) {
617
+ report.retainedCount += 1;
618
+ phase.retainedCount += 1;
619
+ report.errors.push(errorText(`${session.sessionId} Candidate Runtime observation`, error));
620
+ input.skippedByReason.release_session_candidate_owner_unknown =
621
+ (input.skippedByReason.release_session_candidate_owner_unknown ?? 0) + 1;
622
+ continue;
623
+ }
624
+
625
+ if (input.removalBudget.remaining <= 0) {
626
+ input.removalBudget.exhausted = true;
627
+ report.retainedCount += 1;
628
+ phase.retainedCount += 1;
629
+ input.skippedByReason.release_session_candidate_cleanup_budget_exhausted =
630
+ (input.skippedByReason.release_session_candidate_cleanup_budget_exhausted ?? 0) + 1;
631
+ continue;
632
+ }
633
+
634
+ report.attempted += 1;
635
+ input.removalBudget.remaining -= 1;
636
+ try {
637
+ removeRetiredCandidateExecutionLane(session.stable, session.candidate);
638
+ const relativePath = `candidate-runtime-lanes/${session.sessionId}`;
639
+ report.removedPaths.push(relativePath);
640
+ phase.removedCount += 1;
641
+ if (measurementComplete && measuredBytes !== undefined) {
642
+ report.reclaimedBytes += measuredBytes;
643
+ phase.reclaimedBytes += measuredBytes;
644
+ } else {
645
+ report.unknownReclaimedByteCount += 1;
646
+ phase.unknownReclaimedByteCount += 1;
647
+ }
648
+ } catch (error) {
649
+ report.retainedCount += 1;
650
+ phase.retainedCount += 1;
651
+ report.errors.push(errorText(`${session.sessionId} Candidate lane removal`, error));
652
+ }
653
+ }
654
+
655
+ // A directory without readable ReleaseSession authority is visible debt, not
656
+ // deletion authority. Keep it and report it so Recovery can reconcile it.
657
+ if (!inventory.truncated && existsSync(candidateRoot)) {
658
+ const rootBudget = createScanBudget(input.maxEntries);
659
+ visitDirectoryEntries(candidateRoot, rootBudget, report.errors, (entry) => {
660
+ if (!entry.isDirectory()) return;
661
+ const path = resolve(candidateRoot, entry.name);
662
+ if (knownCandidateHomes.has(path)) return;
663
+ report.observedCount += 1;
664
+ report.retainedCount += 1;
665
+ report.orphanDirectoryCount += 1;
666
+ report.unknownObservedByteCount += 1;
667
+ const phase = candidatePhaseMetrics(report, 'authority_missing');
668
+ phase.observedCount += 1;
669
+ phase.retainedCount += 1;
670
+ phase.unknownObservedByteCount += 1;
671
+ input.skippedByReason.release_session_candidate_authority_missing =
672
+ (input.skippedByReason.release_session_candidate_authority_missing ?? 0) + 1;
673
+ });
674
+ report.inspected += rootBudget.inspected;
675
+ if (rootBudget.exhausted) report.truncated = true;
676
+ }
677
+
678
+ report.inspected += measurementBudget.inspected;
679
+ report.removedPaths.sort();
680
+ report.errors.sort();
681
+ return report;
682
+ }
683
+
459
684
  function shouldProtectWorktreeReference(meta: AgentRunSnapshot, nowMs: number): boolean {
460
685
  if (meta.executionMode !== 'worktree' || meta.worktreeCleanedAt) return false;
461
686
  const status = typeof meta.status === 'string' ? meta.status.trim().toLowerCase() : '';
@@ -609,6 +834,11 @@ function cleanupOrphanWorktrees(
609
834
  const reclaim = emptyReclaimMetrics();
610
835
  const skippedByReason: Record<string, number> = {};
611
836
  const skip = (reason: string): void => { skippedByReason[reason] = (skippedByReason[reason] ?? 0) + 1; };
837
+ const ownedWorktreesByPath = new Map<string, OwnedResource>();
838
+ for (const resource of listOwnedResources(controllerHome, { kind: 'worktree', status: 'active' })) {
839
+ if (resource.cleanupCapable !== true || !resource.targetRef?.trim()) continue;
840
+ ownedWorktreesByPath.set(canonicalPath(resource.targetRef), resource);
841
+ }
612
842
  const repositoriesRoot = join(controllerHome, 'repositories');
613
843
  visitDirectoryEntries(repositoriesRoot, budget, errors, (repoEntry) => {
614
844
  if (!repoEntry.isDirectory()) return;
@@ -624,7 +854,25 @@ function cleanupOrphanWorktrees(
624
854
  skip(references.referenced.has(canonical) ? 'active_owner' : 'unknown_ownership');
625
855
  return;
626
856
  }
857
+ const ownedResource = ownedWorktreesByPath.get(canonical);
858
+ if (!ownedResource) {
859
+ skippedActive.push(relativePath);
860
+ skip('owned_resource_missing');
861
+ return;
862
+ }
627
863
  try {
864
+ try {
865
+ assertOwnedResourceCleanupTarget(controllerHome, {
866
+ resourceId: ownedResource.resourceId,
867
+ kind: 'worktree',
868
+ targetRef: path,
869
+ });
870
+ } catch (error) {
871
+ skippedActive.push(relativePath);
872
+ skip('owned_resource_identity_mismatch');
873
+ errors.push(errorText(`owned worktree cleanup fence ${relativePath}`, error));
874
+ return;
875
+ }
628
876
  if (nowMs - lstatSync(path).mtimeMs < ORPHAN_WORKTREE_TTL_MS) {
629
877
  skip('ttl_not_expired');
630
878
  return;
@@ -638,6 +886,7 @@ function cleanupOrphanWorktrees(
638
886
  const measurement = measureReclaimablePath(path);
639
887
  if (removeOrphanWorktreeDirectory(path, errors, relativePath)) {
640
888
  removed.push(relativePath);
889
+ markOwnedResourceCleaned(controllerHome, ownedResource.resourceId, 'forge:runtime-orphan-worktree-cleanup');
641
890
  if (measurement.complete) reclaim.reclaimedBytes += measurement.bytes;
642
891
  else reclaim.unknownReclaimedByteCount += 1;
643
892
  }
@@ -802,12 +1051,10 @@ function shouldPersistCleanupAudit(report: RuntimeCleanupReport): boolean {
802
1051
  || report.removedTemporaryPaths.length
803
1052
  || report.removedCleanupArtifactPaths.length
804
1053
  || report.removedReleasePaths.length
805
- || report.removedCodegraphLocatorPaths.length
806
- || report.removedCodegraphCachePaths.length
1054
+ || report.releaseSessionCandidates.removedPaths.length
807
1055
  || report.removedRepositoryNamespacePaths.length
808
1056
  || report.sqliteMaintenance?.vacuumed
809
1057
  || report.sqliteMaintenance?.skippedReason === 'database_busy'
810
- || report.retiredPlanBoundWorkAuthorities.length
811
1058
  || report.retiredOwnerlessWorkAuthorities.length,
812
1059
  );
813
1060
  if (hadMutations || report.errors.length) return true;
@@ -839,14 +1086,12 @@ export function cleanupControllerRuntimeState(
839
1086
  const errors: string[] = [];
840
1087
  const skippedByReason: Record<string, number> = {};
841
1088
  const sequence = options.periodicSequence ?? Math.floor(nowMs / 60_000);
1089
+ const removalCycleSequence = Math.floor(sequence / REMOVAL_PHASES.length);
842
1090
  const removalPhases = cleanupRemovalPhaseOrder(options.reason ?? 'manual', sequence);
843
1091
  const periodic = (options.reason ?? 'manual') === 'periodic';
844
- const retiredPlanBoundWorkAuthorities: string[] = [];
845
1092
  const retiredOwnerlessWorkAuthorities: string[] = [];
846
1093
  if (!periodic || removalPhases.includes('repository_namespaces')) try {
847
1094
  for (const repository of listRepositories(home, { includeRemoved: true })) {
848
- const retired = retireTerminalPlanBoundWorkAuthorities({ controllerHome: home, repoId: repository.repoId });
849
- retiredPlanBoundWorkAuthorities.push(...retired.map((workId) => `${repository.repoId}:${workId}`));
850
1095
  const ownerless = reconcileOwnerlessWorkAuthorities({
851
1096
  controllerHome: home,
852
1097
  repoId: repository.repoId,
@@ -870,11 +1115,8 @@ export function cleanupControllerRuntimeState(
870
1115
  let temporaryCleanup: ReturnType<typeof cleanupTemporaryStatePaths> | undefined;
871
1116
  let artifactRetention: ReturnType<typeof cleanupWorkPreservationArtifacts> | undefined;
872
1117
  let releaseRetention: ReturnType<typeof cleanupControllerReleaseHistory> | undefined;
873
- let codegraphRetention: ReturnType<typeof cleanupCodegraphCaches> | undefined;
1118
+ let releaseSessionCandidates: ReleaseSessionCandidateRetentionReport | undefined;
874
1119
  let repositoryNamespaceRetention: ReturnType<typeof cleanupRetiredRepositoryNamespaces> | undefined;
875
- const removedCodegraphLocatorPaths: string[] = [];
876
- let codegraphLocatorInspected = 0;
877
- let codegraphLocatorRetained = 0;
878
1120
  const schedulerHistory = {
879
1121
  removedOccurrencePaths: [] as string[],
880
1122
  removedDecisionPaths: [] as string[],
@@ -920,6 +1162,7 @@ export function cleanupControllerRuntimeState(
920
1162
  graceMs: options.cleanupArtifactRetentionGraceMs,
921
1163
  maxEntries,
922
1164
  maxRemovals: removalBudget.remaining,
1165
+ scanSequence: removalCycleSequence,
923
1166
  });
924
1167
  removalBudget.remaining = Math.max(0, removalBudget.remaining - artifactRetention.attempted);
925
1168
  if (artifactRetention.budgetExhausted) removalBudget.exhausted = true;
@@ -971,7 +1214,7 @@ export function cleanupControllerRuntimeState(
971
1214
  let protectedWorkIds: string[];
972
1215
  try {
973
1216
  protectedWorkIds = readWorkContractStore({ controllerHome: home, repoId: repository.repoId }).contracts
974
- .filter((contract) => !isTerminalWorkContractStatus(contract.status))
1217
+ .filter((contract) => !isTerminalSemanticWorkState(contract.semanticState))
975
1218
  .map((contract) => contract.workId);
976
1219
  } catch (error) {
977
1220
  const message = error instanceof Error ? error.message : String(error);
@@ -1008,65 +1251,6 @@ export function cleanupControllerRuntimeState(
1008
1251
  errors.push(...editSessionHistory.errors.map((error) => `edit-session-history ${error}`));
1009
1252
  continue;
1010
1253
  }
1011
- if (phase === 'caches') {
1012
- const registered = listRepositories(home, { includeRemoved: true });
1013
- const repositoryRoots = new Set<string>();
1014
- for (const repository of registered) {
1015
- repositoryRoots.add(resolve(repository.canonicalRoot));
1016
- repositoryRoots.add(resolve(repository.localRoot));
1017
- for (const checkout of repository.checkouts) {
1018
- repositoryRoots.add(resolve(checkout.canonicalRoot));
1019
- repositoryRoots.add(resolve(checkout.localRoot));
1020
- }
1021
- }
1022
- const protectedRepositoryRoots = new Set<string>();
1023
- let locatorScanRemaining = maxEntries;
1024
- for (const repositoryRoot of [...repositoryRoots].sort()) {
1025
- if (!existsSync(repositoryRoot)) continue;
1026
- if (locatorScanRemaining <= 0) {
1027
- protectedRepositoryRoots.add(repositoryRoot);
1028
- skippedByReason.codegraph_locator_scan_budget_exhausted = (skippedByReason.codegraph_locator_scan_budget_exhausted ?? 0) + 1;
1029
- continue;
1030
- }
1031
- const locatorReport = cleanupStaleCodegraphLocators(
1032
- repositoryRoot,
1033
- home,
1034
- locatorScanRemaining,
1035
- removalBudget.remaining,
1036
- );
1037
- locatorScanRemaining = Math.max(0, locatorScanRemaining - locatorReport.inspected);
1038
- removalBudget.remaining = Math.max(0, removalBudget.remaining - locatorReport.attempted);
1039
- if (locatorReport.budgetExhausted && removalBudget.remaining <= 0) removalBudget.exhausted = true;
1040
- codegraphLocatorInspected += locatorReport.inspected;
1041
- codegraphLocatorRetained += Math.max(0, locatorReport.inspected - locatorReport.removed.length);
1042
- removedCodegraphLocatorPaths.push(...locatorReport.removed.map((name) => join(repositoryRoot, name)));
1043
- Object.entries(locatorReport.skippedByReason).forEach(([key, value]) => {
1044
- skippedByReason[`codegraph_locator_${key}`] = (skippedByReason[`codegraph_locator_${key}`] ?? 0) + value;
1045
- });
1046
- const protectionUncertain = locatorReport.budgetExhausted
1047
- || locatorReport.errors.length > 0
1048
- || (locatorReport.skippedByReason.locator_identity_unproven ?? 0) > 0;
1049
- if (locatorReport.active.length > 0 || protectionUncertain) protectedRepositoryRoots.add(repositoryRoot);
1050
- if (locatorReport.budgetExhausted) {
1051
- skippedByReason.codegraph_locator_scan_budget_exhausted = (skippedByReason.codegraph_locator_scan_budget_exhausted ?? 0) + 1;
1052
- }
1053
- errors.push(...locatorReport.errors.map((error) => `codegraph-locator ${repositoryRoot}: ${error}`));
1054
- }
1055
- codegraphRetention = cleanupCodegraphCaches(home, {
1056
- nowMs,
1057
- retentionMs: options.codegraphCacheRetentionMs,
1058
- maxEntries,
1059
- maxRemovals: removalBudget.remaining,
1060
- protectedRepositoryRoots: [...protectedRepositoryRoots],
1061
- });
1062
- removalBudget.remaining = Math.max(0, removalBudget.remaining - codegraphRetention.attempted);
1063
- if (codegraphRetention.budgetExhausted) removalBudget.exhausted = true;
1064
- Object.entries(codegraphRetention.skippedByReason).forEach(([key, value]) => {
1065
- skippedByReason[`codegraph_cache_${key}`] = (skippedByReason[`codegraph_cache_${key}`] ?? 0) + value;
1066
- });
1067
- errors.push(...codegraphRetention.errors.map((error) => `codegraph-cache ${error}`));
1068
- continue;
1069
- }
1070
1254
  if (phase === 'repository_namespaces') {
1071
1255
  repositoryNamespaceRetention = cleanupRetiredRepositoryNamespaces(home, {
1072
1256
  nowMs,
@@ -1082,6 +1266,14 @@ export function cleanupControllerRuntimeState(
1082
1266
  errors.push(...repositoryNamespaceRetention.errors.map((error) => `repository-namespace ${error}`));
1083
1267
  continue;
1084
1268
  }
1269
+ releaseSessionCandidates = cleanupReleaseSessionCandidateLanes(home, {
1270
+ maxEntries,
1271
+ sequence,
1272
+ removalBudget,
1273
+ skippedByReason,
1274
+ });
1275
+ errors.push(...releaseSessionCandidates.errors.map((error) => `release-session-candidate ${error}`));
1276
+
1085
1277
  releaseRetention = cleanupControllerReleaseHistory(home, {
1086
1278
  nowMs,
1087
1279
  graceMs: options.releaseRetentionGraceMs,
@@ -1100,11 +1292,11 @@ export function cleanupControllerRuntimeState(
1100
1292
  dependencyCleanup ??= { migrated: [], skippedByReason: {} } as ReturnType<typeof cleanupManagedWorktreeDependencyCopies>;
1101
1293
  temporaryCleanup ??= { removed: [], reclaim: emptyReclaimMetrics() } as ReturnType<typeof cleanupTemporaryStatePaths>;
1102
1294
  artifactRetention ??= { removedPaths: [], attempted: 0, budgetExhausted: false, skippedByReason: {}, errors: [], inspected: 0, eligible: 0, retained: 0, skipped: 0, reclaimedBytes: 0, unknownReclaimedByteCount: 0 } as ReturnType<typeof cleanupWorkPreservationArtifacts>;
1103
- codegraphRetention ??= { policyVersion: CODEGRAPH_CACHE_RETENTION_POLICY_VERSION, removedPaths: [], attempted: 0, budgetExhausted: false, skippedByReason: {}, errors: [], inspected: 0, eligible: 0, retained: 0, reclaimedBytes: 0, unknownReclaimedByteCount: 0, observedBytes: 0, unknownObservedByteCount: 0, protected: 0, protectedOverCapacity: 0, truncated: false } as ReturnType<typeof cleanupCodegraphCaches>;
1104
1295
  repositoryNamespaceRetention ??= { policyVersion: 'repository-namespace-retention-v1', removedPaths: [], attempted: 0, budgetExhausted: false, skippedByReason: {}, errors: [], inspected: 0, eligible: 0, retained: 0, reclaimedBytes: 0, unknownReclaimedByteCount: 0 } as ReturnType<typeof cleanupRetiredRepositoryNamespaces>;
1105
1296
  releaseRetention ??= { removedPaths: [], removedBackupPaths: [], attempted: 0, budgetExhausted: false, skippedByReason: {}, errors: [], inspected: 0, eligible: 0, retained: 0, skipped: 0, reclaimedBytes: 0, unknownReclaimedByteCount: 0, reclaimedBackupBytes: 0, unknownReclaimedBackupByteCount: 0 } as ReturnType<typeof cleanupControllerReleaseHistory>;
1297
+ releaseSessionCandidates ??= emptyReleaseSessionCandidateRetentionReport();
1106
1298
  }
1107
- if (!worktrees || !dependencyCleanup || !temporaryCleanup || !artifactRetention || !codegraphRetention || !repositoryNamespaceRetention || !releaseRetention) {
1299
+ if (!worktrees || !dependencyCleanup || !temporaryCleanup || !artifactRetention || !repositoryNamespaceRetention || !releaseRetention || !releaseSessionCandidates) {
1108
1300
  throw new Error('RUNTIME_CLEANUP_PHASE_INCOMPLETE');
1109
1301
  }
1110
1302
  const removedTemporaryPaths = temporaryCleanup.removed.sort();
@@ -1113,8 +1305,6 @@ export function cleanupControllerRuntimeState(
1113
1305
  const removedScheduleOccurrencePaths = schedulerHistory.removedOccurrencePaths.sort();
1114
1306
  const removedScheduleDecisionPaths = schedulerHistory.removedDecisionPaths.sort();
1115
1307
  const removedEditSessionPaths = editSessionHistory.removedPaths.sort();
1116
- removedCodegraphLocatorPaths.sort();
1117
- const removedCodegraphCachePaths = codegraphRetention.removedPaths.sort();
1118
1308
  const removedRepositoryNamespacePaths = repositoryNamespaceRetention.removedPaths.sort();
1119
1309
  let sqliteMaintenance: ControlPlaneDatabaseMaintenanceReport | undefined;
1120
1310
  if (!periodic || removalPhases.includes('releases')) try {
@@ -1128,8 +1318,8 @@ export function cleanupControllerRuntimeState(
1128
1318
  } catch (error) {
1129
1319
  errors.push(errorText('SQLite maintenance', error));
1130
1320
  }
1131
- const inspectedPaths = referenceBudget.inspected + worktreeBudget.inspected + dependencyBudget.inspected + tempBudget.inspected + schedulerBudget.inspected + editSessionBudget.inspected + artifactRetention.inspected + codegraphLocatorInspected + codegraphRetention.inspected + repositoryNamespaceRetention.inspected + releaseRetention.inspected;
1132
- const budgetExhausted = referenceBudget.exhausted || worktreeBudget.exhausted || dependencyBudget.exhausted || tempBudget.exhausted || schedulerBudget.exhausted || editSessionBudget.exhausted || removalBudget.exhausted;
1321
+ const inspectedPaths = referenceBudget.inspected + worktreeBudget.inspected + dependencyBudget.inspected + tempBudget.inspected + schedulerBudget.inspected + editSessionBudget.inspected + artifactRetention.inspected + repositoryNamespaceRetention.inspected + releaseRetention.inspected + releaseSessionCandidates.inspected;
1322
+ const budgetExhausted = referenceBudget.exhausted || worktreeBudget.exhausted || dependencyBudget.exhausted || tempBudget.exhausted || schedulerBudget.exhausted || editSessionBudget.exhausted || removalBudget.exhausted || releaseSessionCandidates.truncated;
1133
1323
  if (pidFiles.skipped.length > 0 && removalBudget.exhausted) skippedByReason.cleanup_budget_exhausted = (skippedByReason.cleanup_budget_exhausted ?? 0) + pidFiles.skipped.length;
1134
1324
  if (pidFiles.skipped.length > 0 && !removalBudget.exhausted) skippedByReason.active_owner = (skippedByReason.active_owner ?? 0) + pidFiles.skipped.length;
1135
1325
  const physicalReclaimedByClass: Record<string, RuntimeCleanupLifecycleClassMetrics> = {
@@ -1139,9 +1329,9 @@ export function cleanupControllerRuntimeState(
1139
1329
  unknownByteCount: worktrees.reclaim.unknownReclaimedByteCount,
1140
1330
  },
1141
1331
  runtime_temp: {
1142
- count: pidFiles.removed.length + removedTemporaryPaths.length + removedCodegraphLocatorPaths.length,
1332
+ count: pidFiles.removed.length + removedTemporaryPaths.length,
1143
1333
  bytes: pidFiles.reclaim.reclaimedBytes + temporaryCleanup.reclaim.reclaimedBytes,
1144
- unknownByteCount: pidFiles.reclaim.unknownReclaimedByteCount + temporaryCleanup.reclaim.unknownReclaimedByteCount + removedCodegraphLocatorPaths.length,
1334
+ unknownByteCount: pidFiles.reclaim.unknownReclaimedByteCount + temporaryCleanup.reclaim.unknownReclaimedByteCount,
1145
1335
  },
1146
1336
  work: {
1147
1337
  count: removedCleanupArtifactPaths.length,
@@ -1158,6 +1348,11 @@ export function cleanupControllerRuntimeState(
1158
1348
  bytes: releaseRetention.reclaimedBackupBytes,
1159
1349
  unknownByteCount: releaseRetention.unknownReclaimedBackupByteCount,
1160
1350
  },
1351
+ release_session_candidate: {
1352
+ count: releaseSessionCandidates.removedPaths.length,
1353
+ bytes: releaseSessionCandidates.reclaimedBytes,
1354
+ unknownByteCount: releaseSessionCandidates.unknownReclaimedByteCount,
1355
+ },
1161
1356
  scheduler_occurrence_history: {
1162
1357
  count: removedScheduleOccurrencePaths.length + removedScheduleDecisionPaths.length,
1163
1358
  bytes: schedulerHistory.reclaimedBytes,
@@ -1168,11 +1363,6 @@ export function cleanupControllerRuntimeState(
1168
1363
  bytes: editSessionHistory.reclaimedBytes,
1169
1364
  unknownByteCount: editSessionHistory.unknownReclaimedByteCount,
1170
1365
  },
1171
- codegraph_cache: {
1172
- count: removedCodegraphCachePaths.length,
1173
- bytes: codegraphRetention.reclaimedBytes,
1174
- unknownByteCount: codegraphRetention.unknownReclaimedByteCount,
1175
- },
1176
1366
  repository_controller_home_namespace: {
1177
1367
  count: removedRepositoryNamespacePaths.length,
1178
1368
  bytes: repositoryNamespaceRetention.reclaimedBytes,
@@ -1199,8 +1389,8 @@ export function cleanupControllerRuntimeState(
1199
1389
  reclaimedBytes: Object.values(physicalReclaimedByClass).reduce((total, entry) => total + entry.bytes, 0),
1200
1390
  unknownReclaimedByteCount: Object.values(physicalReclaimedByClass).reduce((total, entry) => total + entry.unknownByteCount, 0),
1201
1391
  reclaimedByClass: physicalReclaimedByClass,
1202
- logicalRetiredCount: retiredPlanBoundWorkAuthorities.length + retiredOwnerlessWorkAuthorities.length,
1203
- logicalRetiredByClass: { work: retiredPlanBoundWorkAuthorities.length + retiredOwnerlessWorkAuthorities.length },
1392
+ logicalRetiredCount: retiredOwnerlessWorkAuthorities.length,
1393
+ logicalRetiredByClass: { work: retiredOwnerlessWorkAuthorities.length },
1204
1394
  protectedActiveCount: Object.values(protectedByReason).reduce((total, count) => total + count, 0),
1205
1395
  protectedByReason,
1206
1396
  blockerReasons,
@@ -1216,14 +1406,12 @@ export function cleanupControllerRuntimeState(
1216
1406
  removedTemporaryPaths,
1217
1407
  removedCleanupArtifactPaths,
1218
1408
  removedReleasePaths,
1409
+ releaseSessionCandidates,
1219
1410
  removedScheduleOccurrencePaths,
1220
1411
  removedScheduleDecisionPaths,
1221
1412
  removedEditSessionPaths,
1222
- removedCodegraphLocatorPaths,
1223
- removedCodegraphCachePaths,
1224
1413
  removedRepositoryNamespacePaths,
1225
1414
  sqliteMaintenance,
1226
- retiredPlanBoundWorkAuthorities: retiredPlanBoundWorkAuthorities.sort(),
1227
1415
  retiredOwnerlessWorkAuthorities: retiredOwnerlessWorkAuthorities.sort(),
1228
1416
  skippedActiveWorktrees: worktrees.skippedActive.sort(),
1229
1417
  inspectedPaths,
@@ -1233,11 +1421,11 @@ export function cleanupControllerRuntimeState(
1233
1421
  lifecycleMetrics,
1234
1422
  cycle: {
1235
1423
  scanned: inspectedPaths,
1236
- eligible: retiredPlanBoundWorkAuthorities.length + retiredOwnerlessWorkAuthorities.length + pidFiles.removed.length + worktrees.removed.length + dependencyCleanup.migrated.length + removedTemporaryPaths.length + artifactRetention.eligible + schedulerHistory.eligible + editSessionHistory.eligible + removedCodegraphLocatorPaths.length + codegraphRetention.eligible + repositoryNamespaceRetention.eligible + releaseRetention.eligible,
1237
- attempted: retiredPlanBoundWorkAuthorities.length + retiredOwnerlessWorkAuthorities.length + pidFiles.removed.length + worktrees.removed.length + dependencyCleanup.migrated.length + removedTemporaryPaths.length + artifactRetention.attempted + schedulerHistory.attempted + editSessionHistory.attempted + removedCodegraphLocatorPaths.length + codegraphRetention.attempted + repositoryNamespaceRetention.attempted + releaseRetention.attempted + errors.length,
1238
- removed: retiredPlanBoundWorkAuthorities.length + retiredOwnerlessWorkAuthorities.length + pidFiles.removed.length + worktrees.removed.length + dependencyCleanup.migrated.length + removedTemporaryPaths.length + removedCleanupArtifactPaths.length + removedScheduleOccurrencePaths.length + removedScheduleDecisionPaths.length + removedEditSessionPaths.length + removedCodegraphLocatorPaths.length + removedCodegraphCachePaths.length + removedRepositoryNamespacePaths.length + removedReleasePaths.length,
1239
- retained: pidFiles.skipped.length + worktrees.skippedActive.length + artifactRetention.retained + schedulerHistory.retained + editSessionHistory.retained + codegraphLocatorRetained + codegraphRetention.retained + repositoryNamespaceRetention.retained + releaseRetention.retained,
1240
- skipped: Math.max(0, inspectedPaths - pidFiles.removed.length - worktrees.removed.length - dependencyCleanup.migrated.length - removedTemporaryPaths.length - removedCleanupArtifactPaths.length - removedScheduleOccurrencePaths.length - removedScheduleDecisionPaths.length - removedEditSessionPaths.length - removedCodegraphLocatorPaths.length - removedCodegraphCachePaths.length - removedRepositoryNamespacePaths.length - removedReleasePaths.length - errors.length),
1424
+ eligible: retiredOwnerlessWorkAuthorities.length + pidFiles.removed.length + worktrees.removed.length + dependencyCleanup.migrated.length + removedTemporaryPaths.length + artifactRetention.eligible + schedulerHistory.eligible + editSessionHistory.eligible + repositoryNamespaceRetention.eligible + releaseRetention.eligible + releaseSessionCandidates.eligible,
1425
+ attempted: retiredOwnerlessWorkAuthorities.length + pidFiles.removed.length + worktrees.removed.length + dependencyCleanup.migrated.length + removedTemporaryPaths.length + artifactRetention.attempted + schedulerHistory.attempted + editSessionHistory.attempted + repositoryNamespaceRetention.attempted + releaseRetention.attempted + releaseSessionCandidates.attempted + errors.length,
1426
+ removed: retiredOwnerlessWorkAuthorities.length + pidFiles.removed.length + worktrees.removed.length + dependencyCleanup.migrated.length + removedTemporaryPaths.length + removedCleanupArtifactPaths.length + removedScheduleOccurrencePaths.length + removedScheduleDecisionPaths.length + removedEditSessionPaths.length + removedRepositoryNamespacePaths.length + removedReleasePaths.length + releaseSessionCandidates.removedPaths.length,
1427
+ retained: pidFiles.skipped.length + worktrees.skippedActive.length + artifactRetention.retained + schedulerHistory.retained + editSessionHistory.retained + repositoryNamespaceRetention.retained + releaseRetention.retained + releaseSessionCandidates.retainedCount,
1428
+ skipped: Math.max(0, inspectedPaths - pidFiles.removed.length - worktrees.removed.length - dependencyCleanup.migrated.length - removedTemporaryPaths.length - removedCleanupArtifactPaths.length - removedScheduleOccurrencePaths.length - removedScheduleDecisionPaths.length - removedEditSessionPaths.length - removedRepositoryNamespacePaths.length - removedReleasePaths.length - releaseSessionCandidates.removedPaths.length - errors.length),
1241
1429
  failed: errors.length,
1242
1430
  truncated: budgetExhausted,
1243
1431
  budgetExhausted,