@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
@@ -6,13 +6,12 @@ import { join } from 'path';
6
6
  import { registerRepository } from '../src/cli/repositories/registry';
7
7
  import { readForgeRuntimeStatus } from '../src/runtime/control-plane/runtime-status-client';
8
8
  import { FORGE_TOOL_SURFACE } from '../src/cli/controller/runtime-config';
9
- import { CORE_CONTROLLER_TOOL_NAMES } from '../src/cli/mcp/toolset';
9
+ import { controllerExposureSnapshot } from '../adapters/mcp/toolset';
10
10
  import { writeMcpServiceLocalConfig } from '../adapters/mcp/auth';
11
- import { buildMcpToolDefinitions } from '../src/cli/mcp/tools';
12
- import { runtimePolicy } from '../src/cli/mcp/multi-repository';
13
- import { resolveControllerToolsetSelection } from '../src/cli/mcp/toolset-selection';
11
+ import { buildMcpToolDefinitions } from '../adapters/mcp/tool-mapping/tools';
12
+ import { runtimePolicy } from '../adapters/mcp/multi-repository';
14
13
  import { RUNTIME_WRITE_CLAIM_ENV } from '../src/runtime/root/write-fence';
15
- import { createMcpToolContext, readCanonicalRuntimeToolSchema } from '../src/cli/mcp/server';
14
+ import { createMcpToolContext, readCanonicalRuntimeToolSchema } from '../adapters/mcp/server';
16
15
 
17
16
  const root = mkdtempSync(join(tmpdir(), 'forge-mcp-http-smoke-'));
18
17
  const repoRoot = join(root, 'repo');
@@ -148,6 +147,11 @@ try {
148
147
  throw new Error(`GATEWAY_START_FAILED: ${error instanceof Error ? error.message : String(error)} ${stderr}`);
149
148
  }
150
149
  if (health.status !== 200 || health.body.status !== 'ok') throw new Error(`HEALTH_FAILED: ${JSON.stringify(health)} ${stderr}`);
150
+ const initialTransportEvidence = health.body.transportEvidence as Record<string, unknown> | undefined;
151
+ if (initialTransportEvidence?.current !== 'healthy') throw new Error(`TRANSPORT_CURRENT_HEALTH_MISSING: ${JSON.stringify(initialTransportEvidence)}`);
152
+ if (!['stable', 'recovering', 'recovered'].includes(String(initialTransportEvidence?.recentStatus))) {
153
+ throw new Error(`TRANSPORT_RECENT_STATUS_INVALID: ${JSON.stringify(initialTransportEvidence)}`);
154
+ }
151
155
  const expectedPolicy = runtimePolicy(repoRoot, {
152
156
  repo: repoRoot,
153
157
  controllerHome,
@@ -155,8 +159,8 @@ try {
155
159
  enableDevRunner: true,
156
160
  devRunnerAgents: 'codex,claude',
157
161
  });
158
- // Unmarked Controller startup intentionally preserves the Advanced compatibility label.
159
- const expectedToolset = resolveControllerToolsetSelection(null).toolset;
162
+ // Every Controller session exposes the same complete capability registry.
163
+ const expectedToolset = 'full';
160
164
  if (health.body.toolset !== expectedToolset) throw new Error(`TOOLSET_CHANGED: ${String(health.body.toolset)}`);
161
165
  if (health.body.toolSurface !== FORGE_TOOL_SURFACE) throw new Error(`TOOL_SURFACE_CHANGED: ${String(health.body.toolSurface)}`);
162
166
  const expectedCompatibilityToolCount = buildMcpToolDefinitions(expectedPolicy).length;
@@ -179,7 +183,7 @@ try {
179
183
  devRunnerAgents: 'codex,claude',
180
184
  });
181
185
  const runtimeSchema = await readCanonicalRuntimeToolSchema(runtimeContext);
182
- const expectedRuntimeNames = [...CORE_CONTROLLER_TOOL_NAMES].sort();
186
+ const expectedRuntimeNames = [...controllerExposureSnapshot(runtimeContext).actualToolNames].sort();
183
187
  if (JSON.stringify(runtimeSchema.toolNames) !== JSON.stringify(expectedRuntimeNames)) {
184
188
  throw new Error(`RUNTIME_TOOL_SCHEMA_CHANGED: ${JSON.stringify(runtimeSchema.toolNames)}`);
185
189
  }
