@moretea-labs/forge 1.6.0 → 1.7.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 (469) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +39 -0
  3. package/CLAUDE.md +4 -0
  4. package/README.md +2 -2
  5. package/README.zh-CN.md +1 -1
  6. package/SKILL.md +2 -2
  7. package/THIRD_PARTY_NOTICES.md +1 -1
  8. package/agents/openai.yaml +1 -1
  9. package/assets/hooks/hook-input.sh +11 -8
  10. package/assets/hooks/lib/session-state.sh +10 -7
  11. package/assets/hooks/lib/workflow-state.sh +13 -177
  12. package/assets/hooks/post-tool-observer.sh +8 -2
  13. package/assets/hooks/prompt-guard.sh +5 -81
  14. package/assets/hooks/session-start-context.sh +56 -1
  15. package/assets/partials/05-workflow.partial.md +1 -1
  16. package/assets/partials-agents/02-operating-mode.partial.md +2 -0
  17. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  18. package/assets/plugin-registry.v1.json +3 -3
  19. package/assets/reference-configs/document-generation.md +1 -1
  20. package/assets/reference-configs/harness-overview.md +1 -1
  21. package/assets/reference-configs/sprint-contracts.md +3 -3
  22. package/assets/skill-version.json +2 -2
  23. package/assets/templates/contract.template.md +2 -7
  24. package/assets/templates/helpers/capture-plan.sh +2 -2
  25. package/assets/templates/helpers/check-architecture-sync.sh +17 -0
  26. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  27. package/assets/templates/helpers/contract-worktree.sh +1 -21
  28. package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
  29. package/assets/templates/helpers/inspect-project-state.ts +8 -6
  30. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  31. package/assets/templates/helpers/migrate-workflow-docs.ts +9 -7
  32. package/assets/templates/helpers/new-plan.sh +1 -1
  33. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  34. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  35. package/assets/templates/helpers/verify-contract.sh +1 -111
  36. package/assets/templates/helpers/verify-sprint.sh +3 -180
  37. package/assets/templates/helpers/workflow-contract.ts +5 -1
  38. package/assets/templates/plan.template.md +1 -1
  39. package/assets/templates/review.template.md +9 -34
  40. package/assets/workflow-contract.v1.json +10 -19
  41. package/docs/README.md +10 -10
  42. package/docs/architecture/CURRENT.md +178 -0
  43. package/docs/architecture/EVOLUTION.md +42 -0
  44. package/docs/architecture/current/README.md +4 -156
  45. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  46. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  47. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  48. package/docs/architecture/history/README.md +7 -0
  49. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  50. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  51. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  52. package/docs/architecture/history.md +3 -34
  53. package/docs/architecture/index.md +15 -98
  54. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  55. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  56. package/docs/architecture/versions/1.6.md +38 -0
  57. package/docs/architecture/versions/1.7.md +41 -0
  58. package/docs/forge-chatgpt-browser-engine.md +2 -2
  59. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  60. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  61. package/docs/forge-github-issue-launcher.md +1 -1
  62. package/docs/forge-plugin-management.md +1 -1
  63. package/docs/forge-runtime-self-healing-loop.md +1 -1
  64. package/docs/operations/controller-browser-plugin.md +26 -6
  65. package/docs/operations/controller-performance-and-502.md +143 -0
  66. package/docs/operations/controller-reliability-runbook.md +1 -1
  67. package/docs/operations/features.md +2 -2
  68. package/docs/operations/github-repository.md +1 -1
  69. package/docs/operations/homebrew.md +2 -2
  70. package/docs/operations/mcp-tool-exposure.md +5 -3
  71. package/docs/wiki/Architecture.md +6 -6
  72. package/docs/wiki/Implementation.md +2 -2
  73. package/docs/wiki/Integrations.md +2 -2
  74. package/docs/wiki/Work-Lifecycle.md +1 -1
  75. package/package.json +33 -11
  76. package/scripts/activate-source-baseline.ts +17 -13
  77. package/scripts/architecture-event.ts +2 -820
  78. package/scripts/architecture-queue.sh +2 -645
  79. package/scripts/archive-architecture-request.sh +2 -242
  80. package/scripts/archive-workflow.sh +1 -291
  81. package/scripts/benchmark-background-check-overlap.ts +228 -0
  82. package/scripts/benchmark-mcp-host.sh +117 -0
  83. package/scripts/benchmark-mcp-transport.ts +170 -0
  84. package/scripts/benchmark-quality-harness.ts +146 -0
  85. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  86. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  87. package/scripts/benchmark-typescript-navigation.ts +186 -0
  88. package/scripts/benchmark-work-efficiency.ts +334 -0
  89. package/scripts/capability-config.ts +2 -392
  90. package/scripts/capability-resolver.ts +2 -503
  91. package/scripts/capture-plan.sh +1 -332
  92. package/scripts/check-agent-tooling.sh +2 -1558
  93. package/scripts/check-architecture-sync.sh +2 -371
  94. package/scripts/check-brain-manifest.sh +2 -253
  95. package/scripts/check-context-files.sh +2 -47
  96. package/scripts/check-deploy-sql-order.sh +2 -115
  97. package/scripts/check-mcp-compatibility.ts +14 -0
  98. package/scripts/check-runtime-architecture.mjs +349 -79
  99. package/scripts/check-skill-version.ts +3 -191
  100. package/scripts/check-source-duplication.mjs +61 -0
  101. package/scripts/check-stable-baseline.ts +92 -0
  102. package/scripts/check-task-sync.sh +2 -63
  103. package/scripts/check-task-workflow.sh +2 -1000
  104. package/scripts/codex-handoff-resume.sh +2 -267
  105. package/scripts/context-contract-sync.sh +2 -514
  106. package/scripts/contract-run.ts +2 -463
  107. package/scripts/contract-worktree.sh +1 -722
  108. package/scripts/ensure-task-workflow.sh +1 -1225
  109. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  110. package/scripts/inspect-project-state.ts +4 -279
  111. package/scripts/install-standalone-recovery.ts +24 -0
  112. package/scripts/lib/project-init-lib.sh +22 -46
  113. package/scripts/lib/run-forge-helper.sh +19 -0
  114. package/scripts/lib/run-forge-helper.ts +26 -0
  115. package/scripts/migrate-project-template.sh +1 -1189
  116. package/scripts/migrate-workflow-docs.ts +4 -412
  117. package/scripts/new-plan.sh +1 -180
  118. package/scripts/new-spec.sh +1 -47
  119. package/scripts/new-sprint.sh +1 -46
  120. package/scripts/plan-to-todo.sh +1 -796
  121. package/scripts/prepare-codex-handoff.sh +2 -201
  122. package/scripts/prepare-handoff.sh +1 -78
  123. package/scripts/refresh-current-status.sh +2 -467
  124. package/scripts/run-governed-gate.ts +5 -1
  125. package/scripts/select-agent-context-blocks.sh +2 -64
  126. package/scripts/ship-worktrees.sh +1 -558
  127. package/scripts/smoke-ios-physical-device.ts +4 -2
  128. package/scripts/smoke-runtime-recovery.ts +1 -35
  129. package/scripts/smoke-schedule-engine.ts +1 -20
  130. package/scripts/sprint-backlog.sh +1 -834
  131. package/scripts/stage-runtime-release.ts +2 -1
  132. package/scripts/summarize-failures.sh +2 -123
  133. package/scripts/switch-plan.sh +1 -150
  134. package/scripts/sync-brain-docs.sh +2 -379
  135. package/scripts/sync-generated-authority.mjs +175 -0
  136. package/scripts/verify-contract.sh +2 -703
  137. package/scripts/verify-forge-runtime.sh +0 -1
  138. package/scripts/verify-sprint.sh +1 -677
  139. package/scripts/workflow-contract.ts +4 -205
  140. package/scripts/workstream-sync.sh +2 -261
  141. package/src/cli/agent-jobs/executor-health.ts +1 -1
  142. package/src/cli/commands/init-hook.ts +3 -3
  143. package/src/cli/commands/mcp.ts +9 -5
  144. package/src/cli/commands/plugin.ts +12 -3
  145. package/src/cli/commands/recovery.ts +25 -3
  146. package/src/cli/commands/runtime.ts +55 -3
  147. package/src/cli/commands/security.ts +12 -1
  148. package/src/cli/commands/setup-profile.ts +31 -21
  149. package/src/cli/controller/check-runner.ts +113 -5
  150. package/src/cli/controller/composite-result.ts +1 -1
  151. package/src/cli/controller/context/focus.ts +51 -0
  152. package/src/cli/controller/context/instruction-context.ts +114 -0
  153. package/src/cli/controller/context/known-paths.ts +76 -0
  154. package/src/cli/controller/context/query-planning.ts +110 -0
  155. package/src/cli/controller/context/rule-resolution.ts +532 -0
  156. package/src/cli/controller/context/source-materializer.ts +278 -0
  157. package/src/cli/controller/context/structural.ts +16 -0
  158. package/src/cli/controller/context/types.ts +286 -0
  159. package/src/cli/controller/context-pack.ts +828 -487
  160. package/src/cli/controller/launch-agents.ts +77 -2
  161. package/src/cli/controller/operational-plan.ts +2 -2
  162. package/src/cli/controller/work-mode.ts +6 -4
  163. package/src/cli/editing/edit-session.ts +60 -7
  164. package/src/cli/github/contracts.ts +16 -0
  165. package/src/cli/github/github.ts +135 -16
  166. package/src/cli/github/session.ts +2 -1
  167. package/src/cli/installer/managed-entries.ts +15 -1
  168. package/src/cli/local-bridge/console-automations.ts +54 -78
  169. package/src/cli/local-bridge/console-view-models.ts +1 -35
  170. package/src/cli/local-bridge/facade-api.ts +37 -264
  171. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  172. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
  173. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  174. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
  175. package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
  176. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  177. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
  178. package/src/cli/local-bridge/frontend/src/styles.css +1 -1
  179. package/src/cli/local-bridge/frontend/src/types.ts +5 -8
  180. package/src/cli/local-bridge/job-store.ts +1 -490
  181. package/src/cli/local-bridge/server.ts +2 -515
  182. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  183. package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
  184. package/src/cli/mcp/auth.ts +5 -5
  185. package/src/cli/mcp/instructions.ts +3 -2
  186. package/src/cli/mcp/legacy-tool-service.ts +10 -222
  187. package/src/cli/mcp/multi-repository.ts +16 -5
  188. package/src/cli/mcp/oauth.ts +175 -26
  189. package/src/cli/mcp/post-finalize-work-attribution.ts +150 -0
  190. package/src/cli/mcp/repository-tools.ts +282 -146
  191. package/src/cli/mcp/server.ts +586 -116
  192. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  193. package/src/cli/mcp/tool-contract.ts +14 -0
  194. package/src/cli/mcp/toolset-selection.ts +1 -1
  195. package/src/cli/mcp/toolset.ts +44 -7
  196. package/src/cli/mcp/transports/http.ts +124 -14
  197. package/src/cli/mcp/transports/session-registry.ts +43 -5
  198. package/src/cli/mcp/types.ts +3 -3
  199. package/src/cli/repositories/command-classifier.ts +103 -21
  200. package/src/cli/repositories/command-executor.ts +78 -526
  201. package/src/cli/repositories/command-process.ts +108 -0
  202. package/src/cli/repositories/command-scope.ts +99 -41
  203. package/src/cli/repositories/controller-home.ts +7 -8
  204. package/src/cli/repositories/git-command-executor.ts +2 -0
  205. package/src/cli/repositories/locks.ts +53 -16
  206. package/src/cli/repositories/repository-snapshot.ts +124 -0
  207. package/src/cli/repositories/selected-path-actions.ts +17 -9
  208. package/src/cli/repositories/structured-git.ts +118 -6
  209. package/src/cli/repository/inspector.ts +563 -65
  210. package/src/cli/repository/session-cache.ts +58 -17
  211. package/src/cli/v81-entry.ts +1 -4
  212. package/src/effects/fs-transaction.ts +85 -17
  213. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  214. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  215. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  216. package/src/runtime/context/lsp-client.ts +283 -0
  217. package/src/runtime/context/semantic-navigation-contract.ts +61 -0
  218. package/src/runtime/context/semantic-navigation.ts +223 -0
  219. package/src/runtime/context/swift-navigation.ts +565 -0
  220. package/src/runtime/context/typescript-navigation.ts +226 -0
  221. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  222. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +48 -16
  223. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  224. package/src/runtime/control-plane/execution/repository-work-attribution.ts +106 -0
  225. package/src/runtime/control-plane/execution/retained-work-resume.ts +203 -0
  226. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  227. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  228. package/src/runtime/control-plane/execution/work-completion-authority.ts +58 -0
  229. package/src/runtime/control-plane/execution/work-evidence-policy.ts +200 -0
  230. package/src/runtime/control-plane/execution/work-execution-support.ts +386 -0
  231. package/src/runtime/control-plane/execution/work-finalization-service.ts +1913 -0
  232. package/src/runtime/control-plane/execution/work-handle-authority.ts +96 -0
  233. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  234. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  235. package/src/runtime/control-plane/execution/work-operation-service.ts +468 -0
  236. package/src/runtime/control-plane/execution/work-path-scope.ts +37 -0
  237. package/src/runtime/control-plane/execution/work-preparation-service.ts +479 -0
  238. package/src/runtime/control-plane/execution/work-process-evidence.ts +129 -0
  239. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  240. package/src/runtime/control-plane/execution/work-task-receipt.ts +22 -18
  241. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +156 -11
  242. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
  243. package/src/runtime/control-plane/execution/work-verification-context.ts +56 -0
  244. package/src/runtime/control-plane/execution/work-verification-service.ts +388 -0
  245. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +90 -9
  246. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  247. package/src/runtime/control-plane/facade/controller-round-relay.ts +1118 -0
  248. package/src/runtime/control-plane/facade/controller-session-store.ts +302 -12
  249. package/src/runtime/control-plane/facade/goal-workloop-access.ts +17 -1
  250. package/src/runtime/control-plane/facade/goal-workloop.ts +928 -190
  251. package/src/runtime/control-plane/facade/index.ts +3 -0
  252. package/src/runtime/control-plane/facade/plan-contract-store.ts +275 -42
  253. package/src/runtime/control-plane/facade/repository-work-admission.ts +147 -0
  254. package/src/runtime/control-plane/facade/requirement-authority.ts +83 -0
  255. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  256. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  257. package/src/runtime/control-plane/facade/types.ts +90 -10
  258. package/src/runtime/control-plane/facade/work-contract-store.ts +157 -261
  259. package/src/runtime/control-plane/facade/work-state-machine.ts +250 -0
  260. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  261. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  262. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  263. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  264. package/src/runtime/control-plane/global-scheduler/maintenance.ts +152 -0
  265. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  266. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  267. package/src/runtime/control-plane/global-scheduler/scheduler.ts +278 -543
  268. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  269. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  270. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  271. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  272. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  273. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  274. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  275. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  276. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  277. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  278. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +63 -0
  279. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +365 -117
  280. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +89 -0
  281. package/src/runtime/control-plane/launcher/thin-launcher.ts +244 -11
  282. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  283. package/src/runtime/control-plane/persistence/requirement-store.ts +0 -12
  284. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  285. package/src/runtime/control-plane/release-retention.ts +62 -2
  286. package/src/runtime/control-plane/repo-actor/registry.ts +4 -2
  287. package/src/runtime/control-plane/routing/route-policy.ts +24 -21
  288. package/src/runtime/control-plane/routing/workspace-admission.ts +70 -0
  289. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  290. package/src/runtime/diagnostics/mcp-timing.ts +13 -0
  291. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  292. package/src/runtime/diagnostics/performance.ts +24 -1
  293. package/src/runtime/evidence/event-ledger.ts +1 -1
  294. package/src/runtime/evidence/process-check-execution.ts +18 -0
  295. package/src/runtime/execution/jobs/child-reference.ts +6 -2
  296. package/src/runtime/execution/jobs/store.ts +58 -4
  297. package/src/runtime/execution/jobs/types.ts +1 -1
  298. package/src/runtime/execution/managed-workspace.ts +203 -1
  299. package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
  300. package/src/runtime/execution/process-runtime/check-result.ts +88 -0
  301. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +7 -1
  302. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  303. package/src/runtime/execution/process-runtime/command-facade.ts +367 -40
  304. package/src/runtime/execution/process-runtime/gc.ts +38 -6
  305. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1201 -0
  306. package/src/runtime/execution/process-runtime/persisted-check.ts +51 -5
  307. package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
  308. package/src/runtime/execution/process-runtime/runtime.ts +53 -3
  309. package/src/runtime/execution/process-runtime/store.ts +1 -0
  310. package/src/runtime/execution/process-runtime/types.ts +4 -12
  311. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  312. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  313. package/src/runtime/execution/work-activity.ts +21 -0
  314. package/src/runtime/execution/workers/executor.ts +18 -61
  315. package/src/runtime/gateway/mcp/execution-tools.ts +35 -1852
  316. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +61 -0
  317. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  318. package/src/runtime/gateway/mcp/router.ts +186 -84
  319. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +565 -0
  320. package/src/runtime/gateway/mcp/runtime-tools.ts +2378 -1947
  321. package/src/runtime/plugins/app-store-connect-adapter.ts +216 -47
  322. package/src/runtime/plugins/browser-adapter.ts +2662 -829
  323. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  324. package/src/runtime/plugins/browser-handoff-host.ts +2 -25
  325. package/src/runtime/plugins/browser-handoff.ts +110 -5
  326. package/src/runtime/plugins/browser-macos-bridge.ts +701 -63
  327. package/src/runtime/plugins/browser-manifest-surface.ts +603 -0
  328. package/src/runtime/plugins/browser-native-session-service.ts +222 -0
  329. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  330. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  331. package/src/runtime/plugins/browser-runtime-contract.ts +154 -0
  332. package/src/runtime/plugins/browser-runtime.ts +193 -0
  333. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  334. package/src/runtime/plugins/browser-session-store.ts +121 -0
  335. package/src/runtime/plugins/browser-session-types.ts +98 -0
  336. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  337. package/src/runtime/plugins/desktop-operator-registration.ts +10 -4
  338. package/src/runtime/plugins/external-adapter.ts +358 -3
  339. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  340. package/src/runtime/plugins/first-party-registry.ts +2 -0
  341. package/src/runtime/plugins/github-adapter.ts +125 -0
  342. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  343. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  344. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  345. package/src/runtime/plugins/ios-adapter.ts +106 -16
  346. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  347. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  348. package/src/runtime/plugins/lightweight-action.ts +153 -0
  349. package/src/runtime/plugins/local-system-adapter.ts +123 -6
  350. package/src/runtime/plugins/macos-capability-broker.ts +47 -9
  351. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  352. package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
  353. package/src/runtime/plugins/resend-adapter.ts +1 -1
  354. package/src/runtime/plugins/store.ts +330 -33
  355. package/src/runtime/plugins/types.ts +38 -3
  356. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  357. package/src/runtime/projections/git-status-sampler.ts +16 -16
  358. package/src/runtime/projections/materialized-view.ts +28 -10
  359. package/src/runtime/recovery/maintenance-executor.ts +426 -25
  360. package/src/runtime/root/mcp-transport.ts +180 -10
  361. package/src/runtime/root/package-connector-service.ts +230 -10
  362. package/src/runtime/root/package-runtime-release.ts +143 -17
  363. package/src/runtime/root/package-runtime-service.ts +461 -22
  364. package/src/runtime/root/release-manifest.ts +144 -18
  365. package/src/runtime/root/release-materialize.ts +125 -32
  366. package/src/runtime/root/release-store.ts +48 -11
  367. package/src/runtime/root/runtime.ts +23 -5
  368. package/src/runtime/root/service.ts +100 -29
  369. package/src/runtime/root/types.ts +12 -0
  370. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  371. package/src/runtime/shared/trusted-executable.ts +62 -0
  372. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  373. package/src/runtime/standalone-recovery/core.ts +1079 -240
  374. package/src/runtime/standalone-recovery/entry.ts +100 -24
  375. package/src/runtime/standalone-recovery/installer.ts +20 -4
  376. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  377. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  378. package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
  379. package/src/runtime/workflow/schedules/engine.ts +364 -202
  380. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  381. package/src/runtime/workflow/schedules/settlement.ts +64 -17
  382. package/src/runtime/workflow/schedules/store.ts +209 -19
  383. package/src/runtime/workflow/schedules/types.ts +2 -4
  384. package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
  385. package/src/testing/test-governance.ts +8 -40
  386. package/assets/reference-configs/heartbeat-triage.md +0 -57
  387. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  388. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  389. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  390. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  391. package/docs/architecture/current/architecture-invariants.md +0 -331
  392. package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
  393. package/docs/architecture/current/codegraph-context-provider.md +0 -238
  394. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  395. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  396. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
  397. package/docs/architecture/current/entity-model.md +0 -612
  398. package/docs/architecture/current/external-plugin-governance.md +0 -396
  399. package/docs/architecture/current/failure-recovery.md +0 -447
  400. package/docs/architecture/current/governance.md +0 -213
  401. package/docs/architecture/current/human-interaction-plane.md +0 -87
  402. package/docs/architecture/current/implementation-status.md +0 -128
  403. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  404. package/docs/architecture/current/legacy-governance.md +0 -58
  405. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  406. package/docs/architecture/current/migration-roadmap.md +0 -105
  407. package/docs/architecture/current/multi-repository-execution.md +0 -371
  408. package/docs/architecture/current/operations-runbook.md +0 -45
  409. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  410. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  411. package/docs/architecture/current/repository-access-modes.md +0 -102
  412. package/docs/architecture/current/route-policy.md +0 -15
  413. package/docs/architecture/current/route-session-concurrency.md +0 -85
  414. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  415. package/docs/architecture/current/runtime-directory-map.md +0 -49
  416. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  417. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  418. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  419. package/docs/architecture/current/system-overview.md +0 -169
  420. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  421. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  422. package/docs/architecture/current/thin-harness-v1.md +0 -321
  423. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  424. package/docs/forge-autonomous-goal-loop.md +0 -9
  425. package/docs/forge-provider-configuration.md +0 -7
  426. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
  427. package/docs/operations/gmail-assistant-routines.md +0 -186
  428. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  429. package/docs/operations/provider-configuration.md +0 -31
  430. package/scripts/harness-trace-grade.sh +0 -150
  431. package/scripts/heartbeat-triage.sh +0 -361
  432. package/scripts/maintenance-triage.sh +0 -167
  433. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  434. package/src/cli/repositories/goal-registry.ts +0 -239
  435. package/src/runtime/assistant/action-proposals.ts +0 -279
  436. package/src/runtime/assistant/intent.ts +0 -395
  437. package/src/runtime/assistant/model-provider.ts +0 -460
  438. package/src/runtime/assistant/openapi.ts +0 -223
  439. package/src/runtime/assistant/policy.ts +0 -89
  440. package/src/runtime/assistant/readiness.ts +0 -258
  441. package/src/runtime/assistant/routine-runtime.ts +0 -477
  442. package/src/runtime/assistant/schedule-binding.ts +0 -171
  443. package/src/runtime/assistant/standing-grants.ts +0 -375
  444. package/src/runtime/assistant/store.ts +0 -243
  445. package/src/runtime/assistant/types.ts +0 -135
  446. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  447. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  448. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  449. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  450. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  451. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  452. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  453. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  454. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  455. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  456. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  457. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  458. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  459. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  460. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  461. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  462. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  463. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  464. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  465. package/src/runtime/workflow/findings/store.ts +0 -204
  466. package/src/runtime/workflow/findings/types.ts +0 -58
  467. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  468. package/src/runtime/workflow/portfolio/store.ts +0 -185
  469. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -25,7 +25,7 @@ export interface McpLocalConfig {
25
25
  localEndpoint?: string;
26
26
  };
