@moretea-labs/forge 1.8.0 → 1.8.1

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 (528) hide show
  1. package/AGENTS.md +70 -7
  2. package/CHANGELOG.md +14 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/THIRD_PARTY_NOTICES.md +1 -1
  6. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  7. package/adapters/chatgpt/browser-delivery-runtime.ts +529 -56
  8. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  9. package/adapters/chatgpt/controller-round-host.ts +15 -25
  10. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  11. package/adapters/chatgpt/provider-delivery.ts +228 -1
  12. package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
  13. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  14. package/adapters/computer/chatgpt-target-router.ts +103 -0
  15. package/adapters/computer/chrome-extension/background.js +385 -0
  16. package/adapters/computer/chrome-extension/content.js +378 -0
  17. package/adapters/computer/chrome-extension/core.js +24 -0
  18. package/adapters/computer/chrome-extension/manifest.json +30 -0
  19. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  20. package/adapters/computer/interaction-target-authority.ts +142 -18
  21. package/adapters/mcp/auth.ts +0 -1
  22. package/adapters/mcp/instructions.ts +5 -4
  23. package/adapters/mcp/multi-repository.ts +3 -19
  24. package/adapters/mcp/oauth.ts +73 -0
  25. package/adapters/mcp/paths.ts +4 -1
  26. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  27. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  28. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  29. package/adapters/mcp/runtime-gateway/context-adapter.ts +411 -73
  30. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  31. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  32. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  33. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  34. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  35. package/adapters/mcp/runtime-gateway/execution-tools.ts +8 -42
  36. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  37. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
  38. package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
  39. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  40. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  41. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  42. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  43. package/adapters/mcp/runtime-gateway/router.ts +18 -504
  44. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  45. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
  46. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  47. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
  48. package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
  49. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
  50. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  51. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
  52. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  53. package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
  54. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  55. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  56. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  57. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  58. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  59. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  60. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  61. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  62. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  63. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  64. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  65. package/adapters/mcp/server.ts +67 -23
  66. package/adapters/mcp/setup.ts +1 -3
  67. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
  68. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
  69. package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
  70. package/adapters/mcp/toolset-names.ts +5 -0
  71. package/adapters/mcp/toolset.ts +6 -5
  72. package/adapters/mcp/transports/http-observation.ts +365 -0
  73. package/adapters/mcp/transports/http.ts +154 -677
  74. package/adapters/mcp/transports/oauth-http.ts +322 -0
  75. package/adapters/mcp/transports/session-registry.ts +6 -0
  76. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  77. package/assets/plugin-registry.v1.json +6 -4
  78. package/assets/reference-configs/agentic-development-flow.md +25 -0
  79. package/assets/reference-configs/global-working-rules.md +19 -0
  80. package/assets/skill-version.json +2 -2
  81. package/docs/architecture/CURRENT.md +111 -41
  82. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  83. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  84. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  85. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  86. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  87. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  88. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  89. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  90. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  91. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  92. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  93. package/docs/architecture/domains/verification.md +1 -0
  94. package/docs/architecture/domains/workflow-engine.md +6 -0
  95. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  96. package/docs/forge-plugin-management.md +2 -2
  97. package/docs/operations/controller-performance-and-502.md +17 -0
  98. package/docs/operations/controller-reliability-runbook.md +2 -2
  99. package/docs/operations/features.md +1 -1
  100. package/docs/operations/features.zh-CN.md +1 -1
  101. package/docs/operations/homebrew.md +2 -2
  102. package/docs/operations/mcp-tool-exposure.md +2 -0
  103. package/docs/operations/releasing.md +2 -0
  104. package/docs/operations/standalone-disaster-recovery.md +14 -6
  105. package/docs/wiki/Implementation.md +1 -1
  106. package/package.json +25 -14
  107. package/packages/kernel/cognition/api/index.ts +6 -0
  108. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  109. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  110. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  111. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  112. package/packages/kernel/cognition/domain/learning.ts +106 -0
  113. package/packages/kernel/cognition/domain/memory.ts +254 -0
  114. package/packages/kernel/controller/api/index.ts +1 -0
  115. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  116. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  117. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  118. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  119. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  120. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  121. package/packages/kernel/controller/infrastructure/controller-session-store.ts +297 -71
  122. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  123. package/packages/kernel/identity/api/index.ts +10 -0
  124. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  125. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  126. package/packages/kernel/identity/domain/grant.ts +72 -0
  127. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  128. package/packages/kernel/identity/domain/user-request.ts +93 -0
  129. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  130. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  131. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  132. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  133. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  134. package/packages/kernel/scheduler/api/index.ts +0 -2
  135. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  136. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  137. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  138. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +153 -133
  139. package/packages/kernel/work/api/index.ts +3 -2
  140. package/packages/kernel/work/application/work-service.ts +17 -42
  141. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  142. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  143. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  144. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  145. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  146. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  147. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  148. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  149. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  150. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  151. package/packages/kernel/work/domain/state-machine.ts +25 -63
  152. package/packages/kernel/work/domain/types.ts +57 -51
  153. package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
  154. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  155. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  156. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  157. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  158. package/packages/plugin-runtime/computer/index.ts +2 -0
  159. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  160. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  161. package/packages/protocols/computer/contract.ts +27 -1
  162. package/scripts/activate-source-baseline.ts +7 -9
  163. package/scripts/canary-controller-semantic-wait.ts +12 -24
  164. package/scripts/check-mcp-compatibility.ts +48 -136
  165. package/scripts/check-runtime-architecture.mjs +622 -217
  166. package/scripts/forge-local-recovery-helper.mjs +93 -15
  167. package/scripts/lib/project-init-lib.sh +3 -0
  168. package/scripts/open-source-audit-allowlist.txt +1 -2
  169. package/scripts/run-bounded-command.mjs +5 -0
  170. package/scripts/run-governed-gate.ts +0 -1
  171. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  172. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  173. package/scripts/smoke-mcp-http-runtime.ts +5 -0
  174. package/scripts/smoke-runtime-recovery.ts +12 -43
  175. package/scripts/smoke-schedule-engine.ts +23 -15
  176. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  177. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  178. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  179. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  180. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  181. package/scripts/smoke-workflow-supervisor.ts +103 -0
  182. package/scripts/verify-forge-runtime.sh +2 -1
  183. package/src/cli/agent-jobs/executor-health.ts +11 -34
  184. package/src/cli/agent-jobs/integration.ts +18 -49
  185. package/src/cli/agent-jobs/job-manager.ts +7 -3
  186. package/src/cli/commands/brain-assistant.ts +27 -13
  187. package/src/cli/commands/brain.ts +13 -15
  188. package/src/cli/commands/chatgpt.ts +1 -163
  189. package/src/cli/commands/recovery.ts +135 -121
  190. package/src/cli/commands/runtime.ts +3 -3
  191. package/src/cli/commands/setup-profile.ts +8 -0
  192. package/src/cli/controller/check-runner.ts +13 -2
  193. package/src/cli/controller/completion-backlog.ts +3 -3
  194. package/src/cli/controller/completion-orchestrator.ts +4 -43
  195. package/src/cli/controller/completion-target.ts +3 -72
  196. package/src/cli/controller/context/source-materializer.ts +81 -100
  197. package/src/cli/controller/context-pack.ts +10 -8
  198. package/src/cli/controller/execution-completion.ts +4 -7
  199. package/src/cli/controller/execution-policy.ts +36 -153
  200. package/src/cli/controller/governance.ts +2 -3
  201. package/src/cli/controller/issue-store.ts +4 -99
  202. package/src/cli/controller/launch-agents.ts +59 -18
  203. package/src/cli/controller/operational-plan.ts +24 -51
  204. package/src/cli/controller/runtime-config.ts +5 -1
  205. package/src/cli/controller/stuck-state-migration.ts +2 -3
  206. package/src/cli/controller/systemd-user.ts +39 -1
  207. package/src/cli/editing/edit-session.ts +1 -7
  208. package/src/cli/local-bridge/console-automations.ts +18 -13
  209. package/src/cli/local-bridge/console-view-models.ts +3 -12
  210. package/src/cli/local-bridge/facade-api.ts +64 -191
  211. package/src/cli/local-bridge/server.ts +24 -147
  212. package/src/cli/local-bridge/types.ts +0 -1
  213. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  214. package/src/cli/repositories/command-executor.ts +29 -23
  215. package/src/cli/repositories/command-scope.ts +35 -16
  216. package/src/cli/repositories/controller-home.ts +48 -0
  217. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  218. package/src/cli/repositories/git-command-executor.ts +2 -2
  219. package/src/cli/repositories/registry.ts +77 -11
  220. package/src/cli/repositories/structured-git.ts +62 -2
  221. package/src/cli/repository/session-cache.ts +92 -6
  222. package/src/runtime/context/assistant-context.ts +20 -7
  223. package/src/runtime/context/assistant-work-context.ts +89 -27
  224. package/src/runtime/context/automatic-learning.ts +565 -0
  225. package/src/runtime/context/cognitive-attention.ts +173 -0
  226. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  227. package/src/runtime/context/context-closure.ts +46 -9
  228. package/src/runtime/context/context-pack-process.ts +103 -0
  229. package/src/runtime/context/context-plane.ts +1 -9
  230. package/src/runtime/context/direct-controller-learning.ts +298 -0
  231. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  232. package/src/runtime/context/semantic-navigation.ts +6 -34
  233. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  234. package/src/runtime/context/typescript-navigation.ts +89 -3
  235. package/src/runtime/control-plane/cleanup-artifact-retention.ts +212 -9
  236. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  237. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  238. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  239. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  240. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  241. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  242. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  243. package/src/runtime/control-plane/execution/validation.ts +6 -8
  244. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  245. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  246. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  247. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  248. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  249. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  250. package/src/runtime/control-plane/execution/work-handle-authority.ts +188 -109
  251. package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
  252. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  253. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  254. package/src/runtime/control-plane/execution/work-operation-service.ts +43 -27
  255. package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
  256. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  257. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  258. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +173 -186
  259. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
  260. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  261. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
  262. package/src/runtime/control-plane/facade/capability-registry.ts +362 -37
  263. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  264. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  265. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  266. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  267. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  268. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  269. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  270. package/src/runtime/control-plane/facade/index.ts +0 -1
  271. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  272. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  273. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  274. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  275. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  276. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  277. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  278. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  279. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  280. package/src/runtime/control-plane/facade/types.ts +49 -108
  281. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  282. package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
  283. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  284. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  285. package/src/runtime/control-plane/global-scheduler/maintenance.ts +239 -112
  286. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
  287. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  288. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  289. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  290. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  291. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  292. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -300
  293. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  294. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  295. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  296. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  297. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  298. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  299. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  300. package/src/runtime/control-plane/release-retention.ts +135 -47
  301. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  302. package/src/runtime/control-plane/runtime-cleanup.ts +290 -21
  303. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  304. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  305. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  306. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  307. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  308. package/src/runtime/evidence/artifact-store.ts +158 -40
  309. package/src/runtime/evidence/evidence-store.ts +112 -8
  310. package/src/runtime/evidence/output-handle-index.ts +225 -0
  311. package/src/runtime/evidence/result-store.ts +158 -44
  312. package/src/runtime/execution/jobs/store.ts +3 -4
  313. package/src/runtime/execution/managed-workspace.ts +57 -0
  314. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  315. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  316. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  317. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  318. package/src/runtime/execution/process-runtime/command-facade.ts +79 -27
  319. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  320. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  321. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  322. package/src/runtime/execution/process-runtime/index.ts +3 -0
  323. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  324. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  325. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  326. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  327. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  328. package/src/runtime/execution/process-runtime/runtime.ts +35 -2
  329. package/src/runtime/execution/process-runtime/store.ts +30 -2
  330. package/src/runtime/execution/process-runtime/types.ts +6 -1
  331. package/src/runtime/execution/workers/executor.ts +2 -6
  332. package/src/runtime/platform/service-inventory.ts +130 -0
  333. package/src/runtime/platform/service-manager.ts +8 -0
  334. package/src/runtime/plugins/action-application.ts +85 -28
  335. package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
  336. package/src/runtime/plugins/browser-adapter.ts +757 -34
  337. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  338. package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
  339. package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
  340. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  341. package/src/runtime/plugins/browser-registration.ts +16 -0
  342. package/src/runtime/plugins/browser-runtime.ts +14 -1
  343. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  344. package/src/runtime/plugins/browser-session-store.ts +46 -76
  345. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  346. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  347. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  348. package/src/runtime/plugins/computer-registration.ts +222 -11
  349. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  350. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  351. package/src/runtime/plugins/external-adapter.ts +42 -6
  352. package/src/runtime/plugins/external-registration.ts +21 -1
  353. package/src/runtime/plugins/gmail-adapter.ts +23 -2
  354. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  355. package/src/runtime/plugins/google-shared.ts +14 -7
  356. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  357. package/src/runtime/plugins/ios-adapter.ts +1 -1
  358. package/src/runtime/plugins/lightweight-action.ts +208 -2
  359. package/src/runtime/plugins/local-system-adapter.ts +12 -2
  360. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  361. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  362. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  363. package/src/runtime/plugins/store.ts +602 -428
  364. package/src/runtime/plugins/types.ts +20 -0
  365. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  366. package/src/runtime/projections/invalidation.ts +7 -3
  367. package/src/runtime/projections/materialized-view.ts +80 -36
  368. package/src/runtime/recovery/actions.ts +3 -3
  369. package/src/runtime/recovery/capability-action-application.ts +46 -45
  370. package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
  371. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  372. package/src/runtime/recovery/store.ts +29 -11
  373. package/src/runtime/release/release-coordinator.ts +296 -0
  374. package/src/runtime/release/release-session.ts +716 -0
  375. package/src/runtime/release/release-state-migration.ts +25 -0
  376. package/src/runtime/resources/leases/store.ts +56 -25
  377. package/src/runtime/root/computer-composition.ts +191 -6
  378. package/src/runtime/root/controller-progression-composition.ts +192 -0
  379. package/src/runtime/root/controller-round-composition.ts +20 -1
  380. package/src/runtime/root/deployment-topology.ts +106 -0
  381. package/src/runtime/root/entry.ts +4 -3
  382. package/src/runtime/root/known-good-recovery.ts +184 -0
  383. package/src/runtime/root/local-bridge.ts +0 -1
  384. package/src/runtime/root/mcp-transport.ts +111 -18
  385. package/src/runtime/root/ownership.ts +261 -9
  386. package/src/runtime/root/package-connector-service.ts +105 -19
  387. package/src/runtime/root/package-runtime-release.ts +117 -18
  388. package/src/runtime/root/package-runtime-service.ts +17 -11
  389. package/src/runtime/root/release-execution-canary.ts +44 -12
  390. package/src/runtime/root/release-loader.ts +90 -8
  391. package/src/runtime/root/release-manifest.ts +80 -6
  392. package/src/runtime/root/release-materialize.ts +372 -28
  393. package/src/runtime/root/release-store.ts +395 -36
  394. package/src/runtime/root/runtime-lane.ts +191 -0
  395. package/src/runtime/root/runtime.ts +159 -27
  396. package/src/runtime/root/scheduled-controller-composition.ts +28 -3
  397. package/src/runtime/root/service-runner.ts +2 -2
  398. package/src/runtime/root/service.ts +36 -33
  399. package/src/runtime/root/status.ts +48 -0
  400. package/src/runtime/root/types.ts +32 -3
  401. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  402. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  403. package/src/runtime/root/write-fence.ts +50 -2
  404. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  405. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  406. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  407. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  408. package/src/runtime/shared/process-environment.ts +20 -9
  409. package/src/runtime/shared/response-budget.ts +1 -3
  410. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  411. package/src/runtime/standalone-recovery/core.ts +3702 -342
  412. package/src/runtime/standalone-recovery/entry.ts +469 -39
  413. package/src/runtime/standalone-recovery/installer.ts +262 -148
  414. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  415. package/src/runtime/standalone-recovery/operation-lock.ts +1 -1
  416. package/src/runtime/standalone-recovery/performance.ts +54 -16
  417. package/src/runtime/standalone-recovery/release.ts +53 -5
  418. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  419. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  420. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  421. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +10 -3
  422. package/src/runtime/workflow/schedules/engine.ts +138 -172
  423. package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
  424. package/src/runtime/workflows/runtime.ts +15 -19
  425. package/src/testing/test-governance.ts +5 -1
  426. package/supervisor/chatgpt-conversation.ts +23 -0
  427. package/supervisor/client.ts +201 -0
  428. package/supervisor/control-plane.ts +868 -0
  429. package/supervisor/entry.ts +15 -0
  430. package/supervisor/forge-validators.ts +80 -0
  431. package/supervisor/index.ts +5 -0
  432. package/supervisor/native-browser-adapter.ts +786 -0
  433. package/supervisor/native-messaging/host.ts +39 -0
  434. package/supervisor/native-messaging/manifest.ts +26 -0
  435. package/supervisor/native-messaging/protocol.ts +27 -0
  436. package/supervisor/paths.ts +18 -0
  437. package/supervisor/protocol.ts +202 -0
  438. package/supervisor/server.ts +404 -0
  439. package/supervisor/store.ts +1451 -0
  440. package/supervisor/tsconfig.json +8 -0
  441. package/supervisor/types.ts +255 -0
  442. package/adapters/chatgpt/controller-host.ts +0 -119
  443. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  444. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  445. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  446. package/packages/kernel/progression/api/index.ts +0 -2
  447. package/packages/kernel/progression/application/projector.ts +0 -211
  448. package/packages/kernel/progression/domain/types.ts +0 -116
  449. package/packages/kernel/progression/index.ts +0 -1
  450. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  451. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  452. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  453. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  454. package/scripts/benchmark-background-check-overlap.ts +0 -228
  455. package/scripts/benchmark-computer-hotpath.ts +0 -255
  456. package/scripts/benchmark-controller-hotpath.ts +0 -212
  457. package/scripts/benchmark-controller-round2.ts +0 -191
  458. package/scripts/benchmark-ios-agent-device.ts +0 -511
  459. package/scripts/benchmark-mcp-host.sh +0 -117
  460. package/scripts/benchmark-mcp-transport.ts +0 -169
  461. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  462. package/scripts/benchmark-operational-shadow.ts +0 -28
  463. package/scripts/benchmark-quality-harness.ts +0 -146
  464. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  465. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  466. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  467. package/scripts/benchmark-thin-harness.ts +0 -251
  468. package/scripts/benchmark-typescript-navigation.ts +0 -186
  469. package/scripts/benchmark-work-efficiency.ts +0 -334
  470. package/scripts/build-controller-ui.ts +0 -28
  471. package/scripts/check-npm-release.sh +0 -32
  472. package/scripts/check-public-release-surface.sh +0 -19
  473. package/scripts/check-release-published.sh +0 -57
  474. package/scripts/check-release-readiness.sh +0 -37
  475. package/scripts/check-release-version.mjs +0 -74
  476. package/scripts/check-tarball-install-smoke.sh +0 -150
  477. package/scripts/package-source-archive.sh +0 -147
  478. package/scripts/public-release-files.txt +0 -39
  479. package/scripts/public-release.ts +0 -174
  480. package/scripts/publish-release-tarball.sh +0 -27
  481. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  482. package/scripts/stage-runtime-release.ts +0 -44
  483. package/src/cli/controller/progress.ts +0 -656
  484. package/src/cli/controller/work-mode.ts +0 -181
  485. package/src/cli/local-bridge/console-assets.ts +0 -17
  486. package/src/cli/local-bridge/dashboard.ts +0 -17
  487. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  488. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  489. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  490. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  491. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  492. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  493. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  494. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  495. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  496. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  497. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  498. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  499. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  500. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  501. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  502. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  503. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  504. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  505. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  506. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  507. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  508. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  509. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  510. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  511. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  512. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  513. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  514. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  515. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  516. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  517. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  518. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  519. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  520. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  521. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  522. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  523. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  524. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  525. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  526. package/src/runtime/control-plane/routing/index.ts +0 -1
  527. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  528. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -19,6 +19,7 @@ import { callExecutionTool } from './runtime-gateway/execution-tools';