@@ -3,27 +3,34 @@
3
3
  * Focused smoke: local MCP tool surface + connector freshness semantics.
4
4
  * Does not require a live ChatGPT connector session.
5
5
  */
6
- import { getMcpPolicy } from '../src/cli/mcp/policy';
7
- import { controllerExpectedToolNames } from '../src/cli/mcp/legacy-tool-service';
6
+ import { getMcpPolicy } from '../adapters/mcp/policy';
8
7
  import {
9
- ADVANCED_CONTROLLER_TOOL_NAMES,
10
- DEFAULT_CONTROLLER_TOOL_NAMES,
8
+ PREFERRED_CONTROLLER_TOOL_NAMES,
11
9
  PREFERRED_FACADE_TOOL_NAMES,
12
10
  exposedControllerToolDefinitions,
13
- } from '../src/cli/mcp/toolset';
11
+ } from '../adapters/mcp/toolset';
14
12
  import {
15
13
  EXPECTED_FACADE_TOOLS,
16
14
  OPTIONAL_INTERACTIVE_DEVELOPMENT_TOOLS,
17
15
  evaluateConnectorFreshness,
18
16
  } from '../src/cli/local-bridge/connector-freshness';
19
- import type { MultiRepositoryMcpToolContext } from '../src/cli/mcp/multi-repository';
17
+ import type { MultiRepositoryMcpToolContext } from '../adapters/mcp/multi-repository';
20
18
 
21
19
  function assert(condition: unknown, message: string): asserts condition {
22
20
  if (!condition) throw new Error(`SMOKE_FAIL: ${message}`);
23
21
  }
24
22
 
25
23
  const policy = getMcpPolicy('controller');
26
- const expected = controllerExpectedToolNames(policy);
24
+ const fullCtx = {
25
+ policy,
26
+ toolset: 'full' as const,
27
+ controllerHome: process.cwd(),
28
+ repoRoot: process.cwd(),
29
+ enableChatgptBrowser: false,
30
+ audit: () => undefined,
31
+ } as unknown as MultiRepositoryMcpToolContext;
32
+ const fullExposed = exposedControllerToolDefinitions(fullCtx).map((tool) => tool.name);
33
+ const expected = fullExposed;
27
34
 