27
27
  profile?: string;
28
- toolset?: 'core' | 'advanced' | 'full';
28
+ toolset?: 'facade' | 'core' | 'advanced' | 'full';
29
29
  /** Compatibility marker retained for previously persisted toolset choices. */
30
30
  toolsetExplicit?: boolean;
31
31
  accessMode?: AccessMode;
@@ -88,7 +88,7 @@ export interface McpRuntimeState {
88
88
  forgeVersion?: string;
89
89
  toolSurfaceFingerprint?: string;
90
90
  runtimeToolSurfaceFingerprint?: string;
91
- toolset?: 'core' | 'advanced' | 'full';
91
+ toolset?: 'facade' | 'core' | 'advanced' | 'full';
92
92
  configuredAccessMode?: AccessMode;
93
93
  effectiveAccessMode?: AccessMode;
94
94
  effectiveToolset?: McpToolset;
@@ -131,7 +131,7 @@ export interface McpRuntimeState {
131
131
  }>;
132
132
  }
133
133
 
134
- export type McpHttpAuthMode = 'oauth' | 'bearer';
134
+ export type McpHttpAuthMode = 'oauth' | 'bearer' | 'none';
135
135
 
136
136
  export function mcpLocalConfigPath(repoRoot: string): string {
137
137
  return join(repoRoot, '.forge', 'mcp.local.json');
@@ -356,8 +356,8 @@ export function syncMcpControllerHomeBearerToken(
356
356
 
357
357
  export function parseMcpHttpAuthMode(value: string | undefined): McpHttpAuthMode {
358
358
  const mode = (value ?? 'oauth').trim().toLowerCase();
359
- if (mode === 'oauth' || mode === 'bearer') return mode;
360
- throw new Error(`invalid --auth "${value}" (expected: oauth, bearer)`);
359
+ if (mode === 'oauth' || mode === 'bearer' || mode === 'none') return mode;
360
+ throw new Error(`invalid --auth "${value}" (expected: oauth, bearer, none)`);
361
361
  }
362
362
 
363
363
  export function readMcpOAuthPassphrase(repoRoot: string): string | null {
@@ -10,10 +10,11 @@ export function mcpServerInstructions(profile: McpProfileName): string {
10
10
  return [
11
11
  ...common,
12
12
  'Use the shortest valid execution path. Investigation or parallelism alone must not create durable Work, Issues, Plans, Agents, isolation, or worktrees; escalate only for actual recovery, dependency, risk, scope, external-effect, or long-running requirements.',
13
- 'For bounded implementation, use rh_context(operation=search, retrieval_mode=implementation) once as the default code retrieval router when the exact path is unknown. Its current raw snippets and file SHA identities are valid implementation evidence; ChatGPT decides semantic sufficiency and should request wider exact ranges only when impact ambiguity, truncation, drift, or an expansion signal can materially change the edit. For cross-cutting state/time/schema/cache/API/event/concurrency changes, ChatGPT should select relevant impact_domains in that first search so Forge expands those evidence dimensions mechanically in the same call; Forge never infers that the selected domains are semantically complete. Use retrieval_mode=plan|debug|review when the task intentionally needs a broader evidence surface. Do not fall back to shell grep unless retrieval is unavailable or raw Git semantics are explicitly needed. The low-level search_repository handler is compatibility/internal surface, not a second default search path. Prefer repository_command_execute for ordinary local Git and shell operations, repository_safe_patch_apply for bounded source changes, and rh_work only when the task genuinely requires durable orchestration.',
13
+ 'For bounded implementation, start with rh_context(operation=search, retrieval_mode=implementation) as the default code retrieval router when the exact path is unknown, then repeat it with exact paths, symbols, tests, relationships, or impact domains whenever more evidence can materially improve correctness. Its current raw snippets and file SHA identities are valid implementation evidence; ChatGPT alone decides semantic sufficiency. For cross-cutting state/time/schema/cache/API/event/concurrency changes, ChatGPT should select relevant impact_domains so Forge expands those evidence dimensions mechanically; Forge never infers that the selected domains are semantically complete. Use retrieval_mode=plan|debug|review when the task intentionally needs a broader evidence surface. Do not fall back to shell grep unless retrieval is unavailable or raw Git semantics are explicitly needed. The low-level search_repository handler is compatibility/internal surface, not a second default search path. Prefer repository_command_execute for ordinary local Git and shell operations, repository_safe_patch_apply for bounded source changes, and rh_work only when the task genuinely requires durable orchestration.',
14
14
  'Do not preflight unrelated Git history, prior Work, plugins, permissions, TCC, browser mode, maintenance, or recovery state. Inspect them only when the requested operation depends on them or a real failure points there.',
15
+ 'Minimize mechanically redundant MCP round trips. For an ongoing Forge-controlled task, prefer one rh_status(summary) as the initial controller snapshot: it includes bounded readiness, repository identity, top active Work, active Plans, and pending handoffs. Do not immediately follow it with rh_work(plan_list) or rh_context(list/get) unless the next decision needs details that the snapshot does not contain. Use rh_context(work_id=..., detail_level=summary) for one Work, and request detail/raw or capability hydration only when that extra evidence can change the decision.',
15
16
  'Run independent reads, searches, diagnostics, checks, repositories, checkouts, and tasks concurrently by default. Serialize only on a real dependency or Resource Claim conflict, and reuse existing projections, process handles, and check evidence instead of repeating successful observations.',
16
- 'Validation must be proportional to the change: cheap patch-safety checks belong to every coherent edit batch, focused tests run after that batch is stable, and expensive full-suite checks belong at candidate/release or explicitly high-risk boundaries. When a Direct Edit batch is stable, repository_safe_patch_apply may receive explicit check_ids to start revision-bound validation; omit check_ids during intermediate edits. Long checks return managed Processes: continue independent read/review work, then use validation_only with the returned edit-session/validation ids as the synchronization join instead of polling repeatedly. Do not perform maintenance or deep runtime diagnosis before ordinary work unless execution is actually blocked.',
17
+ 'Validation must be proportional to the change: cheap patch-safety checks belong to every coherent edit batch, focused tests run after that batch is stable, and expensive full-suite checks belong at candidate/release or explicitly high-risk boundaries. When a Direct Edit batch is stable, repository_safe_patch_apply may receive explicit check_ids to start revision-bound validation; omit check_ids during intermediate edits. Long checks return managed Processes: continue independent read/review work. Do not call process_wait while useful independent work remains. Use process_get only when a non-blocking observation can change the next decision; when the exact check result becomes a dependency, attach with process_wait (or validation_only with the returned edit-session/validation ids). An attach is transport-bounded: if it returns a running handle, resume useful work and attach again only at a later real dependency boundary, never as periodic polling. Do not perform maintenance or deep runtime diagnosis before ordinary work unless execution is actually blocked.',
17
18
  'repository_safe_patch_apply returns bounded edit-session diff evidence for semantic review. Review that evidence directly instead of issuing a mandatory follow-up diff/status call; expand it only when truncated or semantically ambiguous. After a bounded successful change, finish the requested delivery directly. Avoid additional investigation whose result cannot change implementation or acceptance, and do not invoke hidden atomic compatibility tools merely because they exist in the full profile.',
18
19
  ].join(' ');
19
20
  }
@@ -1,4 +1,5 @@
1
- import type { CallToolResult as SdkCallToolResult } from '@modelcontextprotocol/sdk/types.js';
1
+ import type { CallToolResult, McpToolDefinition } from './tool-contract';
2
+ export type { CallToolResult, McpToolDefinition } from './tool-contract';
2
3
  import { createHash } from "crypto";
3
4
  import {
4
5
  existsSync,
@@ -71,7 +72,8 @@ import {
71
72
  import { normalizeCheckIds } from '../../runtime/control-plane/facade/check-normalization';
72
73
  import { buildExecutionDiagnostics, buildRequirementBoard } from '../../runtime/control-plane/facade/requirement-board';
73
74
  import { acceptVerifiedTaskFromControllerWork } from '../../runtime/control-plane/execution/work-task-receipt';
74
- import { createWorkContract, getWorkContract } from '../../runtime/control-plane/facade/work-contract-store';
75
+ import { getWorkContract } from '../../runtime/control-plane/facade/work-contract-store';
76
+ import { admitDirectEditWorkContract } from '../../runtime/control-plane/facade/repository-work-admission';
75
77
  import { decideRoute } from '../../runtime/control-plane/routing/route-policy';
76
78
  import { listCapabilityDescriptors, summarizeCapabilityGroups } from '../../runtime/control-plane/facade/capability-registry';
77
79
  import {
@@ -113,7 +115,6 @@ import type {
113
115
  import {
114
116
  gitDiff,
115
117
  gitSnapshot,
116
- readRepositoryRange,
117
118
  searchRepository,
118
119
  } from "../repository/inspector";
119
120
  import {
@@ -150,6 +151,11 @@ import { hashMcpInput, tryWriteMcpAuditEntry } from "./audit";
150
151
  import { loadMcpRuntimeState } from "./auth";
151
152
  import { resolveLocalBridgeSurface, summarizeRecentJobs } from "../../runtime/shared/local-bridge-surface";
152
153
  import { resolveRepoPreferredControllerHome } from "../repositories/controller-home";
154
+ import { resolveRepositorySelection } from '../repositories/registry';
155
+ import { executionIdentityForRepository } from '../../runtime/control-plane/execution/execution-identity';
156
+ import { runPersistedCheckViaProcessRuntime } from '../../runtime/gateway/mcp/persisted-check-process';
157
+ import { getProcessRecord } from '../../runtime/execution/process-runtime/store';
158
+ import { processCheckCompletionReceipt } from '../../runtime/execution/process-runtime/check-receipt';
153
159
  import { normalizeMcpRelativePath, resolveMcpPath } from "./paths";
154
160
  import { currentGitBranch, isForgeAdopted } from "./repo";
155
161
  import { repositoryToolNames } from "./repository-tools";
@@ -174,16 +180,6 @@ export interface McpToolContext {
174
180
  signal?: AbortSignal;
175
181
  }
176
182
 
177
- export interface McpToolDefinition {
178
- name: string;
179
- description: string;
180
- inputSchema: Record<string, unknown>;
181
- annotations?: Record<string, unknown>;
182
- }
183
-
184
- export type CallToolResult = Omit<SdkCallToolResult, "content"> & {
185
- content: Array<{ type: "text"; text: string }>;
186
- };
187
183
 
188
184
  const EMPTY_SCHEMA = { type: "object", additionalProperties: false };
189
185
 
@@ -1634,29 +1630,6 @@ export function buildMcpToolDefinitions(
1634
1630
  },
1635
1631
  annotations: readOnly,
1636
1632
  },
1637
- {
1638
- name: "controller_context_pack",
1639
- description:
1640
- "Build a bounded code context pack for a task: relevant files, search-hit line ranges, and raw snippets. This is for scoped investigation, not blind implementation.",
1641
- inputSchema: {
1642
- type: "object",
1643
- properties: {
1644
- description: { type: "string" },
1645
- issue_id: { type: "string" },
1646
- task_id: { type: "string" },
1647
- known_paths: { type: "array", items: { type: "string" } },
1648
- include_globs: { type: "array", items: { type: "string" } },
1649
- exclude_globs: { type: "array", items: { type: "string" } },
1650
- search_terms: { type: "array", items: { type: "string" } },
1651
- max_files: { type: "number" },
1652
- max_snippets: { type: "number" },
1653
- max_chars_per_snippet: { type: "number" },
1654
- structural_context: { type: "string", enum: ["off", "auto", "required"], description: "Optional CodeGraph structural context. Defaults to off so ordinary Direct work pays no graph startup cost." },
1655
- },
1656
- additionalProperties: false,
1657
- },
1658
- annotations: readOnly,
1659
- },
1660
1633
  {
1661
1634
  name: "quick_agent_session",
1662
1635
  description:
@@ -1807,22 +1780,6 @@ export function buildMcpToolDefinitions(
1807
1780
  },
1808
1781
  annotations: readOnly,
1809
1782
  },
1810
- {
1811
- name: "read_repository_file",
1812
- description:
1813
- "Read a line range from one policy-readable repository file.",
1814
- inputSchema: {
1815
- type: "object",
1816
- properties: {
1817
- path: { type: "string" },
1818
- start_line: { type: "number" },
1819
- end_line: { type: "number" },
1820
- },
1821
- required: ["path"],
1822
- additionalProperties: false,
1823
- },
1824
- annotations: readOnly,
1825
- },
1826
1783
  {
1827
1784
  name: "get_git_diff",
1828
1785
  description:
@@ -1844,25 +1801,6 @@ export function buildMcpToolDefinitions(
1844
1801
  inputSchema: EMPTY_SCHEMA,
1845
1802
  annotations: readOnly,
1846
1803
  },
1847
- {
1848
- name: "run_check",
1849
- description:
1850
- "Start one named focused repository check as a Local Job and return immediately; inspect it with get_local_job.",
1851
- inputSchema: {
1852
- type: "object",
1853
- properties: {
1854
- check_id: { type: "string" },
1855
- timeout_ms: { type: "number" },
1856
- },
1857
- required: ["check_id"],
1858
- additionalProperties: false,
1859
- },
1860
- annotations: {
1861
- readOnlyHint: false,
1862
- openWorldHint: false,
1863
- destructiveHint: false,
1864
- },
1865
- },
1866
1804
  {
1867
1805
  name: "list_issues",
1868
1806
  description: "List controller-managed issues and task summaries.",
@@ -3306,28 +3244,6 @@ export async function callMcpTool(
3306
3244
  audit(ctx, name, "ok", args);
3307
3245
  return textResult(payload);
3308
3246
  }
3309
- case "controller_context_pack": {
3310
- if (ctx.policy.profile !== "controller")
3311
- return errorResult(
3312
- "TOOL_DISABLED",
3313
- "controller_context_pack requires the controller profile",
3314
- );
3315
- const pack = buildControllerContextPack(ctx.repoRoot, ctx.policy, {
3316
- description: typeof args.description === "string" ? args.description : undefined,
3317
- issueId: typeof args.issue_id === "string" ? args.issue_id : undefined,
3318
- taskId: typeof args.task_id === "string" ? args.task_id : undefined,
3319
- knownPaths: stringList(args.known_paths),
3320
- includeGlobs: stringList(args.include_globs),
3321
- excludeGlobs: stringList(args.exclude_globs),
3322
- searchTerms: stringList(args.search_terms),
3323
- maxFiles: typeof args.max_files === "number" ? args.max_files : undefined,
3324
- maxSnippets: typeof args.max_snippets === "number" ? args.max_snippets : undefined,
3325
- maxCharsPerSnippet: typeof args.max_chars_per_snippet === "number" ? args.max_chars_per_snippet : undefined,
3326
- structuralContext: args.structural_context === "auto" || args.structural_context === "required" ? args.structural_context : "off",
3327
- });
3328
- audit(ctx, name, "ok", args);
3329
- return textResult(pack);
3330
- }
3331
3247
  case "controller_context": {
3332
3248
  if (ctx.policy.profile !== "controller")
3333
3249
  return errorResult(
@@ -3563,36 +3479,6 @@ export async function callMcpTool(
3563
3479
  audit(ctx, name, "ok", args);
3564
3480
  return textResult(result);
3565
3481
  }
3566
- case "read_repository_file": {
3567
- if (ctx.policy.profile !== "controller")
3568
- return errorResult(
3569
- "TOOL_DISABLED",
3570
- "read_repository_file requires the controller profile",
3571
- );
3572
- const path = String(args.path ?? "");
3573
- const session = ctx.sessionId && ctx.repoId
3574
- ? {
3575
- sessionId: ctx.sessionId,
3576
- repoId: ctx.repoId,
3577
- checkoutId: ctx.checkoutId ?? ctx.repoId,
3578
- }
3579
- : undefined;
3580
- const result = readRepositoryRange(
3581
- ctx.repoRoot,
3582
- ctx.policy,
3583
- path,
3584
- typeof args.start_line === "number" ? args.start_line : 1,
3585
- typeof args.end_line === "number" ? args.end_line : 200,
3586
- session,
3587
- );
3588
- const redacted = redactMcpText(result.content);
3589
- audit(ctx, name, "ok", args, result.path);
3590
- return textResult({
3591
- ...result,
3592
- content: redacted.text,
3593
- redactions: redacted.redactions,
3594
- });
3595
- }
3596
3482
  case "get_git_diff": {
3597
3483
  if (ctx.policy.profile !== "controller")
3598
3484
  return errorResult(
@@ -3640,84 +3526,6 @@ export async function callMcpTool(
3640
3526
  audit(ctx, name, "ok", args);
3641
3527
  return textResult({ checks });
3642
3528
  }
3643
- case "run_check": {
3644
- if (ctx.policy.profile !== "controller")
3645
- return errorResult(
3646
- "TOOL_DISABLED",
3647
- "run_check requires the controller profile",
3648
- );
3649
- // Prefer Unified Process Runtime for ordinary checks. Multi-phase and
3650
- // release checks require an explicit external Controller instead.
3651
- const checkId = String(args.check_id ?? "").trim();
3652
- const forceDurable = args.force_durable === true
3653
- || args.apply_mode === "async"
3654
- || args.mode === "durable";
3655
- if (!forceDurable && checkId) {
3656
- try {
3657
- const { checkRequiresDurableWorkflow, runCheckViaProcessRuntime } = await import(
3658
- "../../runtime/execution/process-runtime"
3659
- );
3660
- const { resolveRepoPreferredControllerHome } = await import("../repositories/controller-home");
3661
- const { resolveRepositorySelection } = await import("../repositories/registry");
3662
- if (!checkRequiresDurableWorkflow(checkId)) {
3663
- const controllerHome = resolveRepoPreferredControllerHome(ctx.repoRoot);
3664
- const repository = resolveRepositorySelection({
3665
- explicitPath: ctx.repoRoot,
3666
- controllerHome,
3667
- allowSoleRepository: true,
3668
- });
3669
- if (repository) {
3670
- const facade = await runCheckViaProcessRuntime({
3671
- controllerHome,
3672
- repoId: repository.repoId,
3673
- checkoutId: repository.activeCheckoutId,
3674
- repoRoot: repository.canonicalRoot,
3675
- checkId,
3676
- timeoutMs: typeof args.timeout_ms === "number" ? args.timeout_ms : undefined,
3677
- requestId: typeof args.request_id === "string" ? args.request_id.trim() || undefined : undefined,
3678
- executionIdentity: {
3679
- schemaVersion: 1,
3680
- repositoryId: repository.repoId,
3681
- checkoutId: repository.activeCheckoutId,
3682
- canonicalRoot: repository.canonicalRoot,
3683
- },
3684
- });
3685
- if (facade.mode !== "durable" && facade.process) {
3686
- audit(ctx, name, "ok", args);
3687
- return textResult({
3688
- mode: facade.mode,
3689
- path: facade.mode === "direct" ? "process_direct" : "process_managed",
3690
- checkId: facade.checkId,
3691
- processId: facade.process.processId,
3692
- status: facade.process.status,
3693
- completed: facade.process.completed === true,
3694
- ok: facade.process.ok,
3695
- exitCode: facade.process.exitCode,
3696
- timedOut: facade.process.timedOut,
3697
- stdout: facade.process.stdout,
3698
- stderr: facade.process.stderr,
3699
- durableSideEffects: facade.durableSideEffects,
3700
- next: facade.process.completed
3701
- ? "Check finished on Process Runtime without LocalBridgeJob / ExecutionJob / Worker."
3702
- : `Managed process ${facade.process.processId} still running; poll process_get / process_wait / process_logs.`,
3703
- });
3704
- }
3705
- }
3706
- }
3707
- } catch (error) {
3708
- const message = error instanceof Error ? error.message : String(error);
3709
- const code = message.includes(":") ? message.slice(0, message.indexOf(":")) : "PROCESS_RUNTIME_FAILED";
3710
- audit(ctx, name, "failed", args, undefined, message);
3711
- return errorResult(code, message, { checkId });
3712
- }
3713
- }
3714
- audit(ctx, name, "blocked", args);
3715
- return errorResult(
3716
- "PROCESS_RUNTIME_REQUIRED",
3717
- "This check cannot create a Local Bridge Job. Run a registered ordinary check through Process Runtime or use external Controller handling for durable checks.",
3718
- { checkId },
3719
- );
3720
- }
3721
3529
  case "list_issues": {
3722
3530
  if (ctx.policy.profile !== "controller")
3723
3531
  return errorResult(
@@ -4506,11 +4314,6 @@ export async function callMcpTool(
4506
4314
  const checkIds = normalizedChecks.validCheckIds;
4507
4315
  const checkResults: TaskVerification['checkResults'] = [];
4508
4316
  if (checkIds.length > 0) {
4509
- const { resolveRepositorySelection } = await import('../repositories/registry');
4510
- const { executionIdentityForRepository } = await import('../../runtime/control-plane/execution/execution-identity');
4511
- const { runPersistedCheckViaProcessRuntime } = await import('../../runtime/gateway/mcp/persisted-check-process');
4512
- const { getProcessRecord } = await import('../../runtime/execution/process-runtime/store');
4513
- const { processCheckCompletionReceipt } = await import('../../runtime/execution/process-runtime/check-receipt');
4514
4317
  const controllerHome = resolveRepoPreferredControllerHome(ctx.repoRoot);
4515
4318
  const repository = resolveRepositorySelection({
4516
4319
  explicitPath: ctx.repoRoot,
@@ -4767,7 +4570,7 @@ export async function callMcpTool(
4767
4570
  const existingWork = getWorkContract(workStore, workId);
4768
4571
  if (requestedWorkId && !existingWork) return errorResult("WORK_NOT_FOUND", `WorkContract ${workId} not found`);
4769
4572
  if (!existingWork) {
4770
- createWorkContract(workStore, {
4573
+ admitDirectEditWorkContract(workStore, {
4771
4574
  workId,
4772
4575
  repoId,
4773
4576
  checkoutId: identity.checkoutId,
@@ -4775,28 +4578,13 @@ export async function callMcpTool(
4775
4578
  controllerInstanceId: identity.controllerInstanceId,
4776
4579
  baseRevision: git.head ?? undefined,
4777
4580
  workspaceFingerprint: workspaceIdentity,
4778
- routeDecisionFingerprint: routeDecision.inputFingerprint,
4779
4581
  routeDecision,
4780
- mode: "direct_control",
4781
4582
  objective: purpose,
4782
- acceptanceCriteria: [],
4783
- constraints: { workspaceMode: "current", requireWorktree: false, requireHandoffOnAmbiguity: true },
4784
- risk: "low",
4785
- status: "running",
4786
- phase: "implementation",
4787
4583
  issueId: typeof args.issue_id === "string" ? args.issue_id : undefined,
4788
4584
  taskId: typeof args.task_id === "string" ? args.task_id : undefined,
4789
- scopeSummary: purpose,
4790
4585
  allowedPaths,
4791
- forbiddenPaths: [],
4792
4586
  checks,
4793
4587
  requestedBy: "chatgpt",
4794
- evidenceRefs: [],
4795
- handoffRefs: [],
4796
- suggestedNextActions: [],
4797
- policyDecisions: [],
4798
- checkRefs: [],
4799
- reconciliations: [],
4800
4588
  });
4801
4589
  }
4802
4590
  const session = beginEditSession(ctx.repoRoot, {
@@ -87,8 +87,8 @@ export function parseMcpToolset(value: unknown, profile: string): McpToolset {
87
87
  if (profile !== 'controller') return 'full';
88
88
  const normalized = typeof value === 'string' ? value.trim().toLowerCase() : '';
89
89
  if (!normalized) return 'advanced';
90
- if (normalized === 'core' || normalized === 'advanced' || normalized === 'full') return normalized;
91
- throw new Error(`invalid MCP toolset "${String(value)}" (expected: core, advanced, or full)`);
90
+ if (normalized === 'facade' || normalized === 'core' || normalized === 'advanced' || normalized === 'full') return normalized;
91
+ throw new Error(`invalid MCP toolset "${String(value)}" (expected: facade, core, advanced, or full)`);
92
92
  }
93
93
 
94
94
  function repositoryForExplicitPath(path: string, controllerHome: string): RepositoryRecord | undefined {
@@ -295,13 +295,24 @@ export function repositoryScopedToolArgs(
295
295
  input: Record<string, unknown>,
296
296
  repository: RepositoryRecord,
297
297
  ): Record<string, unknown> {
298
- // Preserve resolved repository/checkout identity for every downstream call.
299
- // Deleting these fields forced re-resolution and allowed silent route drift.
298
+ // Preserve resolved repository identity for every downstream call. Exact
299
+ // claimed Work calls are the one exception for checkout injection: when the
300
+ // caller omitted checkout_id, repository tools must resolve the Work-owned
301
+ // checkout after validating the authenticated principal instead of inheriting
302
+ // the repository's currently active checkout.
303
+ const workOwnedCheckoutResolution = [
304
+ 'repository_command_preview',
305
+ 'repository_command_execute',
306
+ 'repository_safe_patch_apply',
307
+ ].includes(name)
308
+ && typeof input.work_id === 'string'
309
+ && input.work_id.trim().length > 0
310
+ && !(typeof input.checkout_id === 'string' && input.checkout_id.trim().length > 0);
300
311
  const args: Record<string, unknown> = {
301
312
  ...input,
302
313
  repo_id: repository.repoId,
303
- checkout_id: repository.activeCheckoutId,
304
314
  };
315
+ if (!workOwnedCheckoutResolution) args.checkout_id = repository.activeCheckoutId;
305
316
 
306
317
  const github = repository.github;
307
318
  const githubRepo = github ? `${github.owner}/${github.repo}` : undefined;