19
19
  import { callProcessTool } from './runtime-gateway/process-tools';
20
20
  import { injectDurableCommandFields, isGatewayIsolatedTool, routeDurableMcpCall } from './runtime-gateway/router';
21
21
  import { controllerExposureSnapshot, isControllerToolExposed } from './toolset';
22
+ import { settleCognitionAfterTool } from './runtime-gateway/cognition-settlement';
22
23
  import { randomUUID } from 'crypto';
23
24
  import { readFileSync } from 'fs';
24
25
  import { join } from 'path';
@@ -28,6 +29,7 @@ import { getRuntimeWriteClaim } from '../../src/runtime/root/write-fence';
28
29
  import { recordMcpIncident, recordMcpTiming, type McpTimingTrace } from '../../src/runtime/diagnostics/mcp-timing';
29
30
  import { maybeRegisterMcpIncidentRepair } from '../../src/runtime/diagnostics/incident-repair';
30
31
  import { FORGE_VERSION, forgeToolSurfaceFingerprint } from '../../src/cli/controller/runtime-config';
32
+ import { RUNTIME_MCP_CUTOVER_OUTCOME_UNKNOWN } from '../../src/runtime/root/mcp-transport';
31
33
 
32
34
  export type { McpServerOptions } from './multi-repository';