28
35
  assert(
29
36
  JSON.stringify([...PREFERRED_FACADE_TOOL_NAMES]) === JSON.stringify([...EXPECTED_FACADE_TOOLS]),
@@ -32,7 +39,7 @@ assert(
32
39
 
33
40
  for (const name of EXPECTED_FACADE_TOOLS) {
34
41
  assert(
35
- (DEFAULT_CONTROLLER_TOOL_NAMES as readonly string[]).includes(name),
42
+ (PREFERRED_CONTROLLER_TOOL_NAMES as readonly string[]).includes(name),
36
43
  `default exposure missing ${name}`,
37
44
  );
38
45
  assert(expected.includes(name), `expectedTools missing ${name}`);
@@ -40,41 +47,21 @@ for (const name of EXPECTED_FACADE_TOOLS) {
40
47
 
41
48
  for (const name of OPTIONAL_INTERACTIVE_DEVELOPMENT_TOOLS) {
42
49
  assert(
43
- (ADVANCED_CONTROLLER_TOOL_NAMES as readonly string[]).includes(name),
44
- `interactive tool ${name} missing from ADVANCED_CONTROLLER_TOOL_NAMES`,
50
+ (PREFERRED_CONTROLLER_TOOL_NAMES as readonly string[]).includes(name),
51
+ `interactive tool ${name} missing from the preferred capability list`,
45
52
  );
46
53
  assert(
47
- (DEFAULT_CONTROLLER_TOOL_NAMES as readonly string[]).includes(name),
48
- `interactive tool ${name} missing from the stable default tools/list`,
54
+ (PREFERRED_CONTROLLER_TOOL_NAMES as readonly string[]).includes(name),
55
+ `interactive tool ${name} missing from the preferred routing list`,
49
56
  );
50
57
  }
51
58
 
52
- const coreCtx = {
53
- policy,
54
- toolset: 'core' as const,
55
- enableChatgptBrowser: false,
56
- audit: () => undefined,
57
- } as unknown as MultiRepositoryMcpToolContext;
58
- const advancedCtx = { ...coreCtx, toolset: 'advanced' as const };
59
-
60
- const coreExposed = exposedControllerToolDefinitions(coreCtx).map((tool) => tool.name);
61
- const advancedExposed = exposedControllerToolDefinitions(advancedCtx).map((tool) => tool.name);
62
- for (const name of EXPECTED_FACADE_TOOLS) {
63
- assert(coreExposed.includes(name), `exposed core tools missing ${name}`);
64
- }
65
- assert(coreExposed.includes('repository_list'), 'default surface missing repository_list');
66
- assert(!coreExposed.includes('repository_bootstrap_local_project'), 'default stable surface must not expose legacy bootstrap tool');
67
- assert(!advancedExposed.includes('repository_bootstrap_local_project'), 'advanced stable alias must not expose legacy bootstrap tool');
68
- assert(coreExposed.length === DEFAULT_CONTROLLER_TOOL_NAMES.length, `core stable tool count changed: ${coreExposed.length}`);
69
- assert(advancedExposed.length === DEFAULT_CONTROLLER_TOOL_NAMES.length, `advanced stable tool count changed: ${advancedExposed.length}`);
70
- assert(
71
- JSON.stringify(coreExposed) === JSON.stringify(advancedExposed),
72
- 'Core and Advanced must remain schema-stable aliases of the same bounded tool surface',
73
- );
74
- for (const name of OPTIONAL_INTERACTIVE_DEVELOPMENT_TOOLS) {
75
- assert(coreExposed.includes(name), `stable surface missing interactive ${name}`);
76
- assert(advancedExposed.includes(name), `advanced alias missing interactive ${name}`);
59
+ for (const name of PREFERRED_CONTROLLER_TOOL_NAMES) {
60
+ assert(fullExposed.includes(name), `complete registry missing preferred capability ${name}`);
77
61
  }
62
+ assert(fullExposed.includes('repository_bootstrap_local_project'), 'complete registry missing repository bootstrap');
63
+ assert(fullExposed.includes('git_commit_paths'), 'complete registry missing canonical Git operation');
64
+ assert(fullExposed.length > PREFERRED_CONTROLLER_TOOL_NAMES.length, 'complete registry must include every registered operation');
78
65
 
79
66
  const unable = evaluateConnectorFreshness({ localToolNames: expected });
80
67
  assert(unable.status === 'unable_to_verify_chatgpt_snapshot', `expected unable_to_verify, got ${unable.status}`);
@@ -103,11 +90,10 @@ console.log(JSON.stringify({
103
90
  ok: true,
104
91
  expectedFacadeTools: EXPECTED_FACADE_TOOLS,
105
92
  preferredTools: PREFERRED_FACADE_TOOL_NAMES,
106
- defaultToolCount: coreExposed.length,
107
- advancedToolCount: advancedExposed.length,
93
+ exposedToolCount: fullExposed.length,
94
+ preferredToolCount: PREFERRED_CONTROLLER_TOOL_NAMES.length,
108
95
  expectedToolsHasFacade: EXPECTED_FACADE_TOOLS.every((name) => expected.includes(name)),
109
- advancedHasInteractive: OPTIONAL_INTERACTIVE_DEVELOPMENT_TOOLS.every((name) =>
110
- (ADVANCED_CONTROLLER_TOOL_NAMES as readonly string[]).includes(name)),
96
+ fullHasInteractive: OPTIONAL_INTERACTIVE_DEVELOPMENT_TOOLS.every((name) => fullExposed.includes(name)),
111
97
  states: {
112
98
  unable: unable.status,
113
99
  missingSnap: missingSnap.status,
@@ -9,11 +9,8 @@ import {
9
9
  getWorkContract,
10
10
  getWorkContractByRequestId,
11
11
  recordWorkCompletionReceipt,
12
- recordWorkImplementationReview,
13
- requestWorkImplementationReview,
14
- transitionWorkContractPhase,
15
12
  } from '../src/runtime/control-plane/facade/work-contract-store';
16
- import { implementationReviewChangedPathDigest } from '../src/runtime/control-plane/facade/work-implementation-review';
13
+ import { reviseWorkSemanticContext } from '../packages/kernel/work/api/index';
17
14
  import {
18
15
  claimControllerSession,
19
16
  getControllerSession,
@@ -70,6 +67,7 @@ try {
70
67
  semanticKey: operation.semanticKey,
71
68
  operation,
72
69
  objective: 'Verify WorkContract and Process Runtime recovery without ExecutionJobs',
70
+ workKind: 'completed_no_change' as const,
73
71
  checks: [],
74
72
  };
75
73
  const accepted = acceptSubmittedWorkContract(controllerHome, request);
@@ -89,13 +87,6 @@ try {
89
87
  sessionId: 'session-recovery-a',
90
88
  leaseMs: 60_000,
91
89
  });
92
- // Recovery smoke follows the same Work-only phase API enforced in production.
93
- transitionWorkContractPhase({ controllerHome, repoId: repository.repoId }, accepted.contract.workId, {
94
- phase: 'implementation',
95
- status: 'running',
96
- state: 'active',
97
- summary: 'Process Runtime recovery smoke started implementation.',
98
- });
99
90
  const handle = await spawnManagedProcess({
100
91
  controllerHome,
101
92
  repoId: repository.repoId,
@@ -135,42 +126,13 @@ try {
135
126
  assert(getControllerSession({ controllerHome, repoId: repository.repoId }, accepted.contract.workId)?.sessionId === 'session-recovery-b', 'replacement Controller session missing');
136
127
  const completionRecordedAt = new Date().toISOString();
137
128
  const completionRevision = String(spawnSync('git', ['-C', repoRoot, 'rev-parse', 'HEAD'], { encoding: 'utf8' }).stdout).trim();
138
- transitionWorkContractPhase({ controllerHome, repoId: repository.repoId }, accepted.contract.workId, {
139
- phase: 'verification',
140
- status: 'running',
141
- state: 'satisfied',
142
- summary: 'Recovered Process completed successfully for the exact no-change candidate.',
143
- });
144
- requestWorkImplementationReview(
145
- { controllerHome, repoId: repository.repoId },
146
- accepted.contract.workId,
147
- 'Recovery smoke verification completed; implementation review is required before completion.',
148
- );
149
- recordWorkImplementationReview({ controllerHome, repoId: repository.repoId }, accepted.contract.workId, {
150
- schemaVersion: 1,
151
- reviewId: `REV-smoke-${accepted.contract.workId}`,
152
- workId: accepted.contract.workId,
153
- reviewerPrincipalId: replacement.principalId ?? replacement.controllerId,
154
- reviewerControllerSessionId: replacement.sessionId,
155
- decision: 'approved',
156
- rationale: 'Recovery smoke reviewed the exact recovered no-change candidate before terminal completion.',
157
- findings: [],
158
- sourceRevision: completionRevision,
159
- workspaceFingerprint: 'runtime-recovery-smoke-no-change-content',
160
- verificationWorkspaceFingerprint: 'runtime-recovery-smoke-no-change-verification',
161
- changedPaths: [],
162
- changedPathDigest: implementationReviewChangedPathDigest([]),
163
- acceptanceCriteriaSummary: 'Managed Process recovery, Controller reclaim, and no-change Work completion remain coherent.',
164
- verificationEvidence: [],
165
- architectureEvidence: [],
166
- recordedAt: completionRecordedAt,
167
- });
129
+ const completionReceiptId = `REC-smoke-${accepted.contract.workId}`;
168
130
  recordWorkCompletionReceipt(
169
131
  { controllerHome, repoId: repository.repoId },
170
132
  accepted.contract.workId,
171
133
  {
172
134
  schemaVersion: 1,
173
- receiptId: `REC-smoke-${accepted.contract.workId}`,
135
+ receiptId: completionReceiptId,
174
136
  source: 'direct_edit',
175
137
  issueId: 'ISS-runtime-recovery-smoke',
176
138
  taskId: 'T1',
@@ -186,7 +148,14 @@ try {
186
148
  'completed_no_change',
187
149
  'completed_no_change',
188
150
  );
189
- assert(getWorkContract({ controllerHome, repoId: repository.repoId }, accepted.contract.workId)?.status === 'completed', 'completed WorkContract was not persisted');
151
+ const delivered = getWorkContract({ controllerHome, repoId: repository.repoId }, accepted.contract.workId);
152
+ assert(delivered?.semanticState !== 'completed', 'delivery receipt must not implicitly complete semantic Work');
153
+ reviseWorkSemanticContext(
154
+ { controllerHome, repoId: repository.repoId },
155
+ accepted.contract.workId,
156
+ { expectedRevision: Number(delivered?.semanticRevision ?? 1), state: 'completed', resultRefs: [`receipt:${completionReceiptId}`] },
157
+ );
158
+ assert(getWorkContract({ controllerHome, repoId: repository.repoId }, accepted.contract.workId)?.semanticState === 'completed', 'explicit semantic Work completion was not persisted');
190
159
  assert(listExecutionJobs(controllerHome, repository.repoId, 20).length === 0, 'runtime recovery created an ExecutionJob');
191
160
 
192
161
  const scheduleInput = {
@@ -71,8 +71,8 @@ try {
71
71
  manualOccurrence?.status === 'skipped'
72
72
  && manualOccurrence.decision === 'operation_blocked'
73
73
  && manualOccurrence.decisionId
74
- && manualOccurrence.handoffId,
75
- 'manual semantic Schedule did not create an external-controller handoff',
74
+ && !manualOccurrence.handoffId,
75
+ 'manual semantic Schedule manufactured a human blocker instead of recording a trigger',
76
76
  );
77
77
  assert(
78
78
  getScheduleDecision(controllerHome, repository.repoId, manualOccurrence.decisionId)?.decision === 'operation_blocked',
@@ -105,7 +105,7 @@ try {
105
105
  { source: 'repository-event', eventName: 'git.push', eventId: 'evt-1' },
106
106
  );
107
107
  assert(eventA?.occurrenceId === eventB?.occurrenceId, 'repository event was not idempotent');
108
- assert(eventA?.handoffId === eventB?.handoffId, 'repository event created duplicate handoffs');
108
+ assert(eventA?.decisionId === eventB?.decisionId, 'repository event created a duplicate occurrence decision');
109
109
 
110
110
  const missingDependency = createSchedule(controllerHome, {
111
111
  ...semanticBase,
@@ -132,8 +132,8 @@ try {
132
132
  assert(
133
133
  conditionOccurrence?.status === 'skipped'
134
134
  && conditionOccurrence.decision === 'operation_blocked'
135
- && conditionOccurrence.handoffId,
136
- 'condition Schedule did not create an external-controller handoff',
135
+ && !conditionOccurrence.handoffId,
136
+ 'condition Schedule manufactured a human blocker instead of recording a trigger',
137
137
  );
138
138
 
139
139
  const cron = createSchedule(controllerHome, {
@@ -143,7 +143,7 @@ try {
143
143
  trigger: { type: 'cron', cronExpression: '* * * * *' },
144
144
  });
145
145
  const cronOccurrence = await evaluateSchedule(controllerHome, cron);
146
- assert(cronOccurrence?.decision === 'operation_blocked' && cronOccurrence.handoffId, 'cron Schedule did not hand off');
146
+ assert(cronOccurrence?.decision === 'operation_blocked' && !cronOccurrence.handoffId, 'cron Schedule did not record a bounded trigger');
147
147
 
148
148
  const calendar = createSchedule(controllerHome, {
149
149
  ...semanticBase,
@@ -153,8 +153,8 @@ try {
153
153
  });
154
154
  const calendarOccurrence = await evaluateSchedule(controllerHome, calendar);
155
155
  assert(
156
- calendarOccurrence?.decision === 'operation_blocked' && calendarOccurrence.handoffId,
157
- 'calendar Schedule did not hand off',
156
+ calendarOccurrence?.decision === 'operation_blocked' && !calendarOccurrence.handoffId,
157
+ 'calendar Schedule did not record a bounded trigger',
158
158
  );
159
159
 
160
160
  const staleJobPath = writeLocalJob('JOB-stale', {
@@ -231,9 +231,9 @@ try {
231
231
  assert(
232
232
  blockedOccurrence?.status === 'skipped'
233
233
  && blockedOccurrence.decision === 'maintenance_not_ready'
234
- && blockedOccurrence.handoffId
234
+ && !blockedOccurrence.handoffId
235
235
  && !blockedOccurrence.jobId,
236
- 'unsafe maintenance candidate did not create a bounded handoff',
236
+ 'retryable maintenance blocker was incorrectly promoted to a human handoff',
237
237
  );
238
238
  assert(readFileSync(brokenJobPath, 'utf8') === brokenBefore, 'blocked maintenance modified an unreadable candidate');
239
239
  const backedOff = getSchedule(controllerHome, repository.repoId, blockedMaintenance.scheduleId);
@@ -243,17 +243,25 @@ try {
243
243
  );
244
244
 
245
245
  const handoffs = listHandoffItems({ controllerHome, repoId: repository.repoId, status: 'all' });
246
- assert(handoffs.length >= 6, 'expected external-controller and maintenance handoffs were not persisted');
246
+ // Semantic Schedule triggers are continuation input, not human blockers. Only
247
+ // a real authorization/judgement boundary may persist a Handoff projection.
248
+ assert(
249
+ !manualOccurrence.handoffId && !conditionOccurrence.handoffId && !cronOccurrence.handoffId && !calendarOccurrence.handoffId,
250
+ 'semantic Schedule triggers manufactured human blockers',
251
+ );
252
+ assert(
253
+ !blockedOccurrence.handoffId && handoffs.length === 0,
254
+ 'retryable mechanical maintenance failure manufactured a human blocker',
255
+ );
247
256
  assert(listExecutionJobs(controllerHome, repository.repoId, 100).length === 0, 'Schedule smoke created an ExecutionJob');
248
257
 
249
258
  console.log(JSON.stringify({
250
259
  status: 'ok',
251
- manualHandoff: manualOccurrence.handoffId,
260
+ manualTriggerRecorded: manualOccurrence.decisionId,
252
261
  repositoryEventIdempotent: eventA?.occurrenceId === eventB?.occurrenceId,
253
262
  missingDependencySuppressed: true,
254
- conditionHandoff: conditionOccurrence.handoffId,
255
- cronHandoff: cronOccurrence.handoffId,
256
- calendarHandoff: calendarOccurrence.handoffId,
263
+ semanticScheduleHandoffs: 0,
264
+ maintenanceMechanicalBlockerHasHandoff: Boolean(blockedOccurrence.handoffId),
257
265
  maintenance: maintenanceOccurrence.status,
258
266
  maintenanceBackoffUntil: backedOff.nextEligibleAt,
259
267
  handoffCount: handoffs.length,
@@ -0,0 +1,223 @@
1
+ import { strict as assert } from 'node:assert';
2
+ import { mkdtempSync, rmSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { createHash } from 'node:crypto';
6
+ import { createMcpHttpSessionRegistry } from '../adapters/mcp/transports/http';
7
+ import { authenticatedFacadeControllerIdentity } from '../adapters/mcp/runtime-gateway/controller-authority-adapter';
8
+ import { readExecutionSession, startExecutionSession } from '../src/runtime/control-plane/execution/session-store';
9
+ import {
10
+ bindControllerSessionBinding,
11
+ claimControllerSession,
12
+ getControllerRoundRelay,
13
+ releaseControllerSession,
14
+ type ControllerHost,
15
+ } from '../packages/kernel/controller/api/index';
16
+ import { createWorkContract } from '../packages/kernel/work/api/index';
17
+ import { upsertProcessControllerBinding } from '../adapters/controller-process/binding-store';
18
+ import { runSchedulerAutonomousContinuationReconciliation } from '../src/runtime/control-plane/global-scheduler/autonomous-continuation';
19
+ import { WorkflowSupervisorControlPlane } from '../supervisor/control-plane';
20
+ import { SUPERVISOR_BLOCK_END, SUPERVISOR_BLOCK_START } from '../supervisor/protocol';
21
+ import { WorkflowSupervisorStore } from '../supervisor/store';
22
+
23
+ const root = mkdtempSync(join(tmpdir(), 'forge-unattended-transport-recovery-'));
24
+ const controllerHome = join(root, 'controller');
25
+ const repoId = 'repo-unattended-recovery';
26
+ const workId = 'work-unattended-recovery';
27
+ const oldTransportSessionId = 'mcp-transport-old';
28
+ const newTransportSessionId = 'mcp-transport-new';
29
+ const principalId = 'chatgpt-controller';
30
+
31
+ const validators = {
32
+ completionContract: async () => ({ valid: true, reason: 'ok' }),
33
+ userBlockerPolicy: async () => ({ valid: true, reason: 'ok' }),
34
+ };
35
+ const supervisor = () => new WorkflowSupervisorControlPlane(new WorkflowSupervisorStore(controllerHome), validators);
36
+
37
+ function block(action: 'CONTINUE' | 'DONE', effectId: string, checkpoint: string, conversationId: string, taskId: string): string {
38
+ return `${SUPERVISOR_BLOCK_START}\n${JSON.stringify({
39
+ action,
40
+ source_effect_id: effectId,
41
+ checkpoint,
42
+ reason: action === 'DONE' ? 'complete' : 'continue',
43
+ evidence: ['unattended-transport-recovery-smoke'],
44
+ conversation_id: conversationId,
45
+ task_id: taskId,
46
+ supervisor_state: action === 'DONE' ? 'done' : 'running',
47
+ active_scope: `goal:${taskId}`,
48
+ })}\n${SUPERVISOR_BLOCK_END}`;
49
+ }
50
+
51
+ try {
52
+ // 1) Durable execution is created independently of an MCP stream.
53
+ startExecutionSession(controllerHome, {
54
+ sessionId: oldTransportSessionId,
55
+ principalId,
56
+ controllerInstanceId: 'runtime-before-restart',
57
+ });
58
+
59
+ let transportCloseCount = 0;
60
+ const registry = createMcpHttpSessionRegistry<
61
+ { close(): void },
62
+ { sessionId: string; controllerHome: string }
63
+ >();
64
+ registry.register({
65
+ sessionId: oldTransportSessionId,
66
+ transport: { close: () => { transportCloseCount += 1; } },
67
+ toolContext: { sessionId: oldTransportSessionId, controllerHome },
68
+ route: '/mcp',
69
+ principalId,
70
+ connectionId: 'connection-before-disconnect',
71
+ clientIdentity: 'chatgpt-client',
72
+ });
73
+ await registry.close(oldTransportSessionId, 'transport_close');
74
+ assert.equal(transportCloseCount, 1);
75
+
76
+ // 2) Transport loss must not invalidate execution authority. Reading through a
77
+ // new runtime instance also exercises restart recovery of the durable session.
78
+ const recoveredExecution = readExecutionSession(controllerHome, {
79
+ sessionId: oldTransportSessionId,
80
+ principalId,
81
+ controllerInstanceId: 'runtime-after-restart',
82
+ });
83
+ assert.ok(recoveredExecution);
84
+ assert.equal(recoveredExecution.controllerInstanceId, 'runtime-after-restart');
85
+ assert.equal(recoveredExecution.invalidatedAt, undefined);
86
+
87
+ // 3) A newly authenticated transport can explicitly carry the prior session
88
+ // only on the bounded rollover path. The new transport remains the request
89
+ // binding; the old session is merely the compatibility authority carrier.
90
+ const rolloverIdentity = authenticatedFacadeControllerIdentity({
91
+ principalId,
92
+ sessionId: newTransportSessionId,
93
+ controllerInstanceId: 'runtime-after-restart',
94
+ controllerType: 'chatgpt',
95
+ } as any, {
96
+ session_id: oldTransportSessionId,
97
+ }, { allowTransportSessionRollover: true });
98
+ assert.equal(rolloverIdentity.sessionId, newTransportSessionId);
99
+ assert.equal(rolloverIdentity.transportSessionId, newTransportSessionId);
100
+ assert.equal(rolloverIdentity.controllerAuthorityId, oldTransportSessionId);
101
+ assert.equal(rolloverIdentity.authorityViaSessionCompatibility, true);
102
+
103
+ // 4) Scheduler liveness owns unattended Work wake-up. Repeated reconciliation
104
+ // of the same durable state must never duplicate provider dispatch.
105
+ createWorkContract({ controllerHome, repoId }, {
106
+ workId,
107
+ repoId,
108
+ objective: 'Continue without manual user wake-ups.',
109
+ acceptanceCriteria: ['The Work resumes from durable authority.'],
110
+ allowedPaths: [],
111
+ forbiddenPaths: [],
112
+ checks: [],
113
+ constraints: {},
114
+ requestedBy: 'chatgpt',
115
+ dispatchState: 'running',
116
+ baseRevision: 'abc123',
117
+ } as Parameters<typeof createWorkContract>[1]);
118
+
119
+ const store = { controllerHome, repoId };
120
+ const controllerAuthorityId = oldTransportSessionId;
121
+ const owner = claimControllerSession(store, {
122
+ workId,
123
+ controllerId: principalId,
124
+ // This section proves the generic retained-provider wake path. ChatGPT is
125
+ // intentionally covered by the Workflow Supervisor section below and must
126
+ // not silently fall back to direct provider dispatch when its daemon is down.
127
+ controllerType: 'claude',
128
+ sessionId: oldTransportSessionId,
129
+ authorityDigest: createHash('sha256').update(controllerAuthorityId).digest('hex'),
130
+ principalId,
131
+ controllerInstanceId: 'runtime-before-restart',
132
+ leaseMs: 60_000,
133
+ });
134
+ const binding = upsertProcessControllerBinding(store, {
135
+ workId,
136
+ sessionId: owner.sessionId,
137
+ controllerType: 'claude',
138
+ executable: 'claude',
139
+ launchArgs: [],
140
+ });
141
+ bindControllerSessionBinding(store, { workId, sessionId: owner.sessionId, binding: binding.binding });
142
+ releaseControllerSession(store, workId, owner.controllerId);
143
+
144
+ let providerDispatches = 0;
145
+ const host: ControllerHost = {
146
+ resume: async () => {
147
+ providerDispatches += 1;
148
+ return { accepted: true, dispatchId: `dispatch-${providerDispatches}` };
149
+ },
150
+ };
151
+ const schedulerInput = {
152
+ controllerHome,
153
+ nowMs: Date.parse('2026-09-22T12:00:00.000Z'),
154
+ repositories: [{ repoId, canonicalRoot: root, localRoot: root }],
155
+ dependencies: {
156
+ authorizeWake: () => undefined,
157
+ boundaryForWork: () => ({ status: 'not_eligible' as const }),
158
+ hostForBinding: () => host,
159
+ },
160
+ };
161
+ const firstWake = await runSchedulerAutonomousContinuationReconciliation(schedulerInput);
162
+ assert.equal(firstWake.dispatched, 1);
163
+ const duplicateWake = await runSchedulerAutonomousContinuationReconciliation(schedulerInput);
164
+ assert.equal(duplicateWake.dispatched, 0);
165
+ assert.equal(providerDispatches, 1);
166
+ assert.equal(getControllerRoundRelay(store, workId)?.status, 'dispatched');
167
+
168
+ // 5) Workflow Supervisor state is durable across process/control-plane
169
+ // reconstruction. Ten CONTINUE rounds publish exactly one successor each, and
170
+ // replaying the same completion never creates a second effect.
171
+ const taskId = 'unattended-transport-recovery-task';
172
+ const conversationId = '77777777-8888-9999-aaaa-bbbbbbbbbbbb';
173
+ const conversationUrl = `https://chatgpt.com/c/${conversationId}`;
174
+ let control = supervisor();
175
+ control.registerTask({
176
+ taskId,
177
+ conversationId,
178
+ conversationUrl,
179
+ objective: 'Continue autonomously across reconnects and runtime restarts.',
180
+ completionContract: {},
181
+ continuationPolicy: { active_scope: `goal:${taskId}` },
182
+ userBlockerPolicy: {},
183
+ });
184
+ let effect = control.reserveEnrollment(taskId);
185
+ control.observeEffect({ effectId: effect.effectId, observationId: 'round-0-applied', outcome: 'applied' });
186
+
187
+ for (let round = 1; round <= 10; round += 1) {
188
+ control = supervisor();
189
+ const response = block('CONTINUE', effect.effectId, `checkpoint-${round}`, conversationId, taskId);
190
+ const advanced = await control.browserObserveAssistant({ conversationId, conversationUrl, responseText: response });
191
+ assert.ok(advanced.successorEffect);
192
+ const replay = await control.browserObserveAssistant({ conversationId, conversationUrl, responseText: response });
193
+ assert.equal(replay.successorEffect?.effectId, advanced.successorEffect.effectId);
194
+ assert.equal(replay.deduplicated, true);
195
+ effect = advanced.successorEffect;
196
+ control.observeEffect({
197
+ effectId: effect.effectId,
198
+ observationId: `round-${round}-applied`,
199
+ outcome: 'applied',
200
+ });
201
+ }
202
+
203
+ control = supervisor();
204
+ const done = await control.browserObserveAssistant({
205
+ conversationId,
206
+ conversationUrl,
207
+ responseText: block('DONE', effect.effectId, 'complete', conversationId, taskId),
208
+ });
209
+ assert.equal(done.terminal, true);
210
+ assert.equal(control.browserTasks().length, 0);
211
+
212
+ console.log(JSON.stringify({
213
+ status: 'ok',
214
+ transportDisconnectedWithoutExecutionInvalidation: true,
215
+ reconnectUsedExplicitRolloverAuthority: true,
216
+ runtimeRestartRecoveredExecution: true,
217
+ schedulerProviderDispatches: providerDispatches,
218
+ unattendedContinuationRounds: 10,
219
+ duplicateSuccessorEffects: 0,
220
+ }, null, 2));
221
+ } finally {
222
+ rmSync(root, { recursive: true, force: true });
223
+ }