33
35
  export { buildMultiRepositoryToolDefinitions, callMultiRepositoryTool } from './multi-repository';
@@ -45,9 +47,11 @@ function isMultiRepositoryContext(ctx: ServerToolContext): ctx is MultiRepositor
45
47
  return 'controllerHome' in ctx;
46
48
  }
47
49
 
48
- function recordRequestId(args: Record<string, unknown>, rpcId: string | number | undefined): string {
50
+ function recordRequestId(args: Record<string, unknown>, _rpcId: string | number | undefined): string {
49
51
  const explicit = typeof args.request_id === 'string' ? args.request_id.trim() : '';
50
- return explicit || `mcp-rpc:${rpcId === undefined ? randomUUID() : String(rpcId)}`;
52
+ // Transport RPC ids are connection-local correlation only. They are not a
53
+ // semantic idempotency authority and may be recycled across unrelated calls.
54
+ return explicit || `mcp-call:${randomUUID()}`;
51
55
  }
52
56
 
53
57
  function firstTimingString(...values: unknown[]): string | undefined {
@@ -208,6 +212,7 @@ async function traceControllerMcpRequest(
208
212
  ...(rpcId === undefined ? {} : { rpcId }),
209
213
  layer: ctx.runtimeSourceRoot ? 'canonical_runtime' : 'public_gateway',
210
214
  startedAt: startedAtWall,
215
+ ...(ctx.hostConversationSessionId?.trim() ? { hostConversationSessionId: ctx.hostConversationSessionId.trim() } : {}),
211
216
  outcome,
212
217
  ...(errorCode ? { errorCode } : {}),
213
218
  ...executionIdentity,
@@ -414,6 +419,7 @@ interface CanonicalRuntimeForwardingIdentity {
414
419
  principalId?: string;
415
420
  sessionId?: string;
416
421
  controllerType?: ForwardedControllerType;
422
+ hostConversationSessionId?: string;
417
423
  }
418
424
 
419
425
  function boundedForwardedIdentity(value: unknown): string | undefined {
@@ -422,18 +428,26 @@ function boundedForwardedIdentity(value: unknown): string | undefined {
422
428
  return normalized ? normalized.slice(0, 512) : undefined;
423
429
  }
424
430
 
431
+ /** ChatGPT supplies this as an anonymized same-conversation correlation fact. It is not an auth token or URL. */
432
+ export function chatgptHostSessionIdFromMcpMeta(meta: unknown): string | undefined {
433
+ if (!meta || typeof meta !== 'object' || Array.isArray(meta)) return undefined;
434
+ return boundedForwardedIdentity((meta as Record<string, unknown>)['openai/session']);
435
+ }
436
+
425
437
  export function canonicalRuntimeForwardingIdentity(meta: unknown): CanonicalRuntimeForwardingIdentity {
426
438
  if (!meta || typeof meta !== 'object' || Array.isArray(meta)) return {};
427
439
  const envelope = (meta as Record<string, unknown>)[CANONICAL_RUNTIME_FORWARD_META_KEY];
428
440
  if (!envelope || typeof envelope !== 'object' || Array.isArray(envelope)) return {};
429
441
  const record = envelope as Record<string, unknown>;
430
442
  const controllerType = boundedForwardedIdentity(record.controllerType);
443
+ const hostConversationSessionId = boundedForwardedIdentity(record.hostConversationSessionId);
431
444
  return {
432
445
  principalId: boundedForwardedIdentity(record.principalId),
433
446
  sessionId: boundedForwardedIdentity(record.sessionId),
434
447
  ...(controllerType && ['chatgpt', 'codex', 'claude', 'grok', 'human'].includes(controllerType)
435
448
  ? { controllerType: controllerType as ForwardedControllerType }
436
449
  : {}),
450
+ ...(hostConversationSessionId ? { hostConversationSessionId } : {}),
437
451
  };
438
452
  }
439
453
 
@@ -443,18 +457,27 @@ function canonicalRuntimeForwardingMeta(ctx: MultiRepositoryMcpToolContext): Rec
443
457
  ...(ctx.principalId?.trim() ? { principalId: ctx.principalId.trim() } : {}),
444
458
  ...(ctx.sessionId?.trim() ? { sessionId: ctx.sessionId.trim() } : {}),
445
459
  ...(ctx.controllerType ? { controllerType: ctx.controllerType } : {}),
460
+ ...(ctx.hostConversationSessionId?.trim() ? { hostConversationSessionId: ctx.hostConversationSessionId.trim() } : {}),
446
461
  },
447
462
  };
448
463
  }
449
464
 
450
465
  function canonicalRuntimeRequestContext(baseContext: ServerToolContext, meta: unknown): ServerToolContext {
451
- if (!isMultiRepositoryContext(baseContext) || !baseContext.runtimeSourceRoot) return baseContext;
466
+ if (!isMultiRepositoryContext(baseContext)) return baseContext;
467
+ // Host metadata is request-scoped correlation only. The public Gateway carries
468
+ // it through its private forwarding envelope so Canonical Runtime does not lose
469
+ // the ChatGPT conversation scope during the proxy hop.
470
+ const hostConversationSessionId = chatgptHostSessionIdFromMcpMeta(meta);
471
+ if (!baseContext.runtimeSourceRoot) {
472
+ return hostConversationSessionId ? { ...baseContext, hostConversationSessionId } : baseContext;
473
+ }
452
474
  const forwarded = canonicalRuntimeForwardingIdentity(meta);
453
475
  return {
454
476
  ...baseContext,
455
477
  ...(forwarded.principalId ? { principalId: forwarded.principalId } : {}),
456
478
  ...(forwarded.sessionId ? { sessionId: forwarded.sessionId } : {}),
457
479
  ...(forwarded.controllerType ? { controllerType: forwarded.controllerType } : {}),
480
+ ...(forwarded.hostConversationSessionId ? { hostConversationSessionId: forwarded.hostConversationSessionId } : {}),
458
481
  };
459
482
  }
460
483
 
@@ -490,6 +513,20 @@ export function canonicalRuntimeToolCallIsReplaySafe(name: string, args: Record<
490
513
  return Boolean(workId && requestId);
491
514
  }
492
515
 
516
+ export function canonicalRuntimeToolCallFailureIsCutoverOutcomeUnknown(error: unknown): boolean {
517
+ if (!error || typeof error !== 'object') return false;
518
+ const record = error as { code?: unknown; message?: unknown; data?: unknown };
519
+ const message = typeof record.message === 'string' ? record.message : '';
520
+ if (SdkHttpError.isInstance(error)) {
521
+ return error.status === 409 && (
522
+ message.includes(RUNTIME_MCP_CUTOVER_OUTCOME_UNKNOWN)
523
+ || message.toLowerCase().includes('runtime cutover outcome unknown')
524
+ || JSON.stringify(record.data ?? '').includes(RUNTIME_MCP_CUTOVER_OUTCOME_UNKNOWN)
525
+ );
526
+ }
527
+ return record.code === -32000 && message === RUNTIME_MCP_CUTOVER_OUTCOME_UNKNOWN;
528
+ }
529
+
493
530
  export function canonicalRuntimeToolCallFailureIsTransient(error: unknown): boolean {
494
531
  if (SdkHttpError.isInstance(error)) return error.status === 404;
495
532
  if (SdkError.isInstance(error)) {
@@ -516,6 +553,9 @@ export async function callCanonicalRuntimeToolWithReplay<T>(input: {
516
553
  try {
517
554
  return await input.call();
518
555
  } catch (error) {
556
+ if (canonicalRuntimeToolCallFailureIsCutoverOutcomeUnknown(error)) {
557
+ throw new Error(`${RUNTIME_MCP_CUTOVER_OUTCOME_UNKNOWN}: Canonical Runtime entered cutover after request admission; reconcile the original request/effect identity before retrying.`);
558
+ }
519
559
  if (!canonicalRuntimeToolCallIsReplaySafe(input.name, input.args)
520
560
  || !canonicalRuntimeToolCallFailureIsTransient(error)) {
521
561
  throw error;
@@ -1013,29 +1053,33 @@ export function createForgeMcpServerFromContext(
1013
1053
  // Gateway processes from acquiring Process Runtime leases or evaluating
1014
1054
  // Runtime source coherence against their own checkout.
1015
1055
  if (!getRuntimeWriteClaim()) {
1016
- const forwardedArgs = typeof args.request_id === 'string' && args.request_id.trim()
1017
- ? args
1018
- : { ...args, request_id: requestId };
1056
+ // Keep trace correlation separate from Tool Contract idempotency. Only
1057
+ // a caller-supplied request_id may authorize semantic replay/dedup.
1058
+ const forwardedArgs = args;
1019
1059
  if (runtimeProxy && runtimeSchema) return runtimeProxy.callTool(ctx, name, forwardedArgs, phaseTimings);
1020
1060
  if (runtimeProxy && observeRuntimeStatus(ctx.controllerHome).ready) return runtimeProxy.callTool(ctx, name, forwardedArgs, phaseTimings);
1021
1061
  }
1022
- const accessResult = callAccessTool(ctx, name, args);
1023
- if (accessResult) return accessResult;
1024
- const executionResult = await callExecutionTool(ctx, name, args);
1025
- if (executionResult) return executionResult;
1026
- const processResult = await callProcessTool(ctx, name, args);
1027
- if (processResult) return processResult;
1028
- if (isGatewayIsolatedTool(name)) {
1029
- const isolatedResult = await routeDurableMcpCall(ctx, name, args, { allowReadOnly: true, forceDurable: true });
1030
- if (isolatedResult) return isolatedResult;
1031
- }
1032
- const runtimeResult = await callRuntimeTool(ctx, name, args);
1033
- if (runtimeResult) return runtimeResult;
1034
- const durableResult = await routeDurableMcpCall(ctx, name, args);
1035
- if (durableResult) return durableResult;
1036
- const repositoryResult = await callRepositoryToolWithPostFinalizeAttribution(ctx.controllerHome, name, args, ctx);
1037
- if (repositoryResult) return repositoryResult;
1038
- return callMultiRepositoryTool(ctx, name, args);
1062
+ const executeLocalTool = async (): Promise<CallToolResult> => {
1063
+ const accessResult = callAccessTool(ctx, name, args);
1064
+ if (accessResult) return accessResult;
1065
+ const executionResult = await callExecutionTool(ctx, name, args);
1066
+ if (executionResult) return executionResult;
1067
+ const processResult = await callProcessTool(ctx, name, args);
1068
+ if (processResult) return processResult;
1069
+ if (isGatewayIsolatedTool(name)) {
1070
+ const isolatedResult = await routeDurableMcpCall(ctx, name, args, { allowReadOnly: true, forceDurable: true });
1071
+ if (isolatedResult) return isolatedResult;
1072
+ }
1073
+ const runtimeResult = await callRuntimeTool(ctx, name, args);
1074
+ if (runtimeResult) return runtimeResult;
1075
+ const durableResult = await routeDurableMcpCall(ctx, name, args);
1076
+ if (durableResult) return durableResult;
1077
+ const repositoryResult = await callRepositoryToolWithPostFinalizeAttribution(ctx.controllerHome, name, args, ctx);
1078
+ if (repositoryResult) return repositoryResult;
1079
+ return await callMultiRepositoryTool(ctx, name, args);
1080
+ };
1081
+ const localResult = await executeLocalTool();
1082
+ return settleCognitionAfterTool(ctx, name, args, localResult) ?? localResult;
1039
1083
  });
1040
1084
  }
1041
1085
  return callMcpTool(ctx, name, args);
@@ -419,11 +419,10 @@ export function runMcpSetupChatgpt(opts: {
419
419
  enabled: false,
420
420
  host: existingConfig?.localController?.host ?? "127.0.0.1",
421
421
  port: localControllerPort,
422
- autoOpen: false,
423
422
  mode: "disabled",
424
423
  }
425
424
  : {
426
- ...(existingConfig?.localController ?? { enabled: true, host: "127.0.0.1", autoOpen: false }),
425
+ ...(existingConfig?.localController ?? { enabled: true, host: "127.0.0.1" }),
427
426
  port: localControllerPort,
428
427
  },
429
428
  devMode: {
@@ -701,7 +700,6 @@ export function runMcpDoctor(opts: {
701
700
  enabled: localConfig?.localController?.enabled ?? true,
702
701
  host: localConfig?.localController?.host ?? "127.0.0.1",
703
702
  port: localConfig?.localController?.port ?? 8766,
704
- autoOpen: localConfig?.localController?.autoOpen ?? false,
705
703
  },
706
704
  devMode: {
707
705
  agentRunner: localConfig?.devMode?.agentRunner === true,
@@ -68,30 +68,23 @@ import {
68
68
  updateTask,
69
69
  } from "../../../src/cli/controller/issue-store";
70
70
  import { applyMigratedIssueDecision } from '../../../src/cli/controller/migrated-issue-decision';
71
- import { legacyIssueAuthorityRetired } from '../../../src/cli/controller/legacy-issue-cutover';
72
71
  import {
73
72
  listControllerChecks,
74
73
  } from "../../../src/cli/controller/check-runner";
75
74
  import { normalizeCheckIds } from '../../../src/runtime/control-plane/facade/check-normalization';
76
75
  import { buildExecutionDiagnostics, buildRequirementBoard } from '../../../src/runtime/control-plane/facade/requirement-board';
77
- import { acceptVerifiedTaskFromControllerWork } from '../../../src/runtime/control-plane/execution/work-task-receipt';
78
76
  import { getWorkContract } from '../../../packages/kernel/work/api';
79
77
  import { admitDirectEditWorkContract } from '../../../src/runtime/control-plane/facade/repository-work-admission';
80
- import { decideRoute } from '../../../src/runtime/control-plane/routing/route-policy';
81
78
  import { listCapabilityDescriptors, summarizeCapabilityGroups } from '../../../src/runtime/control-plane/facade/capability-registry';
82
79
  import {
83
- getControllerTimeline,
84
- getProjectProgress,
85
- getTaskProgressDetail,
86
- getTaskProgressReadView,
87
- } from "../../../src/cli/controller/progress";
88
- import { exportControllerWorklog, parseWorklogCategory } from "../../../src/cli/controller/worklog";
80
+ exportControllerWorklog,
81
+ listControllerWorklogEvents,
82
+ parseWorklogCategory,
83
+ } from "../../../src/cli/controller/worklog";
89
84
  import { inspectProjectGovernance, reconcileProjectGovernance } from "../../../src/cli/controller/governance";
90
- import { assessWorkMode, parseExplicitTaskMode } from "../../../src/cli/controller/work-mode";
91
85
  import { taskExecutionPolicy } from "../../../src/cli/controller/execution-policy";
92
86
  import { finishEditSession, finishTaskRun } from "../../../src/cli/controller/completion-orchestrator";
93
87
  import { buildControllerTaskLedgerProjection } from "../../../src/cli/controller/task-ledger";
94
- import { buildControllerContextPack } from "../../../src/cli/controller/context-pack";
95
88
  import { loadControllerProjectState, saveControllerProjectState } from "../../../src/cli/controller/project-state";
96
89
  import {
97
90
  FORGE_MCP_SCHEMA_VERSION,
@@ -179,6 +172,8 @@ export interface McpToolContext {
179
172
  principalId?: string;
180
173
  /** Authenticated transport controller/provider type. */
181
174
  controllerType?: 'chatgpt' | 'codex' | 'claude' | 'grok' | 'human';
175
+ /** Host-provided ChatGPT session correlation. Never authorization and never a canonical conversation URL. */
176
+ hostConversationSessionId?: string;
182
177
  controllerInstanceId?: string;
183
178
  /** Bound repository identity for session cache keys. */
184
179
  repoId?: string;
@@ -737,10 +732,7 @@ function taskExecutorHealth(
737
732
  githubRepo?: string,
738
733
  ): ExecutorHealth | null {
739
734
  if (agent === "github-copilot") {
740
- return classifyGitHubCopilotPreflight(
741
- getGitHubStatus(ctx.repoRoot, githubRepo),
742
- task,
743
- );
735
+ return classifyGitHubCopilotPreflight(getGitHubStatus(ctx.repoRoot, githubRepo));
744
736
  }
745
737
  return classifyLocalExecutorHealth(
746
738
  agent,
@@ -748,7 +740,6 @@ function taskExecutorHealth(
748
740
  agentRunner: ctx.policy.execution.agentRunner,
749
741
  allowedAgents: ctx.policy.execution.allowedAgents,
750
742
  },
751
- task,
752
743
  );
753
744
  }
754
745
 
@@ -1575,18 +1566,12 @@ export function buildMcpToolDefinitions(
1575
1566
  {
1576
1567
  name: "controller_context",
1577
1568
  description:
1578
- "Return one compact controller start-work context: Git status, current Issue focus, active Runs and Jobs, recommended execution mode, and available checks.",
1569
+ "Return one compact controller start-work context: Git status, current Issue focus, active Runs and Jobs, and available checks.",
1579
1570
  inputSchema: {
1580
1571
  type: "object",
1581
1572
  properties: {
1582
1573
  description: { type: "string" },
1583
- mode: { type: "string", enum: ["direct", "plan", "debug", "review", "release", "scale", "-direct", "-plan", "-debug", "-review", "-release", "-scale"] },
1584
1574
  known_paths: { type: "array", items: { type: "string" } },
1585
- expected_files: { type: "number" },
1586
- expected_changed_lines: { type: "number" },
1587
- requires_investigation: { type: "boolean" },
1588
- requires_parallelism: { type: "boolean" },
1589
- requires_long_running_checks: { type: "boolean" },
1590
1575
  needs_dependencies: { type: "boolean" },
1591
1576
  risk: { type: "string", enum: ["readonly", "low", "medium", "high", "destructive"] },
1592
1577
  },
@@ -1784,13 +1769,6 @@ export function buildMcpToolDefinitions(
1784
1769
  },
1785
1770
  annotations: readOnly,
1786
1771
  },
1787
- {
1788
- name: "get_project_progress",
1789
- description:
1790
- "Return evidence-gate completion, effective status, blockers, throughput, current-focus progress, and attention items without lifecycle-percentage estimates.",
1791
- inputSchema: EMPTY_SCHEMA,
1792
- annotations: readOnly,
1793
- },
1794
1772
  {
1795
1773
  name: "get_project_governance",
1796
1774
  description:
@@ -1844,22 +1822,6 @@ export function buildMcpToolDefinitions(
1844
1822
  },
1845
1823
  annotations: write,
1846
1824
  },
1847
- {
1848
- name: "get_task_progress_detail",
1849
- description:
1850
- "Return one Task with effective progress, bounded Run and timeline summaries by default, and full detail on demand.",
1851
- inputSchema: {
1852
- type: "object",
1853
- properties: {
1854
- issue_id: { type: "string" },
1855
- task_id: { type: "string" },
1856
- detail_level: { type: "string", enum: ["summary", "full"] },
1857
- },
1858
- required: ["issue_id", "task_id"],
1859
- additionalProperties: false,
1860
- },
1861
- annotations: readOnly,
1862
- },
1863
1825
  {
1864
1826
  name: "get_worklog_timeline",
1865
1827
  description:
@@ -2045,29 +2007,6 @@ export function buildMcpToolDefinitions(
2045
2007
  },
2046
2008
  annotations: readOnly,
2047
2009
  },
2048
- {
2049
- name: "assess_work_request",
2050
- description:
2051
- "Choose direct_edit, quick_agent, or issue_task before creating work. Prefer repository search plus bounded direct edits for low/medium-risk changes, even when exact files need discovery; use an Agent only when direct patches are not safe or practical.",
2052
- inputSchema: {
2053
- type: "object",
2054
- properties: {
2055
- description: { type: "string" },
2056
- mode: { type: "string", enum: ["direct", "plan", "debug", "review", "release", "scale", "-direct", "-plan", "-debug", "-review", "-release", "-scale"] },
2057
- known_paths: { type: "array", items: { type: "string" } },
2058
- expected_files: { type: "number" },
2059
- expected_changed_lines: { type: "number" },
2060
- requires_investigation: { type: "boolean" },
2061
- requires_parallelism: { type: "boolean" },
2062
- requires_long_running_checks: { type: "boolean" },
2063
- needs_dependencies: { type: "boolean" },
2064
- risk: { type: "string", enum: ["readonly", "low", "medium", "high", "destructive"] },
2065
- },
2066
- required: ["description"],
2067
- additionalProperties: false,
2068
- },
2069
- annotations: readOnly,
2070
- },
2071
2010
  {
2072
2011
  name: "create_issue",
2073
2012
  description:
@@ -2403,7 +2342,7 @@ export function buildMcpToolDefinitions(
2403
2342
  {
2404
2343
  name: "integrate_task_run",
2405
2344
  description:
2406
- "Integrate one reviewed isolated Task Run into the main working tree through a rollback-capable edit session.",
2345
+ "Explicitly integrate one completed isolated Task Run into this dispatch checkout through a rollback-capable edit session.",
2407
2346
  inputSchema: {
2408
2347
  type: "object",
2409
2348
  properties: { run_id: { type: "string" } },
@@ -2821,7 +2760,7 @@ export function buildMcpToolDefinitions(
2821
2760
  },
2822
2761
  );
2823
2762
  }
2824
- return tools;
2763
+ return tools.filter((tool) => !RETIRED_LEGACY_PUBLIC_TOOLS.has(tool.name));
2825
2764
  }
2826
2765
 
2827
2766
  export function controllerExpectedToolNames(
@@ -2835,24 +2774,48 @@ export function controllerExpectedToolNames(
2835
2774
  return [...DEFAULT_CONTROLLER_TOOL_NAMES];
2836
2775
  }
2837
2776
 
2838
- const RETIRED_LEGACY_MUTATION_TOOLS = new Set([
2777
+ const RETIRED_LEGACY_PUBLIC_TOOLS = new Set([
2778
+ "list_issues",
2779
+ "get_project_board",
2780
+ "get_project_governance",
2839
2781
  "reconcile_project_governance",
2782
+ "get_project_state",
2840
2783
  "set_current_issue",
2841
2784
  "archive_issue",
2842
2785
  "restore_issue",
2786
+ "get_issue",
2843
2787
  "publish_issue_to_github",
2844
2788
  "refresh_github_issue",
2845
2789
  "close_github_issue",
2790
+ "inspect_issue_readiness",
2791
+ "inspect_task_readiness",
2846
2792
  "prepare_issue_launch",
2847
2793
  "create_issue",
2794
+ "update_issue",
2848
2795
  "plan_issue",
2849
2796
  "append_task",
2850
2797
  "split_task",
2851
2798
  "supersede_task",
2852
2799
  "set_task_dependencies",
2853
2800
  "update_task",
2801
+ "dispatch_task",
2802
+ "launch_issue",
2803
+ "dispatch_ready_tasks",
2804
+ "get_task_run",
2805
+ "get_task_run_events",
2806
+ "get_task_run_log",
2807
+ "get_task_diff",
2808
+ "integrate_task_run",
2809
+ "finish_task_run",
2810
+ "list_task_runs",
2811
+ "cancel_task_run",
2812
+ "retry_task_run",
2813
+ "verify_task",
2814
+ "accept_task",
2815
+ "request_task_changes",
2854
2816
  "record_task_verification",
2855
2817
  "accept_verified_task",
2818
+ "finish_edit_session",
2856
2819
  ]);
2857
2820
 
2858
2821
  export async function callMcpTool(
@@ -2861,12 +2824,9 @@ export async function callMcpTool(
2861
2824
  args: Record<string, unknown> = {},
2862
2825
  ): Promise<CallToolResult> {
2863
2826
  try {
2864
- if (RETIRED_LEGACY_MUTATION_TOOLS.has(name) && legacyIssueAuthorityRetired(ctx.repoRoot)) {
2827
+ if (RETIRED_LEGACY_PUBLIC_TOOLS.has(name)) {
2865
2828
  audit(ctx, name, "blocked", args);
2866
- return errorResult(
2867
- "LEGACY_CONTROL_PLANE_MUTATION_RETIRED",
2868
- `${name} cannot mutate frozen Issue/Task/currentIssue/project-board compatibility files after SQLite cutover. Use Requirement, Plan and Work APIs.`,
2869
- );
2829
+ return errorResult("UNKNOWN_TOOL", `unknown tool: ${name}`);
2870
2830
  }
2871
2831
  switch (name) {
2872
2832
  case "harness_status": {
@@ -3202,30 +3162,6 @@ export async function callMcpTool(
3202
3162
  timeoutMs: check.timeoutMs,
3203
3163
  source: check.source,
3204
3164
  }));
3205
- const assessment = assessWorkMode({
3206
- description: typeof args.description === "string" && args.description.trim()
3207
- ? String(args.description)
3208
- : "Inspect the selected repository context.",
3209
- knownPaths: stringList(args.known_paths),
3210
- expectedFiles: typeof args.expected_files === "number" ? args.expected_files : undefined,
3211
- expectedChangedLines: typeof args.expected_changed_lines === "number" ? args.expected_changed_lines : undefined,
3212
- requiresInvestigation: args.requires_investigation === true,
3213
- requiresParallelism: args.requires_parallelism === true,
3214
- requiresLongRunningChecks: args.requires_long_running_checks === true,
3215
- needsDependencies: args.needs_dependencies === true,
3216
- risk: typeof args.risk === "string" ? args.risk as TaskRisk : undefined,
3217
- explicitMode: parseExplicitTaskMode(args.mode)
3218
- ?? (typeof args.description === "string" && args.description.trim() ? undefined : "direct"),
3219
- });
3220
- const modeContextPack = assessment.modeBehavior.structuralContext === "required"
3221
- ? buildControllerContextPack(ctx.repoRoot, ctx.policy, {
3222
- description: typeof args.description === "string" ? args.description : undefined,
3223
- knownPaths: stringList(args.known_paths),
3224
- structuralContext: "required",
3225
- maxFiles: 8,
3226
- maxSnippets: 20,
3227
- })
3228
- : undefined;
3229
3165
  const payload = {
3230
3166
  git: gitSnapshot(ctx.repoRoot),
3231
3167
  requirementBoard,
@@ -3260,8 +3196,6 @@ export async function callMcpTool(
3260
3196
  })),
3261
3197
  },
3262
3198
  checks,
3263
- recommendedExecution: assessment,
3264
- ...(modeContextPack ? { modeContextPack } : {}),
3265
3199
  };
3266
3200
  audit(ctx, name, "ok", args);
3267
3201
  return textResult(payload);
@@ -3525,13 +3459,6 @@ export async function callMcpTool(
3525
3459
  response.responseMeta.structuredPayloadBytes = Buffer.byteLength(JSON.stringify(response), "utf8");
3526
3460
  return textResult(response);
3527
3461
  }
3528
- case "get_project_progress": {
3529
- if (ctx.policy.profile !== "controller")
3530
- return errorResult("TOOL_DISABLED", "get_project_progress requires the controller profile");
3531
- const progress = getProjectProgress(ctx.repoRoot);
3532
- audit(ctx, name, "ok", args);
3533
- return textResult(progress);
3534
- }
3535
3462
  case "get_project_governance": {
3536
3463
  if (ctx.policy.profile !== "controller")
3537
3464
  return errorResult("TOOL_DISABLED", "get_project_governance requires the controller profile");
@@ -3577,22 +3504,10 @@ export async function callMcpTool(
3577
3504
  audit(ctx, name, "ok", args, `tasks/issues/${issue.id}`);
3578
3505
  return textResult(projectIssueEffectiveView(ctx.repoRoot, issue));
3579
3506
  }
3580
- case "get_task_progress_detail": {
3581
- if (ctx.policy.profile !== "controller")
3582
- return errorResult("TOOL_DISABLED", "get_task_progress_detail requires the controller profile");
3583
- const result = getTaskProgressReadView(
3584
- ctx.repoRoot,
3585
- String(args.issue_id ?? ""),
3586
- String(args.task_id ?? ""),
3587
- args.detail_level === "full" ? "full" : "summary",
3588
- );
3589
- audit(ctx, name, "ok", args, `tasks/issues/${result.issue.id}`);
3590
- return textResult(result);
3591
- }
3592
3507
  case "get_worklog_timeline": {
3593
3508
  if (ctx.policy.profile !== "controller")
3594
3509
  return errorResult("TOOL_DISABLED", "get_worklog_timeline requires the controller profile");
3595
- const events = getControllerTimeline(ctx.repoRoot, {
3510
+ const events = listControllerWorklogEvents(ctx.repoRoot, {
3596
3511
  category: parseWorklogCategory(args.category),
3597
3512
  issueId: typeof args.issue_id === "string" ? args.issue_id : undefined,
3598
3513
  taskId: typeof args.task_id === "string" ? args.task_id : undefined,
@@ -3826,24 +3741,6 @@ export async function callMcpTool(
3826
3741
  );
3827
3742
  return textResult(preview);
3828
3743
  }
3829
- case "assess_work_request": {
3830
- if (ctx.policy.profile !== "controller")
3831
- return errorResult("TOOL_DISABLED", "assess_work_request requires the controller profile");
3832
- const assessment = assessWorkMode({
3833
- description: String(args.description ?? ""),
3834
- knownPaths: stringList(args.known_paths),
3835
- expectedFiles: typeof args.expected_files === "number" ? args.expected_files : undefined,
3836
- expectedChangedLines: typeof args.expected_changed_lines === "number" ? args.expected_changed_lines : undefined,
3837
- requiresInvestigation: args.requires_investigation === true,
3838
- requiresParallelism: args.requires_parallelism === true,
3839
- requiresLongRunningChecks: args.requires_long_running_checks === true,
3840
- needsDependencies: args.needs_dependencies === true,
3841
- risk: typeof args.risk === "string" ? args.risk as TaskRisk : undefined,
3842
- explicitMode: parseExplicitTaskMode(args.mode),
3843
- });
3844
- audit(ctx, name, "ok", args);
3845
- return textResult(assessment);
3846
- }
3847
3744
  case "create_issue": {
3848
3745
  if (ctx.policy.profile !== "controller")
3849
3746
  return errorResult(
@@ -4427,18 +4324,12 @@ export async function callMcpTool(
4427
4324
  if (!task) return errorResult("TASK_NOT_FOUND", `task not found: ${issueId}/${taskId}`);
4428
4325
  if (task.status === "done") return textResult(projectIssueEffectiveView(ctx.repoRoot, current));
4429
4326
  if (task.status !== "verified" || !task.verification) return errorResult("TASK_NOT_VERIFIED", `task has not passed its risk-adaptive verification requirements (current: ${task.status})`);
4430
- const workId = typeof args.work_id === "string" ? args.work_id.trim() : "";
4431
- const issue = workId
4432
- ? acceptVerifiedTaskFromControllerWork({
4433
- controllerHome: resolveRepoPreferredControllerHome(ctx.repoRoot),
4434
- repoId: ctx.repoId ?? String(args.repo_id ?? "").trim(),
4435
- repoRoot: ctx.repoRoot,
4436
- issueId,
4437
- taskId,
4438
- workId,
4439
- note: typeof args.note === "string" ? args.note : undefined,
4440
- }).issue
4441
- : acceptVerifiedTask(ctx.repoRoot, issueId, taskId, typeof args.note === "string" ? args.note : "Accepted after required verification evidence.");
4327
+ const issue = acceptVerifiedTask(
4328
+ ctx.repoRoot,
4329
+ issueId,
4330
+ taskId,
4331
+ typeof args.note === "string" ? args.note : "Accepted after required verification evidence.",
4332
+ );
4442
4333
  audit(ctx, name, "ok", args, `tasks/issues/${issue.id}`);
4443
4334
  return textResult(projectIssueEffectiveView(ctx.repoRoot, issue));
4444
4335
  }
@@ -4487,19 +4378,6 @@ export async function callMcpTool(
4487
4378
  const checks = stringList(args.checks);
4488
4379
  const git = gitSnapshot(ctx.repoRoot);
4489
4380
  const workspaceIdentity = createHash("sha256").update(JSON.stringify(git)).digest("hex");
4490
- const routeDecision = decideRoute({
4491
- intent: {
4492
- objective: purpose,
4493
- scopeClear: allowedPaths.length > 0,
4494
- mutation: true,
4495
- expectedFiles: typeof args.max_files === "number" ? args.max_files : allowedPaths.length,
4496
- expectedChangedLines: typeof args.max_changed_lines === "number" ? args.max_changed_lines : undefined,
4497
- },
4498
- workspace: { knownPaths: allowedPaths, checkoutId: identity.checkoutId, fingerprint: workspaceIdentity },
4499
- policy: { risk: "local_repo_write", approvalConfirmed: true },
4500
- capabilities: {},
4501
- recovery: {},
4502
- });
4503
4381
  const requestedWorkId = typeof args.work_id === "string" ? args.work_id.trim() : "";
4504
4382
  const workId = requestedWorkId || `work-direct-${createHash("sha256").update(`${repoId}\0${purpose}\0${Date.now()}`).digest("hex").slice(0, 16)}`;
4505
4383
  const workStore = { controllerHome, repoId };
@@ -4514,7 +4392,6 @@ export async function callMcpTool(
4514
4392
  controllerInstanceId: identity.controllerInstanceId,
4515
4393
  baseRevision: git.head ?? undefined,
4516
4394
  workspaceFingerprint: workspaceIdentity,
4517
- routeDecision,
4518
4395
  objective: purpose,
4519
4396
  issueId: typeof args.issue_id === "string" ? args.issue_id : undefined,
4520
4397
  taskId: typeof args.task_id === "string" ? args.task_id : undefined,
@@ -4546,7 +4423,6 @@ export async function callMcpTool(
4546
4423
  checkoutId: identity.checkoutId,
4547
4424
  principalId: identity.principalId,
4548
4425
  controllerInstanceId: identity.controllerInstanceId,
4549
- routeDecisionFingerprint: routeDecision.inputFingerprint,
4550
4426
  },
4551
4427
  });
4552
4428
  audit(
@@ -4585,7 +4461,6 @@ export async function callMcpTool(
4585
4461
  checkoutId: identity.checkoutId,
4586
4462
  principalId: identity.principalId,
4587
4463
  controllerInstanceId: identity.controllerInstanceId,
4588
- routeDecisionFingerprint: current.routeDecisionFingerprint,
4589
4464
  },
4590
4465
  },
4591
4466
  );
@@ -4705,7 +4580,6 @@ export async function callMcpTool(
4705
4580
  checkoutId: identity.checkoutId,
4706
4581
  principalId: identity.principalId,
4707
4582
  controllerInstanceId: identity.controllerInstanceId,
4708
- routeDecisionFingerprint: current.routeDecisionFingerprint,
4709
4583
  },
4710
4584
  },
4711
4585
  );
@@ -1,8 +1,7 @@
1
1
  import { classifyRepositoryCommand } from '../../../src/cli/repositories/command-classifier';
2
2
  import { resolveRepositorySelection } from '../../../src/cli/repositories/registry';
3
3
  import { executionIdentityForRepository } from '../../../src/runtime/control-plane/execution/execution-identity';
4
- import { getWorkContract } from '../../../packages/kernel/work/api';
5
- import { isTerminalWorkContractStatus } from '../../../src/runtime/control-plane/facade/types';
4
+ import { getWorkContract, semanticWorkState } from '../../../packages/kernel/work/api';
6
5
  import {
7
6
  classifyRepositoryCommandRoute,
8
7
  executeRepositoryCommandViaProcessRuntime,
@@ -69,10 +68,7 @@ export async function callPostFinalizeWorkReadOnlyCommand(
69
68
  const work = getWorkContract({ controllerHome, repoId: repository.repoId }, requestedWorkId);
70
69
  if (
71
70
  !work
72
- || !isTerminalWorkContractStatus(work.status)
73
- || work.status !== 'completed'
74
- || !work.completionReceipt
75
- || work.completionReceipt.workId !== requestedWorkId
71
+ || semanticWorkState(work) !== 'completed'
76
72
  || !work.principalId?.trim()
77
73
  || work.principalId.trim() !== principalId
78
74
  ) {
@@ -110,7 +106,7 @@ export async function callPostFinalizeWorkReadOnlyCommand(
110
106
  repoId: repository.repoId,
111
107
  checkoutId: repository.activeCheckoutId,
112
108
  workId: requestedWorkId,
113
- lifecycleClosed: true,
109
+ semanticWorkState: 'completed',
114
110
  error: {
115
111
  code: 'POST_FINALIZE_READONLY_ROUTE_MISMATCH',
116
112
  message: 'Post-finalize Work attribution may execute only through the bounded readonly direct lane.',
@@ -127,9 +123,8 @@ export async function callPostFinalizeWorkReadOnlyCommand(
127
123
  repoId: repository.repoId,
128
124
  checkoutId: repository.activeCheckoutId,
129
125
  workId: requestedWorkId,
130
- lifecycleClosed: true,
126
+ semanticWorkState: 'completed',
131
127
  postFinalizeAttribution: 'readonly_followup',
132
- completed: true,
133
128
  ok: execution.ok === true,
134
129
  exitCode: execution.exitCode,
135
130
  stdout: execution.stdout,